MIPS，是一種採取精簡指令集（RISC）的指令集架構（ISA）Price Charles September 1995 MIPS IV Instruction Set Revision 32 MIPS Technologies Inc，由美國 MIPS 計算機系統公司開發，現為美普思科技。MIPS 廣泛被使用在許多電子產品、網路裝置、個人娛樂裝置與商業裝置上。最早的 MIPS 架構是 32 位元，最新的版本已經變成 64 位元。商業市場主要競爭對手為 ARM 與 RISCV。 MIPS 架構有多個版本，包括 MIPS I、II、III、IV，以及 MIPS V，它們各是 MIPS3264（ 32 位元、64 位元的實現）釋出的五個版本。早期的 MIPS 架構只有 32 位的版本，隨後才開發 64 位的版本。截至 2017 年 4 月，MIPS3264 的當前版本是 MIPS3264 Release 6。MIPS3264 與 MIPS IV 的主要區別不僅在於它除了使用者態架構外，還定義了特權核心模式的系統控制協處理器。 MIPS 架構有幾個可選的拓展，比如 MIPS3D，它是一個專用於常見 3D 計算任務的浮點 SIMD 指令集的簡單集合；MDMX（MaDMaX）是一個應用更加廣泛的整數 SIMD 指令集，它使用了 64 位浮點數暫存器；MIPS16e 則為提供了指令流壓縮的功能，這可以減小程式的體積；MIPS MT 則提供了多執行緒的能力。 在一些大學和技術學校中計算機架構的課程上，學生們通常會學習 MIPS 架構。這個架構極大地影響了後來的精簡指令集架構，如 Alpha。2021 年 3 月，MIPS 宣佈 MIPS 架構的開發已經結束，因為該公司正在向 RISCV 過渡。 歷史 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）功能，稱為配對單精度（PairedSingle）。 當 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、凱為、龍芯和君正已加入其中。MIPS32MIPS64 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 架構的開發。該公司已加入 RISCV 基金會，未來的處理器設計將基於 RISCV 架構 MIPS becomes RISCV March 8 2021 Retrieved March 11 2021Wave Computing and MIPS emerge from chapter 11 bankruptcy March 1 2021 Retrieved March 11 2021。 設計 MIPS 是一種模組化架構，最多支援四個協處理器（CP0123）。在 MIPS 術語中，CP0 是系統控制協處理器（MIPS IV 中處理器的重要部分，與實現相關），CP1 是可選的浮點運算器（FPU），CP23 是可選的由實現定義的協處理器（MIPS III 刪除了 CP3 並將其操作碼重新用於其他目的）。例如，在 PlayStation 影片遊戲機中，CP2 是幾何變換引擎（GTE），它可以加速 3D 計算機圖形中的幾何處理。 版本 MIPS I MIPS 是一種載入 儲存架構（也稱為暫存器 暫存器架構）；除了用於訪問電腦記憶體的載入 儲存指令外，所有指令都對暫存器進行操作。 暫存器 MIPS I 有 32 個 32 位通用暫存器（GPR）。暫存器 0 硬編碼為零，寫入的內容將被丟棄。暫存器 31 是連結暫存器。對於與其他指令非同步執行的整數乘法和除法指令，提供了一對 32 位暫存器 HI 和 LO。有一小組指令用於在通用暫存器和 HILO 暫存器之間複製資料。 程式計數器（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 opcode 6 opcode 6 opcode 6 opcode 6 opcode 6 rs 5 rs 5 rs 5 rs 5 rs 5 rt 5 rt 5 rt 5 rt 5 rt 5 rd 5 rd 5 rd 5 rd 5 rd 5 shamt 5 shamt 5 shamt 5 shamt 5 shamt 5 funct 6 funct 6 funct 6 funct 6 funct 6 funct 6 I opcode 6 opcode 6 opcode 6 opcode 6 opcode 6 opcode 6 rs 5 rs 5 rs 5 rs 5 rs 5 rt 5 rt 5 rt 5 rt 5 rt 5 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 immediate 16 J opcode 6 opcode 6 opcode 6 opcode 6 opcode 6 opcode 6 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 address 26 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 指令。添加了一組 TraponCondition 指令。如果求值為真，這些指令將導致異常。所有現有的分支指令都有了 可能 分支的版本，僅在分支跳轉要執行時才執行分支延遲槽中執行指令。在某些情況下，這些指令允許用有用的指令填充分支延遲槽，以此提高效能。為 COP13 添加了雙字載入和儲存指令。與其他記憶體訪問指令一致，這些載入和儲存要求雙字自然對齊。 浮點協處理器指令集也添加了幾條指令。添加了符合 IEEE 754 的浮點平方根指令。它支援單精度和雙精度運算元。添加了一組將單精度和雙精度浮點數轉換為 32 位字的指令。它們補充了現有的轉換指令，允許用指令控制 IEEE 舍入模式，而不是透過浮點控制和狀態（Floating Point Control and Status）暫存器。 MIPS III MIPS III 是向後相容 MIPS II 的擴充套件，增加了對 64 位元記憶體定址和整數運算的支援。64 位資料型別稱為雙字，MIPS III 將通用暫存器、HILO 暫存器和程式計數器擴充套件到 64 位以支援。添加了新指令來載入和儲存雙字，對它們執行整數加、減、乘、除和移位運算，以及在 GPR 和 HILO 暫存器之間移動雙字。必要時，現有最初定義為對 32 位字進行操作的指令被重新定義，以對 32 位結果進行符號擴充套件，使得大多數指令對字和雙字進行的處理行為相同。在這些重新定義的指令中包括 Load Word。在 MIPS III 中，它將字有符號擴充套件到 64 位。為了補充 Load Word，添加了一個無符號擴充套件版本。 R 指令格式無法指定完整的 64 位位移距離（其 5 位位移量欄位太窄，無法指定雙字的位移距離），MIPS III 對於每個 MIPS I 的位移指令，提供了三個 64 位的版本。第一個版本是原始移位指令的 64 位版本，用於指定介於 031 位之間的常量位移距離。第二個版本與第一個版本類似，但將位移量欄位的值加上 3210，以便可以指定 3264 位之間的常量位移距離。第三個版本從 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 指令集。 MIPS32MIPS64 MIPS32 的第一個版本基於 MIPS II，添加了來自 R4000 和 R5000 系列 64 位處理器的條件移動、預取指令和其他特性。MIPS64 的第一個版本增加了一個 MIPS32 模式來執行 32 位程式碼。向 MIPS32 和 MIPS64 規範添加了以前在某些實現中可用的 MUL 和 MADD（乘加）指令，同樣的還有快取控制指令。 2014 年的 MIPS32MIPS64 Release 6 添加了以下內容： 一個沒有延遲槽的新分支家族： 具有 26 位偏移量的無條件分支（BC）和分支連結（BALC）， 具有 21 位偏移量的零 非零條件分支， 全套有符號和無符號條件分支，可比較兩個暫存器（例如 BGTUC）或一個暫存器與零（例如 BGTZC）， 全套分支和連結，將暫存器與零進行比較（例如 BGTZALC）。 無延遲槽的索引跳轉指令，旨在支援大絕對地址。 在第 16、32 或 48 位處載入 16 位立即數的指令，允許輕鬆生成大常量。 PC 相關載入指令，以及大（PC 相關）偏移量的地址生成。 位反轉和位元組對齊指令（以前僅適用於 DSP 擴充套件）。 乘法和除法指令重新定義，向單個暫存器輸出結果。 生成真值的指令現在生成全零或全一，而不僅僅是清除 設定 0 位， 使用真值的指令現在只將全零解釋為假，而不是隻看 0 位。 刪除了不常用的指令： 一些條件移動 可能 分支指令（在以前的版本中已棄用）。 具有 16 位立即數的整數溢位捕獲指令 整數累加器指令（連同 HILO 暫存器，移至 DSP 特定應用擴充套件） 未對齊的載入指令（LWL 和 LWR）（現要求大多數一般載入和儲存指令支援未對齊的訪問，透過陷阱或新增新指令（BALIGN）等形式） 重新組織指令編碼，為未來的擴充套件騰出空間。 microMIPS microMIPS3264 架構（分別）是 MIPS32 和 MIPS64 架構的超集，旨在取代 MIPS16e ASE。MIPS16e 的一個缺點是在處理任何 16 位指令之前需要切換模式。microMIPS 將最常用的 32 位指令編碼為 16 位指令版本。允許程式混合 16 位和 32 位指令而無需切換模式。microMIPS 與 MIPS3264 Release 3 一起推出，MIPS3264 的每個後續版本都有相應的 microMIPS3264 版本。處理器可以單獨實現 microMIPS3264，或同時實現 microMIPS3264 及其相應的 MIPS3264 子集。從 MIPS3264 Release 6 開始，對 MIPS16e 的支援結束，microMIPS 是 MIPS 中唯一的程式碼壓縮形式。 應用程式特定擴充套件 基本的 MIPS32 和 MIPS64 架構可以補充一些可選的架構擴充套件，這些擴充套件統稱為 應用程式特定擴充套件（ASE）。這些 ASE 提供的功能可以提高某些工作負載的效率和效能，例如數字訊號處理。 MIPS 微控制器：微控制器應用的增強功能。MCU ASE（特定應用擴充套件）用於擴充套件中斷控制器支援、減少中斷延遲並增強微控制器系統設計中通常需要的 IO 外設控制功能。 單獨的優先順序和向量生成 在 EIC（外部中斷控制器）模式下支援多達 256 箇中斷和 8 個硬體中斷引腳 提供 16 位向量偏移地址 中斷異常向量預取 自動中斷序言 新增硬體以在中斷處理例程之前儲存和更新系統狀態 自動中斷尾聲 恢復先前儲存在堆疊中的系統狀態，以便從中斷返回。 中斷鏈 支援掛起中斷的服務，無需退出初始中斷例程，節省儲存和恢復多個活動中斷所需的週期 支援推測性預取中斷向量地址。透過將記憶體訪問與管道重新整理和異常優先順序重疊來減少中斷服務週期數 原子性位設定 清除指令，通常可在不中斷的情況下修改 IO 暫存器中用於監視或控制外部外圍功能的位，確保安全地執行操作。 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 是 MIPS32MIPS64 Release 2 及更新指令集版本的可選擴充套件，可用於加速大量 媒體 計算 尤其是音影片。DSP 模組包含整數流水線中的一組指令和狀態，並且在 MIPS 處理器核心中實現所需的附加邏輯最少。ASE 修訂版 2 於 2006 年下半年推出。該修訂版向原始 ASE 添加了額外的指令，但在其他方面與它向後相容。與 MIPS 架構的大部分不同，它是一組相當不規則的操作，其中許多是為了某些關鍵演算法特別選擇的。其主要新穎特點（對比原始 MIPS32）： 飽和算術（當計算溢位時，提供最接近非溢位答案的可表示數字）。 有符號 32 位和 16 位定點小數的定點運算，範圍為 1 到 1（廣泛稱為 Q31 和 Q15）。 現有的整數乘法與乘法累加指令，將結果傳送到雙倍大小的累加器（在 MIPS32 CPU 上稱為 hilo 和 64 位）。DSP ASE 增加了三個累加器，以及一些不同風格的乘法累加。 SIMD 指令在 4x 無符號位元組或 2x16 位值上執行，這些值打包到一個 32 位暫存器（DSP ASE 的 64 位變體也支援更大的向量）。 SIMD 操作是基本算術、移位和一些乘法累加型別的操作。 MIPS SIMD 架構（MSA） 旨在加速多媒體的指令集擴充套件。 32 個 16x8 位、8x16 位、4x32 位和 2x64 位向量元素的向量暫存器 高效的整數、定點和浮點數向量並行算術運算 對絕對值運算元的操作 可用的舍入和飽和選項 全精度乘法和乘加 整數、浮點和定點資料之間的轉換 完整的向量級比較和分支指令集，無條件標誌 向量（1D）和陣列（2D）打散操作 位元組序無關的有型別載入和儲存指令 符合 IEEE 7542008 浮點運算標準 基本精確浮點異常訊號 用於有更多門 電晶體的晶片的預定義可擴充套件擴充套件 結合通用編譯器加速計算密集型應用程式 用於消費電子應用或專用硬體未涵蓋的功能的軟體可程式設計解決方案 新興的資料探勘、特徵提取、影像和影片處理以及人機互動應用 高效能科學計算 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 系統上的多媒體應用程式加速。 MIPS3D 提高 3D 圖形應用程式效能的附加指令 呼叫約定 MIPS 有幾個呼叫約定，尤其是在 32 位平臺上。 O32 ABI 是最常用的 ABI，因為它是 MIPS 的原始 System V ABI。它嚴格基於堆疊，只有四個暫存器 a0a3 可用於傳遞引數。堆疊上的空間是保留的，以防被呼叫者需要儲存其引數，但呼叫者不會將暫存器儲存在那裡。返回值儲存在暫存器 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 將前八個引數傳遞給暫存器 a0a7 中的函式；後續引數在堆疊上傳遞。返回值（或指向它的指標）儲存在暫存器 v0 中；第二個返回值可以儲存在 v1 中。在 N32 和 N64 ABI 中，所有暫存器都被認為是 64 位寬。 已有一些嘗試，使用更類似於 N32 的 32 位 ABI 替換 O32。1995 年的一次會議提出了 MIPS EABI，其 32 位版本非常相似。EABI 啟發 MIPS 科技提出更激進的 NUBI ABI，重用引數暫存器作為返回值。GCC 支援 MIPS EABI，但 LLVM 不支援，兩者也不支援 NUBI。 對於 O32 及 N32N64，返回地址儲存在 ra 暫存器中。這是使用 JAL（跳轉和連結）或 JALR（跳轉和連結暫存器）指令自動設定的。（非葉子）MIPS 子例程的函式序言將返回地址（在 ra 中）推入堆疊 Karen Miller The MIPS Register Usage Conventions 2006Hal Perkins MIPS Calling Convention 2006。 在 O32 和 N32N64 上，堆疊向下增長，但 N32N64 ABI 需要所有堆疊條目 64 位對齊。幀指標（30）是可選的，實際上很少使用，除非需要在執行時確定函式中的堆疊分配，例如呼叫了 alloca 。 對於 N32 和 N64，返回地址通常儲存在棧指標之前的 8 個位元組，儘管這可能是可選的。 對於 N32 和 N64 ABI，函式必須保留 S0s7 暫存器、全域性指標（gp 或 28）、棧指標（sp 或 29）和幀指標（30）。O32 ABI 相同，只是 gp 暫存器需要由呼叫函式儲存而不是被呼叫函式。 對於多執行緒程式碼，執行緒本地儲存指標通常儲存在特殊硬體暫存器 29 中，並透過使用 mfhw（從硬體移動）指令訪問。已知至少有一個供應商將此資訊儲存在 k0 暫存器中，該暫存器通常保留供核心使用，但這不是標準的。 k0 和 k1 暫存器（2627）保留供核心使用，不應由應用程式使用，因為核心可以隨時由於中斷、上下文切換或其他事件而更改這些暫存器。 O32 呼叫約定暫存器 名稱 編號 用途 被調保留？ zero 0 常量 0 at 1 彙編臨時用 v0v1 23 函式返回值和表示式求值 a0a3 47 函式引數 t0t7 815 臨時 s0s7 1623 臨時儲存值 t8t9 2425 臨時 k0k1 2627 保留核心用 gp 28 全域性指標 （除 PIC 程式碼） sp 29 棧指標 fp 30 幀指標 ra 31 返回地址 N32N64 呼叫約定暫存器 名稱 編號 用途 被調保留？ zero 0 常量 0 at 1 彙編臨時用 v0v1 23 函式返回值和表示式求值 a0a7 411 函式引數 t4t7 1215 臨時 s0s7 1623 臨時儲存值 t8t9 2425 臨時 k0k1 2627 保留核心用 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 模擬器（早期版本僅模擬 R2000R3000）稱為 SPIM，用於教育。EduMIPS64 是一個 GPL 圖形跨平臺 MIPS64CPU 模擬器，用 JavaSwing 編寫。它支援 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、BroadcomNetlogic ec4400、Cavium Octeon I）、Imperas（所有 MIPS32 和 MIPS64 核心）、VaST 系統（R3000、R4000）和 CoWare（MIPS4KE、MIPS24K、MIPS25Kf 和 MIPS34K）。 WepSIM 是一個基於瀏覽器的模擬器，其中 MIPS 指令的子集是微程式設計的。該模擬器對於學習 CPU 的工作方式（微程式設計、MIPS 例程、陷阱、中斷、系統呼叫等）非常有用。 參見 MIPS 架構處理器 管線 參考文獻 擴充套件閱讀 外部連結 MIPS 處理器 prpl 基金會 （由 Imagination Technologies 創立的一個支援 MIPS 平臺的非盈利基金會） 線上 MIPS 模擬器 MIPS Instructions MIPS Instruction Set 計算機組織：MIPS 指令集 一 暫存器說明 Category 指令集架構