# 命令セットアーキテクチャの設計原理 ## 定義 命令セットアーキテクチャ(ISA: Instruction Set Architecture)の設計原理とは、プロセッサをプログラマ・コンパイラから見える抽象として定義する際の分類軸と、その軸上の選択を実プログラムの計測結果に基づいて行うという方法論を指す。分類軸には、オペランドの格納方式(スタック・アキュムレータ・汎用レジスタ)、汎用レジスタアーキテクチャの内訳(ロードストア・レジスタメモリ・メモリメモリ)、メモリアドレッシングモード、オペランドの型とサイズ、演算の分類、制御フロー命令の種類、命令フォーマットの符号化方式(可変長・固定長・ハイブリッド)が含まれる。各軸の選択はコード密度・実行命令数・デコードの複雑さ・パイプライン実装のしやすさというトレードオフを持ち、いずれか一つを最適化すると他が犠牲になる(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]])。 ## 分類軸 - **オペランド格納方式**: スタック(暗黙のTOSオペランド)・アキュムレータ(暗黙の単一レジスタ)・汎用レジスタ(明示的オペランド)の3系統。1980年以降の新規アーキテクチャはほぼ例外なくロードストア型汎用レジスタを採用する。汎用レジスタはさらにALU命令が扱えるメモリオペランド数と総オペランド数の組(m, n)で、ロードストア(0,3)・レジスタメモリ(1,2)・メモリメモリ(2,2)/(3,3)に分類できる(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] §A.2)。 - **メモリアドレッシングモード**: 変位・即値・レジスタ間接・インデックス・直接/絶対・メモリ間接・オートインクリメント/デクリメント・スケールドの8種。VAX実測では変位と即値の2方式だけでアドレッシングモード使用の大部分を占め、変位・即値・レジスタ間接の3種で全体の75〜99%をカバーできる(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] §A.3)。 - **命令フォーマットの符号化**: 可変長(コードサイズ最小・デコード複雑、例: Intel 80x86・VAX)・固定長(デコード単純・コードサイズ最大、例: RISC-V・ARM・MIPS)・ハイブリッド(複数の固定フォーマットをopcodeで切り替える折衷案、例: RISC-V圧縮拡張RV32IC)の3類型。architectは性能重視なら固定長、コードサイズ重視なら可変長を選ぶ(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] §A.7)。 - **コンパイラが課す要求**: 演算・データ型・アドレッシングモードの直交性(独立性)、グラフ彩色によるレジスタ割付けを機能させるための最低16(望ましくは32)個の汎用レジスタ、「プリミティブを提供し解決策を提供しない」設計方針、コンパイル時に既知の値を静的に命令へ束縛する方針、の4点が繰り返し強調される(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] §A.8)。 ## 横断的知見 - **固定長・固定位置の命令符号化というISA選択は、パイプライン実装における「ハザード判定をID段一箇所に一元化できる」という単純さに直接波及する**: 付録Aは、architectが命令符号化を選ぶ際の3つ目の判断基準として「パイプライン実装で扱いやすい命令長にすること」を明示し(§A.7)、RISC-Vの命令フォーマット(R/I/S/U型)がopcode・rs1・rd・funct3を全フォーマットで共通の固定位置に置く設計であることを示す(§A.9)。付録Cはこの設計選択が具体的にどう活きるかを実装側から裏付ける——RISC-Vの5段パイプラインでは、ロードインタロック検出もフォワーディング制御の判定もすべてID段で完結させる設計が採られており、これが可能なのはレジスタ指定子が命令の種類を判定する前に固定位置から読み出せるためである。つまり付録Aが「符号化の選択がパイプライン実装に影響する」と一般論で述べている箇所を、付録Cは「ID段一元化」という具体的な実装原則として裏付けている(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] §A.7, §A.9, [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix C Pipelining - Basic and Intermediate Concepts]] §C.3)。 - **ロードストア型(0,3)への収斂は、命令数の増加という代償を払ってでも「命令ごとのクロック数がほぼ均一」という性質を得るための選択であり、この性質こそがパイプライン実装を容易にする**: 付録Aのレジスタレジスタ型の長所として明記される「命令が同程度のクロック数で実行される(付録C参照)」という一文は、そのまま付録Cが前提とする「1命令1サイクルでパイプラインを流れる」という古典的5段パイプラインのモデルの成立条件になっている。レジスタメモリ型やメモリメモリ型はメモリアクセスを命令内に含むためオペランドの位置によってクロック数が変動し、付録Cが示すような単純なストール処理では対応しきれない(構造ハザードの扱いが命令ごとに異なる)。ロードストア型が「命令数は増えるが実装は単純」というトレードオフを取った理由は、付録A単独では定性的な記述に留まるが、付録Cを読むと「単純さ」の中身が「ID段でのハザード判定の一元化」と「ほぼ一定のCPI」という2つの具体的な実装上の利益に分解できる(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] §A.2, [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix C Pipelining - Basic and Intermediate Concepts]] §C.1, §C.3)。 - **「完璧なアーキテクチャは設計できない」というISA設計の教訓は、パイプライン深化という後発の実装トレンドを予見できなかった具体例で裏付けられる**: 付録Aの誤謬節は、1975年のVAX設計者がコードサイズ効率を過大評価し、5年後にデコード・パイプライン化の重要性が増すことを過小評価したと総括する。付録Cはこの「5年後に重要になった」実装トレンドの内実を示しており、MIPS R4000のようなプロセッサが5段パイプラインを8段の「スーパーパイプライン」に細分化してクロックを上げる一方、分岐遅延が3サイクルに伸びるという新たなトレードオフに直面したことを定量的に記録する。ISA設計時点で「将来のマイクロアーキテクチャがどれだけ深いパイプラインを必要とするか」を見積もることの難しさが、2つの付録を突き合わせることで具体的に理解できる(Source: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] §A.10, [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix C Pipelining - Basic and Intermediate Concepts]] §C.6)。 ## 未解決の問い - この概念をどのソース群で継続的に検証するか。 - 付録Aの「コンパイラがISAに課す要求」(直交性・16以上の汎用レジスタ)は、付録C・第3章が扱うアウトオブオーダー実行・レジスタリネーミングの文脈で物理レジスタファイルのサイズ要求とどう接続するか。アーキテクチャレジスタ数(ISAが公開する数)と物理レジスタ数(マイクロアーキテクチャが内部に持つ数)の乖離は本ページの範囲外であり、第3章側の記述と突き合わせる余地がある。 - RISC-Vの圧縮拡張(RV32IC)のような可変長命令の混在は、付録Cが前提とする「ID段でのハザード判定一元化」という単純さをどこまで損なうか。付録A・付録Cのいずれも圧縮命令デコードの具体的なパイプライン実装は扱っておらず、Appendix K(本 vault 未取り込み)や他文献での検証が必要。 ## 関連 - 実体: [[RISC-V]] / [[VAX]] / [[Intel 80x86]] - 概念: [[パイプライン処理]] - ソース: [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix A Instruction Set Principles]] / [[@2019__MorganKaufmann__Computer Architecture - A Quantitative Approach - Appendix C Pipelining - Basic and Intermediate Concepts]] ## 出典 - John L. Hennessy, David A. Patterson, *Computer Architecture: A Quantitative Approach*, Sixth Edition, Morgan Kaufmann, 2019, Appendix A, Appendix C.