Next: Conclusion Up: Jeu d'instructions Previous: Formats des instructions

Instructions

Instructions d'accès à la mémoire

Le MIPS R10000 et l'UltraSPARC possèdent une architecture dite load/store. Seules les instructions load ou store peuvent accéder à la mémoire. Les données doivent être chargées dans des registres avant de pouvoir être utilisées par des opérations.

À l'inverse, un grand nombre d'instructions du PentiumPro peuvent accéder une ou deux de leurs opérandes en mémoire. Cette particularité limite l'usage des instructions de lecture et d'écriture en mémoire.

Instructions d'accès à la mémoire du MIPS R10000


Les instructions load et store transférent des données entre la mémoire et les registres généraux. Le MIPS R10000 implémente des instructions séparées pour chaque type de transfert : transfert de données de différentes tailles (mot, double-mot...), chargement d'entiers signés ou non, accès à des données non alignées en mémoire, différents modes d'adressage... Les instructions de type load et store accèdent des données alignées en mémoire. Dans le cas contraire, elles déclenchent une exception.

L'utilisation d'un sémaphore peut se faire grâce aux instructions Load Linked et Store Conditionnal qui permettent un accès atomique à la mémoire.

Le MIPS R10000 met en oeuvre les modes d'organisation des données big-endian et little-endian.

Instructions d'accès à la mémoire de l'UltraSPARC


