寄存器窗口(register windows)
SPARC 最獨特的特性是寄存器窗口展姐,一種優(yōu)化函數(shù)調(diào)用階段的手段剖毯。 每次調(diào)用逊谋,都會分配一個新的緩存窗口,來緩存需要壓棧的寄存器胶滋。 窗口的數(shù)量是一個限制,因此俭令,實現(xiàn)上采用的是環(huán)形緩存部宿。權(quán)衡消耗和性能之后,大概6到8個緩存窗口是最優(yōu)的設(shè)計赫蛇。
實際上SPARC支持2到32個窗口雾叭,每個窗口一般會緩存8個寄存器,包括全局變量织狐,局部變量,傳入?yún)?shù)旺嬉,返回參數(shù)起意。(每個窗口最多可以有16個不同的寄存器,SPARC體系結(jié)構(gòu)硬件實現(xiàn)最少會有40個寄存器悲酷,最多可以達(dá)到520個寄存器亲善,到目前為止,大多數(shù)設(shè)計都采用128到136個寄存器蛹头。) 窗口的使用方面戏溺,調(diào)用和返回指令并不會觸發(fā)窗口使用屠尊,SPARC 有專門的 SAVE 和 RESTORE 指令來觸發(fā)窗口使用讼昆。 SAVE 會指向下一個寄存器窗口,也就相當(dāng)于保存了調(diào)用函數(shù)的窗口浸赫。 有一個重點是源寄存器在調(diào)用者的窗口,而目標(biāo)寄存器位于被調(diào)用者的窗口中羡榴。 SPARC編譯器通常使用此指令來更改堆棧指針运敢,以在新的堆棧幀中分配局部變量。 RESTORE 跟 SAVE 相反肤视,從被調(diào)用者的窗口返回到調(diào)用者的窗口涉枫。 這將自動釋放堆棧幀。 編譯器也可以利用它來生成被調(diào)用方的最終返回值愿汰。
寄存器窗口的缺點是大量的寄存器可能會拖慢時鐘頻率。 雖然在早期這點看起來不是問題摇予。 SPARC體系結(jié)構(gòu)(有寄存器窗口)和 MIPS R2000 體系結(jié)構(gòu) (沒有寄存器窗口) 都是從 1987 就存在吗跋。 幾次更新?lián)Q代下來, 雖然使用了類似的技術(shù)酗宋,但是 SPARC 的頻率都沒有比 MIPS 的時鐘頻率慢疆拘, 也許這是因為 cache 的存在掩蓋了這一點。 最近一代計算機(jī)使用了不同的技術(shù)策略 —— 一個是順序回右,一個是亂序 —— 但是看起來寄存器的數(shù)量也不大會影響到時鐘頻率。 最近翔烁,Tensilica和IA-64也添加了寄存器窗口。
寄存器窗口的缺點是大量的寄存器可能會拖慢時鐘頻率阶女。 在早期頻率低的時代哩治,這點看起來當(dāng)然不是問題衬鱼。 實際上,SPARC體系結(jié)構(gòu)(有寄存器窗口)和 MIPS R2000 體系結(jié)構(gòu) (沒有寄存器窗口) 都是從 1987 就存在蒜胖,幾次更新?lián)Q代下來抛蚤,雖然使用了類似的技術(shù),但是 SPARC 的頻率都沒有比 MIPS 的時鐘頻率慢朋沮, 也許這是因為 cache 的存在掩蓋了這一點缀壤。 最近一代設(shè)計雖然使用了不同的技術(shù)策略 —— 一個是順序,一個是亂序 —— 但是看起來寄存器的數(shù)量也不大會影響到時鐘頻率筋夏。 最近图呢,Tensilica和IA-64也添加了寄存器窗口。
另一種數(shù)據(jù)傳輸?shù)奶匦允莑oad和store的可選項赴叹。 這可以簡化外設(shè)輸入輸出和控制寄存器的操作瞳筏。
快速 trap
SPARC 第9版支持了快速trap。 從單級trap擴(kuò)展到到至少4級trap姚炕, 允許獲取到窗口的上溢和下溢中斷丢烘。 額外的級別意味著處理程序不需要在代碼中顯式地檢查頁面錯誤或未對齊的堆棧指針播瞳,從而使處理程序更快免糕。 添加了兩個新的指令,從這個多級處理程序返回:RETRY(重新進(jìn)入中斷的指令)和 DONE(不重新進(jìn)入)石窑。 為了支持用戶級 trap 松逊,RETURN 指令還可以從非特權(quán)模式 trap 返回。
支持 LISP 和 Smalltalk
剩下的主要特性是算術(shù)加法和減法经宏。 SPARC 的設(shè)計者參考了LISP和Smalltalk等編程語言,并且影響了前面提到的一些功能:寄存器窗口耐亏,條件trap指令沪斟,帶32位指令地址的調(diào)用和多字算術(shù)(參見Taylor et al [1986]和Ungar等[1984])。 對加法轨域,減法和比較的操作杀餐, 添加了標(biāo)記數(shù)據(jù)類型的支持。 兩個最低有效位表示操作數(shù)是否為整數(shù)(編碼為00)枉长, 因此如果任一操作數(shù)未被標(biāo)記為整數(shù)或結(jié)果太大琼讽, 則TADDcc和TSUBCC將設(shè)置溢出位。 隨后的條件分支或trap指令可以決定要做什么钻蹬。 (如果操作數(shù)不是整數(shù), 軟件會恢復(fù)操作數(shù)肝匆, 檢查操作數(shù)的類型, 并根據(jù)這些類型調(diào)用正確的操作枯怖。) 事實證明能曾,不對齊的內(nèi)存訪問trap也可以用于標(biāo)記的數(shù)據(jù), 因為從具有錯誤標(biāo)簽的指針加載可能是無效的訪問蕊程。
整數(shù)和浮點交疊操作
SPARC允許用浮點指令執(zhí)行整數(shù)指令操作蚂斤。 在這種情況下,要從中斷恢復(fù),SPARC有一個待處理的浮點指令隊列及其地址岗钩。 RDPR允許處理器清空隊列兼吓。 第二個浮點特征是包含浮點平方根指令FSQRTS,F(xiàn)SQRTD和FSQRTQ视搏。
其余指令
SPARC 剩余的獨有特性如下:
- JMPL 使用 Rd 來指定返回地址寄存器, 因此指定 r31 與 MIPS 中的 JAIR 相似浑娜, 指定 r0 與 JR 相似。
- LDSTUB 加載單個字節(jié)到 Rd 打颤, 并且保存 FF16 到地址字節(jié)漓滔。 這種指令可以用來實現(xiàn)信號量。
- CASA (CASXA) 是一條原子操作指令透且,比較寄存器中和內(nèi)存中的32位(64位)值豁鲤,如果相等罕邀,則交換第二個寄存器和內(nèi)存中的值养距。 這條第九版的指令可以用來實現(xiàn)沒有鎖的無等待同步算法。
- XNOR 計算與第二個操作數(shù)的補(bǔ)碼的異或肾胯。
- BPcc耘纱, BPr, 和 FBPcc 包括一個分支預(yù)測位艳馒,編譯器可以利用這個位來告訴計算機(jī)哪個分支更可能執(zhí)行员寇。
- ILLTRAP 引發(fā)一個非法指令trap。 Muchnick [1988] 解釋了如何將其正確運用在C的返回返回程序中陆爽。
- POPC 統(tǒng)計操作數(shù)中總共有多少個位被置位扳缕。 第三版 alpha 體系結(jié)構(gòu)也有這條指令。
- 不會觸發(fā)失敗的 load 操作運行編譯器將其移動到條件控制前驴剔。
- 四精度浮點算術(shù)和數(shù)據(jù)傳輸粥庄,允許浮點寄存器操作128位的浮點。
- 乘法的多精度浮點結(jié)果指的是利花,兩個單精度相乘可以得到一個雙精度結(jié)果载佳,兩個雙精度結(jié)果相乘可以得到一個四精度結(jié)果。這些指令可以用在處理復(fù)雜和特定的一些浮點算術(shù)中挠乳。