MIPS指令集

**MIPS**（**M**icroprocessor without **I**nterlocked **P**ipeline **S**tages），是一種採取精簡指令集（RISC）的指令集架構（ISA），由美國 MIPS 電腦系統公司開發，現為美普思科技。MIPS 廣泛被使用在許多電子產品、網路裝置、個人娛樂裝置與商業裝置上。最早的 MIPS 架構是 32 位元，最新的版本已經變成 64 位元。商業市場主要競爭對手為 ARM 與 RISC-V。

MIPS 架構有多個版本，包括 MIPS I、II、III、IV，以及 MIPS V，它們各是 MIPS32/64（ 32 位元、64 位元的實現）發布的五個版本。早期的 MIPS 架構只有 32 位元的版本，隨後才開發 64 位元的版本。截至 2017 年 4 月，MIPS32/64 的目前版本是 MIPS32/64 Release 6。MIPS32/64 與 MIPS I-V 的主要區別不僅在於它除了使用者態架構外，還定義了特權核心模式的系統控制協處理器。

MIPS 架構有幾個可選的拓展，比如 MIPS-3D，它是一個專用於常見 3D 計算任務的浮點 SIMD 指令集的簡單集合；MDMX（MaDMaX）是一個應用更加廣泛的整數 SIMD 指令集，它使用了 64 位元浮點數暫存器；MIPS16e 則為提供了指令流壓縮的功能，這可以減小程式的體積；MIPS MT 則提供了多執行緒的能力。

在一些大學和技術學校中電腦架構的課程上，學生們通常會學習 MIPS 架構。這個架構極大地影響了後來的精簡指令集架構，如 Alpha。2021 年 3 月，MIPS 宣布 MIPS 架構的開發已經結束，因為該公司正在向 RISC-V 過渡。

## 歷史

MIPS 架構的第一個版本是由 MIPS 電腦系統公司為其 R2000 微處理器設計的，這是第一個 MIPS 的實現。MIPS 和 R2000 都是在 1985 年一起推出的。當 MIPS II 推出時，MIPS 更名為 MIPS I，以區別於新版本。

MIPS 電腦系統公司的 R6000 微處理器（1989 年）是第一個 MIPS II 實現，專為伺服器設計，由 Bipolar Integrated Technology 製造和銷售，但在商業上失敗了。在 1990 年代中期，許多用於嵌入式系統的新 32 位元 MIPS 處理器都是 MIPS II 實現，因為 1991 年引入 64 位元 MIPS III 架構，使得直到 1999 年 MIPS 32 推出前，MIPS II 都是最新的 32 位元 MIPS 架構。

MIPS 電腦系統公司的 R4000 微處理器（1991 年）是第一個 MIPS III 實現。它設計用於個人、工作站和伺服器電腦。MIPS 電腦系統積極推廣 MIPS 架構和 R4000，建立進階計算環境（ACE）聯盟以推進其進階 RISC 計算（ARC）標準，旨在將 MIPS 建立為主導的個人計算平台。ARC 在個人電腦上幾乎沒有成功，但 R4000（和 R4400 衍生產品）廣泛用於工作站和伺服器電腦，尤其是其最大的使用者矽谷圖形公司（SGI）。R4000 的其他用途包括高端嵌入式系統和超級電腦。MIPS III 最終由許多嵌入式微處理器實現。Quantum Effect Design 的 R4600（1993 年）及其衍生產品廣泛應用於高端嵌入式系統和低階工作站和伺服器。MIPS 科技的 R4200（1994 年）專為嵌入式系統、筆記型電腦和個人電腦而設計。NEC 製造的衍生產品 R4300i 用於 N64 遊戲機。N64 和 PlayStation 是 1990 年代中期 MIPS 架構處理器的最大使用者之一。

第一個 MIPS IV 實現是 MIPS 科技 R8000 微處理器晶片組（1994 年）。R8000 的設計始於矽谷圖形公司，它僅用於高端工作站和伺服器，用於高效能浮點工作負載關鍵的科學和技術應用。後來的實現是 MIPS 科技的 R10000（1996 年），Quantum Effect Devices 的 R5000（1996 年）和 RM7000（1998 年）。NEC 和東芝製造和銷售的 R10000 及其衍生產品被 NEC、Pyramid Technology、SGI 和 Tandem Computers（以及其他公司）用於工作站、伺服器和超級電腦。R5000 和 R7000 可用於高端嵌入式系統、個人電腦以及低階工作站和伺服器。東芝 R5000 的衍生產品 R5900 用於索尼的 Emotion Engine，該引擎為其 PlayStation 2 遊戲機提供動力。

