Veuillez consulter cette page à partir de l'interface principale.
Flags d'instructions Le flag est utilisé par ces instructions :
version : 2014-04-28

 

Les flags des instructions du YASEP

Que sont ces flags ?

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 commun 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 (ou attributs) 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 de base.

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...

Attributs servant uniquement à l'assemblage/désassemblage des instructions

OPTIONAL

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

Vous pouvez activer ou inhiber des opcodes (et économiser les circuits correspondants) avec l'outil de configuration des profils. Un YASEP qui n'utilise pas ces instructions peut les ignorer, se bloquer ou déclencher une exceptions. Dans le futur, des Registres Spéciaux pourront indiquer quelles instructions sont prises en charge par le processeur.

Preliminary

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

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, même si les résultats peuvent varier plus ou moins subtilement).

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.

ALIAS_RR, ALIAS_IRR :

Lorsque l'assembleur essaie de créer une instruction longue lorsqu'il voit une forme courte, 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.

Attributs servant à l'assemblage et au décodage matériel des instructions

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.

IMM_LSB, 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_EQUAL

Ce flag indique que l'instruction peut modifier le drapeau d'égalité, 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. IGNORE_SND_SHORT est valide pour les instructions courtes et IGNORE_SND_LONG pour les instructions longues en raison de légères différences entre les formats.

Il n'y a pas d'effet de bord lié à la lecture de l'opérande, qui restera inutilisé dans le pipeline, ce champ est d'ailleurs probablement mis à zéro. Cependant le champ snd peut encore servir d'adresse de registre destination lors de l'étape d'écriture.

READ_DST

Ce flag est utilisé par les instructions optionnelles qui nécessitent 3 opérandes. Dans ce cas, le champ DST sert à la fois de source et de destination.

Ce flag implique que les seules formes possibles sont longues.

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 longues qui ignorent le champ snd, comme MOV. Ce champ est alors 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).