MMIX

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
MMIX
Concepteur Donald Knuth
Bits 64-bit
Lancement 1999
Architecture RISC
Encodage Fixe
Endianness Gros-boutiste
Libre Oui
Registres
Usage général 256
32 registres spéciaux

MMIX, prononcé /ɛm.mɪks/ et usuellement typographié dans une police à chasse fixe (MMIX), est à la fois un jeu d'instructions 64-bit RISC et une architecture informatique conçu par Donald Knuth, avec une aide importante de John LeRoy Hennessy (en), un des concepteurs de l'architecture MIPS, et de Richard L. Sites, un des concepteurs de l’architecture Alpha. Knuth lui-même présente ce projet en ces mots :

« MMIX est un ordinateur destiné à illustrer les aspects de la programmation au niveau machine. Dans mes livres The Art of Computer Programming, il remplace MIX, une machine répliquant le style des années 1960, laquelle jouait un tel rôle... J'ai tenté de concevoir MMIX de façon à ce que son langage machine soit simple, élégant et facile à apprendre. En parallèle, j'ai fait attention d'inclure toutes les complexités nécessaires pour obtenir une haute performance dans la pratique, de sorte que MMIX pourrait en principe être construit et peut-être faire concurrence à certains des langages généraux les plus rapides disponibles commercialement[trad 1],[1] »

Architecture[modifier | modifier le code]

En termes d’architecture informatique MMIX est un ordinateur RISC 64 bits, avec 256 registres 64 bits généraux et 32 registres 64 bits à usage spécifique. MMIX est une machine gros-boutiste avec des instructions 32 bits et un espace d’adressage virtuel (en) 64 bits. Son jeu d'instructions comprend 256 codes opérations, dont un est réservé pour un potentiel usage futur. Les nombres à virgule flottante sont implémentés conformément au standard IEEE 754.

Instructions[modifier | modifier le code]

Les instructions de MMIX sont toutes définies et utilisables à partir de leur code opération, qui est un nombre d’un octet, généralement noté sous forme hexadécimale. Cependant pour améliorer la lisibilité du code assembleur, une étiquette mnémotechnique unique est associé à chacun des codes. Ainsi l’étiquette ADD est équivalente à l’instruction numéro 2016, qui est le code opérateur de l’addition. La plupart des instructions sont de la forme opérateur X Y Z, où opérateur spécifie l’instruction, X est un registre servant d’accumulateur, c’est-à-dire utilisé pour stoker le résultat de l’instruction, et Y et Z désignent les registres servant d’opérandes à l’instruction. Par exemple ADD $0,$1,3 signifie affecter à $0 la Somme (arithmétique) du nombre stocké dans le registre $1 et du nombre 3.

La plupart des instructions peuvent prendre soit des valeurs immédiates, soit utiliser le contenu d’un registre ; ainsi un seul mnémonique peut correspondre à un ou deux codes opérations.

Typiquement, les programmes MMIX sont construits en utilisant le langage assembleur MMIXAL. L’exemple ci-dessous est un programme écrit en MMIXAL qui affiche Hello world :

Main    GETA  $255,string               ; Get the address of the string
                                        ; in register 255.
 
        TRAP  0,Fputs,StdOut            ; Put the string pointed to
                                        ; by register 255 to file StdOut.
 
        TRAP  0,Halt,0                  ; End process.
 
string  BYTE  "Hello, world!",#a,0      ; String to be printed.
                                        ; #a is newline,
                                        ; 0 terminates the string.

Registres[modifier | modifier le code]

Dans une puce d’architecture MMIX il y a 256 registres généraux , auxquels on accède par le référence noté de $0 à $255 et 32 registres spéciaux. Deux des registres spéciaux, rL et rG, déterminent quels sont les registres locaux et lesquels sont globaux. Tous les registres, de $0 à $(rL-1) sont des registres locaux. Les registres de [rL] à [rG]-1 sont des registres marginaux qui retournent toujours 0 s'ils sont utilisés comme source dans une opération. Utiliser un registre marginal en tant que destination d’une opération déclenchera une incrémentation automatique de rL pour inclure ce registre. Tous les registres de [rG] à $255 sont appelés registres globaux et ne sont pas sauvegardés sur la pile de registre.

Pile de registre local[modifier | modifier le code]

La pile de registre local fournit à chaque procédure ses propres registres locaux rL, notés de $0 à $(rL - 1 ). Si une procédure est appelée, les registres locaux sont ajoutés sur la pile. Les arguments de la procédure sont placés dans les registres locaux restants. Quand une procédure se termine, elle retire les registres précédemment ajoutés. Comme il n’y a que 256 registres physiques, il peut être nécessaire de stocker une partie de la pile en mémoire. Cette action est implémentée avec les registres spéciaux rO et rS qui enregistrent quelle partie de la pile de registre local est en mémoire et quelle partie est toujours dans les registres physiques locaux. Le registre de pile assure également la liaison rapide de procédures (en).