MIPS V 於 1996 年 10 月 21 日在微處理器論壇上與 MIPS 數位媒體擴充（MDMX）擴充一起發布，旨在提高 3D 圖形變換的效能。在 1990 年代中期，非嵌入式 MIPS 微處理器的主要用途是 SGI 的圖形工作站。MIPS V 使用僅整數的 MDMX 擴充，以此提高 3D 圖形應用程式的效能。MIPS V 從未真正實現。1997 年 5 月 12 日，SGI 發布了「H1」（「野獸」）和「H2」（「船長」）微處理器。前者計劃是第一個 MIPS V 實現，預計於 1999 年上半年推出。「H1」和「H2」專案後來合併，最終在 1998 年取消。雖然沒有任何 MIPS V 實現，但 MIPS64 Release 1（1999 年）基於 MIPS V 並保留其所有功能作為可選的協處理器 1（FPU）功能，稱為配對單精度（Paired-Single）。

當 MIPS 科技公司於 1998 年從 SGI 分拆出來時，它重新專注於嵌入式市場。直到 MIPS V，每個後續版本都是前一個版本的嚴格超集，但是發現這是一個問題，隨後架構更改為分別定義 32 位元和 64 位元：MIPS32 和 MIPS64。兩者都於 1999 年推出。MIPS32 基於 MIPS II，, 並帶有 MIPS III、MIPS IV 和 MIPS V 的一些附加特性；MIPS64 基於 MIPS V。NEC、東芝和 SiByte（後來被博通收購）在 MIPS64 發布後都獲得了許可證。飛利浦、LSI Logic、IDT、Raza Microelectronics, Inc.、凱為、龍芯和君正已加入其中。MIPS32/MIPS64 Release 5 於 2012 年 12 月 6 日發布。第 4 版被跳過，因為在許多亞洲文化中，數字 4 被認為是不吉利的。

2018 年 6 月 — 美國矽谷新創 AI 晶片公司 Wave Computing 宣佈完成收購 MIPS 公司股權，MIPS 公司維持獨立運作，並預計開源 MIPS 架構。

2018 年 12 月，MIPS 架構的新所有者 Wave Computing 宣布 MIPS ISA 將在一個名為 MIPS 開放計劃的專案中開源。該計劃旨在開放對 32 位元和 64 位元設計的最新版本的存取，使其無需任何許可或版稅即可使用，並授予參與者現有 MIPS 專利的許可。

2019 年 3 月，該架構的一個版本在免版稅許可下可用，但該年晚些時候該程式再次關閉。

2021 年 3 月，WaveComputing 宣布停止 MIPS 架構的開發。該公司已加入 RISC-V 基金會，未來的處理器設計將基於 RISC-V 架構。

## 設計

MIPS 是一種模組化架構，最多支援四個協處理器（CP0/1/2/3）。在 MIPS 術語中，CP0 是系統控制協處理器（MIPS I-V 中處理器的重要部分，與實現相關），CP1 是可選的浮點運算器（FPU），CP2/3 是可選的由實現定義的協處理器（MIPS III 刪除了 CP3 並將其操作碼重新用於其他目的）。例如，在 PlayStation 電動遊戲機中，CP2 是幾何變換引擎（GTE），它可以加速 3D 電腦圖形中的幾何處理。

## 版本

### MIPS I

MIPS 是一種載入 - 儲存架構（也稱為暫存器 - 暫存器架構）；除了用於存取電腦記憶體的載入 / 儲存指令外，所有指令都對暫存器進行操作。

#### 暫存器

MIPS I 有 32 個 32 位元通用暫存器（GPR）。暫存器 $0 寫死為零，寫入的內容將被丟棄。暫存器 $31 是連結暫存器。對於與其他指令非同步執行的整數乘法和除法指令，提供了一對 32 位元暫存器 _HI_ 和 _LO_。有一小組指令用於在通用暫存器和 HI/LO 暫存器之間複製資料。

程式計數器（PC）有 32 位元。低二位總是為零，因為 MIPS I 指令有 32 位元長，並且與它們的自然字邊界對齊。

#### 指令格式

指令分為三種類型：R 型（Register）、I 型（Immediate）和 J 型（Jump）。三種類型的指令的最高 6 位均為 6 位的 opcode 碼。從 25 位往下，

* R 型指令用連續三個 5 位二進位碼來表示三個暫存器的位址，然後用一個 5 位二進位碼來表示移位的位數（如果未使用移位元運算，則全為 0），最後為 6 位的 function 碼（它與 opcode 碼共同決定 R 型指令的具體操作方式）；
* I 型指令則用連續兩個 5 位二進位碼來表示兩個暫存器的位址，然後是一個 16 位元二進位碼來表示的一個立即數二進位碼；
* J 型指令用 26 位二進位碼來表示跳轉目標的指令位址（實際的指令位址應為 32 位元，其中最低兩位為 00）。

三種用於核心指令集的指令圖示如下：

#### CPU 指令

