MIPS(マイクロプロセッサ・ウィズアウト・インターロックド・パイプライン・ステージ)[ 1 ]は、米国に拠点を置くMIPS Computer Systems(現MIPS Technologies )によって開発されたRISC(縮小命令セットコンピュータ)命令セットアーキテクチャ(ISA)[ 2 ]: A-1 [ 3 ]: 19のファミリーです。
MIPSには、MIPS I、II、III、IV、Vを含む複数のバージョンがあり、MIPS32/64(それぞれ32ビットおよび64ビット実装用)の5つのリリースがあります。初期のMIPSアーキテクチャは32ビットでしたが、64ビットバージョンは後に開発されました。2017年4月現在、MIPSの最新バージョンはMIPS32/64リリース6です。[ 4 ] [ 5 ] MIPS32/64は、主にユーザーモードアーキテクチャに加えて特権カーネルモードシステム制御コプロセッサを定義することで、MIPS I~Vと異なります。
MIPSアーキテクチャには、いくつかのオプションの拡張機能があります。3Dコンピュータグラフィックス専用のシンプルな浮動小数点SIMD命令セットであるMIPS-3D 、 [ 6 ] 64ビット浮動小数点レジスタを使用するより広範な整数SIMD命令セットであるMDMX (MaDMaX)、プログラムが必要とするメモリを削減するために命令ストリームに圧縮を追加するMIPS16e、 [ 7 ]およびマルチスレッド機能を追加するMIPS MT 。 [ 8 ]
大学や専門学校のコンピュータアーキテクチャのコースでは、MIPSアーキテクチャがよく研究されています。[ 9 ]このアーキテクチャは、 Alphaなどの後のRISCアーキテクチャに大きな影響を与えました。2021年3月、MIPSはRISC-Vへの移行に伴い、MIPSアーキテクチャの開発が終了したと発表しました。[ 10 ]
MIPSアーキテクチャの最初のバージョンは、MIPS Computer Systems社が自社のR2000マイクロプロセッサ向けに設計したもので、これが最初のMIPS実装となった。MIPSとR2000は1985年に同時に発表された。[ 11 ] MIPS IIが発表された際、MIPSは新しいバージョンと区別するためにMIPS Iと改名された。 [ 3 ]: 32
MIPS Computer Systems社のR6000マイクロプロセッサ(1989年)は、最初のMIPS II実装でした。[ 3 ]: 8サーバー向けに設計されたR6000は、Bipolar Integrated Technology社によって製造・販売されましたが、商業的には失敗に終わりました。1990年代半ばには、組み込みシステム向けの多くの新しい32ビットMIPSプロセッサがMIPS II実装でした。これは、1991年に64ビットMIPS IIIアーキテクチャが導入されたことで、1999年にMIPS32が導入されるまで、MIPS IIが最新の32ビットMIPSアーキテクチャとなったためです。[ 3 ]: 19
MIPS Computer SystemsのR4000マイクロプロセッサ (1991 年) は、最初の MIPS III 実装でした。パーソナルコンピュータ、ワークステーション、サーバーコンピュータでの使用を想定して設計されました。MIPS Computer Systems は、MIPS アーキテクチャと R4000 を積極的に推進し、Advanced Computing Environment (ACE) コンソーシアムを設立して、MIPS をパーソナルコンピューティングプラットフォームの主流にすることを目指したAdvanced RISC Computing (ARC) 標準を推進しました。ARC はパーソナルコンピュータではほとんど成功しませんでしたが、R4000 (およびその派生版である R4400) はワークステーションやサーバーコンピュータで広く使用され、特に最大のユーザーであるSilicon Graphicsによって使用されました。R4000 のその他の用途には、ハイエンド組み込みシステムやスーパーコンピュータが含まれます。MIPS III は最終的に多くの組み込みマイクロプロセッサで実装されました。Quantum Effect DesignのR4600 (1993 年) およびその派生版は、ハイエンド組み込みシステムやローエンドワークステーションおよびサーバーで広く使用されました。 MIPS Technologies社のR4200(1994年)は、組み込みシステム、ノートパソコン、パーソナルコンピュータ向けに設計された。その派生版であるR4300iは、NECエレクトロニクスによって製造され、ニンテンドー64ゲーム機に搭載された。ニンテンドー64は、プレイステーションと並んで、1990年代半ばにMIPSアーキテクチャプロセッサを最も多く使用した機器の一つであった。
MIPS IVの最初の実装は、MIPS Technologies社のR8000マイクロプロセッサチップセット(1994年)でした。R8000の設計はSilicon Graphics社で始まり、大規模な浮動小数点演算処理で高い性能が求められる科学技術分野向けのハイエンドワークステーションやサーバーでのみ使用されました。その後、MIPS Technologies社のR10000(1996年)、Quantum Effect Devices社のR5000(1996年)、RM7000(1998年)が実装されました。NEC Electronics社と東芝社が製造・販売したR10000とその派生製品は、NEC、Pyramid Technology社、Silicon Graphics社、Tandem Computers社(その他多数)によってワークステーション、サーバー、スーパーコンピュータで使用されました。R5000とR7000は、ハイエンド組み込みシステム、パーソナルコンピュータ、ローエンドワークステーションやサーバーで使用されました。東芝のR5000の派生型であるR5900は、ソニー・コンピュータエンタテインメントのエモーションエンジンに使用され、同社のPlayStation 2ゲーム機の動力源となった。
1996 年 10 月 21 日に Microprocessor Forum 1996 でMIPS Digital Media Extensions (MDMX) 拡張機能とともに発表された MIPS V は、3D グラフィックス変換のパフォーマンスを向上させるように設計されました。[ 12 ] 1990 年代半ば、組み込み以外の MIPS マイクロプロセッサの主な用途は、シリコン グラフィックスのグラフィックス ワークステーションでした。MIPS V は、整数のみの MDMX 拡張機能によって完成し、3D グラフィックス アプリケーションのパフォーマンスを向上させるための完全なシステムを提供しました。[ 13 ] MIPS V の実装は導入されませんでした。1997 年 5 月 12 日に、シリコン グラフィックスは H1 ("Beast") と H2 ("Capitan") マイクロプロセッサを発表しました。前者は最初のMIPS V実装となる予定で、1999年前半に導入される予定だった。[ 14 ] H1およびH2プロジェクトは後に統合され、最終的に1998年に中止された。MIPS V実装はなかったが、MIPS64リリース1(1999年)はMIPS Vをベースとしており、ペアードシングルと呼ばれるオプションのコプロセッサ1(FPU)機能としてそのすべての機能を保持している。
MIPS Technologies が 1998 年に Silicon Graphics からスピンアウトしたとき、組み込み市場に再び注力しました。MIPS V を通じて、後続の各バージョンは前のバージョンの厳密なスーパーセットでしたが、この特性が問題であることが判明し、アーキテクチャ定義が変更され、32 ビットと 64 ビットのアーキテクチャ、MIPS32 と MIPS64 が定義されました。両方とも 1999 年に発表されました。[ 15 ] MIPS32 は、MIPS II をベースに、MIPS III、MIPS IV、MIPS V からの追加機能をいくつか備えています。MIPS64 は MIPS V をベースにしています。 [ 15 ] NEC、東芝、SiByte (後にBroadcomに買収) は、MIPS64 が発表されるとすぐにライセンスを取得しました。その後、 Philips、LSI Logic、IDT、Raza Microelectronics、Cavium、Loongson Technology、Ingenic Semiconductor が加わりました。 MIPS32/MIPS64 リリース 5 は 2012 年 12 月 6 日に発表されました。[ 16 ] MIPS の製品マーケティング ディレクターによると、リリース 4 は、多くのアジア文化で数字の 4 が不吉だと考えられているためスキップされたとのことです。[ 17 ]
2018 年 12 月、MIPS アーキテクチャの新しい所有者である Wave Computing は、MIPS Open イニシアチブと呼ばれるプログラムで MIPS ISA をオープンソース化すると発表した。[ 18 ]このプログラムは、32 ビットと 64 ビットの両方の設計の最新バージョンへのアクセスを開放し、ライセンス料やロイヤリティ料なしで利用できるようにすること、また参加者に既存の MIPS 特許のライセンスを付与することを目的としていた。[ 19 ] [ 20 ] [ 21 ]
2019年3月、MIPSリビジョン6がロイヤリティフリーのライセンスで利用可能になったが[ 22 ]、同年後半にプログラムは再び停止された[ 23 ] 。
2021年3月、Wave ComputingはMIPSアーキテクチャの開発が終了したと発表した。同社はRISC-V財団に加盟し、今後のプロセッサ設計はRISC-Vアーキテクチャに基づくことになる。[ 10 ] [ 24 ]それにもかかわらず、Loongsonなどの一部のライセンシーは、MIPS互換ISAの新しい拡張を独自に継続している。[ 25 ]
2024年1月、LoongsonはMIPSアーキテクチャの使用権をめぐる訴訟で勝訴した。[ 26 ]
MIPSは、最大4つのコプロセッサ(COP0/1/2/3)をサポートするモジュール型アーキテクチャです。MIPSの用語では、COP0はシステム制御コプロセッサ(MIPS I~Vでは実装定義のプロセッサの必須部分)、COP1はオプションの浮動小数点演算ユニット(FPU)、COP2とCOP3はオプションの実装定義コプロセッサです(MIPS IIIではCOP3が削除され、そのオペコードは他の用途に再利用されました)。例えば、PlayStationビデオゲーム機では、COP2はジオメトリ変換エンジン(GTE)であり、3Dコンピュータグラフィックスにおけるジオメトリ処理を高速化します。
MIPSはロード/ストアアーキテクチャ(レジスタ・レジスタアーキテクチャとも呼ばれる)であり、メモリへのアクセスに使用されるロード/ストア命令を除き、すべての命令はレジスタ上で動作します。
MIPS I には 32 ビットの汎用レジスタ (GPR) が 32 個あります。レジスタ$0はゼロに固定されており、そこに書き込まれた値は破棄されます。レジスタ$31はリンクレジスタです。他の命令とは非同期に実行される整数乗算および除算命令には、32 ビットのレジスタHIとLOが用意されています。汎用レジスタと HI/LO レジスタ間でデータをコピーするための命令が少数用意されています。プログラムカウンタは 32 ビットです。MIPS I 命令は 32 ビット長で、自然なワード境界にアラインされているため、下位 2 ビットは常にゼロになります。
命令は、R(レジスタ)、I(即値)、J(ジャンプ)の3種類に分類されます。すべての命令は6ビットのオペコードで始まります。オペコードに加えて、Rタイプの命令は3つのレジスタ[ 27 ] 、シフト量フィールド、および関数フィールドを指定します。Iタイプの命令は2つのレジスタと16ビットの即値を指定します。Jタイプの命令は、オペコードの後に26ビットのジャンプ先を指定します。[ 2 ] : A-174
コア命令セットに使用されるフォーマットは以下の3種類です。
MIPS I には、8 ビット バイト、16 ビット ハーフワード、および 32 ビット ワードをロードおよびストアする命令があります。サポートされているアドレッシング モードは、ベース + ディスプレイスメントの 1 つのみです。MIPS I は 32 ビット アーキテクチャであるため、32 ビット未満の量をロードするには、データを符号拡張またはゼロ拡張して 32 ビットにする必要があります。「unsigned」が末尾に付いたロード命令はゼロ拡張を実行します。それ以外の場合は、符号拡張を実行します。ロード命令は、GPR (rs) の内容からベースを取得し、結果を別の GPR (rt) に書き込みます。ストア命令は、GPR (rs) の内容からベースを取得し、別の GPR (rt) からデータをストアします。すべてのロードおよびストア命令は、ベースと符号拡張された 16 ビット即値を加算してメモリ アドレスを計算します。MIPS I では、すべてのメモリ アクセスが自然なワード境界にアラインされている必要があり、そうでない場合は例外が通知されます。効率的な非アラインメントメモリアクセスをサポートするために、「left」または「right」が末尾に付いたロード/ストアワード命令が用意されています。すべてのロード命令の後にはロード遅延スロットが続きます。ロード遅延スロット内の命令は、ロード命令によってロードされたデータを使用することはできません。ロード遅延スロットには、ロード命令に依存しない命令を配置できます。そのような命令が見つからない場合は、NOP命令が代入されます。
MIPS I には、加算と減算を実行する命令があります。これらの命令は、2 つの GPR (rs と rt) からオペランドを取得し、結果を 3 番目の GPR (rd) に書き込みます。あるいは、加算では、1 つのオペランドを 16 ビット即値 (32 ビットに符号拡張) から取得することもできます。加算と減算の命令には 2 つのバリアントがあります。デフォルトでは、結果がオーバーフローすると例外が通知されます。「unsigned」サフィックスが付いた命令では、例外は通知されません。オーバーフロー チェックでは、結果を 32 ビットの 2 の補数整数として解釈します。MIPS I には、ビットごとの論理 AND、OR、XOR、および NOR を実行する命令があります。これらの命令は、2 つの GPR からオペランドを取得し、結果を 3 番目の GPR に書き込みます。AND、OR、および XOR 命令では、1 つのオペランドを 16 ビット即値 (32 ビットにゼロ拡張) から取得することもできます。 「関係に基づいて設定」命令は、指定された関係が真か偽かに応じて、宛先レジスタに 1 または 0 を書き込みます。これらの命令は、2 つの GPR または 1 つの GPR と 16 ビット即値 (符号拡張されて 32 ビット) からオペランドを取得し、結果を 3 番目の GPR に書き込みます。デフォルトでは、オペランドは符号付き整数として解釈されます。「unsigned」が接尾辞として付加されたこれらの命令のバリアントは、オペランドを符号なし整数として解釈します (符号拡張された 16 ビット即値からオペランドを取得する場合も同様です)。
ロード上位即値命令は、16ビット即値を汎用レジスタ(GPR)の上位16ビットにコピーします。この命令は、オリジン即値命令と組み合わせて、32ビット即値をレジスタにロードするために使用されます。
MIPS Iには、左論理シフト、右論理シフト、および右算術シフトを実行する命令があります。オペランドはGPR(rt)から取得され、結果は別のGPR(rd)に書き込まれます。シフト距離は、GPR(rs)または5ビットの「シフト量」(「sa」フィールド)から取得されます。
MIPS I には、符号付きおよび符号なし整数の乗算と除算を行う命令があります。これらの命令は、オペランドを 2 つの GPR から取得し、結果を HI と LO と呼ばれる 2 つの 32 ビット レジスタに書き込みます。これは、他の CPU 命令とは別個に (かつ同時に) 実行される可能性があるためです。乗算の場合、64 ビット積の上位と下位の半分がそれぞれ HI と LO に書き込まれます。除算の場合、商が LO に、余りが HI に書き込まれます。結果にアクセスするには、HI または LO の内容を GPR にコピーする命令のペア (Move from HI および Move from LO) が用意されています。これらの命令は連動しており、HI と LO への書き込みを行う未完了の算術命令が完了するまで、HI と LO の読み取りは実行されません。別の命令のペア (Move to HI または Move to LO) は、GPR の内容を HI と LO にコピーします。これらの命令は、例外処理後にHIとLOを元の状態に戻すために使用されます。HIまたはLOを読み取る命令は、HIまたはLOに書き込みを行わない2つの命令で区切る必要があります。
すべての MIPS I 制御フロー命令の後には、分岐遅延スロットが続きます。分岐遅延スロットが有用な処理を実行する命令で埋められていない限り、NOP が代入されます。MIPS I 分岐命令は、符号付き整数として GPR (rs) の内容をゼロまたは別の GPR (rt) と比較し、指定された条件が真であれば分岐します。制御は、16 ビットのオフセットを 2 ビット左にシフトし、18 ビットの結果を符号拡張し、32 ビットの符号拡張結果をプログラム カウンタ (命令アドレス) と 8 10の合計に加算することによって計算されたアドレスに転送されます。ジャンプには、絶対ジャンプとレジスタ間接ジャンプの 2 つのバージョンがあります。絶対ジャンプ (「ジャンプ」および「ジャンプとリンク」) は、26 ビットの instr_index を 2 ビット左にシフトし、28 ビットの結果を分岐遅延スロット内の命令のアドレスの上位 4 ビットと連結することによって、制御が転送されるアドレスを計算します。レジスタ間接ジャンプは、GPR(rs)から取得したアドレスにある命令に制御を移します。GPRから取得したアドレスはワード境界に揃っている必要があります。そうでない場合、分岐遅延スロット内の命令の実行後に例外が通知されます。リンクする分岐命令およびジャンプ命令(「ジャンプおよびリンクレジスタ」を除く)は、戻りアドレスをGPR 31に保存します。「ジャンプおよびリンクレジスタ」命令を使用すると、戻りアドレスを任意の書き込み可能なGPRに保存できます。
MIPS Iには、ソフトウェアが例外を通知するための命令が2つあります。システムコールとブレークポイントです。システムコールは、ユーザーモードソフトウェアがカーネル呼び出しを行うために使用され、ブレークポイントは、カーネルの例外ハンドラを介してデバッガに制御を移すために使用されます。どちらの命令にも、例外ハンドラの動作環境固有の情報を含むことができる20ビットのコードフィールドがあります。
MIPSには32個の浮動小数点レジスタがあります。2つのレジスタは倍精度浮動小数点数用にペアになっています。奇数番号のレジスタは、倍精度レジスタペアの一部として、算術演算や分岐には使用できません。そのため、ほとんどの命令で使用可能なレジスタは16個となります(移動/コピーおよびロード/ストアは影響を受けません)。
単精度は「.s」という接尾辞で表され、倍精度は「.d」という接尾辞で表されます。
MIPS II ではロード遅延スロット[ 3 ] : 41 が削除され、いくつかの命令セットが追加されました。共有メモリ マルチプロセッシング用に、共有メモリの同期、リンク ワードのロード、条件付きワードのストア命令が追加されました。[ 28 ]トラップ オン 条件命令のセットが追加されました。これらの命令は、評価された条件が真の場合に例外を発生させます。既存のすべての分岐命令には、分岐が実行される場合にのみ分岐遅延スロットの命令を実行する分岐可能性バージョンが与えられました。 [ 3 ] : 40これらの命令は、有用な命令が分岐遅延スロットを埋めることができるようにすることで、特定の場合にパフォーマンスを向上させます。[ 3 ] : 212 COP1〜3 用のダブルワード ロードおよびストア命令が追加されました。他のメモリ アクセス命令と同様に、これらのロードおよびストアでは、ダブルワードが自然にアラインされている必要がありました。
浮動小数点コプロセッサの命令セットにも、いくつかの命令が追加されました。IEEE 754規格に準拠した浮動小数点平方根命令が追加され、単精度と倍精度の両方のオペランドをサポートしました。また、単精度および倍精度の浮動小数点数を32ビットワードに変換する命令セットも追加されました。これらの命令は、浮動小数点制御およびステータスレジスタではなく、命令によってIEEE丸めモードを指定できるようにすることで、既存の変換命令を補完しました。
MIPS III は、64 ビットメモリ アドレス指定と整数演算のサポートを追加した MIPS II の下位互換性のある拡張です。64 ビット データ タイプはダブルワードと呼ばれ、MIPS III は汎用レジスタ、HI/LO レジスタ、およびプログラム カウンタを 64 ビットに拡張してこれをサポートしました。ダブルワードのロードとストア、ダブルワードに対する整数加算、減算、乗算、除算、シフト演算の実行、および GPR と HI/LO レジスタ間のダブルワードの移動を行うための新しい命令が追加されました。共有メモリ マルチ プロセッシング用に、Load Linked Double WordおよびStore Conditional Double Word命令が追加されました。[ 28 ]元々 32 ビット ワードを操作するように定義されていた既存の命令は、必要に応じて 32 ビットの結果を符号拡張して、ほとんどの命令でワードとダブルワードを同じように扱えるように再定義されました。再定義された命令の中にはLoad Wordがあります。MIPS III では、ワードを 64 ビットに符号拡張します。Load Wordを補完するために、ゼロ拡張版が追加されました。
R命令フォーマットでは64ビットシフトの完全なシフト距離を指定できないため(5ビットのシフト量フィールドはダブルワードのシフト距離を指定するには狭すぎるため)、MIPS IIIではMIPS Iの各シフト命令の64ビット版を3つ提供する必要がありました。最初のバージョンは、0~31ビットの固定シフト距離を指定するために使用される、元のシフト命令の64ビット版です。2番目のバージョンは最初のバージョンと似ていますが、32~63ビットの固定シフト距離を指定できるように、シフト量フィールドの値を追加します。3番目のバージョンは、GPRの下位6ビットからシフト距離を取得します。
MIPS IIIでは、既存のカーネル権限レベルとユーザー権限レベルの間に、スーパーバイザー権限レベルが追加されました。この機能は、実装定義のシステム制御プロセッサ(コプロセッサ0)のみに影響します。
MIPS III では、コプロセッサ 3 (COP3) サポート命令が削除され、そのオペコードが新しいダブルワード命令に再利用されました。残りのコプロセッサには、コプロセッサ レジスタと GPR 間でダブルワードを移動する命令が追加されました。浮動小数点汎用レジスタ (FGR) は 64 ビットに拡張され、命令が偶数番号のレジスタのみを使用するという要件が削除されました。これは、以前のバージョンのアーキテクチャとは互換性がありません。浮動小数点制御/ステータス レジスタの 1 ビットを使用して、MIPS III 浮動小数点ユニット (FPU) を MIPS I および II 互換モードで動作させます。浮動小数点制御レジスタは互換性のために拡張されませんでした。追加された新しい浮動小数点命令は、CPU と FPU 間でダブルワードをコピーする命令、単精度および倍精度の浮動小数点数をダブルワード整数に変換する命令、およびその逆の命令のみです。
MIPS IV は、このアーキテクチャの 4 番目のバージョンです。MIPS III の上位互換であり、既存のすべての MIPS バージョンと互換性があります。[ 29 ] : A - 1 MIPS IV は、主に浮動小数点 (FP) パフォーマンスを向上させるために設計されました。オペランドへのアクセスを改善するために、FP ロードとストア用のインデックス付きアドレッシング モード(ベース + インデックス、両方とも GPR から取得) が追加され、メモリ プリフェッチを実行してキャッシュ ヒントを指定するためのプリフェッチ命令も追加されました (これらは、ベース + オフセットとベース + インデックスのアドレッシング モードの両方をサポートしました)。
MIPS IVでは、命令レベルの並列性を向上させるためにいくつかの機能が追加されました。単一の条件ビットによって引き起こされるボトルネックを緩和するために、浮動小数点制御レジスタとステータスレジスタに7つの条件コードビットが追加され、合計で8つになりました。FP比較命令と分岐命令は、どの条件ビットが書き込まれるか、または読み出されるかを指定できるように再定義されました。また、前のFP比較によって書き込まれた条件ビットを読み取るFP分岐命令間の遅延スロットは削除されました。GPRとFPRの両方に対して条件付き移動命令の形で部分述語のサポートが追加され、実装ではIEEE 754トラップに対して正確な例外と不正確な例外のどちらかを選択できるようになりました。
MIPS IVでは、単精度および倍精度FPNの両方に対応する新しいFP演算命令がいくつか追加されました。それらは、融合乗算加算または減算、逆数、および逆平方根です。FP融合乗算加算または減算命令は、IEEE 754の精度要件を満たすか超えるために、それぞれ1回または2回の丸め処理を実行します(実装定義)。FP逆数および逆平方根命令は、IEEE 754の精度要件を満たさず、必要な精度から最終桁で1つまたは2つの単位だけ異なる結果を生成します(実装定義)。これらの命令は、精度よりも命令のレイテンシが重要なアプリケーションで使用されます。
MIPS V では、既存の 64 ビット浮動小数点レジスタに格納された 2 つの単精度 (32 ビット) 浮動小数点数で構成される新しいデータ型、ペアード シングル (PS) が追加されました。算術、比較、条件付き移動のための既存の浮動小数点命令のバリアントが追加され、このデータ型を SIMD 方式で操作できるようになりました。PS データのロード、再配置、変換のための新しい命令が追加されました。[ 3 ] : 426–429これは、既存のリソースで浮動小数点 SIMD を活用する最初の命令セットでした。[ 13 ]
MIPS II をベースにした MIPS32 の最初のリリースでは、条件付き移動、プリフェッチ命令、および 64 ビット プロセッサの R4000 および R5000 ファミリのその他の機能が追加されました。[ 15 ] MIPS64 の最初のリリースでは、32 ビット コードを実行するための MIPS32 モードが追加されました。[ 15 ]以前は一部の実装で利用可能だったMUL および MADD (乗算加算) 命令が、キャッシュ制御命令と同様に、MIPS32 および MIPS64 仕様に追加されました。[ 15 ]キャッシュ制御の目的で、SYNCおよびSYNCI命令の両方が用意されました。[ 30 ] [ 31 ]
2014年のMIPS32/MIPS64リリース6では、以下が追加されました。[ 32 ]
使用頻度の低い手順を削除しました。
命令エンコーディングを再編成し、将来の拡張のためのスペースを確保した。
microMIPS32/64アーキテクチャは、MIPS16eアプリケーション固有拡張(ASE)を置き換えるために設計された、MIPS32およびMIPS64アーキテクチャ(それぞれ)の上位互換です。MIPS16eの欠点は、16ビット命令を処理する前にモード切り替えが必要になることです。microMIPSは、最も頻繁に使用される32ビット命令を16ビット命令としてエンコードしたバージョンを追加します。これにより、プログラムはモードを切り替えることなく、16ビット命令と32ビット命令を混在させることができます。microMIPSはMIPS32/64リリース3と同時に導入され、以降のMIPS32/64リリースにはそれぞれ対応するmicroMIPS32/64バージョンがあります。プロセッサはmicroMIPS32/64を実装することも、microMIPS32/64とその対応するMIPS32/64サブセットの両方を実装することもできます。 MIPS32/64リリース6以降、MIPS16eのサポートは終了し、microMIPSがMIPSにおける唯一のコード圧縮方式となった。
基本となるMIPS32およびMIPS64アーキテクチャには、アプリケーション固有拡張機能(ASE)と呼ばれる多数のオプションのアーキテクチャ拡張機能を追加できます。これらのASEは、デジタル信号処理などの特定のワークロードの効率とパフォーマンスを向上させる機能を提供します。
マイクロコントローラアプリケーション向けの機能強化。MCU ASE(アプリケーション固有拡張機能)は、割り込みコントローラのサポートを拡張し、割り込みレイテンシを低減し、マイクロコントローラシステム設計で一般的に必要とされるI/O周辺制御機能を強化するために開発されました。
MIPS16は、 LSI LogicとMIPS Technologiesによって設計されたMIPS IからVまでのアプリケーション固有の拡張機能であり、最初の実装であるLSI Logic TinyRISCプロセッサとともに1996年10月21日に発表されました。[ 33 ] MIPS16はその後、NEC Electronics、Philips Semiconductors、東芝(その他)にライセンス供与され、MIPS I、II、IIIアーキテクチャの拡張機能として実装されました。MIPS16は、32ビット命令の代わりに16ビット命令を使用することでアプリケーションのサイズを最大40%削減し、電力効率、命令キャッシュヒット率も向上させ、基本アーキテクチャと同等のパフォーマンスを実現しています。[ 34 ] MIPS Technologiesや他のプロバイダーのハードウェアおよびソフトウェア開発ツールによってサポートされています。 MIPS16eは、MIPS32およびMIPS64リリース1で初めてサポートされたMIPS16の改良版です。MIPS16e2は、MIPS32およびMIPS64(リリース5まで)でサポートされたMIPS16の改良版です。リリース6では、microMIPSに置き換えられました。
DSP ASE は、MIPS32/MIPS64 Release 2 以降の命令セットのオプションの拡張機能であり、 特にオーディオやビデオなどの幅広い「メディア」演算を高速化するために使用できます。DSP モジュールは、整数パイプライン内の命令と状態のセットで構成され、MIPS プロセッサ コアに実装するための追加ロジックは最小限で済みます。ASE のリビジョン 2 は 2006 年後半に導入されました。このリビジョンでは、元の ASE に命令が追加されていますが、それ以外は元の ASE と後方互換性があります。[ 35 ] MIPS アーキテクチャの大部分とは異なり、これはかなり不規則な一連の操作であり、その多くは特定の重要なアルゴリズムとの関連性に基づいて選択されています。主な新しい機能 (元の MIPS32 との比較): [ 36 ]
マルチメディア処理を高速化するために設計された命令セット拡張機能。
MIPSリビジョン6では、ハードウェアによるネイティブ仮想化サポートが追加されました。
各マルチスレッドMIPSコアは、単一のパイプラインとその他のハードウェアリソースを共有する最大2つのVPE(仮想処理要素)をサポートできます。ただし、各VPEにはソフトウェアシステムから見たプロセッサ状態の完全なコピーが含まれているため、各VPEはSMP Linuxオペレーティングシステムから見ると完全なスタンドアロンプロセッサとして認識されます。よりきめ細かいスレッド処理アプリケーションの場合、各VPEは2つのVPEにまたがって割り当てられた最大9つのTCをサポートできます。TCは共通の実行ユニットを共有しますが、それぞれ独自のプログラムカウンタとコアレジスタファイルを持っているため、ソフトウェアからのスレッドを処理できます。MIPS MTアーキテクチャでは、プロセッササイクルをスレッドに割り当てることもでき、オプションのQoS(Quality of Service )マネージャブロックを使用して相対的なスレッド優先度を設定します。これにより、バスを介した情報の流れを決定する2つの優先順位付けメカニズムが可能になります。最初のメカニズムでは、ユーザーが1つのスレッドを他のスレッドよりも優先できます。2番目のメカニズムは、特定のスレッドに一定の割合のサイクルを時間とともに割り当てるために使用されます。両方のメカニズムを組み合わせることで、スレッド群への帯域幅の効率的な割り当てと、レイテンシのより適切な制御が可能になります。リアルタイムシステムでは、システムレベルの決定性が非常に重要であり、QoSブロックはシステムの予測可能性の向上に役立ちます。高度なシステムのハードウェア設計者は、MIPS Technologiesが提供する標準のQoSブロックを、アプリケーションに合わせて特別に調整されたQoSブロックに置き換えることができます。
SmartMIPSは、 Gemplus InternationalとMIPS Technologiesが共同開発したアプリケーション固有拡張機能(ASE)であり、スマートカードソフトウェアのパフォーマンス向上とメモリ消費量の削減を目的としています。スマートカードはMIPS64プロセッサの機能を必要としないため、SmartMIPSはMIPS32のみでサポートされています。SmartMIPSを採用しているスマートカードはごく少数です。
1990年代にRISCシステムやCISCシステムで一般的だったマルチメディアアプリケーションの高速化。
MIPS-3Dは、3Dグラフィックスアプリケーションのパフォーマンスを向上させるために13個の新しい命令を追加したMIPS Vの拡張機能です。[ 37 ]これらの命令は、頂点変換、クリッピング、変換、ライティングという4つの一般的な3Dグラフィックス操作を実装するために必要な命令の数を減らすことでパフォーマンスを向上させました。
頂点変換の場合:
切り抜きの場合:
透視分割と正規化について:
MIPSには、特に32ビットプラットフォームにおいて、いくつかの呼び出し規約が存在する。
O32 ABI は、 MIPS のオリジナルのSystem V ABIであるという地位から、最も一般的に使用されている ABI です。 [ 38 ] [ 39 ]これは厳密にスタックベースであり、引数を渡すために使用できるレジスタは 4 つ ( $a0 - $a3 ) のみです。スタック上の領域は、呼び出し先が引数を保存する必要がある場合に備えて予約されていますが、呼び出し元によってレジスタがそこに格納されることはありません。戻り値はレジスタ$v0に格納され、2 番目の戻り値は$v1に格納される場合があります。この ABI は 1990 年に形作られ、1994 年に最後に更新されました。この認識されている遅さと、16 個のレジスタしかない古い浮動小数点モデルにより、他の多くの呼び出し規約が普及しました。これは 32 ビット MIPS 用にのみ定義されていますが、GCC はO64 と呼ばれる 64 ビットのバリエーションを作成しました。[ 40 ]
64 ビットの場合、シリコン グラフィックスの N64 ABI が最も一般的に使用されています。最も重要な改善点は、引数の受け渡しに 8 つのレジスタが使用できるようになったことです。また、浮動小数点レジスタの数も 32 に増加しています。 N32 と呼ばれるILP32バージョンもあり、これはx32 ABIと同様に、より小さなコードのために 32 ビット ポインタを使用します。どちらも CPU の 64 ビット モードの下で動作します。[ 40 ] N32 および N64 ABI では、最初の 8 つの引数をレジスタ$a0~$a7に渡します。それ以降の引数はスタックに渡されます。戻り値 (またはそのポインタ) は$v0に格納されます。2 番目の戻り値は$v1に格納される場合があります。N32 および N64 ABI の両方で、すべてのレジスタは 64 ビット幅であるとみなされます。
O32 を、O32 よりも N32 に似た 32 ビット ABI に置き換える試みがいくつか行われてきました。1995 年の会議では MIPS EABI が考案され、その 32 ビット版はそれに非常によく似ていました。[ 41 ] EABI は、MIPS Technologies が、戻り値のために引数レジスタを再利用するという、より根本的な「NUBI」 ABI を提案するきっかけとなりました。[ 42 ] MIPS EABI は GCC でサポートされていますが、LLVM ではサポートされておらず、どちらも NUBI をサポートしていません。
O32 および N32/N64 のすべてにおいて、戻りアドレスは$ra ( $31 ) に格納されます。これは、JAL (ジャンプおよびリンク) 命令または JALR (ジャンプおよびリンクレジスタ) 命令の使用により自動的に設定されます。 (非リーフ) MIPS サブルーチンの関数プロローグは、戻りアドレス ( $ra内) をスタックにプッシュします。[ 43 ] [ 44 ]
O32とN32/N64の両方でスタックは下方向に拡張されますが、N32/N64 ABIではすべてのスタックエントリに対して64ビットアライメントが必要です。フレームポインタ($30)はオプションであり、実際には関数内のスタック割り当てが実行時に決定される場合(たとえば、を呼び出す場合)を除いてほとんど使用されません。alloca()
N32およびN64の場合、リターンアドレスは通常スタックポインタの8バイト前に格納されますが、これはオプションの場合もあります。
N32およびN64 ABIでは、関数は$s0~$s7レジスタ、グローバルポインタ($gpまたは$28)、スタックポインタ($spまたは$ 29 )、およびフレームポインタ($fpまたは$30 )を保持する必要があります。O32 ABIも同様ですが、呼び出し元の関数は、呼び出された関数ではなく$gpレジスタを保存する必要があります。
マルチスレッドコードの場合、スレッドローカルストレージポインタは通常、専用ハードウェアレジスタ$29に格納され、mfhw(ハードウェアからの移動)命令を使用してアクセスされます。少なくとも1つのベンダーは、通常カーネル用に予約されている$k0レジスタにこの情報を格納することが知られていますが、これは標準的な方法ではありません。
$ k0レジスタと$k1レジスタ ( $26、$27 ) はカーネル用に予約されており、割り込み、コンテキストスイッチ、その他のイベントによりカーネルによっていつでも変更される可能性があるため、アプリケーションで使用しないでください。
呼び出し間で保持されるレジスタとは、(慣例として)システムコールやプロシージャ(関数)呼び出しによって変更されないレジスタのことです。例えば、$sレジスタは、それらを使用する必要のあるプロシージャによってスタックに保存されなければなりません。また、$spと$fpは常に定数でインクリメントされ、プロシージャがそれら(およびそれらが指すメモリ)の使用を終えた後にデクリメントされます。これに対し、$raは通常の関数呼び出し( jalを使用するもの)によって自動的に変更され、$tレジスタは、プロシージャ呼び出しの前にプログラムによって保存されなければなりません(呼び出し後にプログラムがそれらの値を必要とする場合)。
Linux 上の位置独立コードのユーザー空間呼び出し規約では、関数が呼び出されたときに$t9レジスタにその関数のアドレスが格納されていなければならないという要件も追加されています。 [ 46 ]この規約は、MIPS 用の System V ABI 補足資料に遡ります。[ 47 ]
MIPSプロセッサは、家庭用ゲートウェイやルーターなどの組み込みシステムで使用されています。元々、MIPSは汎用コンピューティング向けに設計されました。1980年代から1990年代にかけて、パーソナルコンピュータ、ワークステーション、サーバーコンピュータ向けのMIPSプロセッサは、 Digital Equipment Corporation、MIPS Computer Systems、NEC、Pyramid Technology、SiCortex、Siemens Nixdorf、Silicon Graphics、Tandem Computersなど、多くの企業で使用されました。
歴史的に見ると、Nintendo 64、Sony PlayStation、PlayStation 2、PlayStation Portableといったビデオゲーム機はMIPSプロセッサを採用していました。MIPSプロセッサは1990年代にはスーパーコンピュータでも広く使われていましたが、現在ではTOP500リストから外れています。当初は組み込みアプリケーションでも利用されていましたが、1990年代には組み込みプロセッサ市場でMIPSが大きな存在感を示すようになり、2000年代にはほとんどのMIPSプロセッサが組み込みアプリケーション向けとなりました。
1990年代半ばから後半にかけて、製造されたRISCマイクロプロセッサの3分の1がMIPSプロセッサであったと推定された。[ 48 ]
2010年代後半になっても、MIPSマシンは自動車、無線ルーター、LTEモデム(主にMediaTek製)、マイクロコントローラー(例えばMicrochip TechnologyのPIC32M)などの組み込み市場では依然として広く使用されていました。しかし、パーソナルコンピュータ、サーバー、アプリケーション分野では、ほとんど姿を消しました。
Open Virtual Platforms (OVP) [ 49 ]には、非商用利用で無料で使用できるシミュレータOVPsim、プロセッサ、周辺機器、プラットフォームのモデルライブラリ、およびユーザーが独自のモデルを開発できるようにする API が含まれています。ライブラリのモデルはオープンソースで、C 言語で記述されており、MIPS 4K、24K、34K、74K、1004K、1074K、M14K、microAptiv、interAptiv、proAptiv の 32 ビット コアと、MIPS 64 ビット 5K シリーズのコアが含まれています。これらのモデルは Imperas [ 50 ]によって作成および保守されており、MIPS Technologies と提携してテストされ、MIPS-Verified マークが割り当てられています。サンプル MIPS ベースのプラットフォームには、ベアメタル環境と、変更されていない Linux バイナリ イメージを起動するためのプラットフォームの両方が含まれています。これらのプラットフォーム エミュレータは、ソースまたはバイナリとして利用可能で、高速で、非商用利用で無料で、使いやすいです。 OVPsimはImperas社によって開発・保守されており、非常に高速(毎秒数億命令)で、マルチコアの同種および異種アーキテクチャとシステムを処理できるように設計されています。
SPIMは教育で使用できる無料のMIPS32シミュレータです。最新バージョンはQtSpimと呼ばれ、Qt UIフレームワークを使用しています。[ 51 ]
EduMIPS64は、Java/Swingで書かれたGPLライセンスのグラフィカルなクロスプラットフォームMIPS64 CPUシミュレータで、別のMIPS64シミュレータであるWinMIPS64の移植版として始まり、MIPS64 ISAの幅広いサブセットをサポートし、アセンブリプログラムの実行時にパイプラインで何が起こるかをユーザーがグラフィカルに確認できるようにします。[ 52 ]
MARS [ 53 ]は、教育での使用、特に Hennessy のComputer Organization and Designでの使用を目的として設計された、別の GUI ベースの MIPS エミュレータです。現在はメンテナンスされていません。
Saturn [ 54 ]は、Titan [ 55 ]と呼ばれるアセンブラを備えた GUI ベースの MIPS IDE です。これは、現在メンテナンスされていない MARS の代替として、トロント大学の学生によるプロジェクトとして始まりました。 [ 56 ] Saturn は現在、トロント大学のコースで使用されており、学生と教員によってメンテナンスされています。
WebMIPS [ 57 ]は、汎用パイプラインプロセッサの視覚的表現を備えたブラウザベースの MIPS シミュレータです。このシミュレータは、ステップごとの実行中にレジスタを追跡するのに非常に役立ちます。
QtMipsは、基本的なコンピュータアーキテクチャのコース向けに、シンプルな5段階パイプラインの可視化とキャッシュ原理の可視化を提供します。[ 58 ] [ 59 ] [ 60 ]これは、 Webアプリケーションとして、またWindows、 Linux、macOS用のダウンロード可能なプログラムとして利用できます。
より高度な無料エミュレータは、 GXemul(旧称mips64emulプロジェクト)およびQEMUプロジェクトから入手可能です。これらは、様々なMIPS IIIおよびIVマイクロプロセッサに加え、それらを使用するコンピュータシステム全体をエミュレートします。
商用シミュレータは、特にMIPSプロセッサの組み込み用途向けに提供されており、例えばWind River Simics(MIPS 4Kcおよび5Kc、PMC RM9000、QED RM7000、Broadcom/Netlogic ec4400、Cavium Octeon I)、Imperas(すべてのMIPS32およびMIPS64コア)、VaST Systems(R3000、R4000)、CoWare(MIPS4KE、MIPS24K、MIPS25Kf、MIPS34K)などがある。
CREATOR [ 61 ] [ 62 ]は、直感的でクロスプラットフォーム、汎用的で、実際のハードウェア デバイスと互換性があるように設計されたオープンソース[ 63 ]の Web ベースの統合開発環境 (IDE) です。この IDE を使用すると、MIPS32、RISC-V、Z80 などのアセンブリ言語で記述されたプログラムの編集、アセンブル、デバッグ、シミュレーション、実行をすべて単一のツール内で行うことができます。さらに、これらのプログラムをマイクロコントローラ (ESP32-C3、ESP32-C6 など) や SBC ボード (OrangePi RV2、Nezha D1-H など) などの実際のハードウェアで実行することもできます。[ 64 ] [ 65 ]
WepSIM [ 66 ]は、MIPS命令のサブセットをマイクロプログラミングしたブラウザベースのシミュレータです。このシミュレータは、CPUがマイクロプログラミングレベル、MIPSアセンブリレベル、 割り込み処理などでどのように動作するかを学ぶのに非常に役立ちます。
{{cite magazine}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)Rタイプはレジスタタイプの略です。Rタイプ命令は、オペランドとして3つのレジスタを使用します。2つはソース、1つはデスティネーションです。
{{cite web}}: CS1 maint: 非推奨のアーカイブ サービス (リンク) (オンライン デモ) 「アーカイブされたコピー」。2011年 10 月 10 日にオリジナルからアーカイブされました。2012年1 月 13 日に取得されました。{{cite web}}: CS1 maint: アーカイブされたコピーをタイトルとして (リンク) (ソース)