我正在使用64位计算机上的gcc -m32
进行编译。
以下有什么区别?请注意,这是AT& T语法。
# this
movd %edx, %xmm0
# and this
movl %edx, (%esp)
movd (%esp), %xmm0
答案 0 :(得分:1)
总结评论的答案:
您可能获得了使用内存中间的代码,因为您没有启用优化。
机器状态的唯一区别是第二个版本在堆栈上留下了副本。 (但
movd %edx, %xmm0
movl %edx, (%esp)
仍然是完成该状态的更好选择。相同的uop和更低的延迟(特别是在Intel CPU上.AMD Bulldozer / Steamroller在movd (x)mm, r32/r64
有10个周期延迟。在Intel上有1个周期。)
整数单元和浮动之间的传输延迟 我的测量中的点/向量单位比指定的长得多 AMD的软件优化指南。不过,我无法证实这一点 将数据从通用寄存器移动到矢量更快 按照该指南中的建议,通过内存中间注册。
(在微格式pdf中)