MOVUPD 与 MOVDQU(x86/x64 组件)

Rya*_*own 5 64-bit x86 assembly

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

MOVDQU 位于第 948 页,MOVUPD 位于 intel x64 手册的第 995 页。

Mic*_*ael 5

阿格纳雾说:

当与 [128 位] 寄存器操作数一起使用时,指令MOVDQA, MOVDQU, MOVAPS, MOVUPS,MOVAPDMOVUPD都是相同的

然后他继续说(他在他的例子中使用了对齐的版本,但我猜这同样适用于未对齐的变体):

在 Intel Core 2 和更早的 Intel 处理器上,一些浮点指令以整数单位执行。这包括 XMM 移动指令、布尔值和一些洗牌和打包指令。当与使用浮点单元的指令混合时,这些指令具有旁路延迟。在大多数其他处理器上,使用的执行单元是根据指令名称,例如MOVAPS XMM1,XMM2使用浮点单元, MOVDQA XMM1,XMM2使用整数单元。


读取或写入内存的指令使用单独的单元。在某些处理器上,从内存单元到浮点单元的旁路延迟可能比到整数单元要长,但这与指令的类型无关。因此,当前处理器之间MOVAPS XMM0,[MEM]MOVDQA XMM0,[MEM]上的延迟没有差异,但不能排除未来处理器上会有差异。


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