为什么有些SSE" mov"说明指定它们移动浮点值?

时间:2013-04-30 07:09:57

标签: assembly x86 sse

许多SSE“mov”指令指定它们正在移动浮点值。例如:

  • MOVHLPS - 移动打包的单精度浮点值从高到低
  • MOVSD-移动标量双精度浮点值
  • MOVUPD - 移动未对齐的打包双精度浮点值

为什么这些指令不会简单地表示它们移动32位或64位值?如果它们只是移动位,为什么指令指定它们是浮点值?当然,无论你是否将这些位解释为浮点,它们都能工作吗?

2 个答案:

答案 0 :(得分:12)

我想我找到了答案:一些微体系结构在不同的执行单元上执行浮点指令而不是整数指令。当指令流保持在同一“域”(整数或浮点)内时,您会获得更好的总体延迟。 Agner Fog的优化手册中标题为“数据旁路延迟”的部分详细介绍了这一点:http://www.agner.org/optimize/microarchitecture.pdf

我在这个类似的SO问题中找到了这个解释:Difference between MOVDQA and MOVAPS x86 instructions?

答案 1 :(得分:4)

如果有人关心,这正是为什么在Agner Fog的vectorclass中他有单独的向量类与boolean float(Vec4fb)和布尔整数(Vec4i)一起使用 http://www.agner.org/optimize/#vectorclass

在他的手册中,他写道。 “我们之所以为其定义了一个单独的布尔矢量类 使用浮点向量是因为它使我们能够生成更快的代码。 (许多 现代CPU具有用于整数向量和浮动的单独执行单元 点向量。有时可以在中执行布尔运算 浮点单元,从而避免在两者之间移动数据的延迟 单元)。“

关于SSE和AVX的大多数问题都可以通过阅读他的手册来回答,更重要的是看看他的矢量类中的代码。