使用CL寄存器进行移位会导致寄存器部分失速?

变量移位是否会在ecx上产生部分寄存器失速(或寄存器重新组合)? 如果是这样,在哪个微体系结构?

我已经在Core2(65纳米)上测试了这一点,似乎只读了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的版本经验丰富当写入cl而不是bl时是2.8倍减速)。


检测结果:

  • Merom:没有观察到失速
  • Penryn:没有观察到失速
  • Nehalem:没有观察到失速
  • 更新:Haswell中新的shrx组转换确实表明了失速。 移位计数的参数不是写成8位寄存器,所以可能是预期的,但文本表示并没有提到任何有关这种微观架构细节的内容。


    按照目前的措词(“可以使用CL寄存器进行转换......”),问题的标题包含它自己的答案:使用现代处理器,CL上永远不会有部分寄存器失速,因为CL永远不可能与更小的东西重新组合。

    是的,处理器知道你正在移动的数量被有效地包含在CL中,CL的5或6个最低有效位精确。 它可能在ECX上停滞不前的一种方式是,它认为指令依赖性的粒度没有低于完整寄存器。 然而,这种担心已经过时:最新的Intel处理器将整个ECX寄存器视为依赖项,这是Pentium 4.请参阅Agner Fog的非官方优化手册,第121页。但是再次说明,P4不会被称为局部注册失速,程序只能成为错误依赖的牺牲品(比如说,如果CH在换班之前是修改者)。

    链接地址: http://www.djcxy.com/p/65225.html

    上一篇: Can a shift using the CL register result in a partial register stall?

    下一篇: 'POST 400 bad request' error when updating parse.com table