| デザイナー | ドナルド・クヌース |
|---|---|
| ビット | 64ビット |
| 紹介された | 1999 (1999年) |
| デザイン | RISC |
| エンコーディング | 修理済み |
| 分岐 | 条件コード |
| エンディアン | 大きい |
| 開ける | はい、ロイヤリティフリーです |
| レジスター | |
| 32個の特殊目的レジスタ | |
| 汎用 | 256 (特殊目的レジスタ rL と rG は、どのレジスタを参照できるかを制御します) |
MMIX (エムミックスと発音) は、ドナルド・クヌースが設計した64 ビットの縮小命令セット コンピュータ(RISC)アーキテクチャであり、ジョン・L・ヘネシー( MIPS アーキテクチャの設計に貢献) とリチャード・L・サイト ( Alphaアーキテクチャの設計者) の多大な貢献によって実現しました。
クヌースは次のように述べています。
MMIXは、プログラミングの機械レベルの側面を説明することを目的としたコンピュータです。私の著書『The Art of Computer Programming』では、かつてそのような役割を果たしていた1960年代スタイルのマシンMIXに代わるものです。…私はMMIXの設計にあたり、その機械語がシンプルで洗練され、習得しやすいものとなるよう努めました。同時に、MMIXが原理的には構築可能であり、市場で最も高速な汎用コンピュータのいくつかと競合する可能性もあるように、高いパフォーマンスを実現するために必要な複雑な要素もすべて組み込むよう配慮しました。[ 1 ]
クヌースは1999年にMMIXの設計を開始し、2011年に設計の安定版をリリースした。[ 2 ]このプロセッサには「2009」という番号が付けられているが、これは他のコンピュータアーキテクチャの番号との算術平均であり、ローマ数字では「MMIX」であるとクヌースは説明している。[ 3 ]
MMIXは、ビッグエンディアン方式の64ビットRISC(縮小命令セットコンピュータ)で、256個の64ビット汎用レジスタ、32個の64ビット特殊用途レジスタ、固定長32ビット命令、および64ビット仮想アドレス空間を備えています。MMIX命令セットは256個のオペコードで構成され、そのうち1つは将来の拡張用に予約されています。MMIXはIEEE 754浮動小数点数を使用します。
すべての命令には関連するニーモニックがあります。例えば、命令番号20(10進数で32)はADDに関連付けられています。ほとんどの命令は記号形式 を持ちます。OP X,Y,Zここで、OPは命令の種類、Xは命令の結果を格納するレジスタ、YとZは命令のオペランドを指定します。これらのフィールドはそれぞれ8ビット幅です。例えば、ADD $0,$1,3は「$0に$1と3の合計を設定する」という意味です。一部の命令では、YとZを16ビットの即値オペランドYZとして扱います。
ほとんどの命令は即値またはレジスタの内容のいずれかを取ることができるため、1 つの命令ニーモニックは 2 つのオペコードのいずれかに対応する場合があります。
MMIXプログラムは通常、MMIXALアセンブリ言語を使用して構築されます。以下は、「Hello, world!」という文字列を出力する単純なMMIXALプログラムです。
LOC #100 % プログラムのアドレスを設定する % は最初は 0x100 です。 メイン GETA $255,string % 文字列のアドレスを入れる % をレジスタ 255 に格納します。 TRAP 0,Fputs,StdOut % が指す文字列を書き込む % レジスタ255を標準に % 出力ファイル。 TRAP 0,Halt,0 % プロセスを終了します。 string BYTE "Hello, world!",#a,0 % 印刷する文字列。#aは % 改行、0 で終了 % 弦。 MMIXチップには、$0から$255で指定される256個の直接アドレス指定可能な汎用アーキテクチャレジスタと、32個の特殊用途アーキテクチャレジスタがあります。特殊用途レジスタには、GET命令とPUT命令でアクセスできます。特殊レジスタのうち2つ、rLとrGは、汎用レジスタのうちどれがローカルでどれがグローバルかを決定します。$0... ([rL] − 1)から始まるすべてのレジスタはローカルレジスタであり、レジスタの内部スタックへのウィンドウを表します。 [ 4 ] [rL]... ([rG] − 1)から始まるレジスタは「マージナルレジスタ」であり、演算のソースとして使用された場合は常に0を返します。マージナルレジスタを演算のデスティネーションとして使用すると、マシンは自動的にrLをインクリメントしてそのレジスタを含めます。[rG]...$255から始まるすべてのレジスタはグローバルレジスタと呼ばれ、レジスタスタックの一部ではありません。
ローカルレジスタスタックは、各サブルーチンに、$0 から$(rL − 1)で指定される独自の rL ローカルレジスタを提供します。サブルーチンが呼び出されるたびに、いくつかのローカルレジスタがスタックにプッシュされます (ウィンドウの開始をシフトすることにより)。呼び出されたサブルーチンの引数は、残りのローカルレジスタに残されます。サブルーチンが終了すると、前にプッシュされたレジスタがポップされます。内部スタックは有限の数のレジスタしか格納できないため、スタックの一部をメモリに格納する必要がある場合があります。[ 4 ]これは、ローカルレジスタスタックのどの部分がメモリ内にあり、どの部分がまだローカル物理レジスタ内にあるかを記録する特別なレジスタ rO と rS で実装されています。レジスタスタックは、サブルーチンの高速なリンクを提供します。
32 個の特殊な物理アーキテクチャ レジスタは、コード番号別に次のようになります。
ほとんどすべての他のCPU上で実行されるプログラムと同様に、MMIXプログラムはいくつかの方法で割り込まれる可能性があります。タイマーなどの外部ハードウェアは、プリエンプション割り込みの一般的な発生源です。多くの命令は、仮想記憶の実装に使用されるメモリ保護ページフォールト例外や浮動小数点例外処理など、特定の例外ケースで割り込みを発生させます。MMIXには、「トリップ」と「トラップ」の2種類の割り込みがあります。「トリップ」と「トラップ」の主な違いは、トラップはオペレーティングシステム内の「トラップハンドラー」プログラムに制御を送る(トラッピング)のに対し、トリップはユーザーアプリケーション内の「トリップハンドラー」プログラムに制御を送る(トリッピング)ことです。ユーザーは、他のコンピュータシステムの一部のトラップと同様に、明示的なソフトウェア割り込み命令TRIPおよびTRAPを使用して、任意の割り込みハンドラーを強制的に実行することもできます。特に、ユーザープログラムからオペレーティングシステムへのシステムコールは、 TRAP命令を使用します。[ 1 ] : 38
2015年10月現在、MMIX命令セットアーキテクチャのハードウェア実装は知られていない。しかし、fpgammix [ 5 ]プロジェクトはMMIXをVerilogで実装しており、フィールドプログラマブルゲートアレイを用いた実装を可能にしている。
MMIX 命令セット アーキテクチャは、コンピューター アーキテクチャの研究およびソフトウェア開発用の多数のソフトウェア ツールによってサポートされています。
gzippedtarファイル)。GNUコンパイラ コレクションには、 C / C++コンパイラ用のMMIXバックエンドが含まれています。これは、Hans-Peter Nilsson によって提供され、2001 年後半から GCC のメイン ディストリビューションの一部となっています。2017 年 11 月現在、GCC の MMIX バックエンドは、ボランティアによって積極的に開発および保守され続けています。
上記のツールは、理論的には、 FreeBSD、Linux 、またはその他の同様のオペレーティング システム カーネル全体をMMIX ハードウェア上にコンパイル、ビルド、ブートストラップするために使用できます (そのようなハードウェアが存在する場合)。
(
Cray-1
+
IBM 801
+
RISC II
+
Clipper
C300 +
AMD 29k
+
Motorola 88k
+
IBM 601
+
Intel i960
+
Alpha 21164
+
POWER2
+
MIPS R4000
+
Hitachi Super H4
+
StrongARM
110 +
SPARC
64) / 14 = 28126 / 14 = 2009