可变移位能否在 上产生部分寄存器停顿(或寄存器重组 µops)ecx
?如果是这样,在哪个微架构上?
我已经在 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 bl, 5
为mov cl, 5
没有任何区别,如果正在进行寄存器重新组合,它会有所不同,这可以通过替换来证明shl eax, cl
(add eax, ecx
在我的测试中,add
当写入cl
而不是时,该版本经历了 2.8 倍的减速bl
)。
试验结果:
- Merom:没有观察到失速
- Penryn:没有观察到失速
- Nehalem:没有观察到失速
更新:shrx
Haswell 的新班次确实显示了这种停滞。移位计数参数没有写成 8 位寄存器,因此这可能是意料之中的,但文本表示实际上并没有说明此类微架构细节。