为什么要将32位寄存器从堆栈移到堆栈到xmm寄存器呢?

时间:2015-04-17 14:20:54

标签: assembly x86 att

我正在使用64位计算机上的gcc -m32进行编译。

以下有什么区别?请注意,这是AT& T语法。

# this
movd  %edx, %xmm0

# and this
movl  %edx, (%esp)
movd  (%esp), %xmm0

1 个答案:

答案 0 :(得分:1)

总结评论的答案:

您可能获得了使用内存中间的代码,因为您没有启用优化。

机器状态的唯一区别是第二个版本在堆栈上留下了副本。 (但

movd %edx, %xmm0
movl %edx, (%esp)

仍然是完成该状态的更好选择。相同的uop和更低的延迟(特别是在Intel CPU上.AMD Bulldozer / Steamroller在movd (x)mm, r32/r64有10个周期延迟。在Intel上有1个周期。)

Agner Fog says

  

整数单元和浮动之间的传输延迟   我的测量中的点/向量单位比指定的长得多   AMD的软件优化指南。不过,我无法证实这一点   将数据从通用寄存器移动到矢量更快   按照该指南中的建议,通过内存中间注册。

(在微格式pdf中)