Per comprendere i formati di istruzione MIPS I, è necessario comprendere la pipeline MIPS e ripensare alla tecnologia di implementazione della CPU intorno al 1985. Se si guarda il diagramma (si conosce quello), si vedrà che la lettura del file di registro è nella ID stage, subito dopo IF.
Ai fini di un'istruzione di tipo R, la fase ID deve eseguire le seguenti attività:
- Determina che in realtà è un'istruzione di tipo R.
- In tal caso, dire al file di registro di caricare i valori dai registri.
Ai fini di questa discussione, è il primo compito a cui devi pensare. Se c'è molto lavoro di decodifica delle istruzioni che devi fare anche per capire se hai bisogno di valori dai registri, questo aumenta il ritardo prima di poter avviare le letture del registro. Aumenta anche la complessità della fase ID. Riservando un unico codice operativo per tutte le istruzioni di tipo R, si riduce al minimo la complessità.
Sembra un po 'strano dedicare cinque bit solo al cambio. Mi vengono in mente alcune possibili spiegazioni. Uno è che semplifica il routing (quei cinque bit sono SEMPRE inseriti direttamente nel file di registro, quei cinque bit sono SEMPRE inseriti nello shifter del barilotto, quei sei bit sono SEMPRE instradati sempre verso l'ALU per determinare quale funzione eseguire).
Potrebbero aver pensato di introdurre in futuro istruzioni combinate di spostamento a sinistra e aggiunta. Questo presumibilmente sarebbe nella forma:
$d = $s + ($t << shamt)
Questa è un'istruzione sorprendentemente utile da avere in giro, come può dirti qualsiasi programmatore di assembly x86. Puoi usarlo per implementare le moltiplicazioni rapide di2S+ 1 per vari valori di Soppure puoi usarlo per indicizzare array in cui la dimensione di un elemento è una potenza di due (che è un caso molto comune). Ma è ancora abbastanza RISC da poterlo implementare senza penalità significative.
Oggi, probabilmente non ci penseremmo due volte ad avere una fase di decodifica più complessa, soprattutto perché gli accessi ai file di registro tendono ad avvenire più tardi nella pipeline di una tipica CPU superscalare. Molte CPU moderne eseguono anche una decodifica approssimativa delle istruzioni nel momento in cui un'istruzione viene inserita nella cache L1 . Aumentate di qualche bit le linee della cache I per memorizzare le informazioni extra (grazie alla Legge di Moore, avete molti transistor da sprecare) per rendere la decodifica "corretta" delle istruzioni più semplice e veloce.
Uno dei motivi per cui probabilmente volevano mantenere il campo del codice operativo il più piccolo possibile è che non penalizzasse indebitamente le istruzioni di tipo J. Come probabilmente saprai, le istruzioni di tipo J utilizzano l'indirizzamento pseudo-diretto. A beneficio di chiunque suoni insieme a casa, lo spiegherò brevemente.
Il campo dell'indirizzo di un'istruzione di tipo J è di 26 bit. Poiché le istruzioni sono sempre allineate a 4 byte, non è necessario memorizzare i due bit meno significativi, il che significa che si dispone effettivamente di 28 bit di indirizzo. Tuttavia, lo spazio degli indirizzi in MIPS I è a 32 bit. Quindi i primi quattro bit della posizione di salto sono presi dal contatore del programma.
Ciò significa che non è possibile passare direttamente a una posizione in cui i quattro bit più significativi della posizione del PC sono diversi. Dovresti invece fare un salto in tre istruzioni più costoso attraverso un registro scratch:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
Oggi non è poi così male, ma nel 1985 ci sono molti cicli di clock.
Rubare un po 'dal campo dell'indirizzo ridurrebbe ulteriormente l'intervallo effettivo di un salto diretto. Puoi vedere come questo potrebbe essere un prezzo troppo alto da pagare.