MIPS I 有載入和儲存 8 位元的位元組、16 位元的半字和 32 位元的字的指令。僅支援一種定址模式：基址 + 位移。由於 MIPS I 是 32 位元架構，因此載入少於 32 位元的值需要將資料有符號或無符號擴充到 32 位元。以「unsigned」為字尾的載入指令執行無符號擴充；否則執行有符號擴充。載入指令從 GPR（rs）的內容中取得基址，並將結果寫入另一個 GPR（rt）。儲存指令從 GPR（rs）的內容中取得基址，從另一個 GPR（rt）取得儲存資料。所有載入和儲存指令都通過將基址與符號擴充的 16 位元立即數相加來計算記憶體位址。MIPS I 要求所有記憶體存取都與其自然字邊界對齊，否則會發出異常訊號。「左」或「右」為字尾的載入 / 儲存字指令用以支援高效的未對齊記憶體存取。所有載入指令後都有一條指令的載入延遲槽。載入延遲槽中的指令不能使用載入指令載入的資料。載入延遲槽可以填充一條不依賴於載入的指令；如果找不到這樣的指令，則用 nop 代替。

MIPS I 有執行加法和減法的指令。這些指令從兩個 GPR（rs 和 rt）取得它們的運算元，並將結果寫入第三個 GPR（rd）。此外，加法可以從 16 位元立即數（有符號擴充為 32 位元）中取得運算元之一。加減法指令有兩種變體：預設情況下，如果結果溢位則發出異常訊號；帶有「unsigned」字尾的指令不會發出異常訊號。溢位檢查將結果解釋為 32 位元二補數整數。MIPS I 有執行按位元邏輯 AND、OR、XOR 和 NOR 的指令。這些指令從兩個 GPR 取得其運算元並將結果寫入第三個 GPR。AND、OR 和 XOR 指令也可以從 16 位元立即數（無符號擴充到 32 位元）中取得運算元之一。如果指定的關係為真或假，則 Seton 關係指令將 1 或 0 寫入目標暫存器。這些指令的運算元來自兩個 GPR 或一個 GPR 和一個 16 位元立即數（符號擴充為 32 位元），並將結果寫入第三個 GPR。預設情況下，運算元被解釋為有符號整數。以「unsigned」為字尾的指令的變體將運算元解釋為無符號整數（即使是對於來自有符號擴充 16 位元立即數的運算元）。

Load Immediate Upper 指令將 16 位元立即數複製到 GPR 的高 16 位元。它與 Or Immediate 指令結合使用以將 32 位元立即數載入到暫存器中。

MIPS I 有執行左右邏輯移位和右算術移位的指令。運算元從一個 GPR（rt）中獲得，並將結果寫入另一個 GPR（rd）。位移距離是從 GPR（rs）或 5 位「位移量」（「sa」欄位）中獲得的。

MIPS I 有有符號和無符號整數乘法和除法的指令。這些指令從兩個 GPR 取得其運算元，並將其結果寫入一對稱為 HI 和 LO 的 32 位元暫存器，因為它們可能與其他 CPU 指令分開（並同時）執行。對於乘法，64 位元乘積的高位和低位分別寫入 HI 和 LO。對於除法，商寫入 LO，餘數寫入 HI。為了存取結果，提供了一對指令（從 HI 移動和從 LO 移動）將 HI 或 LO 的內容複製到 GPR。這些指令是互鎖的：對 HI 和 LO 的讀取不會越過未完成的要寫入 HI 和 LO 的算術指令。另一對指令（Move to HI 或 Move to LO）將 GPR 的內容複製到 HI 和 LO。這些指令用於在例外處理後將 HI 和 LO 恢復到其原始狀態。讀取 HI 或 LO 的指令必須由不寫入 HI 或 LO 的兩條指令分隔。

所有 MIPS I 控制流指令後需要接一個分支延遲槽。除非分支延遲槽用執行有用工作的指令填充，否則要使用 nop。MIPS I 分支指令將 GPR（rs）的內容與零或另一個 GPR（rt）的內容作為有符號整數進行比較，如果指定的條件為真，則跳轉分支。執行位置將轉移到通過將 16 位元偏移量左移兩位、對 18 位元結果進行有符號擴充，並將 32 位元符號擴充結果與程式計數器（指令位址）和 810 作和得到。跳轉有兩個版本：絕對跳轉和暫存器間接跳轉。絕對跳轉（「Jump」和「Jump and Link」）通過將 26 位 instr\_index 左移兩位，並將 28 位元結果與分支延遲槽指令的指令位址高四位連接來計算跳轉的位址。暫存器間接跳轉將控制轉移到來自 GPR（rs）的位址處的指令。來自 GPR 的位址必須是字對齊的，否則在執行分支延遲槽中的指令後會發出異常訊號。連結的分支和跳轉指令（「Jump and Link Register」除外）將返回位址儲存到 GPR 31。「Jump and Link Register」指令允許將返回位址儲存到任何可寫的 GPR。

MIPS I 有兩條軟體用於發出異常訊號的指令：System Call 和 Breakpoint。System Call 被使用者態軟體用來進行核心呼叫；Breakpoint 用於核心例外處理程式轉移控制到除錯器。兩條指令都有一個 20 位的代碼（Code）欄位，可儲存給例外處理程式的操作環境特定資訊。

