首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CL寄存器的移位会导致部分寄存器失速吗?

使用CL寄存器的移位会导致部分寄存器失速吗?
EN

Stack Overflow用户
提问于 2012-10-27 20:00:05
回答 1查看 1.5K关注 0票数 8

变量移位能否在ecx上生成部分寄存器失速(或寄存器重新组合操作)?如果是,在哪一种微结构上?

我已经在Core2 (65 on )上测试过这个,它似乎只读取cl

代码语言:javascript
复制
_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倍)。

测试结果:

  • 梅龙:没有观察到失速
  • Penryn:没有观察到失速
  • Nehalem:没有观察到失速

更新:哈斯韦尔新的轮班制( shrx-group of shifts )确实表明了失速。shift-count参数并不是作为8位寄存器编写的,所以这可能是意料之中的,但是文本表示实际上并没有提到这种微观架构的细节。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-08 22:06:03

按照目前的措辞(“可以使用CL寄存器…进行移位吗”)这个问题的标题包含了它自己的答案:使用现代处理器,CL上永远不会有部分寄存器失速,因为CL永远不能从较小的东西中重新组合。

是的,处理器知道您正在移动的量实际上包含在CL中,准确地说,这是CL中最不重要的5或6位。它可以在ECX上停滞的一种方式是,它考虑指令依赖的粒度不低于完全寄存器。然而,这种担忧已经过时:最新的英特尔处理器将整个ECX寄存器视为依赖项,即奔腾4。参见Agner的非官方优化手册,第121页。但是,如果使用P4,这将不会被称为部分寄存器失速,程序只能成为错误依赖的牺牲品(例如,如果CH在移位之前是修饰符)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13103680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档