開発者 | ドナルド・クヌース |
---|---|
ビット数 | 64ビット |
デザイン | RISC |
エンコード | Fixed |
ブランチ | Condition code |
エンディアン | ビッグエンディアン |
オープン | 公開中 |
レジスタ | |
汎用 | うち32が専用レジスタ |
256 |
MMIX(エムミックス)は、ドナルド・クヌースがジョン・ヘネシー(MIPSプロセッサ設計者)や Dick Sites(Alphaプロセッサ設計者)の協力を得て設計した命令セット(命令セットアーキテクチャ、ISA)である。コンピュータプログラミングの「Art」を記している大著The Art of Computer Programming (TAoCP) において使用していた「MIX」の代替となるべく設計され、現代的な特徴を持つ。当命令セットを設計した後に執筆・改訂の TAoCP にて既に使用されている。
"MMIX" という綴りはローマ数字として解釈すると2009であり、前任のMIXの頭にMを付けたものであると同時に、2000年代のコンピュータ(プロセッサ)という意味を掛けているものと思われる(とはいえ、MIXの時の「実在のコンピュータ 16 種の型番から取って平均した」値の1009である、という主張にはかなりこじつけの気配があったのと同様、特に意味があるものではない)。
MMIX は二進法コンピュータであり(MIXでは十進を併用していた)、64ビット仮想アドレス空間と32ビット幅の命令セットを持つ(ビッグエンディアン方式)。
命令は32ビット幅で、一般に "OP X, Y, Z" という形式である。OPは命令コード、Xに結果が返され、それぞれのフィールドは8ビット幅である。例えば、加算命令 (ADD) の命令コードは32となっている。Xオペランドは通常演算結果を格納するレジスタを指定する。他のオペランドは演算対象のレジスタを指定する。例えば、"ADD $0, $1, 3" はレジスタ 1 と即値 3 を加算してレジスタ 0 に結果を格納する(Zオペランドを即値として扱う ADDI 命令の命令コードは 33 だが、同じ ADD というニーモニックを使用)。MMIXプログラムは MMIXALアセンブリ言語で書かれる。
MMIXチップには256本のアークテクチャ上の汎用レジスタがあり、$0 から $255 で表される。他に32本の専用レジスタを持つ。MMIX は後述するレジスタスタック機能を持つ。レジスタスタックに使用するレジスタをローカルレジスタ、任意のルーチンからアクセス可能なレジスタをグローバルレジスタと呼ぶ。ローカルレジスタは $0 から始まり rL レジスタで指定される番号のレジスタまで、グローバルレジスタは rG レジスタで指定される番号のレジスタから $255 までとなっている。ローカルレジスタはサブルーチン呼び出しの際に自動的に切り替えられる(切り替えない呼び出し方法もある)。物理的なレジスタの構成はMMIXでは規定されていないが、例えばグローバルレジスタを 256-32本、ローカルレジスタを512本物理的に用意するなどの構成が考えられる。
ローカルレジスタスタックはレジスタ・ウィンドウに似ているが、具体的な実装方式は定義されておらず、あくまでもユーザーから見た見え方のみが定義されている。ローカルレジスタスタックを使用すると、各サブルーチンは $0 から $(rL-1) までをローカルレジスタとして持つ(rLレジスタは専用レジスタ)。どちらでもない汎用レジスタはマージナルレジスタと呼ばれる。マージナルレジスタをオペランドに使用すると自動的にそのレジスタまでがローカルレジスタとなる(入力オペランドとして使用すると、値は 0)。例えば、ルーチン A が $0 から $4 までをローカルレジスタに使用していて、引数を2つ持つルーチン B を呼び出す場合、$5 をルーチン B の結果格納域とし、$6 と $7 に引数を設定してルーチンBを呼び出す。そうするとルーチンBでは$6だった物理レジスタが $0、$7だった物理レジスタが $1 として見えるようになる。ルーチン B のリターン値を $0 に格納してルーチン A に戻ると、ルーチンA からは $5 にそのリターン値が見えることになる($0 から $4 は B を呼び出す前と同じものが復帰している)。物理レジスタには限りがあるため、全コールスタックをレジスタに保持することはできない。スタック内容のレジスタからメモリへの移動(またはその逆)は自動的に行われ、rO レジスタと rS レジスタがメモリ上のスタックとレジスタスタックの関連付けを行う。
MMIXには以下のような32本の専用レジスタがある。
トリップとはユーザーレベルの例外処理機構であり、トリップが発生するとユーザー空間の固定アドレス(0番地)にジャンプする。トラップはオペレーティングシステムに飛び込む機構である。上記専用レジスタの説明に「トリップ」とあるのはトリップ発生時に使用されるコンテキスト保持のレジスタ、「トラップ」とあるのはトラップ発生時に使用されるコンテキスト保持のレジスタである。