MIPS I命令フォーマットを理解するには、MIPSパイプラインを理解する必要があり、1985年頃のCPU実装技術を振り返る必要があります。図を見ると、レジスタファイルの読み取りはIFの直後のIDステージ。
Rタイプの命令の目的で、IDステージは次のタスクを実行する必要があります。
- それは実際にあると判断され、Rタイプ命令。
- その場合、レジスタから値をロードするようレジスタファイルに指示します。
この議論の目的のために、それはあなたが考えなければならない最初のタスクです。レジスタからの値が必要な場合でも解決するために行う必要のある命令デコード作業が多数ある場合、これはレジスタ読み取りを開始する前に遅延を増加させます。また、IDステージの複雑さが増します。すべてのRタイプの命令に単一のオペコードを予約することにより、複雑さを最小限に抑えます。
シフトするためだけに5ビットを使うのは少し奇妙に思えます。いくつかの可能な説明を考えることができます。1つは、ルーティングを簡素化することです(これらの5ビットは常にレジスタファイルに直接供給され、これらの5ビットは常にバレルシフターに供給され、これらの6ビットは常に実行する機能を決定するためにALUにルーティングされます)。
彼らは、将来的にシフト左加算命令の組み合わせを導入することを考えていたかもしれません。これはおそらく次の形式になります。
$d = $s + ($t << shamt)
2s+ 1s
今日、特にレジスタファイルへのアクセスは、典型的なスーパースカラーCPUのパイプラインの後半で発生する傾向があるため、より複雑なデコードステージを考えることはおそらくありません。最新のCPUの多くは、命令がL1キャッシュに挿入された時点で粗い命令デコードを実行します。ます。「適切な」命令デコードをより簡単かつ高速にするために、Iキャッシュラインを数ビット広くして余分な情報を保存します(ムーアの法則のおかげで、多くの無駄なトランジスタがあります)。
オペコードフィールドをできる限り小さくしたいと考えた理由の1つは、Jタイプの命令に不当にペナルティを課さないようにするためです。おそらくご存知のように、Jタイプの命令は疑似直接アドレス指定を使用します。自宅で一緒に遊ぶ人のために、簡単に説明します。
Jタイプの命令のアドレスフィールドは26ビットです。命令は常に4バイト境界で整列されるため、最下位の2ビットを保存する必要はありません。つまり、事実上28ビットのアドレスがあることになります。ただし、MIPS Iのアドレス空間は32ビットです。したがって、ジャンプ位置の上位4ビットはプログラムカウンターから取得されます。
つまり、PCの場所の最上位4ビットが異なる場所に直接ジャンプすることはできません。代わりに、スクラッチレジスタを介して、より高価な3命令のジャンプを行う必要があります。
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
今日はそれほど悪くはありませんが、1985年には多くのクロックサイクルがあります。
アドレスフィールドからビットを盗むと、直接ジャンプの有効範囲がさらに減少します。あなたはこれがどのように高すぎて支払うことができないかを見ることができます。