| デザイナー | ドナルド・クヌース |
|---|---|
| ビット | 64ビット |
| 紹介された | 1999 |
| デザイン | RISC |
| エンコーディング | 修理済み |
| 分岐 | 条件コード |
| エンディアン | 大きい |
| 開ける | はい、ロイヤリティフリーです |
| レジスター | |
| 32 個の特殊目的レジスタ | |
| 汎用 | 256 |
MMIX(エムミックスと発音)は、ドナルド・クヌースが設計した64ビットの RISC(縮小命令セットコンピューティング)アーキテクチャであり、ジョン・L・ヘネシー( MIPSアーキテクチャの設計に貢献)とリチャード・L・サイト(アルファアーキテクチャの設計者)の多大な貢献により実現しました。クヌースは次のように述べています。
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 は命令の結果を格納するレジスタを指定し、残りは命令のオペランドを指定します。これらのフィールドはそれぞれ 8 ビット幅です。たとえば、ADD $0,$1,3は「$0 を $1 と 3 の合計に設定する」という意味です。
ほとんどの命令は即値またはレジスタの内容のいずれかを取ることができるため、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 個の特殊な物理アーキテクチャ レジスタは次のとおりです。
- rB、ブートストラップレジスタ(トリップ)
- トリップすると、rB ← $255、$255 ← rJ になります。したがって、rJ は汎用レジスタに保存されます。
- rD、配当レジスタ
- 符号なし整数除算では、これを他のオペランドで除算する 128 ビット入力の左半分として使用します。
- rE、イプシロンレジスタ
- イプシロンに関する浮動小数点の比較に使用されます。
- rH、himultレジスタ
- 符号なし整数の乗算の 128 ビット結果の左半分を格納するために使用されます。
- rJ、リターンジャンプレジスタ
- PUSH によって次の命令のアドレスを保存し、PUSH から戻るために POP によって使用されます。
- rM、多重マスクレジスタ
- 多重化命令によって使用されます。
- rR、剰余レジスタ
- 整数除算の余りに設定されます。
- rBB、ブートストラップレジスタ(トラップ)
- トラップ時には、rBB ← $255、$255 ← rJとなる。こうしてrJは汎用レジスタに保存される。
- rC、サイクルカウンタ
- サイクルごとに増加します。
- rN、シリアル番号
- この特定の MMIX プロセッサを識別する定数。
- rO、レジスタスタックオフセット
- レジスタ スタックを実装するために使用されます。
- rS、レジスタスタックポインタ
- レジスタ スタックを実装するために使用されます。
- rI、インターバルカウンタ
- サイクルごとに減分されます。ゼロになると割り込みが発生します。
- rT、トラップアドレスレジスタ
- トリップ ベクトルのアドレスを格納するために使用されます。
- rTT、動的トラップアドレスレジスタ
- トラップ ベクトルのアドレスを格納するために使用されます。
- rK、割り込みマスクレジスタ
- 特定の割り込みを有効または無効にするために使用されます。
- rQ、割り込み要求レジスタ
- 割り込みが発生したときにそれを記録するために使用されます。
- rU、使用カウンタ
- 実行された命令の数を保持するために使用されます。
- rV、仮想変換レジスタ
- 仮想アドレスを物理アドレスに変換するために使用されます。セグメントのサイズと数、ページ テーブルのルート位置、およびアドレス空間番号が含まれます。
- rG、グローバル閾値レジスタ
- rG 以上の番号を持つすべての汎用レジスタ参照は、グローバル レジスタを参照します。
- rL、ローカル閾値レジスタ
- rL より小さい番号を持つすべての汎用レジスタ参照は、ローカル レジスタを参照します。
- rA、算術ステータスレジスタ
- オーバーフローやゼロ除算などの算術例外を記録、有効化、無効化するために使用されます。
- rF、障害位置レジスタ
- 障害の原因となった命令のアドレスを保存するために使用されます。
- rP、予測レジスタ
- 条件付きスワップ (CSWAP) によって使用されます。
- rW、中断された場所のレジスタ(トリップ)
- トリップ時に、中断された命令の後の命令のアドレスを格納するために使用されます。
- rX、実行レジスタ(トリップ)
- トリップ時に、中断された命令を保存するために使用されます。
- rY、Yオペランド(トリップ)
- トリップ時に、中断された命令の Y オペランドを格納するために使用されます。
- rZ、Zオペランド(トリップ)
- トリップ時に、中断された命令の Z オペランドを格納するために使用されます。
- rWW、割り込み先レジスタ(トラップ)
- トラッピング時に、中断された命令の後の命令のアドレスを格納するために使用されます。
- rXX、実行レジスタ(トラップ)
- トラップ時に、中断された命令を保存するために使用されます。
- rYY、Yオペランド(トラップ)
- トラッピング時に、中断された命令の Y オペランドを格納するために使用されます。
- rZZ、Zオペランド(トラップ)
- トラッピング時に、中断された命令の Z オペランドを格納するために使用されます。
他のほとんどの CPU で実行されるプログラムと同様に、MMIX プログラムはいくつかの方法で割り込まれる可能性があります。タイマーなどの外部ハードウェアは、プリエンプション割り込みの一般的なソースです。多くの命令は、仮想メモリを実装するために使用されるメモリ保護 ページフォールト例外や、浮動小数点例外処理などの特定の例外的な場合に割り込みを引き起こします。MMIX には、「トリップ」と「トラップ」の 2 種類の割り込みがあります。「トリップ」と「トラップ」の主な違いは、トラップはオペレーティング システムの「トラップ ハンドラー」プログラムに制御を送る (トラッピング) のに対し、トリップはユーザー アプリケーションの「トリップ ハンドラー」プログラムに制御を送る (トリップ) ことです。ユーザーは、他のコンピューター システムのトラップの一部と同様に、明示的なソフトウェア割り込み命令 TRIP および TRAP を使用して、任意の割り込み ハンドラーを強制的に実行することもできます。特に、ユーザー プログラムからオペレーティング システムへのシステム コールでは、TRAP 命令が使用されます。[1] : 38
ハードウェア実装
2015年10月現在[アップデート]、MMIX命令セットアーキテクチャのハードウェア実装は知られていない。しかし、fpgammix [5]プロジェクトはMMIXをVerilogで実装しており、フィールドプログラマブルゲートアレイを使用して実装することが可能となっている。
ソフトウェアツール
MMIX 命令セット アーキテクチャは、コンピューター アーキテクチャの研究およびソフトウェア開発用の多数のソフトウェア ツールによってサポートされています。
シミュレータとアセンブラ
- MMIXware [6] – Donald KnuthのMMIX-SIMシンプル(動作)シミュレータ、MMIXALアセンブラ、テストスイート、サンプルプログラム、完全なドキュメント、およびMMIXアーキテクチャ(パイプライン)シミュレータ(
gzippedtarファイル)。 - MMIXX [7] – MIT理論物理学センターのAndrew Pochinsky氏が提供したX11ベースのグラフィックパッケージ。上記のMMIXwareソースと組み合わせると、MMIX仮想マシンに640×480ピクセルのトゥルーカラーの「仮想ディスプレイ」(UNIX/Linux用)が追加されます。
コンパイラ
GNUコンパイラ コレクションには、 C / C++コンパイラ用のMMIXバックエンドが含まれています。これはHans-Peter Nilsson によって提供され、2001 年後半から GCC のメイン ディストリビューションの一部となっています。2017 年 11 月現在、GCC の MMIX バックエンドは引き続きボランティアによって積極的に開発および保守されています。 [アップデート]
- Hans-Peter NilssonによるGCC + MMIXツールのインストール手順。[8]
- §3.17.26. GNU GCCバージョン7.2.0のMMIXオプション[9](GNU GCC Webサイト)。
- §9.28. MMIX依存機能[10]はGNU Binutilsバージョン2.29以降、GNU GCCのアセンブラバックエンド(GNU Binutils Webサイト)から利用可能。
上記のツールは、理論的には、 FreeBSD、Linux 、またはその他の同様のオペレーティング システム カーネル全体をMMIX ハードウェア上にコンパイル、ビルド、ブートストラップするために使用できます (そのようなハードウェアが存在する場合)。
参照
- 教育用プログラミング言語
- DLX
- LC-3
- 小さな男のコンピューター
- ミクロシム
- ミックス
- NAR 2は、学生の学習を支援するために教授が設計した別のプロセッサです。
参考文献
- ^ ab Knuth, Donald E. (1999 年 10 月)、MMIXware: A RISC Computer for the Third Millennium、Lecture Notes in Computer Science Tutorial、vol. 1750、ハイデルベルク: Springer-Verlag、ISBN 3-540-66938-8(訂正)
- ^ 「MMIX Home: Don Knuthからのメッセージ」mmix.cs.hm.edu . 2021年5月23日閲覧。
- ^ Knuth, Donald (1999-02-09). MMIX: A RISC Computer for the New Millennium (オフセット 7:36). Stanford Lecture. 2021-12-11 のオリジナルからアーカイブ。
(
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
- ^ ab クヌース、ドナルド(2005)。「セクション 1.4.2」「MMIX - 新世紀に向けた RISC コンピュータ。コンピュータ プログラミングの芸術。第 1 巻、巻 1。Addison Wesley。p. 58。」
- ^ tommythorn. 「fpgammix」. 2024年9月27日閲覧。
- ^ "MMIXware". Cs-faculty.stanford.edu . 2014年5月25日閲覧。
- ^ "MMIXX". Malgil.com. 2002-03-06 . 2014-05-25閲覧。
- ^ GCC + MMIX ツールのインストール手順
- ^ https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/MMIX-Options.html §3.17.26. MMIX
- ^ 「§9.28 MMIX依存機能」 Sourceware.org . 2017年11月20日閲覧。
さらに読む
- ドナルド E. クヌース (2005)。『コンピュータプログラミングの技法』第 1 巻 第 1 巻: MMIX 新世紀に向けた RISC コンピュータ。Addison - Wesley。ISBN 0-201-85392-2 (正誤表)
- Martin Ruckert (2015) 。MMIX Supplement, The: Supplement to The Art of Computer Programming Volumes 1, 2, 3 by Donald E. Knuth。Addison -Wesley。ISBN 0-133-99231-4
外部リンク
- MMIXホームページ
- Donald Knuth の MMIX ページ — MMIX の簡単な紹介と、TAoCP で仮想アセンブリ言語を使用する Knuth の理由。
- Donald Knuth の MMIX ニュース ページ — CWEBで書かれたオープン ソースシミュレーター、プログラマー マニュアル、およびサンプル プログラム。
- MMIXmasters Web サイト — TAOCP 第 1 巻から第 3 巻までのすべてのプログラムを古い MIX から新しい MMIX に変換しているボランティア (MMIXmasters) のための Web サイト。
- VMMMIX は、Wayback Machineで 2009-07-05 にアーカイブされています— VMMMIX は MMIX 仮想マシンです。コンソール、HDD、および Ethernet I/O を備えています。現在、この仮想マシンは Windows でのみ動作します。また、この MMIX 仮想マシンでは Linux も動作します。
- VMB ホームページ - 仮想マザーボード プロジェクトでは、適切なバージョンの MMIX CPU で使用できるプラグ アンド プレイ デバイスのコレクションを提供しています。