MIPS 有 32 個浮點暫存器。兩兩暫存器配對用於雙精度數。奇數號暫存器不能用於算術或分支，只是作為雙精度暫存器對的一部分，導致大多數指令只有 16 個可用暫存器（移動 / 複製和載入 / 儲存不受影響）。

單精度指令由.s 字尾表示，而雙精度由.d 字尾表示。

### MIPS II

MIPS II 移除了載入延遲槽並添加了幾組指令。對於共享記憶體多處理，添加了「Synchronize Shared Memory」、「Load Linked Word」和「Store Conditional Word」指令。添加了一組 Trap-on-Condition 指令。如果求值為真，這些指令將導致異常。所有現有的分支指令都有了「可能」分支的版本，僅在分支跳轉要執行時才執行分支延遲槽中執行指令。在某些情況下，這些指令允許用有用的指令填充分支延遲槽，以此提高效能。為 COP1-3 添加了雙字載入和儲存指令。與其他記憶體存取指令一致，這些載入和儲存要求雙字自然對齊。

浮點協處理器指令集也添加了幾條指令。添加了符合 IEEE 754 的浮點平方根指令。它支援單精度和雙精度運算元。添加了一組將單精度和雙精度浮點數轉換為 32 位元字的指令。它們補充了現有的轉換指令，允許用指令控制 IEEE 捨入模式，而不是通過浮點控制和狀態（Floating Point Control and Status）暫存器。

### MIPS III

MIPS III 是向下相容 MIPS II 的擴充，增加了對 64 位元記憶體定址和整數運算的支援。64 位元資料類型稱為雙字，MIPS III 將通用暫存器、HI/LO 暫存器和程式計數器擴充到 64 位元以支援。添加了新指令來載入和儲存雙字，對它們執行整數加、減、乘、除和移位元運算，以及在 GPR 和 HI/LO 暫存器之間移動雙字。必要時，現有最初定義為對 32 位元字進行操作的指令被重新定義，以對 32 位元結果進行符號擴充，使得大多數指令對字和雙字進行的處理行為相同。在這些重新定義的指令中包括「Load Word」。在 MIPS III 中，它將字有符號擴充到 64 位元。為了補充「Load Word」，添加了一個無符號擴充版本。

R 指令格式無法指定完整的 64 位元位移距離（其 5 位位移量欄位太窄，無法指定雙字的位移距離），MIPS III 對於每個 MIPS I 的位移指令，提供了三個 64 位元的版本。第一個版本是原始移位指令的 64 位元版本，用於指定介於 0-31 位元之間的常數位移距離。第二個版本與第一個版本類似，但將位移量欄位的值加上 3210，以便可以指定 32-64 位元之間的常數位移距離。第三個版本從 GPR 的六個低位取得位移距離。

MIPS III 在現有核心和使用者權限級別之間添加了一個「管理員」權限級別。此功能僅影響由實現定義的系統控制處理器（協處理器 0）。

MIPS III 移除了協處理器 3（CP3）相關支援指令，並為新的雙字指令重新使用了其操作碼。其餘的協處理器獲得了在協處理器暫存器和 GPR 之間移動雙字的指令。浮點通用暫存器（FGR）擴充到 64 位元，並且取消了指令僅使用偶數暫存器的要求。這與早期版本的架構不相容；浮點控制 / 狀態暫存器中的一位用於在 MIPS I 和 II 相容模式下操作 MIPS III 浮點單元（FPU）。浮點控制暫存器沒有為相容性進行擴充。添加的唯一新浮點指令是在 CPU 和 FPU 之間複製雙字的指令，將單精度和雙精度浮點數轉換為雙字整數，反之亦然。

### MIPS IV

MIPS IV 是該架構的第四個版本。它是 MIPS III 的超集，與 MIPS 的所有現有版本相容。MIPS IV 主要旨在提高浮點（FP）效能。為了改進對運算元的存取，添加了用於 FP 載入和儲存的索引定址模式（基址 + 索引，均來自 GPR），以及用於執行記憶體預取和指定快取提示的預取指令（這些指令同時支援基址 + 偏移量和基址 + 索引定址模式）。

MIPS IV 添加了幾個特性來改進指令級並列性。為了緩解由單個條件位引起的瓶頸，在浮點控制和狀態暫存器中添加了七個條件代碼位，使總數達到八個。重新定義了 FP 比較和分支指令，以便它們可（分別）指定寫入或讀取哪個條件位；並且刪除了 FP 比較與讀取由比較指令寫入條件位的 FP 分支之間的延遲槽。通過 GPR 和 FPR 條件移動指令的形式部分添加了對分支預測的支援；並且實現可以選擇為 IEEE 754 陷阱提供精確或不精確的例外。