Les instructions de transfert de données entre la mémoire et les registres généraux (Load/Store) doivent utiliser une adresse de donnée alignée en mémoire. Dans le cas contraire, une exception est générée (l'instruction est alors émulée par logiciel). Ces instructions transférent des données entières de 8, 16, 32 ou 64 bits. Les instructions de transfert de données flottantes manipulent des données sur 32, 64 ou 128 bits.

L'UltraSPARC met en oeuvre un mode d'organisation des données big-endian pour toutes les instructions. Mais il est possible d'accéder aux données dans le mode d'organisation little-endian.

Instructions d'accès à la mémoire du PentiumPro


Comme sur les architectures RISC, le PentiumPro implémente des instructions de type load/store, mais la plupart des instructions peuvent accéder une de leurs opérandes en mémoire (souvent on a deux accès : en lecture puis en écriture). Les instructions load/store se limitant à la lecture ou à l'écriture d'une donnée en mémoire ont donc une importance moindre que pour les microprocesseurs RISC.

À noter que les déplacements de données d'un emplacement mémoire à un autre sont réalisés par les instructions de déplacement de chaînes de caractères (string operations).

D'autre part, les segments particuliers comme les piles sont adressés par des instructions spécifiques, PUSH et POP. L'instruction PUSH écrit une constante ou le contenu d'un registre à l'emplacement mémoire pointé comme sommet de pile dans le segment <<pile>> courant. L'instruction POP charge dans un registre le contenu du sommet de pile. Ces deux opérations incluent la mise à jour du pointeur de sommet de pile.

Le PentiumPro met en oeuvre un mode d'organisation des données little-endian pour toutes les instructions.

Instructions arithmétiques et logiques de l'unité entière

Les instructions arithmétiques et logiques regroupent l'ensemble des instructions de calcul : multiplication, addition, soustraction, décalage, conversion... Certaines instructions sont particulières à chaque microprocesseur, comme nous le montrons dans les paragraphes suivants. À noter que les trois jeux d'instructions mettent en oeuvre des instructions conditional-move qui permettent d'éviter de nombreux branchements.

Les instructions <<Conditional-move>>


Les instructions conditional-move permettent un déplacement conditionné par le résultat de l'opération précédente (déplacement registre registre). Il y a deux avantages à ces instructions : L'exemple illustre l'utilisation d'un conditional-move pour le calcul de A=min(A,B).

Instructions arithmétiques et logiques entières du MIPS R10000


Il existe quatre types différents d'instructions arithmétiques et logiques qui utilisent deux formats différents (R-type et I-type) :

Instructions arithmétiques et logiques entières de l'UltraSPARC


La plupart des instructions arithmétiques et logiques utilisent trois registres : deux pour les opérandes sources et un pour le résultat. Ces instructions ont généralement deux versions. L'une peut mettre à jour les codes conditions icc et xcc, tandis que l'autre version ne les modifie pas.

Contrairement aux microprocesseurs implémentant la norme SPARC V8, la norme SPARC V9 met en oeuvre des instructions de multiplication et de division utilisant des opérandes sur 64 bits. Bien entendu, les instructions manipulant des données sur 32 bits sont conservées de manière à assurer une compatibilité ascendante.

Instructions arithmétiques et logiques entières du PentiumPro


Le jeu d'instructions du PentiumPro est un jeu d'instructions dit destructeur (à deux opérandes), c'est-à-dire que le résultat d'une opération doit être rangé dans l'un des deux emplacements des opérandes sources. Ceci a pour conséquence de limiter les optimisations possibles par le compilateur et donc de ralentir l'exécution du flot d'instructions.

Par ailleurs, le PentiumPro dispose d'un jeu d'instructions arithmétiques et logiques assez proche des deux autres microprocesseurs, la principale différence résidant dans les modes d'accès aux données. En effet, les instructions entières du PentiumPro peuvent adresser une de leurs deux opérandes en mémoire. En plus des instructions classiques, le PentiumPro possède des instructions sur des décimaux. Elles permettent de convertir les contenus des registres AL et AH dans un des deux formats décimaux. Ces instructions, associées aux instructions arithmétiques binaires, permettent une bonne exécution de codes décimaux. Ainsi, le PentiumPro offre la possibilité de ranger les données en mémoire dans un format décimal.

Instructions de contrôle

Les instructions de contrôle modifient la valeur du compteur ordinal. Ce sont les branchements conditionnels, les branchements inconditionnels, les appels et les retours de procédures. On notera que les branchements peuvent être conditionnels ou non et absolus ou relatifs.

Instructions de contrôle du MIPS R10000


Avatar de la compatibilité binaire, l'architecture MIPS met en oeuvre la technique du branchement retardé. C'est à dire que tous les sauts et branchements sont définis par l'architecture avec un retard d'une instruction (branch delay slot) qui est toujours exécutée. Un branch delay slot ne doit pas lui-même contenir une instruction de branchement ou de saut, sans quoi le résultat de l'opération est indéfini. De plus, les instructions de type Branch likely permettent au compilateur d'insérer dans le delay slot une instruction qui peut être annulée si le branchement n'est pas pris.

Sur le MIPS R10000, le branchement peut être relatif au compteur ordinal (16 bits signés) ou absolu. Lorsque le saut est absolu, les 26 bits du champ immédiat sont décalés deux fois à gauche puis concaténés aux bits de poids fort du compteur ordinal pour obtenir l'adresse absolue de la cible. Lorsque le saut est indirect, l'adresse cible est fournie par le contenu d'un registre.

Comme ses prédécesseurs, le MIPS R10000 procure un test et un branchement conditionnel en une seule instruction, si le test est fait sur les entiers. La condition est soit l'égalité des deux registres, soit la comparaison d'un registre par rapport à zéro (), ceci implique en fait souvent une instruction supplémentaire de soustraction pour la comparaison de deux registres.

Les opérations flottantes affectent des codes conditions. Quand le test est réalisé sur des opérandes flottantes, un registre de code condition est utilisé. Huit codes conditions sont permis. Quatre instructions de branchements dit flottants utilisent ces codes conditions : deux de ces instructions sont des extensions de l'architecture MIPS I (branchement sur codes conditions flottants vrai ou faux) alors que les deux autres sont plutôt des extensions de l'architecture MIPS III.

L'architecture MIPS fournit une instruction d'appel de procédure qui permet d'effectuer simultanément le saut à la procédure appelée et la sauvegarde de l'adresse de retour (adresse de l'instruction qui suit le delay slot) dans le registre R31. Cette instruction est appelée Jump And Link. L'exemple ci-dessous illustre son utilisation. L'utilisation de l'instruction plus classique jr permet de revenir naturellement au programme appelant.

Instructions de contrôle de l'UltraSPARC


La norme SPARC V9 définit plusieurs catégories d'instructions de branchements :

Le jeu d'instructions définit par la norme SPARC V9 met en oeuvre des codes conditions pour les branchements conditionnels. Chaque opération peut produire une série de codes conditions permettant de savoir si le résultat de l'opération est positif, négatif... Ces codes conditions servent notamment pour les instructions de branchements. Un des avantages des codes conditions est qu'il n'est pas nécessaire d'effectuer de comparaisons. Il n'y a donc pas d'instruction de comparaison dans le jeu d'instructions. Pour comparer deux registres, il suffit de faire une soustraction de ces deux registres.

Comme le MIPS R10000, l'UltraSPARC met en oeuvre une technique de branchement retardé. pour certains branchements, l'exécution de l'instruction du delay slot (instruction qui suit le branchement) n'est validée que si le branchement est pris (ou non pris).

Instructions de contrôle du PentiumPro


Les instructions de contrôle du PentiumPro utilisent un déplacement de taille variable. Ce saut peut être inter-segment ou intra-segment. L'adresse cible du saut peut être relative à l'adresse de départ ou absolue.

À noter que les instructions d'appels de procédure sauvegardent l'adresse de retour dans la pile. L'instruction RET de la procédure appelée utilise cette adresse pour revenir au programme appelant.

La condition d'un branchement conditionnel peut être établie par une opération entière située en amont du saut dans le flot d'instructions (analogue aux codes conditions). La condition s'effectue sur le registre de drapeaux EFLAGS. Il n'existe pas d'instruction de branchement sur condition flottante. Les branchements conditionnés par le résultat d'une opération flottante nécessitent le transfert du registre d'état flottant (voir paragraphe ) dans le registre entier AX afin de pouvoir isoler les drapeaux puis effectuer le test (quatre instructions sont alors nécessaires). La condition d'un branchement peut aussi être contenue dans un registre de comptage dont la valeur est décrémentée à chaque saut (instructions Loop While ECX not Equal...).

Instructions pour les langages structurés en blocs

Le jeu d'instructions du PentiumPro intègre des instructions pour les langages structurés en blocs. Ces instructions sont destinées à l'exécution des appels et des retours de procédures. L'instruction ENTER range dans la pile toutes les informations qu'il est nécessaire de conserver avant l'exécution d'une procédure. L'instruction LEAVE réalise l'opération inverse

Instructions flottantes

Instructions flottantes du MIPS R10000


Le jeu d'instructions flottant du MIPS R10000 est classique. La norme MIPS IV définit 8 codes conditions affectés par une instruction de comparaison C.cond.fmt et testés par les instructions de branchement conditionnel flottants.

Le jeu d'instructions flottant du MIPS R10000 intègre des instructions de type multiplication-addition flottante. Ces instructions permettent d'effectuer deux calculs flottants pour une seule instruction.

Instructions flottantes de l'UltraSPARC


Le jeu d'instructions flottant de l'UltraSPARC est classique (addition, multiplication, division, racine carrée, conversion...). Ces instructions utilisent trois registres (deux registres source et un registre destination) excepté les racine carrées et les instructions de conversions qui n'utilisent qu'un registre source et un registre destination.

Instructions flottantes du PentiumPro


Les instructions flottantes du PentiumPro peuvent se diviser en deux catégories. La première comporte toutes les instructions simples : addition, soustraction, multiplication, division, racine carrée... La deuxième catégorie intègre toutes les instructions dites <<transcendentales>> qui réalisent les fonctions trigonométriques, logarithmiques ou hyperboliques.

Toutes les instructions flottantes, du PentiumPro, doivent avoir une de leurs opérandes située en sommet de pile (l'autre étant soit en mémoire, soit dans la pile de registres flottants), ce qui représente un sérieux goulot d'étranglement. L'instruction FXCH permet d'échanger le contenu du sommet de pile avec un des autres éléments de la pile flottante. Cette instruction doit être utilisée dans tous les cas où l'on ne veut pas utiliser le sommet de pile comme l'un des opérandes.

Le format interne des flottants est de 80 bits. Les instructions de transfert de données de la mémoire vers le banc de registres flottants effectuent une conversion implicite flottante 32 ou 64 bits vers 80 bits.

Les instructions de comparaison permettent de comparer le registre de sommet de pile avec une autre opérande. Les codes conditions C0, C2, et C3 du mot d'état sont positionnés. Le mot d'état doit être transféré dans un registre entier afin d'y être testé pour effectuer un branchement conditionnel.

Remarque :

Les jeux d'instructions des trois microprocesseurs incluent l'instruction de racine carrée. À noter que cette instruction n'est plus émulée, car les microprocesseurs intègrent une unité de racine carrée.

Instructions de traitements graphiques

L'UltraSPARC est un microprocesseur d'usage général qui intègre un jeu d'instructions orienté graphique, le Visual Instruction Set (VIS). Ce jeu d'instructions n'est pas défini par la norme SPARC V9. Ces instructions graphiques manipulent des données sur 8, 16 et 32 bits en parallèle. Les opérandes de ces instructions doivent être des registres flottants. Par exemple, huit valeurs de 8 bits (contenues dans le même registre) peuvent être calculées par une seule instruction. Différents types d'instructions : les instructions de conversion (FEXPAND, FPACK16, FPACK32, FPACKPIX) effectuent des conversions entre plusieurs formats de données ; les instructions arithmétiques et logiques (FPADD15...) sont utilisées pour effectuer des opérations sur des pixels ou des groupes de pixels ; les instructions (ALIGNADDR...) calculent des adresses pour des données non-alignées en mémoire ; les instructions d'accès à la mémoire chargent ou sauvegardent des blocs en mémoire.



Next: Conclusion Up: Jeu d'instructions Previous: Formats des instructions


flloansi@IRISA.irisa.fr
Tue Jun 4 09:57:56 MET DST 1996