MOVUPD与MOVDQU (x86/x64汇编)的区别

6

这些指令有什么区别呢?MOVDQU是无对齐双128位数据传输指令,MOVUPD是无对齐双64位浮点数传输指令。虽然它们都是用于传输无对齐的128位数据,但是它们的数据类型不同。

在英特尔x64手册中,MOVDQU在第948页,MOVUPD在第995页。


相关:为什么汇编使用MOVUPS指令来处理双精度浮点数? - movups在机器码中比movupd少1个字节,因此更好。(是否有任何情况下使用MOVDQU和MOVUPD比MOVUPS更好?) - Peter Cordes
1个回答

6

Agner Fog 表示:

指令MOVDQAMOVDQUMOVAPSMOVUPSMOVAPDMOVUPD在使用[128位]寄存器操作数时均相同。

然后他接着说(他在他的示例中使用了对齐版本,但我猜非对齐变体也适用):

在Intel Core 2和早期的Intel处理器上,一些浮点运算指令是在整数单元中执行的。这包括XMM移动指令、布尔和一些洗牌和打包指令。这些指令与使用浮点运算单元的指令混合使用时有绕过延迟。在大多数其他处理器上,所使用的执行单元与指令名称相符,例如MOVAPS XMM1,XMM2使用浮点单元,MOVDQA XMM1,XMM2使用整数单元。


读取或写入内存的指令使用单独的单元。从内存单元到浮点单元的绕过延迟在某些处理器上可能比到整数单元的延迟更长,但这不取决于指令类型。因此,在当前处理器上,MOVAPS XMM0,[MEM]MOVDQA XMM0,[MEM]之间的延迟没有区别,但不能排除在将来处理器上会有区别。


[您]可以使用MOVAPS代替在内存或寄存器之间移动数据的MOVAPDMOVDQA在一些处理器上,使用MOVAPS将整数指令结果移到另一个寄存器中时会出现绕过延迟,但在访问内存时不会出现


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接