MIPS IV 為單精度和雙精度浮點數添加了幾個新的浮點算術指令：融合乘加減、倒數和倒數平方根。FP 融合乘加減指令執行一次或兩次捨入（由實現定義），（分別）超過或達到 IEEE 754 精度要求。FP 倒數和倒數平方根指令不符合 IEEE 754 精度要求，並且產生的結果與所需精度相差一到兩個單位（它是實現定義的）。這些指令服務於指令延遲比準確性更重要的應用程式。

### MIPS V

MIPS V 添加了一種新的資料類型，配對單精度（PS），它由兩個單精度（32 位元）浮點陣列成，儲存在現有的 64 位元浮點暫存器中。添加了現有算術、比較和條件移動浮點指令的變體，以便以 SIMD 方式對這種資料類型進行操作。添加了用於載入、重排和轉換 PS 資料的新指令。這是第一個利用現有資源實現的浮點 SIMD 指令集。

### MIPS32/MIPS64

MIPS32 的第一個版本基於 MIPS II，添加了來自 R4000 和 R5000 系列 64 位元處理器的條件移動、預取指令和其他特性。MIPS64 的第一個版本增加了一個 MIPS32 模式來執行 32 位元代碼。向 MIPS32 和 MIPS64 規範添加了以前在某些實現中可用的 MUL 和 MADD（乘加）指令，同樣的還有快取控制指令。

2014 年的 MIPS32/MIPS64 Release 6 添加了以下內容：

* 一個沒有延遲槽的新分支家族：
  * 具有 26 位偏移量的無條件分支（BC）和分支連結（BALC），
  * 具有 21 位偏移量的零 / 非零條件分支，
  * 全套有符號和無符號條件分支，可比較兩個暫存器（例如 BGTUC）或一個暫存器與零（例如 BGTZC），
  * 全套分支和連結，將暫存器與零進行比較（例如 BGTZALC）。
* 無延遲槽的索引跳轉指令，旨在支援大絕對位址。
* 在第 16、32 或 48 位元處載入 16 位元立即數的指令，允許輕鬆生成大常數。
* PC 相關載入指令，以及大（PC 相關）偏移量的位址生成。
* 位反轉和位元組對齊指令（以前僅適用於 DSP 擴充）。
* 乘法和除法指令重新定義，向單​​個暫存器輸出結果。
* 生成真值的指令現在生成全零或全一，而不僅僅是清除 / 設定 0 位，
* 使用真值的指令現在只將全零解釋為假，而不是只看 0 位。

刪除了不常用的指令：

* 一些條件移動
* 「可能」分支指令（在以前的版本中已棄用）。
* 具有 16 位元立即數的整數溢位擷取指令
* 整數累加器指令（連同 HI/LO 暫存器，移至 DSP 特定應用擴充）
* 未對齊的載入指令（LWL 和 LWR）（現要求大多數一般載入和儲存指令支援未對齊的存取，通過陷阱或添加新指令（BALIGN）等形式）

重新組織指令編碼，為未來的擴充騰出空間。

### microMIPS

microMIPS32/64 架構（分別）是 MIPS32 和 MIPS64 架構的超集，旨在取代 MIPS16e ASE。MIPS16e 的一個缺點是在處理任何 16 位元指令之前需要切換模式。microMIPS 將最常用的 32 位元指令編碼為 16 位元指令版本。允許程式混合 16 位元和 32 位元指令而無需切換模式。microMIPS 與 MIPS32/64 Release 3 一起推出，MIPS32/64 的每個後續版本都有相應的 microMIPS32/64 版本。處理器可以單獨實現 microMIPS32/64，或同時實現 microMIPS32/64 及其相應的 MIPS32/64 子集。從 MIPS32/64 Release 6 開始，對 MIPS16e 的支援結束，microMIPS 是 MIPS 中唯一的代碼壓縮形式。

## 應用程式特定擴充

基本的 MIPS32 和 MIPS64 架構可以補充一些可選的架構擴充，這些擴充統稱為「應用程式特定擴充」（ASE）。這些 ASE 提供的功能可以提高某些工作負載的效率和效能，例如數位訊號處理。

**MIPS 單晶片**
: 微控制器應用的增強功能。MCU ASE（特定應用擴充）用於擴充中斷控制器支援、減少中斷延遲並增強微控制器系統設計中通常需要的 I/O 外設控制功能。

* 單獨的優先級和向量生成
* 在 EIC（外部中斷控制器）模式下支援多達 256 個中斷和 8 個硬體中斷引腳
* 提供 16 位元向量偏移位址
* 中斷異常向量預取
* 自動中斷序言 —— 添加硬體以在中斷處理常式之前儲存和更新系統狀態
* 自動中斷尾聲 —— 恢復先前儲存在堆疊中的系統狀態，以便從中斷返回。
* 中斷鏈 —— 支援掛起中斷的服務，無需登出初始中斷常式，節省儲存和恢復多個活動中斷所需的周期
* 支援推測性預取中斷向量位址。通過將記憶體存取與管道重新整理和異常優先級重疊來減少中斷服務周期數
* 原子性位設定 / 清除指令，通常可在不中斷的情況下修改 I/O 暫存器中用於監視或控制外部外圍功能的位，確保安全地執行操作。

