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, cl
由add eax, ecx
證明它會(在我的測試與add
版本經歷了2.8倍放緩時寫入cl
而不是bl
)。
測試結果:
- 米倫:沒有失速觀察
- 的Penryn:沒有失速觀察
- 的Nehalem:沒有失速觀察
更新:新的shrx
-group在Haswell 的轉變確實是表明失速。移位計數的參數不是寫成8位寄存器,所以可能是預期的,但文本表示並沒有提到任何有關這種微觀架構細節的內容。
'ecx'沒有'shl'的操作碼。你爲什麼認爲那裏有? – interjay
@interjay它是一個同義詞,一些彙編器允許這種形式。 – harold
如果它是一個同義詞,你如何期望它有不同的效果? – interjay