Registres spéciaux[modifier | modifier le code]

Les 32 registres spéciaux de l’architecture physique sont définis comme suit :

  1. rB, le registre d’amorçage (déclencheur), avec un b comme dans l’anglais bootstrap :
    lorsqu’un déclenchement se produit, rB est affecté de la valeur stockée dans le registre $255 et le registre $255 est affecté de la valeur stockée dans le registre rJ, sauvegardant ainsi rJ dans un registre général.
  2. rD, le registre de dividende :
    La division entière non-signée utilise ce registre en tant que moitié gauche du numérateur (dividende) codé sur 128 bits qui est à diviser par le dénominateur (diviseur).
  3. rE, le registre epsilon, ou registre de la marge d’erreur :
    Utilisé dans la comparaison de nombres à virgule flottante tolérant une marge d’erreur
  4. rH, nommé registre himult :
    Le terme himult, prononcé /haɪ.mʌlt/, est la contraction de l’anglais high multiplication, littéralement haute multiplication, où haute suggère la partie contenant les bits de poids les plus forts d’un nombre stocké dont la représentation est distribuée sur plusieurs registres distincts. Ce registre est utilisé pour stocker la moitié droite du produit de la multiplication entière non-signé.
  5. rJ, le registre de retour de saut, avec un j comme dans l’anglais jump :
    Ce registre est utilisé par PUSH et POP pour sauvegarder l’adresse de la prochaine instruction au retour d’un PUSH.
  6. rM est le registre de masque de multiplexage
    Ce registre est utilisé par les instructions multiplexes MUX et MUXI[2].
  7. rR est le registre de reste :
    Il est affecté de la valeur du reste lors des divisions exécutées par DIV, DIVI, DIVU, DIVUI ou FDIV.
  8. rBB, le registre d’amorçage du noyau, avec BB comme bootstrap bis :
    Lors d’une capture par l’instruction TRAP, trap désignant un dispositif de capture en anglais, rBB est affecté du registre $255 et le registre $255 est affecté de la valeur stockée dans rJ, sauvegardant ainsi rJ dans un registre général.
  9. rC, le compteur de cycle :
    Il est incrémenté à chaque cycle.
  10. rN, le registre de numéro de série :
    Une constante qui identifie le processeur MMIX courant.
  11. rO, le registre d’offset de la pile
    Ce registre est utilisé pour implémenter la pile de registre.
  12. rS, avec un s comme stack, pile en anglais :
    C’est le registre utilisé pour stocker un pointeur vers l’adresse courante de la pile.
  13. rI, le compteur d’interval :
    Il est décrémenté à chaque cycle et déclenche une interruption lorsqu’il atteint zéro.
  14. rT, avec un t comme trap, dispositif de capture en anglais :
    Il est utilisé pour stocker l’adresse du vecteur de déclencheur.
  15. rTT, avec un t également en référence à l’anglais trap, mais il s’agit cette fois du registre de déclencheur dynamique (dynamic trap adress register)
    Il est utilisé pour stocker l’adresse du vecteur de déclencheur.
  16. rK, le registre de masque d’interruption, interrupt mask register en anglais :
    Ce registre est utilisé pour enclencher et déclencher des interruptions spécifiques.
  17. rQ, le registre de requête d'interruption :
    Il est utilisé pour enregistrer les interruptions au fur et à mesure de leurs survenues.
  18. rU, le compteur d'utilisation :
    Le compte du nombre d'instructions exécutées est stocké dans ce registre.
  19. rV, le registre de traduction virtuelle :
    Il est utilisé pour la traduction entre adresses virtuelles et physiques. Il mémorise le nombre de segments, la taille allouée pour chaque segment, la position de la racine de la table des pages (en)
    et le nombre d'espaces d'adresses (en).
  20. rG, le registre de seuil global :
    Toutes les références de registres généraux codées avec un nombre supérieur ou égal au seuil défini par rG font référence à des registres globaux.
  21. rL, le registre de seuil local :
    Toutes les références de registres généraux codées avec un nombre strictement inférieur au seuil défini par rL font référence à des registres locaux.
  22. rA le registre de statut arithmétique :
    Ce registre est utilisé pour la gestion des exceptions arithmétiques : enregistrement, enclenchement et déclenchement. Ces exceptions incluent notamment le dépassement arithmétique (en) et la division par zéro.
  23. rF le registre de positionnement d'erreur :
    Lorsque le système détecte qu'une instruction ne s'est pas exécutée correctement, l'adresse de l'instruction est stockée dans ce registre. Le mnémotechnique f est lié à l'anglais failure location register, où failure location register peut être traduit par échec. En français on peut se référer aux mots fredaine ou faux-pas.
  24. rP, le registre de prédiction :
    Il est utilisé par l'instruction CSWAP de permutation conditionnelle.
  25. rW, le registre de lieu d'interruption :
    Ce registre est utilisé lors d’un déclenchement pour stocker l’adresse de l’instruction après celle qui a été interrompue. Le W fait référence au nom anglais where-interrupted register, littéralement le registre où-interrompue.
  26. rX, le registre d’exécution (déclencheur) :
    Ce registre est utilisé lors de déclenchement pour stocker l’instruction qui a été interrompue.
  27. rY l’opérande Y (déclencheur) :
    Ce registre est utilisé, lors d’un déclenchement, pour stocker la première opérande de l’instruction. Y fait référence au nom générique usuel en mathématique.
  28. rZ l’opérande Z (déclencheur) :
    Ce registre est utilisé, lors d’un déclenchement, pour stocker le premier opérande de l’instruction. Z fait référence au nom générique usuel en mathématique.
  29. rWW, le registre de lieu d'interruption (capture) :
    Il est utilisé, lors d’une capture, pour stocker l’adresse de l’instruction après celle qui a été interrompue. Le W fait référence au mot where, comme précédemment.
  30. rXX, le registre d’exécution (capture) :
    Il est utilisé, lors d’une capture, pour stocker l’instruction qui a été interrompue.
  31. rYY, l’opérande Y (capture) :
    Il est utilisé, lors d’une capture, pour stocker l’opérande Y de l’instruction interrompue.
  32. rZZ, l’opérande Z (capture) :
    Il est utilisé, lors d’une capture, pour stocker l’opérande Z de l’instruction interrompue.

