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