Instruction
VPBLENDMW
Picks each word from the second source where a mask bit is set, otherwise from the first.
- Extensions
- Forms
- 6 (6 EVEX)
- Data
- Intel XED v2026.08.23
VPBLENDMW builds each word of its destination from one of two sources,
chosen by a mask register: the second source where the mask bit is
set, the first where it is clear, or zero there with {z}. It is the
word form of VPBLENDMD, whose page sets it against
masked moves and the older blends, and needs AVX512BW. Words have no
broadcast form, so the second source is a register or a full vector in
memory.
Recorded on Zen 5
- The first source is the fallback.
vpblendmw zmm17{k1}, zmm30, zmm2took ZMM2’s word where K1 had a bit set and ZMM30’s elsewhere; none of the old ZMM17 survived, although the mask is written as merging. - Zeroing.
vpblendmw ymm17{k2}{z}, ymm30, ymm2took YMM2’s words at the bits set in F2C9h, the low 16 bits of K2, and wrote 0 to the other seven words. - No mask copies the second source:
{evex} vpblendmw ymm5, ymm5, ymmword ptr [mem]loaded memory.
In compiled code
_mm512_mask_blend_epi16(k, a, b) takes b where k is set. GCC 14
and Clang 23 at -O2 with -march=x86-64-v4 compile it to
vmovdqu16 zmm0{k1}, zmm1 when the result may replace a, and with
b in memory to a masked load; with the operands the other way round
they emit VPBLENDMW. In loops over short arrays the two compilers
differ. For o[i] = a[i] ? 7 : o[i], GCC marks the zero elements with
VPCMPW and blends a vector of sevens with o read
straight from memory by VPBLENDMW, while Clang marks the nonzero ones
with VPTESTMW and writes sevens with a masked
VMOVDQU16 store, leaving the rest of o untouched. For
o[i] = a[i] > b[i] ? c[i] : b[i] both load b and overwrite it with
a masked VMOVDQU16 load of c.
AMD’s Zen 5 latency spreadsheet gives VPBLENDMW one cycle and four per cycle on any of the four vector pipes, as VPBLENDMD. Zen 5’s 6 recorded cases cover the register and memory forms at all three widths.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VPBLENDMW xmm {k}{z}, xmm, xmm
VPBLENDMW_XMMu16_MASKmskw_XMMu16_XMMu16_AVX512 | EVEX.128.66.0F38.W1 66 /r | AVX10.1 or AVX512BW + AVX512VL |
VPBLENDMW xmm {k}{z}, xmm, m128
VPBLENDMW_XMMu16_MASKmskw_XMMu16_MEMu16_AVX512 | EVEX.128.66.0F38.W1 66 /r | AVX10.1 or AVX512BW + AVX512VL |
VPBLENDMW ymm {k}{z}, ymm, ymm
VPBLENDMW_YMMu16_MASKmskw_YMMu16_YMMu16_AVX512 | EVEX.256.66.0F38.W1 66 /r | AVX10.1 or AVX512BW + AVX512VL |
VPBLENDMW ymm {k}{z}, ymm, m256
VPBLENDMW_YMMu16_MASKmskw_YMMu16_MEMu16_AVX512 | EVEX.256.66.0F38.W1 66 /r | AVX10.1 or AVX512BW + AVX512VL |
VPBLENDMW zmm {k}{z}, zmm, zmm
VPBLENDMW_ZMMu16_MASKmskw_ZMMu16_ZMMu16_AVX512 | EVEX.512.66.0F38.W1 66 /r | AVX10.1 or AVX512BW |
VPBLENDMW zmm {k}{z}, zmm, m512
VPBLENDMW_ZMMu16_MASKmskw_ZMMu16_MEMu16_AVX512 | EVEX.512.66.0F38.W1 66 /r | AVX10.1 or AVX512BW |
Latency and throughput
| Model | xmm {k}{z}, xmm, xmmno maskymm {k}{z}, ymm, ymmno mask | xmm {k}{z}, xmm, xmmwith a mask, zeroingymm {k}{z}, ymm, ymmwith a mask, zeroing | xmm {k}{z}, xmm, m128no mask | xmm {k}{z}, xmm, m128with a mask, zeroing | ymm {k}{z}, ymm, m256no mask | ymm {k}{z}, ymm, m256with a mask, zeroing | zmm {k}{z}, zmm, zmmno mask | zmm {k}{z}, zmm, zmmwith a mask, zeroing | zmm {k}{z}, zmm, m512no mask | zmm {k}{z}, zmm, m512with a mask, zeroing |
|---|---|---|---|---|---|---|---|---|---|---|
| Skylake-SP, Ice Lake | 1 / 0.33p015 | 1 / 0.33p015 | 7 / 0.5p015 | 7 / 0.5p015 | 8 / 0.5p015 | 8 / 0.5p015 | 2 / 0.5p05 | 2 / 0.5p05 | 8 / 0.5p015 | 8 / 0.5p015 |
| Sapphire Rapids | 1 / 0.33p015 | 3 / 0.33p015 | 8 / 0.33p015 | 11 / 0.33p015 | 9 / 0.33p015 | 11 / 0.33p015 | 1 / 0.5p05 | 3 / 0.5p05 | 9 / 0.5p05 | 11 / 0.5p05 |
| Zen 4 | 1 / 0.51FP0 FP3 | 1 / 0.51FP0 FP3 | 8 / 0.5FP0 FP3 | 8 / 0.5FP0 FP3 | 8 / 0.5FP0 FP3 | 8 / 0.5FP0 FP3 | 1 / 1FP0 FP3 | 1 / 1FP0 FP3 | 8 / 1FP0 FP3 | 8 / 1FP0 FP3 |
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.
merging, {k1}
zeroing, {k1}{z}
Example mask k1 = 0xB2. Every word of the wider forms works alike.
With merging: result words 7 to 0: b7, a6, b5, b4, a3, a2, b1, a0.
With zeroing: result words 7 to 0: b7, 0, b5, b4, 0, 0, b1, 0.
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 // 16):
if k1[i]:
zmm1.w[i] = src3.w[i]
elif zeroing:
zmm1.w[i] = 0
else:
zmm1.w[i] = zmm2.w[i]
# zmm1 is zeroed from bit VL upRun on AMD Zen 5 (EPYC 9645): 6 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
VPBLENDMW xmm {k}{z}, xmm, xmm/m128 VPBLENDMW ymm {k}{z}, ymm, ymm/m256 VPBLENDMW zmm {k}{z}, zmm, zmm/m512 | ||
xmm, ymm, zmm | explicit | write |
{k} | explicit | read (selector) |
xmm, ymm, zmm | explicit | read |
xmm/m128, ymm/m256, zmm/m512 | 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-E4
Attributes
What else XED records about the forms. How to read.
- All forms
- opmask selects the source
- Memory forms
- memory fault suppression
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 |
|---|---|---|
AVX512BW_128 | AVX10.1 or AVX512BW + 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 |
AVX512BW_256 | Same as AVX512BW_128 | Same as AVX512BW_128 |
AVX512BW_512 | AVX10.1 or AVX512BW | Same as AVX512BW_128 |
More AVX10.1 instructions
- VPACKUSDW
- VPACKUSWB
- VPADDB
- VPADDD
- VPADDQ
- VPADDSB
- VPADDSW
- VPADDUSB
- VPADDUSW
- VPADDW
- VPALIGNR
- VPANDD
- VPANDND
- VPANDNQ
- VPANDQ
- VPAVGB
- VPAVGW
- VPBLENDMB
- VPBLENDMD
- VPBLENDMQ
- VPBROADCASTB
- VPBROADCASTD
- VPBROADCASTMB2Q
- VPBROADCASTMW2D
- VPBROADCASTQ
- VPBROADCASTW
- VPCLMULQDQ
- VPCMPB
- VPCMPD
- VPCMPEQB
- VPCMPEQD
- VPCMPEQQ
- VPCMPEQW
- VPCMPGTB
- VPCMPGTD
- VPCMPGTQ
- VPCMPGTW
- VPCMPQ
- VPCMPUB
- VPCMPUD
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. - 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-437 (VPBLENDMB/
VPBLENDMW) - 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 timings come from LLVM's scheduling models, part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.