Instruction
VPMOVM2D
Sets each doubleword to all ones or all zeros according to the corresponding mask bit.
- Extensions
- Forms
- 3 (3 EVEX)
- Data
- Intel XED v2026.08.23
VPMOVM2D turns a mask register into a vector of doublewords: element i becomes FFFFFFFFh where bit i of the mask is 1 and 0 where it is 0, for 4, 8 or 16 elements. It is the doubleword form of VPMOVM2B, whose page explains why AVX-512 code needs it: its compares write masks, where C and the older compares such as VPCMPGTD want vectors. Unlike the byte and word forms it belongs to AVX512DQ, with VPMOVM2Q; VPMOVD2M goes the other way.
Recorded on Zen 5
The three cases set exactly the elements of the mask’s low bits and cleared everything above the vector length:
vpmovm2d xmm1, k1, with 3h in the low nibble of K1, wrote FFFFFFFFh to elements 0 and 1 and cleared the rest of ZMM1.vpmovm2d ymm24, k4, low byte 0Ah, set elements 1 and 3.vpmovm2d zmm14, k6, low word EC3Ah, set the nine elements of its set bits and read none of bits 63:16.
In compiled code
For a < b on 64-byte vector types of int, GCC 14 and Clang 23 at
-O2 with -march=x86-64-v4 compare into a mask, GCC with
VPCMPD and Clang with the EVEX VPCMPGTD with swapped
operands, and VPMOVM2D builds the vector of -1 and 0. On 32-byte
vectors both use the VEX VPCMPGTD, which writes the vector directly.
In a loop storing -(a[i] < b[i]) over int arrays GCC writes all
ones under the compare mask instead, with a zero-masked
VMOVDQA32 of a register filled by
VPTERNLOGD, and Clang stays with the VEX compare
on YMM registers. _mm512_movm_epi32 is VPMOVM2D in both.
AMD’s Zen 5 latency spreadsheet lists VPMOVM2D as one macro-op with a latency of one cycle on any of the four pipes FP0 to FP3, four per cycle.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VPMOVM2D xmm, k
VPMOVM2D_XMMu32_MASKmskw_AVX512 | EVEX.128.F3.0F38.W0 38 /r | AVX10.1 or AVX512DQ + AVX512VL |
VPMOVM2D ymm, k
VPMOVM2D_YMMu32_MASKmskw_AVX512 | EVEX.256.F3.0F38.W0 38 /r | AVX10.1 or AVX512DQ + AVX512VL |
VPMOVM2D zmm, k
VPMOVM2D_ZMMu32_MASKmskw_AVX512 | EVEX.512.F3.0F38.W0 38 /r | AVX10.1 or AVX512DQ |
Latency and throughput
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.
Every doubleword works alike: 4, 8 and 16 doublewords in the xmm, ymm and zmm forms.
Result doubleword i comes from bit i of k2. Result doublewords 3 to 0: a3, a2, a1, a0.
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
for i in range(VL // 32):
zmm1.d[i] = -1 if k2[i] else 0 # all ones or zero
# zmm1 is zeroed from bit VL upRun on AMD Zen 5 (EPYC 9645): 3 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
VPMOVM2D xmm, k VPMOVM2D ymm, k VPMOVM2D zmm, k | ||
xmm, ymm, zmm | explicit | write |
k | 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.
- All forms
AVX512-E7NM
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to VPMOVM2D, 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_movm_epi32
__m128i _mm_movm_epi32(__mmask8 __A) |
|
_mm256_movm_epi32
__m256i _mm256_movm_epi32(__mmask8 __A) |
|
_mm512_movm_epi32
__m512i _mm512_movm_epi32(__mmask16 __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 |
|---|---|---|
AVX512DQ_128 | AVX10.1 or AVX512DQ + AVX512VL | 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, Zen 4, Zen 5, Zen 6 |
AVX512DQ_256 | Same as AVX512DQ_128 | Same as AVX512DQ_128 |
AVX512DQ_512 | AVX10.1 or AVX512DQ | Same as AVX512DQ_128 |
More AVX10.1 instructions
- VPMAXSD
- VPMAXSQ
- VPMAXSW
- VPMAXUB
- VPMAXUD
- VPMAXUQ
- VPMAXUW
- VPMINSB
- VPMINSD
- VPMINSQ
- VPMINSW
- VPMINUB
- VPMINUD
- VPMINUQ
- VPMINUW
- VPMOVB2M
- VPMOVD2M
- VPMOVDB
- VPMOVDW
- VPMOVM2B
- VPMOVM2Q
- VPMOVM2W
- VPMOVQ2M
- VPMOVQB
- VPMOVQD
- VPMOVQW
- VPMOVSDB
- VPMOVSDW
- VPMOVSQB
- VPMOVSQD
- VPMOVSQW
- VPMOVSWB
- VPMOVSXBD
- VPMOVSXBQ
- VPMOVSXBW
- VPMOVSXDQ
- VPMOVSXWD
- VPMOVSXWQ
- VPMOVUSDB
- VPMOVUSDW
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 Advanced Vector Extensions 10.2 Architecture Specification, revision 7.0 (361050-007, April 2026)
- Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2C, page 5-585 (VPMOVM2B/
VPMOVM2W/ VPMOVM2D/ VPMOVM2Q) - 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.