Ensimag - Filières SLE/ISI Processeur M IPS R3000. Architecture externe et jeu d’instructions M IPS R3000 jeu d’instructions page - 1 Ensimag - Filières SLE/ISI A) Introduction Ce document décrit l’architecture externe ainsi que le jeu d’instructions du processeur M IPS R3000. Le M IPS R3000 est la deuxième génération de processeur de la société M IPS1 , et n’est plus commercialisé aujourd’hui. Son successeur est le R4000 qui lui ressemble fort. Des informations sur cette famille de processeurs, très utilisée dans les applications embarquées et dans les machines parallèle à mémoire partagées, sont disponibles sur le site www.mips.com. L’architecture externe est le niveau d’abstraction nécessaire à l’écriture de programmes assembleur, de la partie génération de code d’un compilateur, et du programmeur de systèmes d’exploitation multi-processus (et/ou multi-tâches). Sont détaillés : – les registres visibles du logiciel ; – l’adressage de la mémoire ; – le jeu d’instruction ; – les mécanismes de traitement des exceptions, interruptions et appels systèmes. L’architecture interne sera décrite en détail durant le cours. B) Notations Par convention, nous utiliserons les notations du langage C pour la description des constantes, et pour la terminologie en général. La description des instructions nécessite également l’introduction de quelques notations : = + − × . . mod and or nor xor memb [a] ← ⇒ k xn xp...q test d’égalité addition entière en complément à deux soustraction entière en complément à deux multiplication entière en complément à deux division entière en complément à deux reste de la division entière en complément à deux opérateur et bit-à-bit opérateur ou bit-à-bit opérateur non-ou bit-à-bit opérateur ou-exclusif bit-à-bit contenu de la mémoire à l’adresse a accédée sur b octets assignation implication concaténation de chaînes de bits réplication du bit x dans une chaîne de n bits. Notons que x est un unique bit sélection des bits p à q de la chaîne de bits x Certains opérateurs n’étant pas évidents, nous donnons ici quelques exemples. 1 M IPS signifie Microprocessor without Interlocked Pipeline Stage. M IPS R3000 jeu d’instructions page - 2 Ensimag - Filières SLE/ISI 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Posons 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 la chaîne de bit x, qui a une longueur de 16 bits, le bit le plus à droite étant le bit de poids faible et de numéro zéro, et le bit le plus à gauche étant le bit de poids fort et de numéro 15. x6...3 est la chaîne 1001. x16 15 crée une chaîne de 16 bits de long dupliquant le bit 15 de x, zéro 16 dans le cas présent. x15 k x15...0 est la valeur 32 bits avec extension de signe d’un immédiat en complément à deux de 16 bits. M IPS R3000 jeu d’instructions page - 3 Ensimag - Filières SLE/ISI C) Architecture externe Le processeur possède deux modes, le mode utilisateur (ou user) pour exécuter les applications, et le mode noyau (ou kernel) pour exécuter le système. Ces 2 modes sont nécessaires à l’exécution sure de plusieurs processus sur un même processeur. 1) Registres visibles du logiciel Les registres du M IPS R3000 visibles du logiciel, c.-à-d. qui sont manipulés par les instructions implicitement ou explicitement, ont tous une taille de 32 bits. Le M IPS R3000 visant par construction l’exécution de multiples processus, des mécanismes de protections sont mis en œuvre pour l’accès aux registres relatifs au système. Ces derniers registres appartiennent à un coprocesseur système dit coprocesseur 0 ou cop0. Les accès à ce coprocesseur ne peuvent avoir lieu qu’en mode noyau. registres du processeur hormis $0 et $31, ils sont identiques du point de vue du matériel, et ils peuvent être accèdes dans les 2 modes. $i , (0 ≤ i ≤ 31) ce sont les registres d’usage général. Les opérandes des instructions et leur(s) résultat(s) y sont placés. Le registre $0 peut être écrit mais retourne toujours 0x00000000 lors de la lecture. Le registre $31 est utilisé implicitement (c.-à-d. que le matériel en impose l’utilisation et qu’il n’apparaît donc pas dans l’instruction) pour sauvegarder l’adresse de retour d’appels de foncions lors des instructions bgezal, bltzal, et jal ; pc , program counter ce registre contient l’adresse de l’instruction à exécuter. Sa valeur est modifiée par toutes les instructions ; ir , instruction register ce registre contient l’instruction en cours d’exécution. Il n’est pas directement accessible hi et lo ces registres contiennent le résultat de la multiplication sur 64 bits, ou le résultat de la division euclidienne (quotient dans lo et reste dans hi). registres du coprocesseur 0 ces registres concernent la gestion des exceptions, interruptions et appels systèmes. badvaddr , bad virtual address ce registre contient l’adresse fautive en cas d’exception de type « adresse illégale » ; status c’est le registre d’état. Il contient les masques d’interruption et le mode ; cause c’est le registre qui contient la cause de l’exception ; M IPS R3000 jeu d’instructions page - 4 Ensimag - Filières SLE/ISI $0 $pc $1 $ir $hi $31 $lo F IG . 1 – Registres généraux du M IPSR3000. epc , exception program counter ce registre contient l’adresse de retour en cas d’interruption et l’adresse de l’instruction fautive en cas d’exception ou d’appel système. Ces registres concernent la gestion de la mémoire virtuelle. TLB , Transaltion Lookaside Buffer c’est la mémoire associative pour la traduction adresse virtuelle vers adresse physique ; index registre contenant l’index de la TLB dans lequel faire les accès ; random registre contenant un index aléatoire valide pour les accès à la TLB ; context registre utilisé partiellement par le logiciel (une partie sert à pointer sur la structure des pages du système d’exploitation) et par le matériel (l’autre partie contient les poids forts de l’adresse fautive lors d’une traduction qui échoue) pour faciliter l’écriture en logiciel de la gestion de la mémoire virtuelle ; entryhi et entrylo valeur à comparer aux entrées de la TLB pour savoir s’il y a une erreur de page (page fault). entryhi 10 TLB entrylo 2 index 0 status 12 random 1 cause 13 context 4 epc 14 badvaddr 8 prid 15 F IG . 2 – Registres du coprocesseur 0 du M IPSR3000. M IPS R3000 jeu d’instructions page - 5 Ensimag - Filières SLE/ISI 2) Adressage mémoire Toutes les adresses émises par le processeur sont des adresses octet (byte), codées sur 32 bits. Le processeur peut lire des instructions (32 bits), des mots (32 bits), des demi-mots (16 bits) et des octets (8 bits). Il peut écrire des mots, des demi-mots et des octets. Les adresses des mots et les instructions doivent être des multiples de 4, et celles des demi-mots doivent être des multiples de 2. Un accès à une adresse non alignée génère une exception. Il n’y a qu’un seul mode d’adressage, qui est le mode « indirect registre ». L’adresse effective est a = $i + offset. Ou $i est n’importe quel registre général et offset un immédiat sur 16 bits étendu de signe. L’immédiat se trouve dans les 16 bits de poids faible du registre ir. La conversion des adresses virtuelles vers les adresses physiques se fait grâce à une table de translation d’adresses totalement associative. Le cache est en adresses physiques. 0xFFFFFFFF kseg2 0xc0000000 0xbFFFFFFF kseg1 0xa0000000 0x9FFFFFFF kseg0 0x80000000 0x7FFFFFFF kuseg 1 Giga octets Traduites Cachées 0.5 Giga octets Non traduites Non cachées 0.5 Giga octets Non traduites Cachées 2 Giga octets Traduites Cachées segment noyau segment utilisateur 0x00000000 F IG . 3 – Segmentation mémoire du M IPSR3000. D) 1) Reset, appels systèmes, interruptions et exceptions Fonctionnement Ces actions passent toutes en mode noyau. Le reset à lieu lors de la mise sous tension du processeur, ou lors de la mise à zéro de la broche reset. Le registre pc prend la valeur 0xbfc00000, les interruptions sont masquées, le registre random prend la valeur du dernier index de la TLB et les interruptions sont masqués par action sur le registre status. Les « appels systèmes » correspondent à des services fournies par le noyau auxquels on accède grâce aux deux instructions syscall et break. Le registre pc prend la valeur 0x80000080, et les interruptions sont masquées. Le registre epc contient l’adresse de l’instruction qui à causé l’appel système. M IPS R3000 jeu d’instructions page - 6 Ensimag - Filières SLE/ISI Int MOD 0x0 0x1 TLBL 0x2 TLBS 0x3 AdEL 0x4 AdES IBE 0x5 0x6 DBE 0x7 Sys Bp RI CpU Ovf 0x8 0x9 0xA 0xB 0xC TAB . 1 – Raisons des déroutements interruption. modification de TLB. Cette exception est levée lorsque que l’adresse virtuelle d’une écriture correspond à une entrée de la TLB marqué non-inscriptible ; rechargement de la TLB. Indique que le système d’exploitation doit recharger la TLB pour effectuer une lecture ; rechargement de la TLB. Indique que le système d’exploitation doit recharger la TLB pour effectuer une écriture ; erreur d’adressage lors de la lecture d’une donnée ou d’une instruction ; erreur d’adressage lors de l’écriture d’une donnée ; erreur lors d’un accès mémoire pour la lecture d’une instruction ; erreur lors d’un accès mémoire pour la lecture ou l’écriture d’une donnée ; appel système ; point d’arrêt ; instruction inconnue (ou réservée) ; tentative avortée d’accès à un coprocesseur ; dépassement de capacité lors d’un calcul arithmétique. Les interruptions matérielles sont des évènements asynchrones déclenchés par la mise à 1 d’une broche du processeur. Il y a 6 broches d’interruption sur le M IPS, et elles sont masquables soit individuellement soit collectivement par action sur le registre status. L’interruption doit être maintenue par le périphérique tant qu’elle n’a pas été acquittée. Le registre pc prend la valeur 0x80000080, et les interruptions sont masquées. L’instruction en cours d’exécution lors d’une interruption est achevée, puis le programme est dérouté. Le registre epc contient l’adresse de l’instruction qui suit l’instruction durant laquelle l’interruption a été levée. Il existe également deux interruptions logicielles, qui sont levées par la mise à 1 d’un bit dans le registre cause, et donc le comportement est identique aux interruptions matérielles. Les exceptions sont des évènements synchrones liés à la mauvaise exécution d’une instruction. Le registre pc prend la valeur 0x80000080 dans le cas général, ou 0x80000000 dans certain cas particulier liés à la gestion de la mémoire virtuelle. les interruptions sont masquées, et le registre epc contient l’adresse de l’instruction fautive, ce qui permet d’émettre des diagnostiques. Si une des ces actions à lieu dans une instruction qui suit un branchement, ce n’est pas l’adresse de l’instruction qui est mise dans epc, mais celle du branchement, et le bit bd du registre cause est mis à 1. 2) Détail des registres liés aux exceptions autres que celles relatives à la gestion de la mémoire virtuelle Ces registres ne sont accessibles que par les instructions mfc0 et mtc0, qui elles mêmes ne sont utilisables qu’en mode noyau. Les registres ci-dessous sont mis à jour lors d’un déroutement. Les mécanismes à mettre en œuvre lorsque la gestion de la mémoire virtuelle est concernée sont complémentaires, et présentés dans la section suivante. M IPS R3000 jeu d’instructions page - 7 Ensimag - Filières SLE/ISI Registre status($12 du coprocesseur 0, accessible en lecture/écriture) 31 30 29 28 CU3 CU2 CU1 CU0 27 26 25 24 23 22 21 20 19 18 17 16 0 BEV 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 HIM5 HIM4 HIM3 HIM2 HIM1 HIM0 SIM1 SIM0 0 KUo IEo KUp IEp KUc IEc CUi coprocessor usable. Ces 4 bits sont des bits de présence des coprocesseurs. Le M IPSde base n’en comporte qu’un, CP0. D’autres implantations peuvent en avoir jusqu’à trois autres. Un bit à 1 indique que le coprocesseur est utilisable ; BEV bootstrap exception vector. Ce bit définit l’adresse du gestionnaire d’interruption. Les différents cas, en fonction de BEV et de la cause du déroutement sont tabulés ici. BEV cause adresse x reset 0xbfc00000 0 !reset && !TLB refill 0x80000080 0 !reset && TLB refill 0x80000000 1 !reset && !TLB refill 0xbfc00180 1 !reset && TLB refill 0xbfc00100 HIMi , SIMi hardware and software interrupt mask. Ces bits contrôlent individuellement le fait qu’une certaine ligne d’interruption puisse interrompre le processeur. Un et logique avec les bits d’interruption en attente dans le registre cause permet au logiciel de connaître les interruptions actives. Un bit à 1 autorise l’interruption ; KU kernet/user. Indique le mode d’exécution. Un 0 indique le mode noyau, un 1 le mode utilisateur ; IE interrupt enable. Autorise ou inhibe toutes les interruptions. Un 0 masque les interruptions, un 1 les autorise. Lors d’un déroutement, le registre status est modifié par le matériel. Les bits KUo et IEo sont perdus. Les bits KUp et IEp sont copiés dans KUo et IEo . Les bits KUc et IEc sont copiés dans KUp et IEp . Les bits KUc et IEc sont mis à zéro. Le suffixe indique donc le niveau d’imbrication des déroutements : c signifie current, p previous et o old. L’opération à peu près inverse est effectuée sur le registre status lors de l’exécution de l’instruction rfe : les bits KUp et IEp sont copiés dans KUc et IEc , et les bits KUo et IEo sont copiés dans KUp et IEp . Registre cause($13 du coprocesseur 0, accessible en lecture) 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 BD 0 CE 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 HIP5 HIP4 HIP3 HIP2 HIP1 HIP0 SIP1 SIP0 0 EXCODE 0 BD branch delay. Ce bit est à 1 si l’exception ou l’interruption a été levée dans le delayed slot d’un branchement ; CE coprocessor error. Indique le numéro du coprocesseur en erreur sur une exception de type CpU ; HIPi , SIPi hardware and software interrupt pending. Ces bits reflètent l’état des lignes d’interruption. Un et logique avec les bits de masque d’interruption du registre status permet au logiciel de connaître les interruptions actives. Un 1 signifie que l’interruption est présente sur la ligne ; EXCODE exception code. Code indiquant la raison pour laquelle le déroutement a eu lieu. La valeur du code sur 4 bits est donnée par la table 1. Registre epc($14 du coprocesseur 0, accessible en lecture) 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 EPC M IPS R3000 jeu d’instructions page - 8 Ensimag - Filières SLE/ISI EPC exception program counter. Ce registre contient l’adresse à laquelle doit reprendre l’exécution après une interruption. Pour les exceptions, il contient soit l’adresse de l’instruction qui a causé l’interruption, si le bit BD du registre cause est à zéro, soit l’adresse du branchement qui précède immédiatement cette instruction si BD est à 1. Registre badvaddr($8 du coprocesseur 0, accessible en lecture) 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 BVA BVA bad virtual address. Ce registre contient l’adresse à laquelle doit reprendre l’exécution après une interruption. Pour les exceptions, il contient soit l’adresse de l’instruction qui a causé l’interruption, si le bit BD du registre cause est à zéro, soit l’adresse du branchement qui précède immédiatement cette instruction si BD est à 1. E) Gestion de la mémoire virtuelle La gestion de la mémoire virtuelle est intimement liée aux exceptions, car la possibilité d’exécuter du code est directement lié à la présence physique des données et des instructions, et ne doit en rien être visible du programmeur d’applications. Le chargement des pages doit donc être géré de manière transparente vis-à-vis du programme qui s’exécute par le système d’exploitation. L’objectif de la mémoire virtuelle est de rendre disponible à un programme donné tout l’espace adressable par le M IPS, même si la mémoire physique est d’une part partagée par plusieurs programmes et d’autre part de taille inférieure à 232 (ou 264 sur les machines 64 bits). Il y a donc 2 idées derrière la mémoire virtuelle : 1. pouvoir partager l’espace mémoire physique entre divers processus sans qu’ils se perturbent les uns les autres (c’est la différence entre un process et un thread dans l’acception Unixienne de ces termes) ; 2. rendre accessible la totalité de l’espace adressable à un processus. Pour ce faire, a) la mémoire (physique ou virtuelle) est découpée en pages, b) chaque processus reçoit un identifiant unique parmi tous les processus connus du processeur, et c) le disque est utilisé pour sauver les pages de mémoire physique qui sont utilisées plusieurs fois à des dates différentes (qu’elles appartiennent au même processus ou à différents processus). La traduction associe, à un instant t, une adresse (de page) physique à un couple (identifiant de processus, adresse (de page) virtuelle). Dans le M IPSR3000, les mécanismes nécessaires pour garantir la gestion cohérente de ces traductions (par ex., s’il n’y a plus de pages physiques libres, il faut en évincer une sur le disque (le swap) et la réaffecter temporairement à un nouveau couple ((identifiant de processus, adresse virtuelle)) reposent complètement sur le logiciel. Ces aspects seront étudiés dans le cours de Système d’exploitation. Néanmoins, comme l’exécution doit être transparente aux programmes applicatifs, le matériel doit détecter l’absence d’une page en mémoire physique et donner suffisamment d’information au système d’exploitation pour effectuer sa gestion de manière cohérente. Pour ce faire, le M IPSR3000 possède une table de traduction (Translation Lookaside Buffer ou TLB) de 64 entrées de 64 bits. Cette table permet d’associer une adresse de page physique à un couple (identifiant de processus, adresse virtuelle). Il se peut que, vu sa petite taille, la table ne contienne pas l’information nécessaire à la traduction. Dans ce cas une exception de type TLB refill (TLBL ou TLBS) est levée, et c’est au M IPS R3000 jeu d’instructions page - 9 Ensimag - Filières SLE/ISI système d’exploitation d’aller la mettre à jour. Notez que le système peut lui même avoir une des pages le concernant évincée, ce qui va lever un nouveau TLB refill durant la gestion du précédent TLB refill. Le support spécifique fourni par le M IPSdans ce cas est que l’adresse du gestionnaire d’exception est différente dans les 2 cas, car l’écriture d’un gestionnaire de rechargement réentrant n’est simplement pas possible, puisque ce sont des variables globales qui sont utilisées. Format du couple (identifiant, adresse virtuelle) : 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 ASID 8 VPN 7 6 5 4 3 2 1 0 OFFSET ASID address space identifier. L’identifiant du processus dont il est question ici n’est pas le process id obtenu par getpid (2), mais un nombre sur 6 bits (car log2 64 = 6) calculé par le système d’exploitation uniquement pour la gestion de la TLB ; VPN virtual page number. Ces 20 bits représentent le numéro de page virtuelle. Il y a donc 220 , soit 1 Mega, pages virtuelles. Les 3 bits de poids fort de l’adresse définissent le type de traduction à effectuer (voir la figure 3). Les adresses dans les segments kseg0 et kseg1 ne subissent pas la traduction d’adresse standard. Une adresse a de kseg0 sera émise sur le bus comme a - Ox80000000, et une adresse a de kseg1 sera émise sur le bus comme a - Oxa0000000 ; OFFSET ces 12 bits représentent le déplacement dans la page sont passés sans modification sur le bus mémoire. La taille de la page est de 212 , soit 4 Kilo. Les entrées de la TLB sont sur 64 bits, et correspondent à la concaténation des registres entryhi et entrylo. Ne sont donc ici décrit que ces 2 registres. Registre entryhi($10 du coprocesseur 0, accessible en lecture/écriture) : 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 VPN 8 7 6 5 4 3 ASID 2 1 0 0 VPN virtual page number. Les 20 bits de poids fort de l’adresse virtuelle ; ASID address space identifier. L’identifiant du processus qui permet de savoir si deux adresses virtuelles identiques appartiennent à deux processus différents ou non. Registre entrylo($2 du coprocesseur 0, accessible en lecture/écriture) : 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 PFN 8 7 6 5 NDVG 4 3 2 1 0 0 PFN page frame number. Les 20 bits de poids fort de l’adresse physique. Si la traduction d’adresse est valide, alors les bits de PFN sont substitué à ceux de VPN dans le cycle ; N non cachable. L’accès mémoire se fait sans passer par le cache ; D dirty. Si ce bit est à 0, la page est protégée en écriture, et un accès en écriture dans la page lèvera l’exception MOD. Ceci permet au système d’exploitation de gérer des zones en lecture seulement (comme le code ou les constantes d’un programme par exemple) ; V valid. Indique que l’entrée dans la TLB est valide. Si ce bit est à zéro, une exception de type TLBS ou TLBL est levée ; G global. La translation d’adresse se fait en ignorant purement et simplement le champs ASID lors de la traduction. Registre index($0 du coprocesseur 0, accessible en lecture/écriture) : 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 PF 0 INDEX 8 7 6 5 4 3 2 1 0 0 PF probe failure. Ce bit est mis à un si l’instruction tlbp n’a pas détecté d’entrée valide dans la TLB ; M IPS R3000 jeu d’instructions page - 10 Ensimag - Filières SLE/ISI INDEX index de l’entrée de la TLB qui sera affectée par les instructions tlbr et tlbw. Registre random($1 du coprocesseur 0, accessible en lecture) : 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 0 RANDOM 8 7 6 5 4 3 2 1 0 0 RANDOM index de l’entrée de la TLB qui sera affectée par l’instruction tlbwr. Cet index est compris entre 8 et 63. Les 7 premiers index peuvent donc être réservés à des usages spécifiques par le système d’exploitation. M IPS R3000 jeu d’instructions page - 11 Ensimag - Filières SLE/ISI F) Instructions Une instruction M IPSest un mot de 32 bits. Il y a trois catégories (formats) d’instruction : 31 2625 2120 1615 Format R : opcode rs rt Format I : opcode rs rt 1110 rd 65 sh 0 func imm16 Format J : opcode imm26 Dans ce qui suit, nous notons rd la valeur du champs rd, c’est à dire un entier entre 0 et 31 car rd est codé sur 5 bits, et indiquons par $rd le registre indexé par ce champs. Si $rd est le membre de gauche d’une affectation, alors nous en imposons la valeur, si il fait parti du membre de droite, nous en lisons la valeur. Nous ne pouvons en aucun cas modifier rd qui est une constante décidée lors de la compilation. Notons qu’un registre source peut être le registre destination d’une même instruction assembleur. Un opérande immédiat sera noté imm, et sa taille sera spécifié dans la description de l’instruction. Les instructions de saut prennent comme argument une étiquette, où label, qui est utilisée pour calculer l’adresse de saut. Toutes les instructions modifient implicitement ou explicitement un registre non accessible du logiciel, le program counter noté $pc. Pour lever l’ambiguïté liée aux calculs des sauts relatifs au $pc, nous noterons que l’adresse de l’instruction en cours d’exécution est toujours égale à $pc − 4, car $pc est incrémenté (pour passer à l’instruction suivante) en même temps que l’instruction à exécutée est chargée. Le $pc à droite d’une affectation est donc toujours égal à l’adresse de l’instruction courante plus 4. Attention : le M IPS R3000 est un processeur pipeline tel que l’instruction qui suit un branchement (relatif ou absolu) est toujours exécutée. On appel cet emplacement le delay slot et on dit que le branchement effectif est retardé d’une instruction. Le résultat d’une multiplication ou d’une division est mis dans deux registres spéciaux, $hi pour les poids forts (multiplication) ou le reste (division), et $lo pour les poids faibles (multiplication) ou le quotien (division). add format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 100000 action Addition registre registre signée syntaxe add $rd, $rs, $rt description Les contenus des registres $rs et $rt sont ajoutés pour former un résultat sur 32 bits qui est placé dans le registre $rd. opération $rd ← $rs + $rt exception génération d’une exception si dépassement de capacité. addi M IPS R3000 jeu d’instructions page - 12 Ensimag - Filières SLE/ISI format 31 26 25 001000 21 20 rs 16 15 0 rt imm16 action Addition registre immédiat signée syntaxe addi $rt, $rs, imm description La valeur immédiate sur 16 bits subit une extension de signe, et est ajoutée au contenu du registre $rs pour former un résultat sur 32 bits qui est placé dans le registre $rt. Cette instruction est aussi utilisée pour faire une soustraction en utilisant un immédiat dont le bit de poids (15) fort est à 1. opération $rt ← imm16 15 k imm15...0 + $rs exception génération d’une exception si dépassement de capacité. addiu format 31 26 25 001001 21 20 rs 16 15 0 rt imm16 action Addition registre immédiat non-signée syntaxe addiu $rt, $rs, imm description La valeur immédiate sur 16 bits subit une extension de signe, et est ajoutée au contenu du registre $rs pour former un résultat sur 32 bits qui est placé dans le registre $rt. Cette instruction est aussi utilisée pour faire une soustraction en utilisant un immédiat dont le bit de poids (15) fort est à 1. opération $rt ← imm16 15 k imm15...0 + $rs addu format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 100001 action Addition registre registre non-signée syntaxe addu $rd, $rs, $rt description Les contenus des registres $rs et $rt sont ajoutés pour former un résultat sur 32 bits qui est placé dans le registre $rd. opération $rd ← $rs + $rt and M IPS R3000 jeu d’instructions page - 13 Ensimag - Filières SLE/ISI format 31 26 25 000000 21 20 16 15 rs rt 11 10 rd 6 5 00000 0 100100 action Et bit-à-bit registre registre syntaxe and $rd, $rs, $rt description Un et bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé dans le registre $rd. opération $rd ← $rs and $rd andi format 31 26 25 001100 21 20 rs 16 15 rt 0 imm16 action Et bit-à-bit registre immédiat syntaxe andi $rt, $rs, imm description La valeur immédiate sur 16 bits subit une extension de zéros. Un et bit-à-bit est effectué entre cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le registre $rt. opération $rt ← 016 k imm and $rs beq format 31 26 25 000100 21 20 rs 16 15 rt 0 imm16 action Branchement si registre égal registre syntaxe beq $rs, $rt, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Le contenu des registres $rs et $rt sont comparés. S’ils sont égaux, le programme saute à l’adresse précédemment calculée. opération 2 $addr ← $pc + imm14 15 k imm k 0 $rs = $rt ⇒ $pc ← $addr bgez format 31 26 25 000001 21 20 rs M IPS R3000 jeu d’instructions 16 15 00001 0 imm16 page - 14 Ensimag - Filières SLE/ISI action Branchement si registre supérieur ou égal à zéro syntaxe bgez $rs, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $rs a son bit de signe à zéro, le programme saute à l’adresse précédemment calculée. opération 2 $addr ← $pc + imm14 15 k imm k 0 $rs31 = 0 ⇒ $pc ← $addr bgezal format 31 26 25 000001 21 20 rs 16 15 10001 0 imm16 action Branchement à une fonction si registre supérieur ou égal à zéro syntaxe bgezal $rs, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Inconditionnellement, l’adresse de l’instruction suivant le bgezal est sauvée dans le registre $31. Si le contenu du registre $rs à son bit de signe à zéro, le programme saute à l’adresse précédemment calculée. opération 2 $addr ← $pc + imm14 15 k imm k 0 $31 ← $pc $rs31 = 0 ⇒ $pc ← $addr bgtz format 31 26 25 000111 21 20 rs 16 15 00000 0 imm16 action Branchement si registre strictement supérieur à zéro syntaxe bgtz $rs, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $ri à son bit de signe à zéro et qu’il ne vaut pas zéro, le programme saute à l’adresse précédemment calculée. opération 2 $addr ← $pc + imm14 15 k imm k 0 $rs31 = 0 ∧ $rs 6= 0 ⇒ $pc ← $addr M IPS R3000 jeu d’instructions page - 15 Ensimag - Filières SLE/ISI blez format 31 26 25 000110 21 20 rs 16 15 00000 0 imm16 action Branchement si registre inférieur ou égal à zéro syntaxe blez $rs, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $rs à son bit de signe à un et qu’il ne vaut pas zéro, le programme saute à l’adresse précédemment calculée. opération 2 $addr ← $pc + imm14 15 k imm k 0 $rs31 = 1 ∧ $rs 6= 0 ⇒ $pc ← $addr bltz format 31 26 25 000001 21 20 rs 16 15 00000 0 imm16 action Branchement si registre strictement inférieur à zéro syntaxe bltz $rs, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $rs à son bit de signe à zéro, le programme saute à l’adresse précédemment calculée. opération 2 $addr ← $pc + imm14 15 k imm k 0 $rs31 = 1 ⇒ $pc ← $addr bltzal format 31 26 25 000001 21 20 rs 16 15 10000 0 imm16 action Branchement à une fonction si registre supérieur ou égal à zéro syntaxe bltzal $rs, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Inconditionnellement, l’adresse de l’instruction suivant le bgezal est sauvée dans le registre $31. Si le contenu du registre $rs à son bit de signe à un, le programme saute à l’adresse précédemment calculée. M IPS R3000 jeu d’instructions page - 16 Ensimag - Filières SLE/ISI opération 2 $addr ← $pc + imm14 15 k imm k 0 $31 ← $pc $rs31 = 1 ⇒ $pc ← $addr bne format 31 26 25 000101 21 20 rs 16 15 0 rt imm16 action Branchement si registre différent de registre syntaxe bne $rs, $rt, imm description L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immédiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Le contenu des registres $rs et $rt sont comparés. S’ils sont différents, le programme saute à l’adresse précédemment calculée. opération 2 $addr ← $pc + imm14 15 k imm k 0 $rs 6= $rt ⇒ $pc ← $addr break format 31 26 25 6 5 000000 code 0 001101 action Arrêt et saut à la routine d’exception syntaxe break code description Un point d’arrêt est detecté, et le programme saute à l’adresse de la routine de gestion des exceptions. Le champs code est utilisable par le logiciel pour identifier le type de point d’arrêt. opération pc ← 0x80000080 exception Déclenchement d’une exception de type point d’arrêt. div format 31 26 25 000000 21 20 rs 16 15 rt 6 5 0000000000 0 011010 action Division entière et reste signé registre registre syntaxe div $rs, $rt M IPS R3000 jeu d’instructions page - 17 Ensimag - Filières SLE/ISI description Le contenu du registre $rs est divisé par le contenu du registre $rt, le contenu des deux registres étant considéré comme des nombres en complément à deux. Le résultat de la division est placé dans le registre spécial $lo, et le reste dans $hi. La division est une opération multicycles. opération $lo ← $rs $rt $hi ← $rs mod $rt divu format 31 26 25 000000 21 20 rs 16 15 6 5 rt 0000000000 0 011011 action Division entière et reste non-signé registre registre syntaxe divu $rs, $rs description Le contenu du registre $rs est divisé par le contenu du registre $rt, le contenu des deux registres étant considéré comme des nombres non signés. Le résultat de la division est placé dans le registre spécial $lo, et le reste dans $hi. opération $lo ← 0k$rs 0k$rt $hi ← 0 k $rs mod 0 k $rt j format 31 26 25 000010 0 imm26 action Branchement inconditionnel immédiat syntaxe j imm description L’adresse de saut est calculée à partir de la valeur immédiate sur 26 bits, décalée à gauche de 2 bits, en recopiant les bits 32 à 28 du $pc de l’instruction courante. Le programme saute inconditionnellement à l’adresse ainsi calculée. opération $pc ← $pc31...28 k imm k 02 jal format 31 26 25 000011 0 imm26 action Appel de fonction inconditionnel immédiat syntaxe jal imm M IPS R3000 jeu d’instructions page - 18 Ensimag - Filières SLE/ISI description L’adresse de saut est calculée à partir de la valeur immédiate sur 26 bits, décalée à gauche de 2 bits, en recopiant les bits 32 à 28 du $pc de l’instruction courante. L’adresse de l’instruction suivant le jal est sauvée dans le registre $31. Le programme saute inconditionnellement à l’adresse ainsi calculée. opération $31 ← $pc $pc ← $pc31...28 k imm k 02 jalr format 31 26 25 000000 21 20 rs 16 15 00000 11 10 rd 6 5 00000 0 001001 action Appel de fonction inconditionnel registre syntaxe jalr $rs ou jalr $rd, $rs description Le programme saute à l’adresse contenue dans le registre $rs. L’adresse de l’instruction suivant le jalr est sauvée dans le registre $rd. Si le registre $rd n’est pas spécifié, alors l’assembleur y mettra par défaut le registre $31. Attention, l’adresse contenue dans le registre $rs doit être aligné sur une frontière de mots. opération $rd ← $pc $pc ← $rs jr format 31 26 25 000000 21 20 6 5 rs 000000000000000 0 001000 action Branchement inconditionnel registre syntaxe jr $rs description Le programme saute à l’adresse contenue dans le registre $ri. Attention, cette adresse doit être aligné sur une frontière de mots. opération $pc ← $rs lb format 31 26 25 100000 21 20 rs 16 15 rt 0 imm16 action Lecture d’un octet signé de la mémoire M IPS R3000 jeu d’instructions page - 19 Ensimag - Filières SLE/ISI syntaxe lb $rt, imm($rs) description L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. Le contenu de cette adresse subit une extension de signe et est ensuite placé dans le registre $rt. opération $rt ← mem1 [imm + $rs]24 7 k mem1 [imm + $rs]7...0 exception – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ; – Mémoire inexistante à l’adresse de chargement. lbu format 31 26 25 100100 21 20 rs 16 15 rt 0 imm16 action Lecture d’un octet non-signé de la mémoire syntaxe lbu $rt, imm($rs) description L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. Le contenu de cette adresse est étendu avec des zéro et est ensuite placé dans le registre $rt. opération $rt ← 024 k mem1 [imm + $rs]7...0 – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ; – Mémoire inexistante à l’adresse de chargement. lh format 31 26 25 100001 21 20 rs 16 15 rt 0 imm16 action Lecture d’un demi-mot signé de la mémoire syntaxe lh $rt, imm($rs) description L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. Le contenu de cette adresse subit une extension de signe et est ensuite placé dans le registre $rt. Attention, le bit de poids faible de l’adresse résultante doit être à zéro. opération $rt ← mem2 [imm + $rs]16 15 k mem2 [imm + $rs]15...0 M IPS R3000 jeu d’instructions page - 20 Ensimag - Filières SLE/ISI exceptions – Adresse non alignée sur une frontière de demi-mot. ; – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ; – Mémoire inexistante à l’adresse de chargement. lhu format 31 26 25 100101 21 20 rs 16 15 rt 0 imm16 action Lecture d’un demi-mot non-signé de la mémoire syntaxe lhu $rt, imm($rs) description L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. Le contenu de cette adresse est étendu avec des zéro et est ensuite placé dans le registre $rt. Attention, le bit de poids faible de l’adresse résultante doit être à zéro. opération $rt ← 016 k mem2 [imm + $rs]15...0 exceptions – Adresse non alignée sur une frontière de demi-mot. ; – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ; – Mémoire inexistante à l’adresse de chargement. lui format 31 26 25 001111 21 20 00000 16 15 rt 0 imm16 action Lecture d’une constante dans les poids forts syntaxe lui $rt, imm description La constante immédiate de 16 bits est décalée de 16 bits à gauche, et est complétée de zéro. La valeur ainsi obtenue est placée dans $rt. opération $rt ← imm k 016 lw format 31 26 25 100011 21 20 rs 16 15 rt 0 imm16 action Lecture d’un mot de la mémoire M IPS R3000 jeu d’instructions page - 21 Ensimag - Filières SLE/ISI syntaxe lw $rt, imm($rs) description L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. Le contenu de cette adresse est placé dans le registre $rt. Attention, les deux bits de poids faible de l’adresse résultante doivent être à zéro. opération $rt ← mem4 [imm + $rs] exceptions – Adresse non alignée sur une frontière de mot ; – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ; – Mémoire inexistante à l’adresse de chargement. mfc0 format 31 26 25 010000 21 20 00000 16 15 rt 11 10 0 rd 0000000000 action Copie d’un registre spécialisé dans d’un registre général syntaxe mfc0 $rt, $rd description Le contenu du registre spécialisé $rd — non directement accessible au programmeur — est recopié dans le registre général $rt. Les registres possibles pour $rd sont ceux du coprocesseur 0 qui servent à la gestion des exceptions et interruptions. opération $rt ← copro0 [$rd] exception – Utilisation de l’instruction en mode utilisateur. mfhi format 31 26 25 000000 16 15 0000000000 11 10 rd 6 5 00000 0 010000 action Copie le registre $hi dans un registre général syntaxe mfhi $rd description Le contenu du registre spécialisé $hi — qui est mis à jour par l’opération de multiplication ou de division — est recopié dans le registre général $rd. opération $rd ← $hi M IPS R3000 jeu d’instructions page - 22 Ensimag - Filières SLE/ISI mflo format 31 26 25 16 15 000000 0000000000 11 10 rd 6 5 00000 0 010010 action Copie le registre $lo dans un registre général syntaxe mflo $rd description Le contenu du registre spécialisé $lo — qui est mis à jour par l’opération de multiplication ou de division — est recopié dans le registre général $rd. opération $rd ← $lo mtc0 format 31 26 25 010000 21 20 00100 16 15 rt 11 10 rd 0 0000000000 action Copie d’un registre général dans un registre spécialisé syntaxe mtc0 $rt, $rd description Le contenu du registre général $rt est recopié dans le registre spécialisé $rd — non directement accessible au programmeur —. Ces registres sont ceux du coprocesseur 0 qui servent à la gestion des exceptions et interruptions. opération copro0 [$rd] ← $rt mthi format 31 26 25 000000 21 20 rs 6 5 000000000000000 0 010001 action Copie d’un registre général dans le registre $hi syntaxe mthi $rs description Le contenu du registre général $rs est recopié dans le registre spécialisé $hi. opération $hi ← $rs mtlo format 31 26 25 000000 21 20 rs M IPS R3000 jeu d’instructions 6 5 000000000000000 0 010011 page - 23 Ensimag - Filières SLE/ISI action Copie d’un registre général dans le registre $lo syntaxe mtlo $rs description Le contenu du registre général $rs est recopié dans le registre spécialisé $lo. opération $lo ← $rs mult format 31 26 25 000000 21 20 rs 16 15 rt 6 5 0000000000 0 001110 action Multiplication signé registre registre syntaxe mult $rs, $rt description Le contenu du registre $rs est multiplié par le contenu du registre $rs, le contenu des deux registres étant considéré comme des nombres en complément à deux. Les 32 bits de poids fort du résultat sont placés dans le registre $hi, et les 32 bits de poids faible dans $lo. La multiplication est une opération multicycles. opération $lo ← ($rs × $rt)31...0 $hi ← ($rs × $rt)63...32 multu format 31 26 25 000000 21 20 rs 16 15 rt 6 5 0000000000 0 011000 action Multiplication signé registre registre syntaxe multu $rs, $rt description Le contenu du registre $rs est multiplié par le contenu du registre $rt, le contenu des deux registres étant considéré comme des nombres non-signés. Les 32 bits de poids fort du résultat sont placés dans le registre $hi, et les 32 bits de poids faible dans $lo. La multiplication est une opération multicycles. opération $lo ← (0 k $rs × 0 k $rt)31...0 $hi ← (0 k $rs × 0 k $rt)63...32 nor format 31 26 25 000000 21 20 rs M IPS R3000 jeu d’instructions 16 15 rt 11 10 rd 6 5 000000 0 00000 100111 page - 24 Ensimag - Filières SLE/ISI action Non-ou bit-à-bit registre registre syntaxe nor $rd, $rs, $rt description Un non-ou bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé dans le registre $rd. opération $rd ← $rs nor $rt or format 31 26 25 21 20 000000 rs 16 15 rt 11 10 rd 6 5 000000 0 00000 100101 action Ou bit-à-bit registre registre syntaxe or $rd, $rs, $rt description Un ou bit-à-bit est effectué entre les contenus des registres $rs et $rs. Le résultat est placé dans le registre $rd. opération $rd ← $rs or $rt ori format 31 26 25 21 20 001101 rs 16 15 rt 0 imm16 action Ou bit-à-bit registre immédiat syntaxe ori $rt, $rs, imm description La valeur immédiate sur 16 bits subit une extension de zéros. Un ou bit-à-bit est effectué entre cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le registre $rt. opération $rt ← (016 k imm) or $rs rfe format 31 26 25 010000 24 1 6 5 00000000000000000000 0 010000 action Restauration des bits d’état en fin d’exception syntaxe rfe M IPS R3000 jeu d’instructions page - 25 Ensimag - Filières SLE/ISI description Recopie les anciennes valeurs des bits de masques d’interruption et de mode (noyau ou utilisateur) du registre d’état — un des registres spécialisé — à la valeur qu’il avait avant l’exécution du programme d’exception courant. opération $sr ← $sr31...4 k $sr5...2 exception Utilisation de l’instruction en mode utilisateur. sb format 31 26 25 101000 21 20 rs 16 15 rt 0 imm16 action Écriture d’un octet en mémoire syntaxe sb $rt, imm($rs) description L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. L’octet de poids faible du registre $rt est écrit à l’adresse ainsi calculée. opération mem1 [imm + $rs] ← $rt7...0 exceptions – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ; – Mémoire inexistante à l’adresse de chargement. sh format 31 26 25 101001 21 20 rs 16 15 rt 0 imm16 action Écriture d’un demi-mot en mémoire syntaxe sh $rt, imm($rs) description L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. Les deux octets de poids faible du registre $rt sont écrit à l’adresse ainsi calculée. Le bit de poids faible de cette adresse doit être à zéro. opération mem2 [imm + $rs] ← $rt15...0 exceptions – Adresse non alignée sur une frontière de demi-mot ; M IPS R3000 jeu d’instructions page - 26 Ensimag - Filières SLE/ISI – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ; – Mémoire inexistante à l’adresse de chargement. sll format 31 26 25 000000 21 20 00000 16 15 rt 11 10 rd 6 5 shamt 0 000000 action Décalage à gauche immédiat syntaxe sll $rd, $rt, shamt description Le registre $rt est décalé à gauche de la valeur immédiate codée sur 5 bits, des zéros étant introduits dans les bits de poids faibles. Le résultat est placé dans le registre $rd. opération $rd ← $rt31−shamt...0 k 0shamt sllv format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 000100 action Décalage à gauche registre syntaxe sllv $rd, $rt, $rs description Le registre $rt est décalé à gauche du nombre de bits spécifiés dans les 5 bits de poids faibles du registre $rs, des zéros étant introduits dans les bits de poids faibles. Le résultat est placé dans le registre $rr. opération $rd ← $rt31−$rs4...0 ...0 k 0$rs4...0 slt format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 101010 action Comparaison signée registre registre syntaxe slt $rd, $rs, $rt description Le contenu du registre $rs est comparé au contenu du registre $rt, les deux valeurs étant considérées comme des quantités signées. Si la valeur contenue dans $rs est inférieure à celle contenue dans $rt, alors $rd prend la valeur un, sinon il prend la valeur zéro. opération $rs < $rt ⇒ $rd ← 031 k 1 $rs ≥ $rt ⇒ $rd ← 032 M IPS R3000 jeu d’instructions page - 27 Ensimag - Filières SLE/ISI slti format 31 26 25 001010 21 20 rs 16 15 0 rt imm16 action Comparaison signée registre immédiat syntaxe slti $rt, $rs, imm description Le contenu du registre $rs est comparé à la valeur immédiate sur 16 bits qui à subit une extension de signe. Les deux valeurs étant considérées comme des quantités signées, si la valeur contenue dans $rs est inférieure à celle de l’immédiat étendu, alors $rt prend la valeur un, sinon il prend la valeur zéro. opération 31 $rs < imm16 k1 15 k imm ⇒ $rt ← 0 16 $rs ≥ imm15 k imm ⇒ $rt ← 032 sltiu format 31 26 25 001011 21 20 rs 16 15 0 rt imm16 action Comparaison non-signée registre immédiat syntaxe sltiu $rt, $rs, imm description Le contenu du registre $rs est comparé à la valeur immédiate sur 16 bits qui à subit une extension de signe. Les deux valeurs étant considérées comme des quantités non-signées, si la valeur contenue dans $rs est inférieur à celle de l’immédiat étendu, alors $rt prend la valeur un, sinon il prend la valeur zéro. opération 31 0 k $rs < 0 k imm16 k1 15 k imm ⇒ $rt ← 0 16 0 k $rs ≥ 0 k imm15 k imm ⇒ $rt ← 032 sltu format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 101011 action Comparaison non-signée registre registre syntaxe sltu $rd, $rs, $rt description Le contenu du registre $rs est comparé au contenu du registre $rt, les deux valeurs étant considérés comme des quantités non-signées. Si la valeur contenue dans $rs est inférieur à celle contenue dans $rt, alors $rd prend la valeur un, sinon il prend la valeur zéro. M IPS R3000 jeu d’instructions page - 28 Ensimag - Filières SLE/ISI opération 0 k $rs < 0 k $rt ⇒ $rd ← 031 k 1 0 k $rs ≥ 0 k $rt ⇒ $rd ← 032 sra format 31 26 25 000000 21 20 00000 16 15 rt 11 10 rd 6 5 shamt 0 000011 action Décalage à droite arithmétique immédiat syntaxe sra $rd, $rt, shamt description Le registre $rt est décalé à droite de la valeur immédiate codée sur 5 bits, le bit de signe du registre étant introduit dans les bits de poids fort. Le résultat est placé dans le registre $rd. opération $rd ← $rtimm k $rt31...imm 31 srav format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 000111 action Décalage à droite arithmétique registre syntaxe srav $rd, $rt, $rs description Le registre $rt est décalé à droite du nombre de bits spécifiés dans les 5 bits de poids faible du registre $rs, le signe de $rt étant introduit dans les bits de poids fort ainsi libérés. Le résultat est placé dans le registre $rd. opération $rs4...0 $rd ← $rt31 k $rt31...$rs4...0 ...0 srl format 31 26 25 000000 21 20 00000 16 15 rt 11 10 rd 6 5 shamt 0 000010 action Décalage à droite logique immédiat syntaxe srl $rd, $rt, shamt description Le registre $rt est décalé à droite de la valeur immédiate codée sur 5 bits, des zéros étant introduits dans les bits de poids fort. Le résultat est placé dans le registre $rd. opération $rd ← 0imm k $rt31...imm srlv M IPS R3000 jeu d’instructions page - 29 Ensimag - Filières SLE/ISI format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 000110 action Décalage à droite logique registre syntaxe srlv $rd, $rs, $rt description Le registre $rt est décalé à droite du nombre de bits spécifiés dans les 5 bits de poids faible du registre $rs, des zéros étant introduits dans les bits de poids fort ainsi libérés. Le résultat est placé dans le registre $rd. opération rd ← 0$rs4...0 k $rt31...$rs4...0 ...0 sub format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 100010 action Soustraction registre registre signée syntaxe sub $rd, $rs, $rt description Le contenu du registre $rt est soustrait du contenu du registre $rs pour former un résultat sur 32 bits qui est placé dans le registre $rd. opération $rd ← $rs − $rt exception Dépassement de capacité. subu format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 00000 0 100011 action Soustraction registre registre non-signée syntaxe subu $rd, $rs, $rt description Le contenu du registre $rt est soustrait du contenu du registre $rs pour former un résultat sur 32 bits qui est placé dans le registre $rd. opération $rd ← $rs − $rt sw format 31 26 25 101011 21 20 rs M IPS R3000 jeu d’instructions 16 15 rt 0 imm16 page - 30 Ensimag - Filières SLE/ISI action Écriture d’un mot en mémoire syntaxe sw $rt, imm($rs) description L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et du contenu du registre $rs. Le contenu du registre $rt est écrit à l’adresse ainsi calculée. Les deux bits de poids faible de cette adresse doivent être à zéro. opération mem4 [imm + $rs] ← $rt exception Adresse non alignée sur une frontière de mot. syscall format 31 26 25 6 5 000000 00000 00000 00000 00000 0 001100 action Appel à une fonction du système (en mode noyau). syntaxe syscall description Un appel système est effectué, transférant immédiatement, et inconditionnellement le contrôle au gestionnaire d’exception. Note : par convention, le numéro de l’appel système, c.-à-d. le code de la fonction système à effectuer, est placé dans le registre $2. opération pc ← 0x80000080 exception Déclenchement d’une exception de type appel système systématique. tlbp format 31 26 25 010000 24 1 6 5 00000000000000000000 0 001000 action Vérifie la présence d’une entrée valide dans le tampon de traduction d’adresse. syntaxe tlbp description Le contenu du registre $entryhi est comparé à l’ensemble des entrées du tampon de traduction d’adresses. Si une entrée correspond, alors l’adresse de cette entrée est écrite dans le registre $index. Sinon, le bit de poids fort du registre $index est mis à 1. opération si ∃i|T LB[i]63..44 = $entryhi31..12 et (T LB[i]8 ou T LB[i]43..38 = $entryhi11..6 ) alors $index = 018 k i5..0 k 08 sinon $index = 1 k 031 M IPS R3000 jeu d’instructions page - 31 Ensimag - Filières SLE/ISI exception Utilisation en mode utilisateur. tlbr format 31 26 25 010000 24 1 6 5 00000000000000000000 0 000001 action Lit l’entrée du tampon de traduction d’adresses dont l’index est précisé par le registre $index du coprocesseur 0. syntaxe tlbr description Cette instruction charge les registres $entryhi et $entrylo avec le contenu du tampon de traduction d’adresse indicé le registre $index. opération $entryhi ← T LB[$index13..8 ]63..32 $entrylo ← T LB[$index13..8 ]31..0 exception Utilisation en mode utilisateur. tlbwi format 31 26 25 010000 24 1 6 5 00000000000000000000 0 000010 action Écrit l’entrée du tampon de traduction d’adresses dont l’index est précisé par le registre $index du coprocesseur 0. syntaxe tlbwi description Le contenu de la case indexée par le registre d’index du tampon de traduction d’adresse est écrasé par les valeurs contenues dans les registres $entryhi et $entrylo du coprocesseur 0. Ceci permet de modifier une entrée dans le tampon pour un processus en cours d’exécution, ou d’évincer les informations de traduction d’un processus dont on sait qu’il va être peu utile dans le futur proche. opération T LB[$index13..8 ] ← $entryhi k $entrylo exception Utilisation en mode utilisateur. tlbwr format 31 26 25 010000 24 1 6 5 00000000000000000000 0 000110 action Écrit l’entrée du tampon de traduction d’adresses dont l’index est précisé par le registre $random du coprocesseur 0. M IPS R3000 jeu d’instructions page - 32 Ensimag - Filières SLE/ISI syntaxe tlbwr description Le contenu de la case indexée par le registre d’index du tampon de traduction d’adresse est écrasé par les valeurs contenues dans les registres $entryhi et $entrylo du coprocesseur 0. Ceci permet de créer une entrée dans le tampon pour un processus en cours d’exécution. opération T LB[$random13..8 ] ← $entryhi k $entrylo exception Utilisation en mode utilisateur. xor format 31 26 25 000000 21 20 rs 16 15 rt 11 10 rd 6 5 000000 0 00000 100110 action Ou-exclusif bit-à-bit registre registre syntaxe xor $rd, $rs, $rt description Un ou-exclusif bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé dans le registre $rd. opération $rd ← $rs xor $rt xori format 31 26 25 001110 21 20 rs 16 15 rt 0 imm16 action Ou-exclusif bit-à-bit registre immédiat syntaxe xori $rt, $rs, imm description La valeur immédiate sur 16 bits subit une extension de zéros. Un ou-exclusif bit-à-bit est effectué entre cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le registre $rt. opération $rt ← 016 k imm xor $rs M IPS R3000 jeu d’instructions page - 33 Ensimag - Filières SLE/ISI G) Encodage des instructions Les tables suivantes présentent sous forme compacte le codage des différentes instructions. 31...29 5...3 20...19 25...24 5...3 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111 00 01 10 11 00 01 10 11 000 001 010 011 100 101 110 111 000 special addi cop0 lb sb - 000 sll jr mfhi mult add - 000 bltz bltzal - 000 mfc0 - 000 tlbp rfe - 001 regimm addiu lh sh - 001 jalr mthi multu addu - 010 j slti - Champ opcode 28...26 011 jal sltiu lw sw - 100 beq andi lbu - 101 bne ori lhu - Champ func, lorsque l’ opcode vaut special. 2...0 010 011 100 101 srl sra sllv syscall break mflo mtlo div divu sub subu and or slt sltu - 110 blez xori - 111 bgtz lui - 110 srlv xor - 111 srav nor - 001 bgez bgezal - Champ rt, lorsque l’ opcode vaut regimm. 18...16 010 011 100 - 101 - 110 - 111 - 001 - Champ rs, lorsque l’ opcode vaut cop0. 23...21 010 011 100 mtc0 - 101 - 110 - 111 - 001 tlbr - Champ func, lorsque l’ opcode vaut cop0. 2...0 010 011 100 tlbwi - 101 - 110 tlbwr - 111 - M IPS R3000 jeu d’instructions page - 34 Ensimag - Filières SLE/ISI H) Organisation de la mémoire Le but d’un programme écrit en langage d’assemblage est de fournir à un programme particulier (appelé « assembleur ») les directives nécessaires pour générer le code binaire représentant les instructions et les données qui devront être chargées en mémoire pour permettre au programme de s’exécuter sur du matériel. Dans l’architecture M IPS R3000, l’espace adressable est divisé en deux segments : le segment utilisateur, et le segment noyau. Un programme utilisateur utilise généralement (c’est purement conventionnel pour un exécutable, mais obligatoire avant l’édition de liens) plusieurs sous-segments (appelés sections) dans le segment utilisateur. Ces sections sont décrites ci-dessous, telles que l’on les trouverait sur une machine Ultrix (du genre de la DEC 5100) : – la section .text contient le code exécutable. Elle est implantée conventionnellement à l’adresse 0x00400000 pour les programmes utilisateur. Sa taille est fixe et calculée lors de l’assemblage. La principale tâche de l’assembleur consiste à générer le code binaire correspondant au programme source décrit en langage d’assemblage, qui sera chargé dans cette section ; – les données globales (ou statiques) manipulées par le programme sont réparties dans plusieurs sections. Elles commencent conventionnellement à l’adresse 0x10000000 pour les programmes utilisateur, et se suivent avec une contrainte d’alignement de la taille du mot. Sa taille est fixe et calculée lors de l’assemblage. Les valeurs contenue dans cette section peuvent être initialisées grâce a des directives contenues dans le programme source en langage d’assemblage. Le common object file format pour M IPS définit 5 types de données possibles : .rodata les données en lecture seulement, forcément initialisées lors de la déclaration ; .data les données initialisées lors de leurs déclarations ; .sdata les « petites » (small) données initialisées lors de leurs déclarations. La taille est fixée par l’option -G du compilateur ; .sbss les « petites » données non initialisées lors de la déclaration ; .bss les données non initialisées lors de la déclaration. Les sections .sbss et .bss doivent être allouées lors du lancement du programme et initialisées à zéro2 . 2 bss signifie blank static storage. M IPS R3000 jeu d’instructions page - 35 Ensimag - Filières SLE/ISI I) Règles syntaxiques 1. les noms de fichiers : Les noms des fichiers contenant un programme source en langage d’assemblage doivent être suffixé par « .s ». Exemple : monprogramme.s 2. les commentaires : ils commencent par un # ou un ; et s’achèvent à la fin de la ligne courante. Exemple : ############################################### # Source Assembleur MIPS de la fonction memcpy ############################################### .... ; sauve la valeur copiée dans la mémoire Les commentaires C sont acceptés si l’on suffixe le programme « .S », car le préprocesseur est alors également appelé avant l’assemblage. 3. les entiers : une valeur entière décimale est notée 250, une valeur entière octale est notée 0372 (préfixée par un zéro), et une valeur entière hexadécimale est notée 0xFA (préfixée par zéro suivi de x). En hexadécimal, les lettres de A à F peuvent être écrites en majuscule ou en minuscule. 4. les chaînes de caractères : elles sont simplement entre guillemets, et peuvent contenir les caractères d’échappement du langage C. Exemple : "Bonjour maître\n" 5. les labels : ce sont des mnémoniques correspondant à des adresses. Ces adresses peuvent être soit des adresses de variables,soit des adresses de saut. Ce sont des chaînes de caractères qui commencent par une lettre, majuscule ou minuscule, un $, un _, ou un .. Ensuite, un nombre quelconque de ces mêmes caractères auxquels on ajoute les chiffres sont utilisés. Pour la déclaration, le label doit être suffixé par « : ». Exemple : $LC12: Pour y référer, on supprime le « : ». Exemple : message: .asciiz "Ceci est une chaîne de caractères...\n" .text __start: la $4, message ; adresse de la chaîne dans $4 ori $2, $0, 4 ; code du ‘print_string’ dans $2 syscall Attention : sont illégaux les labels qui ont le même nom qu’un mnémonique de l’assembleur ou qu’un nom de registre. 6. les immédiats : ce sont les opérandes contenus dans l’instruction. Ce sont des constantes. Ce sont soit des entiers, soit des labels. Ces constantes doivent respecter une taille maximum qui est fonction de l’instruction qui l’utilise : 16 ou 26 bits. M IPS R3000 jeu d’instructions page - 36 Ensimag - Filières SLE/ISI 7. les registres : le processeur M IPS possède 32 registres d’usage général. Chaque registre est connu par son numéro, qui varie entre 0 et 31, et est préfixé par un $. Par exemple, le registre 31 sera noté $31 dans l’assembleur. Hormis les registres $0 et $31 , tous les registres sont identiques du point de vue de la machine. Lorsque le registre $0 est utilisé comme registre source dans une instruction, la valeur lue est toujours 0, et utiliser ce registre comme registre destination dans une instruction ne modifie pas sa valeur. Le registre $31 est utilisé implicitement pour sauver l’adresse de retour lors des appels de fonctions. 8. les arguments : si une instruction nécessite plusieurs arguments, comme par exemple l’addition entre deux registres, ces arguments sont séparés par des virgules. Dans une instruction assembleur, on aura en général comme argument en premier le registre dans lequel est mis le résultat de l’opération, puis ensuite le premier registre source, puis enfin le second registre source ou une constante. Exemple : add $3, $2, $1 9. l’adressage mémoire : le M IPS ne possède qu’un unique mode d’adressage : l’adressage indirect registre avec déplacement. Ainsi l’accès à une case mémoire à partir de l’adresse présente dans un registre se note par le déplacement, c.-à-d. un entier comme défini précédemment, suivi du registre entre parenthèses. Exemples : 11($12), 013($12) 0xB($12). Ces trois exemples indiquent la case mémoire ayant comme adresse le contenu du registre $12 plus 11. S’il n’y a pas d’entier devant la parenthèse ouvrante, le déplacement est nul. En revanche, il n’est pas possible d’écrire des sauts à des adresses absolues ou relatives constantes, comme par exemple un j 0x400000 ou un bnez $3, -12. Il faut nécessairement utiliser des labels. M IPS R3000 jeu d’instructions page - 37 Ensimag - Filières SLE/ISI J) Conventions pour les appels de fonctions L’exécution de fonctions nécessite une pile en mémoire. Cette pile correspond à la section stack. L’utilisation de cette pile fait l’objet de conventions qui doivent être respectées par la fonction appelée et par la fonction appelante. – la pile s’étend vers les adresses décroissantes ; – le pointeur de pile pointe toujours sur la dernière case occupée dans la pile. Ceci signifie que toutes les cases d’adresse strictement inférieure au pointeur de pile sont libres ; – le R3000 ne possède pas d’instructions spécifiques à la gestion de la pile. On utilise les instructions lw et sw pour y accéder. – l’usage conventionnel des registres est le suivant : $0 vaut zéro en lecture, non modifié par écriture $1 réservé à l’assembleur. Ne doit pas être employé dans les programmes utilisateur $2, $3 valeur de retour des fonctions, temporaires à sauvegarder si nécessaire avant d’appeller une fonction $4, $5, $6, $7 4 premiers arguments des fonctions. Ils doivent être sauvegardés par la fonction appellante si celle-ci veut les retrouver en l’état $8, ..., $15, $24, $25 registres de travail à sauver si nécessaire avant d’appeller une fonction $16, ..., $23, $30 registres de travail à sauver avant d’utiliser, car la fonction appellante s’attend à les retrouver inchangés $26, $27 registres réservés aux procédures noyau. Ils ne doivent pas être employés dans les programmes utilisateur $28 pointeur sur les variables globales, constante défine à l’édition de liens $29 pointeur de pile $31 adresse de retour d’appel de fonction Les appels de fonction utilisent un pointeur particulier, appelé pointeur de pile. Ce pointeur est stocké conventionnellement dans le registre $29. On le désigne aussi par la notation $sp. La valeur de retour d’une fonction est conventionellement présente dans le registre $2. Par ailleurs, l’architecture du processeur M IPS R3000 impose l’utilisation du registre $31 pour stocker l’adresse de retour lors d’un appel de fonction (instructions de type jal ou bgezal). À chaque appel de fonction est associée une zone dans la pile constituant le « contexte d’exécution » de la fonction. Dans le cas des fonctions récursives, une même fonction peut être appelée plusieurs fois et possèdera donc plusieurs contextes d’exécution dans la pile (c’est ce qui permet l’appel de fonctions récursives). Nous allons décrire la convention d’appel du compilateur gcc en mode optimisé, ce qui est peut-être moins clair que l’utilisation des notions qui seront vues en compilation, mais qui sont plus naturelles lorsque l’on écrit de l’assembleur. Dans une fonction qui appelle d’autres fonctions, le pointeur de pile $sp pointe sur la dernière case utilisée du contexte. Cette case est destinée à recevoir le registre $4 si la fonction voulait conserver sa valeur à travers un appel de fonction. Juste au dessus se trouve les places pour $5, $6, $7, si la fonction qui a 4 arguments. Si les fonctions à appeller possèdent moins d’arguments, la place est réservée seulement pour les M IPS R3000 jeu d’instructions page - 38 Ensimag - Filières SLE/ISI registres concernés. Si parmis les fonctions à appeller, il en existe qui possèdent plus de 4 arguments, alors les arguments supplémentaires sont empilés au dessus, dans l’ordre identique aux 4 premiers arguments. Au dessus de ces arguments (potentiels, car si plusieurs fonctions sont appellables, alors ce sont celles qui ont le plus grand nombre d’arguments qui vont définir cette zone), se trouve une zone pour les variables locales à la fonction. L’ordre des variables dans cette zone est à la discrétion du programmeur (ou du compilateur). Finalement, encore au dessus se trouve la zone dans laquelle les registres qui doivent l’être, le dernier étant $31. Le déplacement du pointeur de pile a lieu une seule fois, à l’entrée dans la fonction, et seulement si nécessaire, i.e. si la fonction a besoin de beaucoup de variables locales ou appelle elle même d’autres fonctions. M IPS R3000 jeu d’instructions page - 39