MIPS架構

MIPS，是一種採取精簡指令集:A-1:19，由美國MIPS計算機系統公司開發，現為美普思科技。MIPS廣泛被使用在許多電子產品、網路裝置、個人娛樂裝置與商業裝置上。最早的MIPS架構是32位元，最新的版本已經變成64位元。商業市場主要競爭對手為ARM與RISC-V。MIPS架構有多個版本，包括MIPS I、II、III、IV，以及MIPS V，它們各是MIPS32/64釋出的五個版本。早期的MIPS架構只有32位的版本，隨後才開發64位的版本。截至2017年4月，MIPS32/64的當前版本是MIPS32/64 Release 6。MIPS32/64與MIPS I-V的主要區別不僅在於它除了使用者態架構外，還定義了特權核心模式的系統控制協處理器。MIPS架構有幾個可選的拓展，比如MIPS-3D，它是一個專用於常見3D計算任務的浮點SIMD指令集的簡單集合；MDMX是一個應用更加廣泛的整數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，以區別於新版本:32。MIPS計算機系統公司的R6000微處理器是第一個MIPS II實現:8，專為伺服器設計，由Bipolar Integrated Technology製造和銷售，但在商業上失敗了。在1990年代中期，許多用於嵌入式系統的新32位MIPS處理器都是MIPS II實現，因為1991年引入64位MIPS III架構，使得直到1999年MIPS 32推出前，MIPS II都是最新的32位MIPS架構:19。MIPS計算機系統公司的R4000微處理器專為嵌入式系統、膝上型電腦和個人電腦而設計。NEC製造的衍生產品R4300i用於N64遊戲機。N64和PlayStation是1990年代中期MIPS架構處理器的最大使用者之一。第一個MIPS IV實現是MIPS科技R8000微處理器晶片組用於工作站、伺服器和超級計算機。R5000和R7000可用於高階嵌入式系統、個人計算機以及低端工作站和伺服器。東芝R5000的衍生產品R5900用於索尼的Emotion Engine，該引擎為其PlayStation 2遊戲機提供動力。MIPS V於1996年10月21日在微處理器論壇上與MIPS數字媒體擴充套件。當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是一種模組化架構，最多支援四個協處理器，它可以加速3D計算機圖形中的幾何處理。版本.MIPS I.MIPS是一種載入-儲存架構；除了用於訪問電腦記憶體的載入/儲存指令外，所有指令都對暫存器進行操作。暫存器.MIPS I有32個32位通用暫存器。暫存器$0硬編碼為零，寫入的內容將被丟棄。暫存器$31是連結暫存器。對於與其他指令非同步執行的整數乘法和除法指令，提供了一對32位暫存器"HI"和"LO"。有一小組指令用於在通用暫存器和HI/LO暫存器之間複製資料。程式計數器有32位。低二位總是為零，因為MIPS I指令有32位長，並且與它們的自然字邊界對齊。指令格式.指令分為三種類型：R型。三種類型的指令的最高6位均為6位的opcode碼。從25位往下，三種用於核心指令集的指令圖示如下：CPU指令.MIPS I有載入和儲存8位的位元組、16位的半字和32位的字的指令。僅支援一種定址模式：基址+位移。由於MIPS I是32位架構，因此載入少於32位的值需要將資料有符號或無符號擴充套件到32位。以“unsigned”為字尾的載入指令執行無符號擴充套件；否則執行有符號擴充套件。載入指令從GPR獲取儲存資料。所有載入和儲存指令都透過將基址與符號擴充套件的16位立即數相加來計算記憶體地址。MIPS I要求所有記憶體訪問都與其自然字邊界對齊，否則會發出異常訊號。“左”或“右”為字尾的載入/儲存字指令用以支援高效的未對齊記憶體訪問。所有載入指令後都有一條指令的載入延遲槽。載入延遲槽中的指令不能使用載入指令載入的資料。載入延遲槽可以填充一條不依賴於載入的指令；如果找不到這樣的指令，則用nop代替。MIPS I有執行加法和減法的指令。這些指令從兩個GPR。Load Immediate Upper指令將16位立即數複製到GPR的高16位。它與Or Immediate指令結合使用以將32位立即數載入到暫存器中。MIPS I有執行左右邏輯移位和右算術移位的指令。運算元從一個GPR中獲得的。MIPS I有有符號和無符號整數乘法和除法的指令。這些指令從兩個GPR獲取其運算元，並將其結果寫入一對稱為HI和LO的32位暫存器，因為它們可能與其他CPU指令分開將GPR的內容複製到HI和LO。這些指令用於在異常處理後將HI和LO恢復到其原始狀態。讀取HI或LO的指令必須由不寫入HI或LO的兩條指令分隔。所有MIPS I控制流指令後需要接一個分支延遲槽。除非分支延遲槽用執行有用工作的指令填充，否則要使用nop。MIPS I分支指令將GPR將返回地址儲存到GPR 31。“Jump and Link Register”指令允許將返回地址儲存到任何可寫的GPR。MIPS I有兩條軟體用於發出異常訊號的指令：System Call和Breakpoint。System Call被使用者態軟體用來進行核心呼叫；Breakpoint用於核心異常處理程式轉移控制到偵錯程式。兩條指令都有一個20位的程式碼欄位，可儲存給異常處理程式的操作環境特定資訊。MIPS有32個浮點暫存器。兩兩暫存器配對用於雙精度數。奇數號暫存器不能用於算術或分支，只是作為雙精度暫存器對的一部分，導致大多數指令只有16個可用暫存器。單精度指令由.s字尾表示，而雙精度由.d字尾表示。MIPS II.MIPS II移除了載入延遲槽:41並添加了幾組指令。對於共享記憶體多處理，添加了“Synchronize Shared Memory”、“Load Linked Word”和“Store Conditional Word”指令。添加了一組Trap-on-Condition指令。如果求值為真，這些指令將導致異常。所有現有的分支指令都有了“可能”分支的版本，僅在分支跳轉要執行時才執行分支延遲槽中執行指令:40。在某些情況下，這些指令允許用有用的指令填充分支延遲槽，以此提高效能:212。為COP1-3添加了雙字載入和儲存指令。與其他記憶體訪問指令一致，這些載入和儲存要求雙字自然對齊。浮點協處理器指令集也添加了幾條指令。添加了符合IEEE 754的浮點平方根指令。它支援單精度和雙精度運算元。添加了一組將單精度和雙精度浮點數轉換為32位字的指令。它們補充了現有的轉換指令，允許用指令控制IEEE舍入模式，而不是透過浮點控制和狀態暫存器。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位位移距離，MIPS III對於每個MIPS I的位移指令，提供了三個64位的版本。第一個版本是原始移位指令的64位版本，用於指定介於0-31位之間的常量位移距離。第二個版本與第一個版本類似，但將位移量欄位的值加上3210，以便可以指定32-64位之間的常量位移距離。第三個版本從GPR的六個低位獲取位移距離。MIPS III在現有核心和使用者許可權級別之間添加了一個“管理員”許可權級別。此功能僅影響由實現定義的系統控制處理器。MIPS III移除了協處理器3。浮點控制暫存器沒有為相容性進行擴充套件。新增的唯一新浮點指令是在CPU和FPU之間複製雙字的指令，將單精度和雙精度浮點數轉換為雙字整數，反之亦然。MIPS IV.MIPS IV是該架構的第四個版本。它是MIPS III的超集，與MIPS的所有現有版本相容。MIPS IV主要旨在提高浮點。MIPS IV添加了幾個特性來改進指令級並行性。為了緩解由單個條件位引起的瓶頸，在浮點控制和狀態暫存器中添加了七個條件程式碼位，使總數達到八個。重新定義了FP比較和分支指令，以便它們可指定寫入或讀取哪個條件位；並且刪除了FP比較與讀取由比較指令寫入條件位的FP分支之間的延遲槽。透過GPR和FPR條件移動指令的形式部分添加了對分支預測的支援；並且實現可以選擇為IEEE 754陷阱提供精確或不精確的例外。MIPS IV為單精度和雙精度浮點數添加了幾個新的浮點算術指令：融合乘加減、倒數和倒數平方根。FP融合乘加減指令執行一次或兩次舍入。這些指令服務於指令延遲比準確性更重要的應用程式。MIPS V.MIPS V添加了一種新的資料型別，配對單精度浮點陣列成，儲存在現有的64位浮點暫存器中。添加了現有算術、比較和條件移動浮點指令的變體，以便以SIMD方式對這種資料型別進行操作。添加了用於載入、重排和轉換PS資料的新指令:426–429。這是第一個利用現有資源實現的浮點SIMD指令集。MIPS32/MIPS64.MIPS32的第一個版本基於MIPS II，添加了來自R4000和R5000系列64位處理器的條件移動、預取指令和其他特性。MIPS64的第一個版本增加了一個MIPS32模式來執行32位程式碼。向MIPS32和MIPS64規範添加了以前在某些實現中可用的MUL和MADD指令，同樣的還有快取控制指令。2014年的MIPS32/MIPS64 Release 6添加了以下內容：刪除了不常用的指令：重新組織指令編碼，為未來的擴充套件騰出空間。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提供的功能可以提高某些工作負載的效率和效能，例如數字訊號處理。呼叫約定.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推入堆疊。在O32和N32/N64上，堆疊向下增長，但N32/N64 ABI需要所有堆疊條目64位對齊。幀指標是可選的，實際上很少使用，除非需要在執行時確定函式中的堆疊分配，例如呼叫了codice_1。對於N32和N64，返回地址通常儲存在棧指標之前的8個位元組，儘管這可能是可選的。對於N32和N64 ABI，函式必須保留$S0-$s7暫存器、全域性指標。O32 ABI相同，只是$gp暫存器需要由呼叫函式儲存而不是被呼叫函式。對於多執行緒程式碼，執行緒本地儲存指標通常儲存在特殊硬體暫存器$29中，並透過使用mfhw指令訪問。已知至少有一個供應商將此資訊儲存在$k0暫存器中，該暫存器通常保留供核心使用，但這不是標準的。$k0和$k1暫存器保留供核心使用，不應由應用程式使用，因為核心可以隨時由於中斷、上下文切換或其他事件而更改這些暫存器。跨呼叫保留的暫存器是。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調變解調器。它們大多已淡出個人、伺服器和應用領域。模擬器.開放虛擬平臺，旨在處理多核同構和異構架構和系統。有一個免費的MIPS32模擬器稱為SPIM，用於教育。EduMIPS64是一個GPL圖形跨平臺MIPS64CPU模擬器，用Java/Swing編寫。它支援MIPS64 ISA的較大子集，並允許使用者以圖形方式檢視CPU執行彙編程式時流水線中發生的情況。MARS是另一個基於GUI的MIPS模擬器，設計用於教育，特別是與Hennessy的《計算機組織和設計》一起使用。WebMIPS是一個基於瀏覽器的MIPS模擬器，具有通用流水線處理器的視覺化表示。該模擬器對於逐步執行期間的暫存器跟蹤非常有用。QtMips為基礎計算機架構課程提供簡單的5階段管道視覺化以及快取原理視覺化。提供Windows、Linux、macOS和線上版本。GXemul和QEMU專案提供了更高階的免費模擬器。除了使用它們的整個計算機系統之外，它們還模擬各種MIPS III和IV微處理器。商業模擬器特別適用於MIPS處理器的嵌入式使用，例如Wind River Simics。WepSIM是一個基於瀏覽器的模擬器，其中MIPS指令的子集是微程式設計的。該模擬器對於學習CPU的工作方式非常有用。