Veuillez consulter cette page à partir de l'interface principale.
La structure des instructions Instructions concernées :
yasep/doc/forms.fr.html version 2012-08-11
Manquent les auto-updates des pointeurs
 

La structure des instructions dans l'architecture du YASEP

Les instructions du YASEP ont un format fixe sur 16 bits avec un champ optionnel, immédiat ou étendu de 16 bits. Ce format est identique pour YASEP16 et YASEP32 : YASEP32 peut utiliser des instructions sur 16 bits et YASEP16 décode les instructions sur 32 bits, en fait le décodeur d'instructions varie peu et doit accepter les deux longueurs.

Chaque instruction peut contenir :

Ces champs et flags ne sont pas tous utilisés en même temps. Certaines combinaisons sont impossibles par construction, d'autres n'ont aucun sens, le reste peut être transformé par l'assembleur. Cependant, une grande variété d'instructions (un opcode suivi de noms de regitres, de données immédiates et d'autres flags) peut être écrite par un programmeur. Cette page explique quelles "formes d'instructions" sont disponibles, comment elles sont structurées et quand on les utilise.

 

Résumé

Une "forme d'instruction" est nommée selon son écriture en langage assembleur. C'est une séquence de lettres, désignant chacune un champ :

La structure du YASEP ne permet qu'un nombre limité de formes. Les deux bits de poids faible d'une instruction du YASEP déterminent comment interpréter les champs suivants, ce qui peut donner 4 combinaisons:

La forme étendue dispose d'un flag supplémentaire (aux) qui permet d'utiliser une des adresses de registre comme immédiat sur 4 bits. Cela porte à 5 le nombre de formes physiquement possibles. L'assembleur permet d'écrire d'autres formes, par exemple en exploitant certaines combinaisons de champs inutilisés.

 

Où vont les résultats ?

Le YASEP écrit le résultat des opérations (si il y a lieu) dans un registre dont l'adresse est donnée par les champs si4, snd ou dst3, en fonction de la forme de chaque instruction :

Il peut sembler étrange que si4 soit le champ de destination pour les instructions longues. C'est nécessaire car snd est le seul champ, dans le chemin de données, où la négation (le n de snd) peut avoir lieu.

Ce système est un peu complexe et pourrait rendre les développement complexes dans un futur lointain. Cependant c'est indispensable pour conserver la compacité et l'orthogonalité des instructions. De plus, dans le chemin de données, ce qui compte vraiment (pour la performance) c'est le temps d'accès aux opérandes. Le "calcul" de l'adresse de destination peut être réalisé rapidement, en même temps que l'ALU (une bonne douzaine de niveaux logiques). Et puisqu'on ne va pas utiliser de "bypass de pipeline" (on n'attend pas l'écriture d'un résultat pour le réutiliser), on peut avoir plus de liberté avec les champs et obtenir le maximum de chaque combinaison de bits. C'est l'assembleur qui va se charger de mettre les bonnes valeurs dans les bons bits.

 

Les "formes courtes"

Commençons par les formes d'instructions les plus simples. Les instructions courtes ont leur bit de poids faible égal à zéro, ce qui indique une longueur de 16 bits. Il reste juste assez de place pour un autre flag, un opcode de 6 bits et 2 champs de 4 bits.

Note : avant, ces deux champs s'appelaient src1 et src2, et on les confondait tout le temps, donc il sont renommés depuis 20090730

 

"forme courte à registres" : deux adresses de registre

ADD R2, R1 ; R1 <= R1 + R2
1514131211 109876 543210
si4 snd opcode Reg court
R2 R1 ADD 0 0
 

"forme courte immédiate" : une adresse de registre et une valeur immédiate

ADD -3, R1 ; R1 <= R1 + -3
1514131211 109876 543210
si4 snd opcode Imm4 court
-3 R1 ADD 1 0

En pratique, ces deux combinaisons peuvent être utilisées de 5 façons en langage assembleur, puisque chacun de ces champs peut être plus ou moins utile en fonction du type d'opération désirée :

 

Forme "RR" : De Registre à Registre

 ADD R1 R2   ; R2 <- R1+R2
C'est l'une des formes les plus courantes. si4 et snd donnent les adresses des deux registres contenant les opérandes. snd est aussi la destination du résultat.

 

Forme "iR" : immédiat court vers Registre

 ADD 2 R3   ; R3 <- 2+R3
Une autre forme courante. si4 donne une valeur immédiate, donc snd sert d'adresse de registre pour l'autre opérande source ainsi que la destination.

 

Form "Ri" : Registre vers immédiat court

 PUT R1 3   ; Envoie le contenu de R1 dans le registre spécial n°3
C'est juste une autre manière d'écrire une forme iR quand l'instruction utilise une valeur immédiate comme adresse de destination.

 

Forme "R" : Registre

 NEG R1   ; en interne : R1 = -R1
C'est aussi une façon courte d'écrire que les deux champs sont le même registre. L'assembleur va correctement remplir les champs si4 et snd si cette forme est acceptable pour l'opcode désiré.

 

Forme "i" : immédiat court

 CRIT 3   ; désactive les interruptions pour les 3 instructions suivantes
Rarement utilisé mais parfois nécessaire. si4 contient la valeur immédiate et snd est ignoré.

 

