2012-10-27 113 views
7

ecx可以通過變量移位產生部分寄存器失速(或寄存器重組失敗)嗎?如果是這樣,在哪個微體系結構?使用CL寄存器移位會導致寄存器部分失速嗎?

我已經在Core2(65nm)上測試過了,它似乎只能讀取cl

_shiftbench: 
    push rbx 
    mov edx, -10000000 
    mov ecx, 5 
    _shiftloop: 
    mov bl, 5 ; replace by cl to see possible recombining 
    shl eax, cl 
    add edx, 1 
    jnz _shiftloop 
    pop rbx 
    ret 

通過mov cl, 5更換mov bl, 5沒有什麼區別,這是否有寄存器重組正在進行,如可以通過更換shl eax, cladd eax, ecx證明它會(在我的測試與add版本經歷了2.8倍放緩時寫入cl而不是bl)。


測試結果:

  • 米倫:沒有失速觀察
  • 的Penryn:沒有失速觀察
  • 的Nehalem:沒有失速觀察

更新:新的shrx -group在Haswell 的轉變確實是表明失速。移位計數的參數不是寫成8位寄存器,所以可能是預期的,但文本表示並沒有提到任何有關這種微觀架構細節的內容。

+1

'ecx'沒有'shl'的操作碼。你爲什麼認爲那裏有? – interjay

+1

@interjay它是一個同義詞,一些彙編器允許這種形式。 – harold

+2

如果它是一個同義詞,你如何期望它有不同的效果? – interjay

回答

4

正如目前的措詞(「可以使用CL寄存器進行轉換...」),問題的標題包含它自己的答案:使用現代處理器,CL上永遠不會有部分寄存器失速,因爲CL永遠不能從小的東西重新組合。

是的,處理器知道你正在移動的數量被有效地包含在CL中,CL的5或6個最低有效位精確。它可能在ECX上停滯不前的一種方式是,它認爲指令依賴性的粒度沒有低於完整寄存器。然而,這種擔心已經過時:最新的Intel處理器將整個ECX寄存器視爲依賴項是Pentium 4.請參閱Agner Fog的unofficial optimization manual,第121頁。但是,P4又不會被稱爲部分寄存器失速,程序只能成爲錯誤依賴的犧牲品(比如說,如果CH是變化前的修飾符)。

+0

謝謝。不幸的是,現在我已經知道了答案,這是我所問過的最糟糕的問題。好吧.. – harold

+2

@harold不要打yourself自己,你在嘗試自己測量經驗答案之後來到了StackOverflow,甚至通過交換已知導致部分寄存器停頓的指令來檢查您的測量是否有意義。如果僅用於方法論,您的問題對網站來說是一個很好的補充。 –