命令フォーマットとエンコーディング
命令フォーマットは、各機械命令がバイナリでどのように配置されるか(オペコード、レジスタフィールド、即値)を定義し、プログラムがどれだけコンパクトに格納され、ハードウェアがどれだけ容易にデコードできるかを決定します。
Definition
命令フォーマットとは、機械命令内のビットフィールドの定義された配置であり、その操作とオペランドをエンコードします。命令エンコーディングとは、命令をこれらのバイナリパターンにマッピングするスキームです。
Scope
このトピックでは、命令のバイナリ表現について扱います。固定長エンコーディングと可変長エンコーディング、操作、ソースおよびデスティネーションレジスタ、即値を指定するフィールド、そしてコード密度とデコードの単純さの間のトレードオフが含まれます。RISC-VのR/I/S/B/U/Jタイプのような代表的なフォーマットファミリーも含まれます。オペランドが使用するアドレッシングモードの選択(アドレッシングモード)や、より広範なRISC/CISCの哲学(RISCとCISC)は対象外です。
Core questions
- 操作とそのオペランドを指定するために、命令エンコーディングにはどのようなフィールドが含まれている必要がありますか?
- 固定長エンコーディングと可変長エンコーディングは、デコードの単純さとコード密度の間でどのようにトレードオフしますか?
- 即値と大きな定数は、限られた命令ビット内でどのようにエンコードされますか?
- 規則的なエンコーディングは、パイプライン化された命令デコードをどのように簡素化しますか?
Key concepts
- オペコードフィールド
- レジスタ指定子フィールド
- 即値フィールド
- 固定長対可変長エンコーディング
- コード密度
- デコードの規則性
- 命令フォーマットファミリー (R/I/S/B/U/J)
Mechanisms
各命令はビットフィールドに分割されます。オペコードは操作を選択し、レジスタフィールドはオペランドを命名し、即値フィールドは定数またはアドレスオフセットを保持します。固定長フォーマット(RISC-Vなど)では、すべての命令が同じ幅を保ち、フィールドが整合性をもって配置されるため、デコードが単純かつ高速になります。可変長フォーマット(x86など)では、命令を密にパックして密度を高めますが、デコードがより複雑になるという代償を伴います。
Clinical relevance
エンコーディングの選択はプロセッサ全体に影響を及ぼします。規則的な固定長フォーマットは、ディープパイプライン処理を実用的にする単純で高速なデコーダを可能にし、高密度の可変長フォーマットは命令メモリトラフィックを削減します。コンパイラとアセンブラはこれらのフォーマットを正確にターゲットにする必要があり、命令セット拡張は既存のエンコーディング空間内に収まる必要があります。
History
初期の命令セットは、希少なメモリを節約するために、不規則で手作業で調整されたエンコーディングを使用していました。1980年代のRISCムーブメントは、デコードとパイプライン処理を効率化するために均一な固定長フォーマットを支持しましたが、x86のようなCISCセットは高密度の可変長エンコーディングを保持しました。RISC-Vのような現代のオープンISAは、クリーンで拡張可能なフォーマットファミリーを体系化しています。
Key figures
- David A. Patterson
- John L. Hennessy
Related topics
Seminal works
- patterson2020
- hennessy2019
Frequently asked questions
- RISC命令セットが固定長エンコーディングを使用するのはなぜですか?
- 固定長命令により、プロセッサは命令長を最初にデコードすることなく、次の命令を見つけてそのフィールドを抽出できます。これにより、フェッチおよびデコード段階が簡素化され高速化され、可変長エンコーディングよりもディープパイプライン処理がはるかに容易になります。
- 命令の幅が固定ビット数しかない場合、大きな定数はどのように処理されますか?
- 即値フィールドは限られているため、大きな定数は分割して構築されます。例えば、上位即値ロード命令で上位ビットを設定し、続く命令で下位ビットを追加するか、定数をメモリに配置してロードします。