这些指令之间有什么区别? MOVDQU是未对齐的双四字移动,而MOVUPD是未对齐的两个64位浮点移动。我的意思是他们俩都只是移动未对齐的128位数据。

MOVDQU在第948页上,MOVUPD在intel x64手册的第995页上。

最佳答案

Agner Fog说:


指令MOVDQAMOVDQUMOVAPSMOVUPSMOVAPDMOVUPD
与[128位]寄存器操作数一起使用时,它们都相同


然后他继续说(他在示例中使用的是对齐版本,但我猜想,未对齐的变体也是如此):


在Intel Core 2和更早的Intel处理器上,一些浮点指令在
整数单位。这包括XMM移动指令,布尔值以及一些随机播放和
包装说明。这些指令与以下指令混合使用时会有旁路延迟:
使用浮点单位。在大多数其他处理器上,使用的执行单元位于
根据指令名称,例如MOVAPS XMM1,XMM2使用浮点单位,
MOVDQA XMM1,XMM2使用整数单位。





读取或写入内存的指令使用单独的单元。来自的旁路延迟
在某些情况下,存储单元到浮点单元的长度可能比到整数单元的长度长
处理器,但这并不取决于指令的类型。因此,没有区别
当前处理器上MOVAPS XMM0,[MEM]MOVDQA XMM0,[MEM]之间的延迟,
但不能排除未来的处理器会有差异。





[Y] ou可以使用MOVAPS而不是MOVAPDMOVDQA将数据移入或移出
内存或寄存器之间。使用时,某些处理器会发生旁路延迟
MOVAPS用于将整数指令的结果移动到另一个寄存器,但不适用于
将数据移入或移出内存。

08-16 11:51