Veuillez consulter cette page à partir de l'interface principale.
Flags d'instructions Le flag est utilisé par ces instructions :
version : 2011-09-25 (OK)

 

Les flags des instructions du YASEP

Le pipeline du YASEP a été conçu pour effectuer les opérations les plus communes le plus efficacement possible. Les opérations de calcul (additions, soustractions, décalages etc.) suivent un chemin très semblable en traversant les portes logiques, ce qui détermine le comportement par défaut des instructions : charger deux opérandes, calculer puis sauver le résultat. Le chemin de données est donc optimisé pour cela.

Cependant, même pour ces instructions typiques, un seul comportement par défaut ne suffit pas et des divergences émergent, chaque instruction doit indiquer ses spécificités et demander des dérogations de comportement.

Ces spécificités sont indiqués par des "flags", des propriétés de chaque opcode, contenues dans le circuit logique du processeur et dans un fichier JavaScript utilisé par l'assembleur, le désassembleur, le simulateur... Ces flags sont indispensables au bon fonctionnement du système et des logiciels, et rendent le codage plus facile en langage assembleur, en permettant les différentes formes (syntaxes) et leurs alias. Ainsi, le codeur n'a pas besoin de se souvenir de chaque détail d'implémentation ou de l'ordre des opérandes qui peut changer d'un opcode à l'autre, d'une forme à l'autre, il suffit de se rappeler de quelques règles.

Même si leur connaissance n'est pas indispensable, c'est un atout pour le programmeur et un aspect intéressant de l'architecture, donc cette page fournit quelques explications...

SWAP_IR : utilise un autre registre pour la forme IR

Il y a deux types d'instructions utilisant la forme FORM_IR : celles dont le champ de registre est une source/opérande, et celles dont le champ de registre indique une destination.

On effectue cette distinction parce que dans les instructions longues (avec valeur immédiate 16 bits), les champs des registres doivent se conformer à la forme FORM_IRR : snd est la source et si4 est la destination.

Cependant, pour certaines instructions de forme FORM_IR (si elles n'ont pas le flag ALIAS_IRR), un des champs de registre n'est pas utilisé. Le flag SWAP_IR indique alors que le registre fourni à l'assembleur est une destination et sa valeur va donc dans le champ si4.

Note : Ce flag est nécessaire pour pouvoir utiliser le flag IMM20.

ALIAS_RR, ALIAS_IRR :

Ces flags indiquent qu'on peut omettre d'écrire un champ de registre si la source est identique à la destination. Cela permet d'écrire une forme FORM_R à la place de FORM_RR, ou une forme FORM_IR à la place de FORM_IRR . Les champs si4 et snd ont alors la même valeur, bien qu'une seule soit donnée dans le code source.

YASEP16_ONLY, YASEP32_ONLY

Ces flags indiquent que l'instruction en question est valide seulement pour une seule taille de YASEP. Quand aucun flag n'est mentionné, l'instruction est alors générique (valide pour les versions 16 bits et 32 bits, avec cependant des résultats qui peuvent varier).

Si une instruction portant le flag YASEP32_ONLY est décodée par un YASEP16 (par exemple), c'est une instruction invalide et le processeur peut l'ignorer, déclencher une exception, se bloquer (le mécanisme n'est pas encore créé).

Voir aussi YASEP16/YASEP32/YASEP

Note : Actuellement (2011-09), le flag YASEP16_ONLY n'est pas utilisé mais il pourrait l'être dans le futur.

OPTIONAL

Certaines instructions sont optionnelles et peuvent être laissées de côté si le circuit électronique a des contraintes de taille.

Tout comme avec ALIAS_RR, un YASEP qui n'utilise pas ces instructions peut les ignorer, se bloquer ou déclencher une exceptions. Des Registres Spéciaux indiqueront quelles instructions sont prises en charge par le processeur.

NO_WRITEBACK

Certaines instructions n'écrivent pas dans le banc de registres. Le champ de registre destination sera ignoré par le décodeur d'instructions, l'assembleur refusera qu'on en spécifie.

ABORT_WRITE

Certaines instructions de comparaison peuvent inhiber l'écriture de données dans le banc de registre. Le registre destination peut rester inchangé après l'exécution de ces instructions. Cela réutilise le mécanisme d'inhibition mis en place pour les prédicats des instructions conditionnelles (avec la forme étendue).

NO_CONDITION

La majorité des instructions peuvent être inhibées en empêchant l'écriture du résultat de l'opération, au dernier étage du pipeline. L'opération est quand même exécutée, par contre.

D'autres instructions n'écrivent pas de résultat, ou alors l'opération ne peut pas être empêchée en inhibant l'écriture du résultat. Le flag NO_CONDITION indique alors que l'instruction n'accepte pas de condition/prédicat lors de l'assemblage, ce sera ignoré lors du décodage et l'opération sera toujours exécutée.

IgnoreImmSign

Normalement, les champs de données immédiates (Imm4 et Imm16) ont leur signe étendu pour remplir tout l'espace de l'opérande, donc l'assembleur s'attend à des valeurs immédiates comprises entre -8 et 7, ou -32768 et 32767.

Cependant, certaines instruction doivent aussi utiliser des valeurs positives uniquement, par exemple les opérations de multiplication non signée MUL8L et MUL8H. Le flag IgnoreImmSign indique à l'assembleur que les valeurs 0 à 15, ou 0 à 65535, sont valides.

IMM16_5LSB, IMM16_8LSB

Ce flag indique que l'instruction ne va pas utiliser des valeurs de plus de 5, ou 8, bits dans le champ IMM16 (pour les formes longues).

CHANGE_CARRY

Ce flag indique que l'instruction peut modifier le drapeau de retenue.

CHANGE_ZERO

Ce flag indique que l'instruction peut modifier le drapeau de zéro, ce qui est utile après les instructions CMPU/CMPS.

IGNORE_SND, IGNORE_SI4

Lors de l'étape de lecture des opérandes par le processeur, certaines instructions n'utilisent pas les champs snd ou si4. Il n'y a pas d'effet de bord lié à la lecture de l'opérande, qui restera inutilisée dans le pipeline, ce champ est d'ailleurs probablement mis à zéro. Cependant les champs snd ou si4 peuvent encore servir d'adresse de registre destination lors de l'étape d'écriture.

IGNORE_IMM16

Ce flag indique que le champ IMM16 (dans les instructions longues) n'est jamais utilisé. C'est souvent lié au flag IGNORE_SI4 mais peut aussi signifier qu'une forme longue n'est pas acceptée.

IMM20

Ce flag est spécifique aux instructions qui ignorent le champ snd, comme MOV. Ce champ est utilisé avec YASEP32 pour ajouter 4 bits de poids fort à IMM16, ce qui fournit un nombre signé de 20 bits (au lieu de 16 avec YASEP16).

Note : Ce flag nécessite le flag SWAP_IR.

Preliminary

Les instructions marquées avec ce flag sont en cours de définition. Leur opcode est réservé pour un usage particulier. Elles peuvent changer ou disparaitre d'un jour à l'autre. Ne les utilisez pas (encore).

READ_DST3

Ce flag est utilisé par les instructions qui nécessitent 3 opérandes, dans ce cas le champ DST3 sert à la fois de source et de destination pour les formes étendues.

Ce flag implique que la seule forme possible est RRR ou iRR (forme étendue)