MOVDQA和MOVAPS x86指令之间的区别?

GJ.*_*GJ. 28 x86 assembly sse mov

我正在寻找英特尔数据表:英特尔®64和IA-32架构软件开发人员手册 ,我找不到它们之间的区别

  • MOVDQA:移动对齐双四字
  • MOVAPS:移动对齐打包单精度

在英特尔数据表中,我可以找到两个指令:

该指令可用于从128位存储器位置加载XMM寄存器,将XMM寄存器的内容存储到128位存储器位置,或在两个XMM寄存器之间移动数据.

唯一的区别是:

要将双四字移入或移出未对齐的存储单元,请使用MOVDQU指令.

要将打包的单精度浮点值移入或移出未对齐的内存位置,请使用MOVUPS指令.

但是我找不到两个不同指令的原因?

那么有人可以解释这个区别吗?

Ste*_*non 43

在功能上,它们是相同的.

一些(但不是全部)微架构上,由于"域穿越惩罚"存在时序差异.因此,movdqa当数据与整数SSE指令一起使用时,以及movaps当数据与浮点指令一起使用时,通常应该使用.有关此主题的更多信息,请参阅Intel优化手册或Agner Fog优秀的微体系结构指南.请注意,这些延迟通常与寄存器寄存器移动而不是加载或存储相关联.

  • @Jasper Bekkers:你不能相信你喜欢的一切,但它仍然是真的.有关域和它们之间的旁路延迟的一般性讨论,请参阅"英特尔优化手册"(2.2.3讨论Nehalem微架构上的域).有关危害的具体具体示例,请参阅Agner Fog的优秀参考文献第86和87页http://www.agner.org/optimize/microarchitecture.pdf (20认同)
  • @Zboson:保留将来引入单独的float/double域的可能性.这几乎肯定不会发生,但一些建筑师认为它可能在很多年前. (5认同)
  • 你的答案比我的更正确.我删除了它. (3认同)
  • 您可以链接到特定的手册条目吗?我很难相信这一点,因为SSE寄存器没有与之关联的类型(该类型在指令中进行了编码),因此我认为没有不同的float和integer路径。但是,它们确实具有不同的操作码,并在不同的指令集中引入。MOVAPS是SSE1,而MOVDQA是SSE2。根据http://www.intel.com/Assets/PDF/manual/248966.pdf,它们还具有相同的延迟和吞吐量。 (2认同)
  • Agners 手册中的页面似乎已更改,最好只搜索“数据旁路延迟”,每个 uArch 都有一个部分。 (2认同)
  • “movaps”与“movapd”怎么样?它们都在浮点域中,所以我不明白为什么有两条指令。 (2认同)