MIPS 體系和CISC體系結(jié)構(gòu)有什么不同
(1)延遲分支:MIPS CPU的流水線結(jié)構(gòu)意味著當(dāng)一個(gè)跳轉(zhuǎn)/分支指令到達(dá)執(zhí)行階段產(chǎn)生新的程序計(jì)數(shù)器值時(shí),跟在跳轉(zhuǎn)指令后的指令已經(jīng)開始了,該體系結(jié)構(gòu)并不是丟棄這部分有潛在用途的工作,而是要求緊跟分支后的指令總是在分支目標(biāo)指令之前執(zhí)行。緊接分支指令后的指令位置稱為分支延遲槽。
要是硬件沒(méi)有特殊處理,是否分支的決定以及分支的目標(biāo)地址,就會(huì)在ALU流水階段結(jié)束時(shí)得到——到此時(shí),如圖1.3所示,已經(jīng)太晚了,甚至在下下一個(gè)流水線槽都來(lái)不及提供一個(gè)指令地址。
但是分支指令的重要性足以給予特殊處理。從圖1.3所示,提供了一條經(jīng)ALU的特殊路徑可以讓分支目標(biāo)地址提早半個(gè)周期到達(dá)。連同取指階段多出來(lái)的半個(gè)時(shí)鐘周期的偏移,就剛好來(lái)得及去除分支目標(biāo)指令作為下下一個(gè)指令。這樣硬件就會(huì)運(yùn)行分支指令、接著運(yùn)行分支延遲槽指令、然后是分支目標(biāo)指令——再?zèng)]有其它的延遲。
編譯器系統(tǒng)或者匯編程序應(yīng)該考慮甚至利用分支延遲;結(jié)果是通常有可能通過(guò)適當(dāng)安排使得延遲槽中的指令做些有用的工作。經(jīng)??梢园褎e處的指令一道延遲槽中。
對(duì)于條件分支問(wèn)題會(huì)有點(diǎn)復(fù)雜,分支延遲指令應(yīng)當(dāng)對(duì)兩條分支路徑都無(wú)害。實(shí)在找不到有用的事情可做時(shí),延遲槽中填入一條nop指令。除非明確要求,否則許多MIPS匯編器都對(duì)程序員隱藏這個(gè)古怪的特性。
![](http://uphotos.eepw.com.cn/fetch/20130729/151202_2_0.jpg)
圖1.4:流水線和加載延遲
(2)數(shù)據(jù)加載延遲:流水線的另一個(gè)后果就是一條加載指令的數(shù)據(jù)在下一條指令的ALU階段的開始才從高速緩存/內(nèi)存系統(tǒng)到達(dá)——所以在下一條指令中不能使用加載的數(shù)據(jù)。
緊接加載指令后的指令位置稱為加載延遲槽,一個(gè)優(yōu)化的編譯器將試圖用它做些有用的事情。匯編器對(duì)程序員隱藏這一點(diǎn),但可能插入一條nop指令。
在現(xiàn)代的MIPS CPU上,加載結(jié)果是互鎖的:如果你試圖過(guò)早使用結(jié)果,CPU將停下來(lái)等待數(shù)據(jù)到達(dá)。但是早期的MIPS CPU沒(méi)有互鎖,在延遲槽中試圖使用數(shù)據(jù)將導(dǎo)致無(wú)法預(yù)料的結(jié)果。本文引用地址:http://www.biyoush.com/article/151202.htm
評(píng)論