变量移位能否在ecx上生成部分寄存器失速(或寄存器重新组合操作)?如果是,在哪一种微结构上?
我已经在Core2 (65 on )上测试过这个,它似乎只读取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 cl, 5没有什么区别,如果正在进行注册重组,就会发生这种情况,用add eax, ecx替换shl eax, cl就可以证明这一点(在我的测试中,使用add的版本在写到cl而不是bl时下降了2.8倍)。
测试结果:
更新:哈斯韦尔新的轮班制( shrx-group of shifts )确实表明了失速。shift-count参数并不是作为8位寄存器编写的,所以这可能是意料之中的,但是文本表示实际上并没有提到这种微观架构的细节。
发布于 2012-11-08 22:06:03
按照目前的措辞(“可以使用CL寄存器…进行移位吗”)这个问题的标题包含了它自己的答案:使用现代处理器,CL上永远不会有部分寄存器失速,因为CL永远不能从较小的东西中重新组合。
是的,处理器知道您正在移动的量实际上包含在CL中,准确地说,这是CL中最不重要的5或6位。它可以在ECX上停滞的一种方式是,它考虑指令依赖的粒度不低于完全寄存器。然而,这种担忧已经过时:最新的英特尔处理器将整个ECX寄存器视为依赖项,即奔腾4。参见Agner的非官方优化手册,第121页。但是,如果使用P4,这将不会被称为部分寄存器失速,程序只能成为错误依赖的牺牲品(例如,如果CH在移位之前是修饰符)。
https://stackoverflow.com/questions/13103680
复制相似问题