8

可变移位能否在 上产生部分寄存器停顿(或寄存器重组 µ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, 5mov cl, 5没有任何区别,如果正在进行寄存器重新组合,它会有所不同,这可以通过替换来证明shl eax, cladd eax, ecx在我的测试中,add当写入cl而不是时,该版本经历了 2.8 倍的减速bl)。


试验结果:

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

更新:shrxHaswell 的新班次确实显示了这种停滞。移位计数参数没有写成 8 位寄存器,因此这可能是意料之中的,但文本表示实际上并没有说明此类微架构细节。

4

1 回答 1

5

正如目前所说的(“Can a shift using the CL register ...”),问题的标题包含了它自己的答案:对于现代处理器,CL 上永远不会出现部分寄存器停顿,因为 CL 永远无法从更小的东西重新组合。

是的,处理器知道您要移动的数量实际上包含在 CL 中,准确地说是 CL 的 5 或 6 个最低有效位。它可能在 ECX 上停滞不前的一种方法是,它考虑指令依赖关系的粒度没有低于完整的寄存器。不过,这种担心已经过时了:将整个 ECX 寄存器视为依赖项的最新 Intel 处理器是 Pentium 4。参见 Agner Fog 的非官方优化手册,第 121 页。但话又说回来,对于 P4,这不会被称为部分寄存器停顿,程序只能成为错误依赖的牺牲品(例如,如果 CH 在移位之前是修饰符)。

于 2012-11-08T22:06:03.373 回答