使用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倍减速)。
检测结果:
更新: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