比較和跳轉(zhuǎn)指令

所有的體系結(jié)構(gòu)都必須要有比較和條件跳轉(zhuǎn),雖然很多相似之處,但是各個體系結(jié)構(gòu)都有自己的一套實現(xiàn)。

SPARC使用4種傳統(tǒng)的狀態(tài)位:負(fù)數(shù),零,進(jìn)位,和溢出。所有的算術(shù)和邏輯指令都可能設(shè)置它們,舊的體系結(jié)構(gòu)中,這些位可能被所有的指令設(shè)置。明確的操作更利于流水線的實現(xiàn)。雖然狀態(tài)位可能被其他操作影響,但是顯式的比較可以用r0作為目的寄存器來生成。SPARC的條件跳轉(zhuǎn)會比較所有的條件位來確定所有可能的跳轉(zhuǎn)。浮點使用專門的條件位。第9版SPARC分支跳轉(zhuǎn)擴(kuò)展了4種情況:一個是為64bit設(shè)計的獨立的條件編碼;一個是跟0的各種情況比較(參考下面的MIPS);3種新的浮點條件碼;最后是靜態(tài)編碼了的分支預(yù)測。

PowerPC也是用四種狀態(tài)編碼:小于,大于,等于,以及溢出,不過存在8份拷貝。這種冗余設(shè)計本質(zhì)上來說,就是為PowerPC多添加了8個4位寄存器,讓PowerPC的指令在使用狀態(tài)的時候減少沖突。每個狀態(tài)碼都可以是一個比較指令的目的,也可以是一個條件跳轉(zhuǎn)的源。整數(shù)指令有一個可選位,來標(biāo)識這個整數(shù)操作后是否有一個與零比較來設(shè)置狀態(tài)寄存器。浮點指令也可以選擇設(shè)置第二個狀態(tài)寄存器。PowerPC提供對這8個4位寄存器的邏輯操作(CRAND,CROR,CRXOR,CRNAND,CRNOR,CREQV),為單條的分支指令提高更復(fù)雜的條件比較。

MIPS用寄存器來獲取分支狀態(tài)。可以用任意的兩個寄存器來構(gòu)造一條相等(BEQ)或者不相等(BNE)指令,通過他們的結(jié)果來決定分支是否跳轉(zhuǎn)。小于置位指令(SLT,SLTI,SLTU,SLTIU)比較兩個操作數(shù)然后設(shè)置目的寄存器,如果小于就設(shè)置為1,否則就將目的寄存器設(shè)置為0。這些指令就可以組合出所有的可能。因為跟0比較很常見,所以MIPS還包括一些特殊的跟0的比較跳轉(zhuǎn)指令:大于等于0(BGEZ),大于0(BGTZ),小于等于0(BLEZ),還有小于0(BLTZ)。當(dāng)然,等于或者不等于也可以由r0跟BEQ和BNE組合出來。跟SPARC一樣,MIPS I為浮點比較和跳轉(zhuǎn)指令提供一個單獨的狀態(tài)碼;MIPS IV將狀態(tài)碼擴(kuò)展到8個,來標(biāo)識浮點的比較和條件指令狀態(tài)。

Alpha指令(CMPEQ,CMPLE,CMPLE,CMPULT,CMPULE)比較兩個寄存器的值,然后設(shè)置第三個寄存器的值,條件為真設(shè)置為1,否則這是為0。浮點指令(CMTEQ,CMTLT,CMTLE,CMTUN)在判斷條件為真的時候?qū)⒔Y(jié)果設(shè)置為2.0,否則設(shè)置為0。分支指令將一個寄存器的值跟0比較(BEQ,BGE,BGT,BLE,BLT,BNE),或者它的最低有效位(BLBC,BLBS),如果條件成立就跳轉(zhuǎn)。

PA-RISC有很多分支選項,我們在“Alpha的指令獨特點”小結(jié)會看到。最直接的是比較并且跳轉(zhuǎn)(COMB),比較兩個寄存器,然后根據(jù)它們的結(jié)果來判斷是否跳轉(zhuǎn),并且測試比較的最低有效位。

ARM跟SPARC類似,指令中提供四種可以選擇設(shè)置的狀態(tài)條件碼。CMP用一個操作數(shù)減去另外一個操作數(shù)的結(jié)果來設(shè)置狀態(tài)位。負(fù)數(shù)比較(MN)用一個操作數(shù)加上另外一個操作數(shù),用和來設(shè)置狀態(tài)位。TST用兩個操作數(shù)邏輯與來設(shè)置所有的狀態(tài)碼,TEQ用獨有的或操作來設(shè)置前三個狀態(tài)碼。跟SPARC一樣,ARM分支指令通過測試狀態(tài)位來判斷所有的有符號和無符號關(guān)系。我們會在“SPARC v.9的指令獨特點”中看到,ARM的一個不常用的特點是,每條指令都可以根據(jù)狀態(tài)碼來選擇是否執(zhí)行。(這個PA-RISC的選項類似,見“Alpha的獨特點”)。

顯然的,Thumb跟ARM很像。不同的地方是狀態(tài)碼不再可選,沒有了TEQ指令,也沒有了條件執(zhí)行的指令。

Hitachi SuperH只有一個單獨的T狀態(tài)位,可以通過比較指令設(shè)置。兩個分支指令可以用來跳轉(zhuǎn),在T位是1的時候跳轉(zhuǎn)(BT)或者T位是0的時候(BF)。這兩種分支可以減少比較指令。

M32R也只有一個單獨的條件狀態(tài)碼(C),有符號比較和無符號比較(CMP,CMPI,CMPU,CMPUI)都用C位來標(biāo)識一個寄存器的值是否小于另一個,就像MIPS的小于置位指令一樣。靈感廢紙指令測試C位是否為1或0:BC和BNC。M32R也包含相等跳轉(zhuǎn),不相等跳轉(zhuǎn)(BEQ和BNE),以及一個寄存器值跟0比較(BGEZ,BGTZ,BLEZ,BLTZ,BEQZ,BNEZ).后面這些都是32位寬指令。

MIPS16保留了小于置位指令(SLT,SLTI,SLTU,SLTIU),但是不再將結(jié)果放到8個寄存器中,而是放到一個專門的T寄存器。MIPS16總是在完整的32位MIPS指令集機(jī)器上面實現(xiàn),所以,T寄存器實際上就是完整MIPS體系結(jié)構(gòu)中的寄存器24。MIPS16的分支指令測試一個寄存器是否等于0(BEQZ和BNEZ)。也有測試T寄存器是否為0的(BTEQZ和BTNEZ)。為了測試兩個寄存器中的值是否相等,MIPS還添加了比較指令(CMP,CMPI),指令會把或的結(jié)果存到T寄存器。MIPS16刪減了寄存器是否等于的比較跳轉(zhuǎn)(BEQ和BNE)。

圖18和圖19匯總了條件分支的設(shè)計。

圖18桌面RISC條件分支匯總。PA-RISC的浮點分支實現(xiàn)需要將FP狀態(tài)寄存器拷貝到整數(shù)寄存器,然后用分支指令測試FP的比較結(jié)果。SPARC的整數(shù)比較是由使用R0作為目的寄存器的算術(shù)指令組合出來的。
圖19嵌入式RISC條件分支匯總
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容