MOVUPDmnemonicMove Unaligned Packed Double-Precision Floating-Point Values,从寄存器或任意字节边界复制 128 位。
MOVUPD 是 SSE2 的非对齐 128 位复制指令。它与 MOVAPD 搬运相同数量的数据,但内存操作数可以从非 16 字节边界开始。
MOVUPD 02xmm0, 03xmm1/m128MOVUPDmnemonicMove Unaligned Packed Double-Precision Floating-Point Values,从寄存器或任意字节边界复制 128 位。
xmm0destination接收源 XMM 寄存器或 128 位内存中的全部位。
xmm1/m128source内存源不必位于 16 字节边界。
MOVUPD 02xmm1/m128, 03xmm0MOVUPDmnemonic存储形式将 XMM 寄存器中的 128 位原样写入寄存器或内存目标。
xmm1/m128destination内存目标不必位于 16 字节边界。
xmm0source提供要写入目标的全部 128 位。
下图直接绘制完整的 128 位数据。MOVUPD 允许内存地址不满足 16 字节对齐;LOAD 与 STORE 只改变复制方向。
允许非 16 字节对齐内存[127:0][127:0]load: XMM_DEST[127:0] = SRC[127:0]
store: DEST[127:0] = XMM_SRC[127:0]“允许非对齐”只表示不会因为地址不是 16 字节倍数而产生 MOVAPD 的对齐 #GP。地址仍须有效并具有相应访问权限,跨越未映射页面时仍可能发生页故障。
section .data
align 16
storage: db 0
unaligned_pd: dq 1.5, -2.0
output: times 32 db 0
section .text
movupd xmm0, [unaligned_pd] ; 66 0F 10:地址可以非 16 字节对齐
movupd [output + 3], xmm0 ; 66 0F 11:非对齐存储这两个内存操作数不要求地址按 16 字节对齐。在部分微架构上,跨越缓存行或页面边界的非对齐访问可能比单一边界内的访问代价更高。
| 指令 | 传统 XMM 内存宽度 | 16 字节对齐要求 | 加载操作码 | 存储操作码 |
|---|---|---|---|---|
MOVAPD | 128 位 | 必须 | 66 0F 28 /r | 66 0F 29 /r |
MOVUPD | 128 位 | 不要求 | 66 0F 10 /r | 66 0F 11 /r |
两者用于寄存器到寄存器复制时,得到的 128 位结果相同。VEX 形式 VMOVUPD 支持 XMM/YMM,EVEX 形式还支持 ZMM 和写掩码;VEX/EVEX 写入 XMM 或 YMM 目标时会清零对应目标寄存器的更高位。
MOVUPD 不修改 EFLAGS,也不产生 SIMD 浮点异常。
