使用CL寄存器的移位会导致部分寄存器停顿吗?

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, 5mov cl, 5没有什么区别,这是否有寄存器重组正在进行,如可以通过更换证明它会shl eax, cl通过add eax, ecx(该版本在我的测试add写入时,经历了2.8倍放缓cl,而不是bl).


检测结果:

  • Merom:没有观察到失速
  • Penryn:没有观察到失速
  • Nehalem:没有观察到失速

更新:shrxHaswell 的新班组确实表明失速.shift-count参数不是写成8位寄存器,因此可能是预期的,但文本表示实际上并没有说明这种微架构细节.

Pas*_*uoq 5

正如目前的措辞(\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

  • @harold 不要自责,您在自己努力测量经验答案后来到了 StackOverflow,您甚至通过交换已知会导致部分寄存器停顿的指令来检查您的测量是否有意义。如果只是为了方法论,你的问题是对网站的一个很好的补充。 (4认同)