为什么一些SSE"mov"指令指定它们移动浮点值?

Jos*_*man 17 x86 assembly sse

许多SSE"mov"指令指定它们正在移动浮点值.例如:

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

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

Jos*_*man 13

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

我在这个类似的SO问题中找到了这个解释:MOVDQA和MOVAPS x86指令之间的区别?

  • 只是评论确认这是正确的.:)在不同的域中抛出一个值通常有1-2个周期的延迟. (5认同)