[英]Why are used conditional move assembly instructions?
在某些情況下,為什么在匯編語言中仍然使用條件移動指令( CMOV
)? 為什么不使用S{cond}
(如果與零比較,則跳過指令)? 與CMOV不同,SKIP不具有直接的數據依賴關系(這對流水線操作是有好處的),並且遵循以下指令cen是任意的(不僅是條件移動)。 當然,它不需要沖洗管道,它只是取消以下指令的寫入結果。 我注意到的唯一瓶頸可以在以下示例中看到:
if(a > b) {
a = b;
}
c = a % 2;
具有等效的程序集 :
; R0 = a, R1 = b, R2 = c
SUB R2, R0, R1 ; R2 = R0 - R1
SLEG R2 ; if(R0 <= 0) PC++ | Skip If Less or Equal Zero
CP R0, R1 ; R0 = R1
*AND R2, R0, =1 ; R2 = R0 & 0x01
*關鍵執行。 處理器必須等待CP
指令的結果,因為R0
作為AND
指令中的操作數。 另一方面,這是現代CPU中的常見情況,可以有效解決,因此我認為性能下降不會像條件移動那樣高。 無論如何,在可能發生可預期的條件跳轉的地方,請使用它。
對不起我的英語不好。
SLEG R2
是一個指令的條件分支。 它可以通過數據依賴性(有效地使下一條指令成為謂語)或分支預測(與其他任何條件分支相同)來實現。
請注意,比較的結果計為“數據”,因此cmov
具有3個輸入:dest,src和flags。 類似地,使用跳轉來預測一條指令會將跳轉的控制輸入添加到另一條指令的數據相關性中。
您必須選擇一個。 我認為表達我想您要說的正確方法是,通常數據依賴檢查不會找到需要等待的任何內容。 在像現代x86芯片這樣的4寬無序設計中,這種情況很少發生,因為數據相關性的影響范圍要大得多。 飛行中還有更多指令,任何獨立的依賴鏈都可以並行運行。
跳過指令肯定比x86笨拙的cmov
強大。 由於cmov
無法接受立即數操作數,因此它通常需要額外的指令才能將常量作為源添加到另一個寄存器中。
保羅·克萊頓(Paul Clayton)的評論很有趣:POWER8特殊情況下有條件的1比1條件轉發分支將它們作為數據依賴項而不是控制依賴項來處理。 聽起來應該與PIC跳過指令完全相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.