**MIPS16**
: MIPS16 是從 MIPS I 到 V 的特定應用擴充，由 LSI Logic 和 MIPS 科技設計，於 1996 年 10 月 21 日與其第一個實現 LSI Logic TinyRISC 處理器一起發布。隨後 NEC 電子、飛利浦半導體、東芝以及其他公司獲得了 MIPS16 的許可，並作為 MIPS I、II、III 架構的擴充實現。MIPS16 使用 16 位元指令而不是 32 位元指令，減少應用程式的大小多達 40%，並且還提高了電源效率、指令快取命中率，並且在效能方面與其基礎架構相當。它由 MIPS 科技和其他供應商的硬體和軟體開發工具提供支援。MIPS16e 是 MIPS16 的改進版本，首先由 MIPS32 和 MIPS64 Release 1 支援。MIPS16e2 是 MIPS16 的改進版本，由 MIPS32 和 MIPS64（直到 Release 5）支援。Release 6 將其替換為 microMIPS。

**MIPS 數位訊號處理（DSP）**
: DSP ASE 是 MIPS32/MIPS64 Release 2 及更新指令集版本的可選擴充，可用於加速大量「媒體」計算 —— 尤其是音影片。DSP 模組包含整數管線中的一組指令和狀態，並且在 MIPS 處理器核心中實現所需的附加邏輯最少。ASE 修訂版 2 於 2006 年下半年推出。該修訂版向原始 ASE 添加了額外的指令，但在其他方面與它向下相容。與 MIPS 架構的大部分不同，它是一組相當不規則的操作，其中許多是為了某些關鍵演算法特別選擇的。其主要新穎特點（對比原始 MIPS32）：

* 飽和算術（當計算溢位時，提供最接近非溢位答案的可表示數字）。
* 有符號 32 位元和 16 位元定點小數的定點運算，範圍為 - 1 到 + 1（廣泛稱為「Q31」和「Q15」）。
* 現有的整數乘法與乘法累加指令，將結果傳送到雙倍大小的累加器（在 MIPS32 CPU 上稱為「hi/lo」和 64 位元）。DSP ASE 增加了三個累加器，以及一些不同風格的乘法累加。
* SIMD 指令在 4x 無符號位元組或 2x16 位元值上執行，這些值打包到一個 32 位元暫存器（DSP ASE 的 64 位元變體也支援更大的向量）。
* SIMD 操作是基本算術、移位和一些乘法累加類型的操作。

**MIPS SIMD 架構（MSA）**
: 旨在加速多媒體的指令集擴充。

* 32 個 16x8 位元、8x16 位元、4x32 位元和 2x64 位元向量元素的向量暫存器
* 高效的整數、定點和浮點數向量並列算術運算
* 對絕對值運算元的操作
* 可用的捨入和飽和選項
* 全精度乘法和乘加
* 整數、浮點和定點資料之間的轉換
* 完整的向量級比較和分支指令集，無條件標誌
* 向量（1D）和陣列（2D）打散操作
* 位元組序無關的有類型載入和儲存指令
* 符合 IEEE 754-2008 浮點運算標準
* 基本精確浮點異常訊號
* 用於有更多門 / 電晶體的晶片的預定義可延伸擴充
* 結合通用編譯器加速計算密集型應用程式
* 用於消費電子應用或專用硬體未涵蓋的功能的軟體可程式化解決方案
* 新興的資料探勘、特徵提取、圖像和影片處理以及人機互動應用
* 高效能科學計算

**MIPS 虛擬化**
: 硬體支援的虛擬化技術。

**MIPS 多執行緒**
: 每個多執行緒 MIPS 核心最多可以支援兩個 VPE（虛擬處理元素），它們共享單個管道以及其他硬體資源。但是，由於每個 VPE 都包含軟體系統所看到的處理器狀態的完整副本，因此每個 VPE 對於 SMP Linux 作業系統來說都是一個完整的獨立處理器。對於更細粒度的執行緒處理應用程式，每個 VPE 能夠支援多達 9 個跨兩個 VPE 分配的 TC。TC 共享一個公共執行單元，但每個都有自己的程式計數器和核心暫存器檔案，因此每個都可以處理來自軟體的執行緒。MIPS MT 架構還允許將處理器周期分配給執行緒，並使用可選的服務品質（QoS）管理塊設定相關執行緒的優先級。這樣有兩個決定跨匯流排資訊流的優先級機制。第一種機制允許使用者優先一個執行緒於另一個執行緒。第二種機制用於隨時間將指定比例的周期分配給特定執行緒。兩種機制的結合使用允許向執行緒集有效分配頻寬，並更好地控制延遲。在即時系統中，系統級確定性非常重要，而 QoS 塊有助於提高系統的可預測性。進階系統的硬體設計人員可以用專門針對其應用進行調整的模組來替換 MIPS 科技提供的標準 QoS 模組。