Forme "ALONE" : pas d'opérande

 NOP   ; pas d'opération, tout les champs sont ignorés.
C'est un cas extrême où aucune opérande n'est nécessaire. si4 et snd sont ignorés.

 

 

Les "formes longues"

YASEP interprète les instructions comme ayant une longueur de 32 bits quand leur bit de poids faible est à 1. Les 16 bits de poids faible sont exactement les mêmes que dans les formes courtes. Le second bit de poids faible indique comment interpréter le demi-mot de poids fort :

 

"Forme longue immédiate" : Deux adresses de registres et une valeur immédiate longue

ADD 1234, R2, R1 ; R1 <= 1234 + R2
31302928 27262524 23222120 19181716 1514131211 109876 543210
Imm16 si4 snd opcode imm16 long
1234h R2 R1 ADD 0 1
 

Forme "IRR" : Immédiat long et Registre vers Registre

 ADD 1234h R2 R1   ; R1 <- 1234h + R2
Cette forme est assez courante. En plus de l'opérande immédiate sur 16 bits, snd fournit l'adresse du registre qui sert de deuxième opérande. si4 donne la destination du résultat.

 

Forme "IR" : Immédiat long vers Registre

 GET 1234h R1   ; R1 <- SR[1234h]
Cette forme est utilisée pour les instructions GET ou MOV. Le champ snd est ignoré parce que seul si4 (ici, le champ d'adresse de destination) a un sens pour l'opération. L'assembleur détecte aussi si la valeur immédiate tient dans 4 bits pour utiliser une forme courte (FORM_iR) ou longue, et optimiser la taille du code binaire.

C'est aussi utilisé par les instructions booléennes (ROP2) et l'ASU (ADD et SUB) pour simuler FORM_iR mais avec une valeur immédiate sur 16 bits. Lorsqu'il trouve le flag ALIAS_IRR, l'assembleur va utiliser FORM_IRR et mettre la même adresse de registre dans les deux champs si4 et snd.

; Ces deux instructions font la même chose et sont encodées de la même manière :
 OR 1234h R1 R1               
 OR 1234h R1

Avec le YASEP32, certains opcodes peuvent aussi utiliser le champ snd (normalement à zéro) pour obtenir une valeur immédiate sur 20 bits : voir le flag IMM20.
.profile YASEP32 ; Les 4 bits de poids fort sont ignorés par YASEP16
 CALL 12345h R1
 MOV 12345h R1
 

Forme "RI" : Registre vers Immédiat long

 PUT R1 1234h   ; SR[1234h] <- R1
Cette forme est uniquement utilisée pour l'instruction PUT. Elle est identique à FORM_IR mais l'ordre des opérandes est inversé par l'assembleur pour obéir à la règle n°1 selon laquelle "La destination est écrite à la fin de l'instruction".

 

 

Les formes étendues

Les formes dites "étendues" réutilisent la structure des formes courtes et rajoutent 16 bits pour fournir d'autres fonctionnalités :

Ces champs sont situés dans l'instruction à des positions qui facilitent au maximum le décodage des opérandes. Le champ de conditions est décalé de 16 bits du champ si4 et le champ dst3 est également décalé d'autant par rapport à snd, afin d'accélérer les opérations si le bus d'instructions est sur 16 bits seulement.

"Forme Etendue à Registres" : trois adresses de registres

ADD R1, R2, R3 ; R3 <= R1 + R2
31302928 27262524 23222120 19181716 1514131211 109876 543210
dst3 Reg si4 snd opcode Ext long
R3 0 R2 R1 ADD 1 1
 

Forme "RRR" : Registre et Registre vers Registre

 ADD R1 R2 R3 ; R3 <- R1+R2
si4 (R1) et snd (R2) sont tous les deux des registres sources, le résultat est écrit dans dst3 (R3).

 

"Forme Etendue Immediate" : deux adresses de registres et un champ immédiat de 4 bits

ADD 5, R1, R3 ; R3 <= R1 + 5
31302928 27262524 23222120 19181716 1514131211 109876 543210
dst3 Reg si4 snd opcode Ext long
R3 1 5 R1 ADD 1 1
 

Form "iRR" : imm4 et Registre vers Registre

 ADD 5 R1 R3 ; R3 <- R1+5
La valeur immédiate sur 4 bits de si4 (5) et la valeur du registre indiqué par snd (R1) sont les opérandes de l'addition, dont le résultat est écrit dans dst3 (R3).

 

 

Codes de conditions

Les instructions étendues du YASEP disposent de 7 bits pour définir la condition (ou le prédicat) qui valide (ou non) l'écriture du résultat de l'instruction courante. Ils permettent d'encoder trois types de conditions :

Toutes les conditions peuvent être inversées par le bit N. Donc on peut coder le prédicat "jamais" en inversant la condition "toujours" (qui est celle par défaut).

L'encodage est tel que la condition "toujours" (ALWAYS) est représentée avec tous les bits à 0.

Le registre "shadow" est pour l'instant indéterminé. Pour l'instant, on considère qu'il s'agit d'une copie locale du registre R1 mais on pourra le changer avec un SR pour indiquer s'il s'agit d'un port d'entrées ou d'autres choses encore.

 

 

A compléter plus tard... (autoupdates...)