MIPS架構

MIPS（Microprocessor without Interlocked Pipeline Stages），是一種採取精簡指令集（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）。

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

類型｜位

31｜30｜29｜28｜27｜26｜25｜24｜23｜22｜21｜20｜19｜18｜17｜16｜15｜14｜13｜12｜11｜10｜9｜8｜7｜6｜5｜4｜3｜2｜1｜0

R｜opcode (6)｜rs (5)｜rt (5)｜rd (5)｜shamt (5)｜funct (6)

I｜opcode (6)｜rs (5)｜rt (5)｜immediate (16)

J｜opcode (6)｜address (26)

#### 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）保留供內核使用，不應由應用程式使用，因為內核可以隨時由於中斷、上下文切換或其他事件而更改這些寄存器。

名稱｜編號｜用途｜被調保留？

$zero｜$0｜常量0｜不適用

$at｜$1｜彙編臨時用｜否

$v0–$v1｜$2–$3｜函數返回值和表達式求值｜否

$a0–$a3｜$4–$7｜函數參數｜否

$t0–$t7｜$8–$15｜臨時｜否

$s0–$s7｜$16–$23｜臨時保存值｜是

$t8–$t9｜$24–$25｜臨時｜否

$k0–$k1｜$26–$27｜保留內核用｜不適用

$gp｜$28｜全局指針｜是（除PIC代碼）

$sp｜$29｜棧指針｜是

$fp｜$30｜幀指針｜是

$ra｜$31｜返回地址｜不適用

名稱｜編號｜用途｜被調保留？

$zero｜$0｜常量0｜不適用

$at｜$1｜彙編臨時用｜否

$v0–$v1｜$2–$3｜函數返回值和表達式求值｜否

$a0–$a7｜$4–$11｜函數參數｜否

$t4–$t7｜$12–$15｜臨時｜否

$s0–$s7｜$16–$23｜臨時保存值｜是

$t8–$t9｜$24–$25｜臨時｜否

$k0–$k1｜$26–$27｜保留內核用｜不適用

$gp｜$28｜全局指針｜是

$sp｜$29｜棧指針｜是

$fp｜$30｜幀指針｜是

$ra｜$31｜返回地址｜不適用

跨調用保留的寄存器是（按照約定）不會被系統調用或過程（函數）調用更改的寄存器。例如，$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。

從歷史上看，任天堂64、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處理器
- prpl基金會 （由Imagination Technologies創立的一個支持MIPS平台的非盈利基金會）
- 在線MIPS模擬器
- MIPS Instructions - MIPS Instruction Set
- 電腦組織：MIPS 指令集 (一) 暫存器說明

## 基本資料

- 日語原文：MIPS
- 設計師：MIPS科技公司
- 字長/暫存器資料寬度：32位元→64位元
- 始創時間：1985年
- 版本：MIPS32/64 Release 6（2014）
- 形式：精簡指令集（RISC）
- 類型：寄存器-寄存器
- 編碼：固定長度
- 分支預測結構：比較和分支
- 位元組序：雙端序
- 分頁大小：4 KB
- 擴展名：MDMX、MIPS-3D
- 啟用：部分。R12000處理器已經上市20多年，因此不受專利保護。因此，R12000及更早的處理器是完全開放的。
- 通用暫存器：32
- 浮點寄存器：32