**SmartMIPS**
: SmartMIPS 是由 Gemplus International 和 MIPS 科技設計的特定於應用程式的擴充（ASE），旨在提高智慧卡軟體的效能並減少記憶體消耗。它僅受 MIPS32 支援，因為智慧卡不需要 MIPS64 處理器的功能。很少有智慧卡使用 SmartMIPS。

**MIPS 數位媒體擴充（MDMX）**
: 1990 年代常見於 RISC 和 CISC 系統上的多媒體應用程式加速。

**MIPS-3D**
: 提高 3D 圖形應用程式效能的附加指令

## 呼叫約定

MIPS 有幾個呼叫約定，尤其是在 32 位元平台上。

O32 ABI 是最常用的 ABI，因為它是 MIPS 的原始 System V ABI。它嚴格基於堆疊，只有四個暫存器 $a0-$a3 可用於傳遞參數。堆疊上的空間是保留的，以防被呼叫者需要儲存其參數，但呼叫者不會將暫存器儲存在那裡。返回值儲存在暫存器 $v0 中；第二個返回值可以儲存在 $v1 中。ABI 形成於 1990 年，最後一次更新是在 1994 年。這種肉眼可見的緩慢，以及只有 16 個暫存器的老式浮點模型，促進了許多其他呼叫約定的擴散。它僅針對 32 位元 MIPS 定義，但 GCC 建立了一個名為 O64 的 64 位元變體。

對 64 位元，最常用的是 SGI 的 N64 ABI。最重要的改進是現有八個暫存器可用於參數傳遞；它還將浮點暫存器的數量增加到 32 個。還有一個稱為 N32 的 ILP32 版本，它使用 32 位元指標來處理較小的代碼，類似於 x32 ABI。兩者都在 CPU 的 64 位元模式下執行。N32 和 N64 ABI 將前八個參數傳遞給暫存器 $a0-$a7 中的函式；後續參數在堆疊上傳遞。返回值（或指向它的指標）儲存在暫存器 $v0 中；第二個返回值可以儲存在 $v1 中。在 N32 和 N64 ABI 中，所有暫存器都被認為是 64 位元寬。

已有一些嘗試，使用更類似於 N32 的 32 位元 ABI 替換 O32。1995 年的一次會議提出了 MIPS EABI，其 32 位元版本非常相似。EABI 啟發 MIPS 科技提出更激進的「NUBI」ABI，重用參數暫存器作為返回值。GCC 支援 MIPS EABI，但 LLVM 不支援，兩者也不支援 NUBI。

對於 O32 及 N32/N64，返回位址儲存在 $ra 暫存器中。這是使用 JAL（跳轉和連結）或 JALR（跳轉和連結暫存器）指令自動設定的。（非葉子）MIPS 次常式的函式序言將返回位址（在 $ra 中）推入堆疊。

在 O32 和 N32/N64 上，堆疊向下增長，但 N32/N64 ABI 需要所有堆疊條目 64 位元對齊。影格指標（$30）是可選的，實際上很少使用，除非需要在執行時確定函式中的堆疊分配，例如呼叫了 `alloca()`。

對於 N32 和 N64，返回位址通常儲存在棧指標之前的 8 個位元組，儘管這可能是可選的。

對於 N32 和 N64 ABI，函式必須保留 $S0-$s7 暫存器、全域指標（$gp 或 $28）、棧指標（$sp 或 $29）和影格指標（$30）。O32 ABI 相同，只是 $gp 暫存器需要由呼叫函式儲存而不是被呼叫函式。

對於多執行緒代碼，執行緒本地儲存指標通常儲存在特殊硬體暫存器 $29 中，並通過使用 mfhw（從硬體移動）指令存取。已知至少有一個供應商將此資訊儲存在 $k0 暫存器中，該暫存器通常保留供核心使用，但這不是標準的。

$k0 和 $k1 暫存器（$26-$27）保留供核心使用，不應由應用程式使用，因為核心可以隨時由於中斷、上下文交換或其他事件而更改這些暫存器。

跨呼叫保留的暫存器是（按照約定）不會被系統呼叫或過程（函式）呼叫更改的暫存器。例如，$s - 暫存器必須由需要使用它們的過程儲存到堆疊中，而 $sp 和 $fp 總是按常數遞增，並在過程完成後遞減（以及它們指向的記憶體）。相比之下，$ra 由任何普通函式呼叫（使用 jal 的函式呼叫）自動更改，並且 $t - 暫存器必須在任何過程呼叫之前由程式儲存（如果程式在呼叫後需要其中的值）。

Linux 上位置無關代碼的使用者空間呼叫約定還要求，當呼叫函式時，$t9 暫存器必須包含該函式的位址。這個約定可以追溯到 MIPS 的 System V ABI 補充規定。

