Formats et encodage des instructions
Les formats d'instruction définissent la manière dont chaque instruction machine est structurée en binaire — l'opcode, les champs de registre et les valeurs immédiates — déterminant ainsi la compacité du stockage des programmes et la facilité avec laquelle le matériel peut les décoder.
Definition
Un format d'instruction est l'agencement défini des champs de bits au sein d'une instruction machine qui encode son opération et ses opérandes, et l'encodage d'instruction est le schéma qui associe les instructions à ces motifs binaires.
Scope
Ce sujet traite de la représentation binaire des instructions : les encodages à longueur fixe par rapport aux encodages à longueur variable, les champs qui spécifient l'opération, les registres source et destination, et les valeurs immédiates, ainsi que le compromis entre la densité du code et la simplicité du décodage. Il inclut des familles de formats représentatives telles que les types R/I/S/B/U/J de RISC-V. Il exclut le choix des modes d'adressage utilisés par les opérandes (addressing modes) et la philosophie plus large RISC/CISC (RISC and CISC).
Core questions
- Quels champs un encodage d'instruction doit-il contenir pour spécifier une opération et ses opérandes ?
- Comment les encodages à longueur fixe et à longueur variable concilient-ils la simplicité du décodage et la densité du code ?
- Comment les valeurs immédiates et les grandes constantes sont-elles encodées dans un nombre limité de bits d'instruction ?
- Comment un encodage régulier simplifie-t-il le décodage d'instructions pipelinées ?
Key concepts
- champ d'opcode
- champs spécificateurs de registre
- champs immédiats
- encodage à longueur fixe vs à longueur variable
- densité du code
- régularité du décodage
- familles de formats d'instruction (R/I/S/B/U/J)
Mechanisms
Chaque instruction est divisée en champs de bits : un opcode sélectionne l'opération, les champs de registre désignent les opérandes, et les champs immédiats contiennent des constantes ou des décalages d'adresse. Les formats à longueur fixe (comme dans RISC-V) maintiennent toutes les instructions à la même largeur et placent les champs de manière cohérente, ce qui rend le décodage simple et rapide ; les formats à longueur variable (comme dans x86) compactent les instructions pour une meilleure densité au prix d'un décodage plus complexe.
Clinical relevance
Les choix d'encodage ont des répercussions sur l'ensemble d'un processeur : les formats réguliers à longueur fixe permettent des décodeurs simples et rapides qui rendent le pipelining profond (deep pipelining) pratique, tandis que les formats denses à longueur variable réduisent le trafic de la mémoire d'instructions. Les compilateurs et les assembleurs doivent cibler ces formats avec précision, et les extensions de jeu d'instructions doivent s'intégrer dans l'espace d'encodage existant.
History
Les premiers jeux d'instructions utilisaient des encodages irréguliers, ajustés manuellement, pour économiser la mémoire rare. Le mouvement RISC des années 1980 a privilégié les formats uniformes à longueur fixe pour simplifier le décodage et le pipelining, tandis que les jeux CISC tels que x86 ont conservé des encodages denses à longueur variable. Les ISA ouverts modernes comme RISC-V codifient des familles de formats claires et extensibles.
Key figures
- David A. Patterson
- John L. Hennessy
Related topics
Seminal works
- patterson2020
- hennessy2019
Frequently asked questions
- Pourquoi les jeux d'instructions RISC utilisent-ils des encodages à longueur fixe ?
- Les instructions à longueur fixe permettent au processeur de localiser l'instruction suivante et d'extraire ses champs sans avoir à décoder d'abord sa longueur, ce qui simplifie et accélère les étapes de récupération (fetch) et de décodage, et rend le pipelining profond (deep pipelining) beaucoup plus facile qu'avec les encodages à longueur variable.
- Comment les grandes constantes sont-elles gérées si les instructions n'ont qu'un nombre fixe de bits ?
- Les champs immédiats sont limités, de sorte que les grandes constantes sont construites par morceaux — par exemple, une instruction de chargement immédiat supérieur (load-upper-immediate) définit les bits de poids fort et une instruction suivante ajoute les bits de poids faible — ou la constante est placée en mémoire et chargée.