A Quantitative Approach-appendix K(3)——RISC指令系統的特有指令
A Quantitative Approach-appendix K(3)——RISC指令系統的特有指令
-
MIPS 64的特有指令
-
非對齊資料傳輸指令
-
大部分程式不會使用這些指令,只有在16位小型機的應用程式,以及快速memcpy/strcpy時,才可能使用到
-
大部分RISC在遇到非對齊的資料訪問時,通常會發生trap。解決辦法是分別獲取兩個字,然後拼接得到結果
-
MIPS的解決方案:提供了四條特殊的載入和儲存指令,通過組合可以只用兩條指令解決非對齊訪問:LWL載入暫存器的左半邊,LWR載入暫存器的右半邊,SWL/SWR與之對應
-
-
NOR,或非邏輯運算,~(Rs1 | Rs2)
-
暫存器移位指令中包含了不可用的5位的固定欄位
-
syscall,特殊的trap指令,用於實現系統呼叫
-
CTCi/CFCi,讀取或者設定控制暫存器的值
-
Jump/call指令是非PC相關的,直接將立即數移位後和PC拼接使用
-
TLB指令,TLB缺失在MIPS I中由軟體處理,因此ISA中包括了操作TLB的指令
-
倒數和倒數的平方根指令,沒有遵從IEEE 754的舍入標準,主要用於執行快速除法和平方根的程式碼,但是沒有高精度要求
-
條件過程呼叫指令,BGEZAL當rs1大於等於0時,儲存返回地址並且跳轉,BLTZAL則是判斷rs1是否小於等於0
-
並行單精度浮點操作指令,MIPS支援使用一條指令在64位暫存器中並行完成兩個32位浮點的操作
-
-
Alpha的特有指令
- 不精確的浮點異常(為了高效能)
- 一般的體系結構要求在觸發異常時,異常指令之前的指令都已經執行完,之後的指令都不執行
- 為了簡化流水線執行,Alpha不要求異常需要滿足之前的指令都執行完,之後的指令都不執行的要求,但是Alpha提供了TRAPB指令,幫助實現精確異常。TRAPB能夠保證之前的算術指令都能夠無異常的執行完成,否則將一直停頓。
- 不支援位元組/半字的資料訪問(為了高效能,只支援word訪問)
- Alpha認為位元組讀寫會降低資料傳輸速度。因為位元組的讀需要增加一個額外的移位,位元組的寫入,需要從記憶體中讀出後再寫入,同時需要重新計算ECC值
- 為了完成位元組的獲取和寫入,Alpha提供了一組詳細的位元組操作指令:暫存器的位域擴充套件和清零(EXTxx),插入位域(INSxx),掩碼清零(MSKxx)等
- 這種方式在初版中有體現,但是結果不好,因此之後又新增進來
- PAL code指令,為了提供VAX的微指令操作,Alpha提供了一個關閉中斷和虛擬地址對映的特權模式。PAL(特權指令庫)可以用作TLB管理,記憶體原子操作,作業系統原語。通過call_pal指令呼叫PAL碼
- 不支援整數的除法
- 不對齊讀寫:LDQ_U和STQ_U,忽略地址的低三位,讀寫64位資料,然後利用提取指令獲取不對齊word
- 單精度浮點表示為雙精度浮點:單精度在記憶體中為32位,讀取到暫存器時,自動轉換為64位
- 浮點暫存器F31固定為0
- VAX浮點格式:相容VAX體系結構,同時支援IEEE 754
- bit count指令,第三版結構中新增的,CTLZ(計算前導0),CTTZ(計算尾部零),CTPOP(word中1的個數)等。這些指令最早在cray的計算機中,用於加解密
- 不精確的浮點異常(為了高效能)
-
SPARC v9的特有指令
- 暫存器視窗:
- 用於減少在過程呼叫時的暫存器traffic(擁擠)。SPARC提供了多個暫存器視窗,每個過程呼叫分配一個新的暫存器視窗。最後一個過程的公用暫存器與第一個過程的公用暫存器重疊起來,形成一個迴圈圈。在呼叫層數很多時,可以迴圈使用。
- SPARC支援2到32個視窗,每個視窗可以快取8個暫存器(最多16個)
- SPARC使用專門的save/restore指令來顯式指示視窗的使用。
- 指令視窗的缺點在於大量的暫存器會拖慢時鐘頻率
- 重疊暫存器視窗的基本思想是:在處理機中設定一個數量比較大的暫存器堆,並把它劃分成很多個視窗。每個過程使用其中相鄰的3個視窗和一個公共的視窗,而在這些視窗中有一個視窗是與前一個過程共用,還有一個視窗是與下一個過程共用的。與前一過程共用的視窗可以用來存放前一過程傳送給本過程的引數,同時也存放本過程傳送給前一過程的計算結果。同樣,與下一過程共用視窗可以用來存放本過程傳送給下一過程的引數和存放下一過程傳送給本過程的計算結果。
- RISC II中採用的重疊暫存器視窗共有138個暫存器,分成17個視窗,其中,有一個由10個暫存器組成的視窗是全域性視窗,能被所有過程訪問。另外有8個視窗,每個視窗各10個暫存器,分別作為8個過程的區域性暫存器。還有8個視窗,每個視窗各有6個暫存器,是相鄰兩個過程公用的,稱為重疊暫存器視窗。每個過程均可以訪問32個暫存器,其中,有10個是所有過程公用的全域性暫存器,有10個是隻供本過程使用的區域性暫存器,有6個是與上一過程公用的暫存器,還有6個是與下一過程公用的暫存器
- fast traps:從單級trap擴充套件到至少四級trap,允許中斷視窗的上溢和下溢的trap處理程式。增加的級別意味著處理程式不需要在程式碼中顯式地檢查頁面錯誤或者未對齊的堆疊指標,從而使得中斷處理程式更快。SPARC添加了兩條指令,用於從多級處理程式返回:retry(重新進入中斷)和done(不重新進入)
- 支援LISP和smalltalk語言:在加法,減法和比較的操作,添加了標記資料型別的支援。最低的兩位用於表示運算元是否為整數,因此如果任一運算元未標記為整數或者結果太大,則TADDcc/TSUBcc將設定溢位位,此後的branch指令或者trap指令決定如何解決。(可以解決程式利用一個整數作為地址訪問記憶體的問題)
- 整數和浮點交疊操作:允許浮點指令和整數指令同時重疊執行。同時浮點也支援求平方根的指令
- JMPL使用rd儲存返回地址暫存器,當rd=r31時,效果和MIPS的JAIR相似,rd=r0時,與JR相似
- LDSTUB取一個位元組到rd中,然後將FF16儲存到對應的地址上。可以用於實現訊號量
- 原子操作指令CASA(CASXA),用於比較暫存器中和記憶體中的32位/64位的大小,如果相等,則交換第二個暫存器和記憶體中的值
- XNOR計算與第二個運算元的補碼的異或
- BPcc,BPr,FBPcc包括一個分支預測位,編譯器可以利用這個位進行分支提示
- ILLTRAP引發一個非法指令trap,用於C語言中的總的返回程式的合理執行
- POPC用於統計運算元中共有多少個1
- nonfaulting loads可以由編譯器將其從分支指令之後移動到分支指令之前,進行推測式非故障執行
- 四精度浮點算術運算和資料傳輸,即128位浮點操作
- 乘法的多精度結果:單精度乘法結果為雙精度結果,雙精度乘法可以得到四精度結果
- 暫存器視窗:
-
Power PC的特有指令
- Branch Registers: Link and Counter(分支暫存器:連結和計數器)
- 連結暫存器,用於程式呼叫儲存返回地址,不是通用暫存器中的一個。目的:使得返回跳轉速度更快,不需要查詢暫存器的步驟
- 計數暫存器:用於迴圈執行,加快迴圈的分支執行
- 更早的獲取目標地址,PowerPC提供了兩條指令(BCLR,BCCTR)可以從暫存器中獲取跳轉的目標地址
- 0號暫存器不強制為0
- 可以使用單條指令讀取或者儲存多個暫存器,最多可以是32個暫存器
- LSW和STSW可以用於獲取或者儲存定長或者變長的字串
- 移位掩碼指令可以用於抽取或者插入數值從/到某個位域
- 代數右移:當運算元為負,並且右移出去一個1,進位位(CA)將會設定為1。目的:可以用於有符號數除以任何2的常數冪
- CBTLZ計算運算元中的前導零個數
- SUBFIC用於計算(立即數-RA)
- 邏輯立即數移位指令:將16位立即數向左移動16位,在執行AND/OR/XOR操作之前
- Branch Registers: Link and Counter(分支暫存器:連結和計數器)
-
PA-RISC 2.0特有指令
-
nullification:普遍的用於各種算術和邏輯指令中。例如,一條加法指令可以將兩個運算元相加,儲存相加結果,如果結果為0,則可以跳過之後的一條指令。通過這樣的方式,可以省略掉只有一條執行指令的分支
-
PA-RISC 2.0定義了非常豐富的條件分支指令
-
PA-RISC在浮點單元中提供了完整的32為整數乘法,但是整數資料必須首先移動到浮點暫存器
-
十進位制操作:COBOL程式(資料處理領域的語言)在計算十進位制時,將十進位制的數字放到4bits中,而不進行轉換,因此PA-RISC提供了32位到十進位制之間的加法轉換指令,邏輯和運算指令等
-
跳轉指令可以左移索引暫存器三位,然後根據基址暫存器定址,一般用於case語句
-
PA-RISC有12條提取和插入指令,允許從暫存器中選擇或者插入任意位欄位
-
PA-RISC提供ADDIL指令來簡化32位地址常數的使用。ADDIL將暫存器中值和一個向左調整的21位常量相加,並儲存。之後的資料傳輸指令使用相對於之前儲存的值的11位的偏移地址,進行地址索引
-
PA-RISC有9條除錯指令,可以在指令或資料地址上設定斷點並返回被捕獲的地址
-
Load/clear指令能夠提供訊號量或者鎖的功能,能夠從記憶體中讀取一個值,然後寫入0
-
針對於儲存短位元組,優化了未對齊的資料移動,根據指令選項和條件碼,可以將一個字中的最左或者最右的位元組移動到有效地址
-
軟體控制的預取,例如將暫存器0作為目標地址的load即為預取
-
PA-RISC 2.0擴充套件了cache hints,提供了更多的cache操作,例如指示儲存器如果當前cache中不包含某個資料,則不要將其放入cache中
-
可選的分支目標堆疊,用於預測子例程返回。軟體可以建議將哪些地址放置在分支目標棧中並從其移除,但硬體控制這些地址是否有效
-
PA-RISC 2.0 增加了浮點的乘加和乘減運算
-
-
ARM的特有指令(v4)
- 條件執行指令,每條指令的開頭有4位可以標識執行條件
- 12位立即數的特有解釋方式。
- 運算元移位不侷限於立即數,所有的算術和邏輯操作的第二個暫存器都可以在操作之前進行移位。
- block loads和stores:在指令中的16位掩碼的控制下,16個暫存器任意組合都可以被儲存/讀取,並且只需要一條指令。這些指令可以用於過程呼叫,塊記憶體複製等
- reverse subtract(反向減法,RSB)允許使用立即數或者是移位之後的暫存器減去第一個暫存器
- 長乘法,類似於MIPS的乘法,利用兩個特定的暫存器儲存乘法的結果
- 沒有整數除法的硬體支援
- 條件trap,(所有的ARM指令都可以支援條件執行)
- 協處理器介面,ARM定義了一整套協處理器指令:資料傳輸,通用暫存器和協處理器暫存器之間的移動,以及協處理器操作
- 利用協處理器的介面定義了浮點體系結構
- 跳轉和切換指令集: BX 指令可以切換ARM和Thumb模式, 低31位表示跳轉的目標地址, 最高位決定是ARM(1)還是 Thumb(0)
-
Thumb的特有指令
- Thumb的指令在硬體上被轉換為常規的ARM指令執行,但是有一些區別
- 條件執行被刪除
- 只提供了前8個暫存器的使用,某些指令隱式使用特殊暫存器
- 使用兩運算元節省空間
- 使用單獨的移位指令完成移位操作
- 定址模式更加簡單,指令格式更多
- 相對於ARM的變化
- 邏輯立即數指令被刪除
- 條件碼稱為隱式的,不是可選的設定條件碼,需要由操作碼定義之前的功能。所有Alu指令和資料傳輸指令都不設定條件碼
- Hi/Lo暫存器的訪問形式:16個ARM暫存器被分為Hi和Lo暫存器,8個Hi暫存器包括SP,連結暫存器,PC。ALU可以使用所有Lo暫存器
- 分支和過程呼叫的距離:branch的8位立即數左移1位作為偏址。過程呼叫需要兩條指令指令,每條指令提供11位,組合之後形成22位,然後移動1位。
- 資料傳輸偏移量:對於普通暫存器的load/store是5位的偏移量,對於SP/PC是8位的偏移量(隱含在操作碼中)
- Thumb的指令在硬體上被轉換為常規的ARM指令執行,但是有一些區別
-
SuperH的特有指令
- Decrement and test:將一個暫存器的內容遞減,如果結果為0,特殊的標誌為T bit會被設定為1
- 可選的延遲分支,BT和BF
- 許多型別的乘法,針對於有符號和無符號,資料寬度等
- 支援零擴充套件和符號擴充套件
- 單位移位指令每次只能夠移動一位(可能是為了適應指令長度為16 bits)
- 可變的移位指令,根據暫存器中的數值的符號,判斷移動的方向,支援邏輯和算術移位
- swap:交換32位字或者是16位半字的高一半和低一半
- 提取32位字,將兩個暫存器組成的64位長字中間的32位提取到另一個暫存器
- cache 預取指令,PREF
- test-and-set指令
-
M32R的特有指令
- 指令之間可以通過一個指令中的指示位來標明相互之間是否可以並行,從而形成類似於VLIW的效果
- 所有的分支偏移會向左移動兩位之後再使用,但是指令長度是16位,因此意味著有些地址是無法跳轉到的
- 除法的結果是餘數而不是商
-
MIPS 16的特有指令
- 32位MIPS體系結構的16位擴充套件,相容32位地址的MIPS(I,II)和64位(III,IV,V)
- MIPS不支援在單個過程中混合兩種長度的指令,除了JAL和JALX,因為這兩條指令在16位模式下,也需要32位(更長的跳轉地址)
- MIPS 16支援三運算元指令,每個運算元是8個暫存器。但是MIPS16 支援將這8個暫存器和完整的MIPS體系結構的剩餘24個暫存器之間進行值複製。
- SP被看作是一個單獨的暫存器,使用操作碼進行指令,從而減少8個可見暫存器的壓力
- MIPS 16的立即數域寬度為5-8位,但是提供了擴充套件短立即數的方法。使用EXTEND指令增加立即數的寬度
- MIPS 16相對於MIPS的變化
- 刪除有符號的算術指令
- 刪除了立即數邏輯運算指令
- BEQ,BNE等型別的指令沒有支援,而是使用set-on-less指令,並且使用新的T暫存器和新的分支指令用於測試T暫存器,然後進行跳轉
- 分支跳轉距離:立即數左移1位
- 延遲分支消失,跳轉仍然有一個延遲分支槽
- 資料傳輸的偏移地址擴充套件是零擴充套件,而不是32位模式下的符號擴充套件
- 重新定義0,在移位指令中,3位的移位域如果為0代表需要移動8位
- 0號暫存器不再代表零,所以需要一些新的指令
-
RISC的發展系譜圖