## 用途

MIPS 處理器用於嵌入式系統，例如住宅閘道器和路由器。最初，MIPS 是為通用計算而設計的。在 1980 年代和 1990 年代，許多公司在個人、工作站和伺服器電腦上使用 MIPS 處理器，例如 DEC、MIPS Computer Systems、NEC、Pyramid Technology、SiCortex、Siemens Nixdorf、SGI，和 Tandem Computers.

從歷史上看，N64、索尼 PlayStation、PlayStation 2 和 PlayStation Portable 等電動遊戲機都使用 MIPS 處理器。MIPS 處理器在 1990 年代也曾在超級電腦中流行，但所有此類系統都從 TOP500 名單中掉了下來。這些用途最初由嵌入式應用程式補充，但在 1990 年代，MIPS 成為嵌入式處理器市場的主流選擇，到 2000 年代，大多數 MIPS 處理器都用於這類應用。

在 1990 年代中後期，據估計生產的 RISC 微處理器中有三分之一是 MIPS 處理器。

到 2010 年代後期，MIPS 機器仍然普遍用於嵌入式市場，包括汽車、無線路由器、LTE 數據機（主要為聯發科）和微控制器（例如 PIC32M）。它們大多已淡出個人、伺服器和應用領域。

## 模擬器

開放虛擬平台（OVP）包括可免費用於非商業用途的模擬器 OVPsim、處理器模型庫、外圍裝置和平台，以及使使用者能夠開發自己的模型的 API。庫中的模型是用 C 語言編寫的開源模型，包括 MIPS4K、24K、34K、74K、1004K、1074K、M14K、microAptiv、interAptiv、proAptiv 32 位元核心和 MIPS64 位元 5K 系列核心。這些模型由 Imperas 建立和維護，並與 MIPS 技術公司合作進行了測試，並得到了 MIPS 驗證標記。基於 MIPS 的範例平台包括裸機環境和用於引導未修改的 Linux 二進位映像的平台。這些平台模擬器可作為原始碼或二進位檔案使用，速度快，非商業用途免費，並且易於使用。OVPsim 由 Imperas 開發和維護，速度非常快（每秒數億條指令），旨在處理多核同構和異構架構和系統。

有一個免費的 MIPS32 模擬器（早期版本僅類比 R2000/R3000）稱為 SPIM，用於教育。EduMIPS64 是一個 GPL 圖形跨平台 MIPS64CPU 模擬器，用 Java/Swing 編寫。它支援 MIPS64 ISA 的較大子集，並允許使用者以圖形方式檢視 CPU 執行組譯程式時管線中發生的情況。

MARS 是另一個基於 GUI 的 MIPS 仿真器，設計用於教育，特別是與 Hennessy 的《電腦組織和設計》一起使用。

WebMIPS 是一個基於瀏覽器的 MIPS 模擬器，具有通用管線處理器的視覺化表示。該模擬器對於逐步執行期間的暫存器跟蹤非常有用。

QtMips 為基礎電腦架構課程提供簡單的 5 階段管道視覺化以及快取原理視覺化。提供 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 系統（R3000、R4000）和 CoWare（MIPS4KE、MIPS24K、MIPS25Kf 和 MIPS34K）。

WepSIM 是一個基於瀏覽器的模擬器，其中 MIPS 指令的子集是微編程的。該模擬器對於學習 CPU 的工作方式（微編程、MIPS 常式、陷阱、中斷、系統呼叫等）非常有用。

## 參見

* MIPS 架構處理器
* 管線

## 參考文獻

## 擴充閱讀

* Farquhar, Erin; Philip Bunce. MIPS Programmer's Handbook. Morgan Kaufmann Publishers. 1994. ISBN 1-55860-297-6.
* Patterson, David A; John L. Hennessy. Computer Organization and Design: The Hardware/Software Interface. Morgan Kaufmann Publishers. 2004. ISBN 1-55860-604-1.  含有內容需登入檢視的頁面 (link)
* Sweetman, Dominic. See MIPS Run. Morgan Kaufmann Publishers. 1999. ISBN 1-55860-410-3.
* Sweetman, Dominic. See MIPS Run, 2nd edition. Morgan Kaufmann Publishers. 2007. ISBN 978-0-12-088421-6.

## 外部連結

* MIPS 處理器 （頁面存檔備份，存於網際網路檔案館）
* prpl 基金會 （頁面存檔備份，存於網際網路檔案館）（由 Imagination Technologies 創立的一個支援 MIPS 平台的非盈利基金會）
* MIPS Architecture history diagram，存檔於網際網路檔案館（存檔日期 2013-05-30）
* 線上 MIPS 模擬器 （頁面存檔備份，存於網際網路檔案館）
* MIPS Instructions - MIPS Instruction Set （頁面存檔備份，存於網際網路檔案館）
* 計算機組織：MIPS 指令集 (一) 暫存器說明 （頁面存檔備份，存於網際網路檔案館）