har*_*old 7 performance x86 assembly
变量移位是否会产生部分寄存器停顿(或寄存器重组μ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
Run Code Online (Sandbox Code Playgroud)
更换mov bl, 5的mov cl, 5没有什么区别,这是否有寄存器重组正在进行,如可以通过更换证明它会shl eax, cl通过add eax, ecx(该版本在我的测试add写入时,经历了2.8倍放缓cl,而不是bl).
检测结果:
更新:shrxHaswell 的新班组确实表明失速.shift-count参数不是写成8位寄存器,因此可能是预期的,但文本表示实际上并没有说明这种微架构细节.
正如目前的措辞(\xe2\x80\x9cCan a shift using the CL register \xe2\x80\xa6\xe2\x80\x9d),问题的标题包含自己的答案:使用现代处理器,永远不会有部分寄存器在 CL 上停止,因为 CL 永远无法由较小的东西重新组合。
\n\n是的,处理器知道您要移动的量实际上包含在 CL 中,准确地说是 CL 的 5 或 6 个最低有效位。它可能在 ECX 上停滞的一种方式是,如果它考虑指令依赖性的粒度没有低于完整寄存器。不过,这种担心已经过时了:将整个 ECX 寄存器视为依赖项的最新 Intel 处理器是 Pentium 4。请参阅 Agner Fog 的非官方优化手册,第 121 页。但话又说回来,对于 P4,这不会是称为部分寄存器停顿,程序只能是错误依赖性的受害者(例如,如果 CH 在移位之前被修改)。
\n| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |