Um die MIPS I-Befehlsformate zu verstehen, müssen Sie die MIPS-Pipeline verstehen und auch auf die CPU-Implementierungstechnologie von 1985 zurückblicken ID-Phase direkt nach IF.
Für den Zweck einer Anweisung vom Typ R muss die ID-Stufe die folgenden Aufgaben ausführen:
- Stellen Sie fest, dass es sich tatsächlich um eine Anweisung vom Typ R handelt.
- In diesem Fall weisen Sie die Registerdatei an, Werte aus den Registern zu laden.
Für den Zweck dieser Diskussion ist es die erste Aufgabe, über die Sie nachdenken müssen. Wenn Sie viele Anweisungen dekodieren müssen, um zu ermitteln, ob Werte aus den Registern benötigt werden, verlängert sich die Verzögerung, bevor Sie mit dem Lesen der Register beginnen können. Dies erhöht auch die Komplexität der ID-Stufe. Indem Sie einen einzigen Operationscode für alle Anweisungen vom Typ R reservieren, reduzieren Sie die Komplexität auf ein Minimum.
Es scheint ein wenig seltsam, dass Sie fünf Bits nur für das Verschieben verwenden. Ich kann mir ein paar mögliche Erklärungen vorstellen. Zum einen wird das Routing vereinfacht (diese fünf Bits werden IMMER direkt in die Registerdatei eingespeist, diese fünf Bits werden IMMER in den Barrel-Shifter eingespeist, diese sechs Bits werden IMMER an die ALU weitergeleitet, um zu bestimmen, welche Funktion auszuführen ist).
Sie haben möglicherweise darüber nachgedacht, in Zukunft kombinierte Anweisungen zum Verschieben nach links und zum Hinzufügen einzuführen. Dies hätte vermutlich die Form:
$d = $s + ($t << shamt)
2s+ 1s
Heutzutage würden wir wahrscheinlich nicht zweimal über eine komplexere Dekodierungsphase nachdenken, zumal Register-Dateizugriffe in der Pipeline einer typischen superskalaren CPU eher später erfolgen. Viele moderne CPUs führen sogar eine grobe Befehlsdecodierung durch, wenn ein Befehl in den L1-Cache eingefügt wird . Sie verbreitern die I-Cache-Zeilen ein paar Bits, um die zusätzlichen Informationen zu speichern (dank Moore's Law müssen Sie viele Transistoren verschwenden), damit die "richtige" Befehlsdecodierung einfacher und schneller wird.
Ein Grund, warum sie das Opcode-Feld wahrscheinlich so klein wie möglich halten wollten, ist, dass es J-Typ-Befehle nicht übermäßig bestraft. Wie Sie wahrscheinlich wissen, verwenden Befehle vom Typ J eine pseudo-direkte Adressierung. Zum Wohle aller, die zu Hause mitspielen, erkläre ich es kurz.
Das Adressfeld eines Befehls vom J-Typ ist 26 Bit. Da Befehle immer 4-Byte-ausgerichtet sind, müssen Sie nicht die niedrigstwertigen zwei Bits speichern, was bedeutet, dass Sie effektiv 28 Adressbits haben. Der Adressraum in MIPS I beträgt jedoch 32 Bit. Die oberen vier Bits der Sprungstelle werden also vom Programmzähler übernommen.
Dies bedeutet, dass Sie nicht direkt zu einem Ort springen können, an dem sich die vier höchstwertigen Bits des PC-Standorts unterscheiden. Sie müssten stattdessen einen teureren Drei-Anweisungen-Sprung durch ein Scratch-Register durchführen:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
Das ist heute nicht schlecht, aber 1985 sind es viele Taktzyklen.
Wenn Sie ein wenig aus dem Adressfeld stehlen, würde sich die effektive Reichweite eines Direktsprungs noch weiter verringern. Sie können sehen, dass dieser Preis möglicherweise zu hoch ist.