Instruction
VMOVLPD
Loads a double from memory into the low half of an XMM register, or stores the low double to memory.
VMOVLPD is the VEX and EVEX form of MOVLPD, whose page covers the merging load, where compilers use it, and what AMD’s guide says about loading halves and skipping the merge. The store writes the low double of an XMM register to eight bytes, as before. The load takes the high double from the first source register and the low one from memory, and zeroes bits 128 and up: the merge remains, but with a named register, which need not be the destination. Only 128-bit forms exist, with the #UD cases of VMOVHPD; the EVEX form (AVX-512F or AVX10.1) reaches XMM16 to XMM31 and takes no mask. VMOVLPS does the same with no 66 prefix.
On Zen 5, the recorded vmovlpd xmm4, xmm4, qword ptr [mem] replaced
the low double of XMM4, kept the high one and cleared bits 511:128, and
{evex} vmovlpd xmm24, xmm3, qword ptr [mem] put the eight bytes below
the high double of XMM3. The stores vmovlpd qword ptr [mem], xmm8 and
{evex} vmovlpd qword ptr [mem], xmm0 wrote eight bytes each and left
the next ones alone.
In compiled code
In our builds at -O2 with -march=x86-64-v3 or x86-64-v4, GCC 14
compiles _mm_loadl_pd(a, p) and v[0] = *p on a __m128d to
vmovlpd xmm0, xmm0, qword ptr [rdi], and _mm_storel_pd to the
store; Clang 23 uses VMOVLPS for all three. (__m128d){*p, *q}
starts with a VMOVSD load in both, which depends on no register.
AMD’s guide for Zen 5 lists the legacy MOVLPD xmm, [mem] among the
instructions whose merge it can skip when the upper bits are known to be
zero (Section 2.11.5); VMOVLPD, whose merge comes from a named register,
is not in that list. Its latency spreadsheet gives VMOVLPD, load or
store, one macro-op on pipes FP0 to FP3, two per cycle, with a latency
of 1 cycle, in its VEX and EVEX rows alike.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VMOVLPD xmm, xmm, m64
VMOVLPD_XMMdq_XMMdq_MEMq | VEX.128.66.0F.WIG 12 /r | AVX |
VMOVLPD m64, xmm
VMOVLPD_MEMq_XMMq | VEX.128.66.0F.WIG 13 /r | AVX |
VMOVLPD xmm, xmm, m64
VMOVLPD_XMMf64_XMMf64_MEMf64_AVX512 | EVEX.128.66.0F.W1 12 /r | AVX10.1 or AVX512F |
VMOVLPD m64, xmm
VMOVLPD_MEMf64_XMMf64_AVX512 | EVEX.128.66.0F.W1 13 /r | AVX10.1 or AVX512F |
Latency and throughput
| Model | xmm, xmm, m64 | m64, xmm | xmm, xmm, m64 |
|---|---|---|---|
| Sandy Bridge | 7 / 1p5 | 1 / 1p4 p23 | |
| Haswell, Broadwell, Skylake | 6 / 1p5 | 1 / 1p2347 | |
| Skylake-SP | 6 / 1p5 | 1 / 1p2347 | 7 / 1p5 |
| Ice Lake | 7 / 1p5 | 1 / 0.5p4789 | 7 / 0.5p15 |
| Alder Lake | 8 / 0.5p15 | 12 / 0.5p4789 | |
| Sapphire Rapids | 8 / 0.5p15 | 12 / 0.5p4789 | 8 / 0.5p15 |
| Lunar Lake | 8 / 0.33V0 V1 V2 V3 | 12 / 0.5p10 p11 p25 p26 p27 | |
| Piledriver | 7 / 1.5FPFMA FPU0 FPU1 | 2 / 1.5AGLU01 FPSTO FPU2 FPU3 Store | |
| Zen | 8 / 0.5FPU1 FPU2 | 1 / 0.5AGU0 AGU1 | |
| Zen 2 | 8 / 0.5FPU1 FPU2 | 1 / 0.33AGU0 AGU1 AGU2 | |
| Zen 3 | 8 / 0.5FP1 FP2 | 1 / 1FP45 FPSt LSU Store | |
| Zen 4 | 8 / 0.5FP1 FP2 | 1 / 1FP45 FPSt LSU Store | 8 / 0.5FP1 FP2 |
| Jaguar | 6 / 1FPA FPM FPU0 FPU1 | 2 / 1FPU1 |
Data flow
Where the elements of the sources go, element 0 on the right; results that depend on a control value are drawn for an example. How to read.
VMOVLPD xmm, xmm, m64Result quadwords 1 to 0: a1, b0.
VMOVLPD m64, xmmm64 receives quadword 0 of xmm2: a0.
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
VMOVLPD xmm, xmm, m64xmm1.q[0] = mem.q[0]
xmm1.q[1] = xmm2.q[1]
# xmm1 is zeroed from bit 128 upRun on AMD Zen 5 (EPYC 9645): 2 cases.
VMOVLPD m64, xmmmem.q[0] = xmm2.q[0]Run on AMD Zen 5 (EPYC 9645): 2 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
VMOVLPD xmm, xmm, m64 | ||
xmm | explicit | write |
xmm | explicit | read |
m64 | explicit | read |
VMOVLPD m64, xmm | ||
m64 | explicit | write |
xmm | explicit | read |
Flags
None: XED records no flag that the forms test or change.
Exceptions
The exception class is XED's name for the set of exception conditions that a form follows. How to read.
- VEX forms
avx-type-5- EVEX forms
AVX512-E9NF
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to VMOVLPD, each with the form it compiles to and the Clang options it needs. The forms come from compiling every intrinsic and decoding the result with Intel XED; all intrinsics A–Z explains the method.
| Intrinsic | Compiles to |
|---|---|
_mm_loadl_pd
__m128d _mm_loadl_pd(__m128d __a, const double *__dp) |
|
_mm_loadl_pi
__m128 _mm_loadl_pi(__m128 __a, const __m64 *__p) |
|
_mm_storel_pd
void _mm_storel_pd(double *__dp, __m128d __a) |
|
CPUID and processors
Each form belongs to an XED ISA set. A form can be used when the processor reports every CPUID bit of one of its ISA set's alternatives.
| ISA set | CPUID | Processors |
|---|---|---|
AVX | AVX | Sandy Bridge, Ivy Bridge, Haswell, Broadwell, Skylake, Comet Lake, Cannon Lake, Ice Lake (client), Tiger Lake, Alder Lake, Arrow Lake, Panther Lake, Nova Lake, Skylake-SP, Cascade Lake, Cooper Lake, Ice Lake (server), Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Sierra Forest, Clearwater Forest, Knights Landing, Knights Mill, Bulldozer, Piledriver, Zen, Zen+, Zen 2, Zen 3, Zen 4, Zen 5, Zen 6 |
AVX512F_128N | AVX10.1 or AVX512F | Cannon Lake, Ice Lake (client), Tiger Lake, Nova Lake, Skylake-SP, Cascade Lake, Cooper Lake, Ice Lake (server), Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Knights Landing, Knights Mill, Zen 4, Zen 5, Zen 6 |
More AVX instructions
- VMASKMOVPD
- VMASKMOVPS
- VMAXPD
- VMAXPS
- VMAXSD
- VMAXSS
- VMINPD
- VMINPS
- VMINSD
- VMINSS
- VMOVAPD
- VMOVAPS
- VMOVD
- VMOVDDUP
- VMOVDQA
- VMOVDQU
- VMOVHLPS
- VMOVHPD
- VMOVHPS
- VMOVLHPS
- VMOVLPS
- VMOVMSKPD
- VMOVMSKPS
- VMOVNTDQ
- VMOVNTDQA
- VMOVNTPD
- VMOVNTPS
- VMOVQ
- VMOVSD
- VMOVSHDUP
- VMOVSLDUP
- VMOVSS
- VMOVUPD
- VMOVUPS
- VMPSADBW
- VMULPD
- VMULPS
- VMULSD
- VMULSS
- VORPD
More AVX10.1 instructions
Sources
- Intel XED v2026.08.23 (commit
0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model. - The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s
-marchfeature sets and AMD’s Processor Programming References, which the page of each processor cites. - Clang's x86 intrinsic headers, LLVM 23.1.2 (commit
85ac56026243): the intrinsics, their signatures and doc comments, and the Clang of that release, which compiled each of them. - LLVM 23.1.2's x86 scheduling models (commit
85ac56026243): the latency, reciprocal throughput and ports of each form, as llvm-mca reports them. - Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2B, page 4-80 (MOVLPD)
- Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1 (253665-093, September 2026)
- Intel Advanced Vector Extensions 10.2 Architecture Specification, revision 7.0 (361050-007, April 2026)
- Software Optimization Guide for the AMD Zen5 Microarchitecture (58455, rev. 1.00, August 2024), Wayback Machine copy of AMD's ZIP
The tables are derived from Intel XED, Copyright Intel Corporation, licensed under the Apache License 2.0; x86-64.net converted and reformatted them. The intrinsics and their signatures come from Clang and the timings from LLVM's scheduling models, both part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.