Implémentation matérielle[modifier | modifier le code]

Il n’existe actuellement aucune implémentation matérielle de l’architecture à jeu d’instruction MMIX. Cependant, le projet fpgammix fournie implémente une implémentation Verilog, ce qui ouvre la possibilité de l’utiliser dans un circuit logique programmable[3].

Outils logiciels[modifier | modifier le code]

L’architecture de jeu d’instruction MMIX est utilisable à travers tout une panoplie d’outils logiciels pour la recherche en développement logiciel et en architecture d’ordinateur.

Simulateurs et assembleurs[modifier | modifier le code]

Knuth a développé un ensemble de logiciels nommé MMIXware comprenant un simulateur comportemental simple de la machine, et MMIXAL, un logiciel d’assemblage, une suite de tests, des programmes d’exemples, une documentation complète, et un simulateur de pipeline de l’architecture MMIX [4].

Andrew Pochinsky, membre de l’équipe du centre de recherche théorique en physique du Massachusetts Institute of Technology à développé MMIXX un paquet implémentant un serveur graphique basé sur X11. Elle peut être combiné avec la machine virtuelle de MMIXware pour fournir un affichage de 640×480 pixes en vrai couleur pour Linux et UNIX.

Compilateur[modifier | modifier le code]

Le projet GNU Compiler Collection (GCC) comprend une partie envers[trad 2] de MMIX pour ses compilateurs C/C++, initialement développé par Hans-Peter Nilsson, et qui fait partie de la distribution standard du projet depuis la fin 2001. Il continue d’être activement développé et maintenu par des volontaires.

L’ensemble des outils existant devraient théoriquement permettre de compiler, construire et amorcer un noyau de système d’exploitation comme Linux sur un processeur MMIX si une implémentation matériel venait à exister.

Voir aussi[modifier | modifier le code]

Notes et références[modifier | modifier le code]

Traduction[modifier | modifier le code]

  1. (en) « MMIX is a computer intended to illustrate machine-level aspects of programming. In my books The Art of Computer Programming, it replaces MIX, the 1960s-style machine that formerly played such a role... I strove to design MMIX so that its machine language would be simple, elegant, and easy to learn. At the same time I was careful to include all of the complexities needed to achieve high performance in practice, so that MMIX could in principle be built and even perhaps be competitive with some of the fastest general-purpose computers in the marketplace. »
  2. Ici envers est utilisé comme traduction de back end, qui exprime une idée d’arrière plan, par opposition à un front end qu’on traduira avers, , exprimant l’idée d’avant plan.

Références[modifier | modifier le code]

  1. Donald E. Knuth, MMIXware: A RISC Computer for the Third Millennium, vol. 1750, Heidelberg, Springer-Verlag, coll. « Lecture Notes in Computer Science Tutorial »,‎ octobre 1999 (ISBN 3-540-66938-8).
  2. MMIX Op Codes
  3. Site officiel de fpgammix
  4. Site officiel de MMIXware

Liens externes[modifier | modifier le code]