MIPSにshamtが含まれており、funct / opcodeを区別しているのはなぜですか?


15

MIPSの設計者がシフト専用の5ビットを含め、オペコードと機能ビットを別々に持つ理由について混乱しています。

MIPSは非常にRISCであるため、いくつかの命令ではシフトのみが行われると想定しているため、これらの5ビットは、イミディエイトに入れることができてもスペースを無駄にしているように見えます。オペコードとファンクトは、RタイプとIタイプの命令を区別するために分離されていると想定していますが、これは、オペコードを1ビット拡張することで実行できます。これらのRタイプの命令の両方で、22ビット長になる可能性があります。IタイプとJタイプの命令が即時およびアドレスを保持したい場合、これは機能しませんが、両方とも不要と思われます。

回答:


10

ここでは、いくつかのトレードオフがあります。

まず、命令を固定幅(32ビット)にする必要があります。これにより、命令がキャッシュブロックとページに揃えられることが保証され、キャッシュとページの存在および権限のチェックが簡素化されます。

次に、さまざまな指示フィールド(opcode/ source regs/ immediates)を固定幅と固定位置にする必要があります。これにより、デコードするロジックがより高速/少なくなり、パイプラインの初期段階で必要になります。(destinationレジスタはパイプラインの最後まで必要ないのでRI命令の異なる場所に置くことができます。)functionALUの機能を制御する必要があるため、フィールドの位置と幅はそれほど重要ではありませんが、 3番目のパイプラインステージであるため、必要に応じて作業する時間があります。

IJJ228228I命令は、コンパイラ/リンカーライターにも適しています。(即値フィールドがわずか12ビットであったSPARCではload-high、20ビットの即値を持つ特別な命令クラス全体を追加する必要がありました。)

26=64JRI

しかし、それはいくつかの小刻みの部屋にR指示を残します。6ビットのオペコードは別として、これらはレジスタの指定に15ビットだけを追加する必要があり、拡張されたオペコードやシフト量に11ビットが残ります。

このfunctionフィールドは、R命令の拡張オペコードであると考える必要があります。R命令オペコードは1つしかありませんfunctionsが、R命令が実行できる64種類があります。

はい。60種類のI命令と64種類のR命令がありますが、シフト即時命令はどこに置くべきでしょうか?

まあ、I命令が少ないだけでなく、命令でやりたいことがもっとたくさんありますI 。すべての分岐命令Iは相対(即時)オフセットを持っているため、命令である必要があることを思い出してください。また、すべてのロードおよびストア命令はIMIPSの形式です。そして最後に、命令であるためには、ロード・アップ・イミディエート命令が必要Iです。それだけでなく、R命令にはまだ5つの追加の未使用ビットがあります(このアーキテクチャのシフトイミディエートの即時に必要なものです)ので、これはシフトイミディエートを特別な(奇妙な)R命令にするさらなるインセンティブを与えます。

これらの決定の多くは科学よりも芸術ですが、識別できる根本的なロジックがあります。重要な目標がありません可能な限り小さく命令の数を作るために、それは作ることです高性能をパイプラインは単一チップに適合します(MIPSやSunのような小さな会社が1980年代にIBMやDECと競合できるように)。(David Pattersonによって発明されたRISCという名前はやや不幸です。「縮小された指示」がMIPSとSPARCアーキテクチャが実際に何をしようとしていたかを正確に説明しているからではなく、可愛かったからです。)命令の固定幅(比較的小さいため、Iキャッシュの動作が向上します)で、フェッチ、ページング、デコードをより簡単かつ高速に実行できます。命令の一部を早期にデコードする必要がある場合(opcode、2つのソースレジスタ、および符号拡張イミディエート)を固定幅で固定位置に配置します。イミディエイトは可能な限り長くし、他のすべての制約を考慮して、できるだけ多くの異なる種類の命令が収まるようにします。


有益な回答、特にアーキテクチャ設計者の目標に関する部分に感謝します。MIPSをMOS 6502と比較するのは面白いと思います。それを正しく理解すれば、6502にシャムがなかったからです(まだ命令形式を理解しようとしています)。
qwr 14

1
6502は第1世代のマイクロプロセッサー設計(pre-CISC)でしたが、パイプライン処理を想定していましたが、次の命令をロードすると同時にレジスタの書き戻しを行うことができました。6502には、ほとんどの8ビットマイクロのようなバイトオペコードがありました。もう1つの検討すべきアーキテクチャはARMです。これは、バークレーRISCの論文を読んでMOS工場を訪問し、「やれやれ、それができる」と決めた上級レベルの電子技術者の集団によって設計されました。
仮名14

「次の命令を実行せず、フェッチされた32ビットをこの命令のソースオペランドとして使用する」という意味のシャムトビットパターンがあった場合、どのような影響があったのでしょうか。代わりに、またはそれに加えて、単純な割り込み不可能な命令のペアに専用のオペコードスペースのかなりのチャンクを持つことが実用的だったのだろうか?単語の2番目の命令に直接ジャンプしますか?
supercat

5

MIPS I命令フォーマットを理解するには、MIPSパイプラインを理解する必要があり、1985年頃のCPU実装技術を振り返る必要があります。図を見ると、レジスタファイルの読み取りはIFの直後のIDステージ。

Rタイプの命令の目的で、IDステージは次のタスクを実行する必要があります。

  1. それは実際にあると判断され、Rタイプ命令。
  2. その場合、レジスタから値をロードするようレジスタファイルに指示します。

この議論の目的のために、それはあなたが考えなければならない最初のタスクです。レジスタからの値が必要な場合でも解決するために行う必要のある命令デコード作業が多数ある場合、これはレジスタ読み取りを開始する前に遅延を増加させます。また、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年には多くのクロックサイクルがあります。

アドレスフィールドからビットを盗むと、直接ジャンプの有効範囲がさらに減少します。あなたはこれがどのように高すぎて支払うことができないかを見ることができます。


後にARMで見られるタイプの「シフト左加算命令の組み合わせ」?
ダミアンジェリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.