Instruction
VPSHUFBITQMB
Selects, for each byte of the second source, one bit of the matching quadword of the first and writes the bits to a mask register.
- Extensions
- Forms
- 6 (6 EVEX)
- Data
- Intel XED v2026.08.23
VPSHUFBITQMB gathers single bits into a mask register. Each byte of the
second source is an index: byte i picks one bit of quadword i / 8 of the
first source, and that bit becomes bit i of the destination mask. Eight
index bytes share each quadword, so the 64 bytes of a zmm register pick
8 arbitrary bits from each of the 8 quadwords, 64 mask bits in all. It
belongs to AVX512_BITALG with VPOPCNTB and
VPOPCNTW, and its intrinsic is
_mm512_bitshuffle_epi64_mask(data, indices).
Indices and the mask
Only the low 6 bits of an index count, 0 to 63 within its quadword; the two above are ignored. In a case recorded on Zen 5 with the quadword 8000000000000001h, the index FFh took bit 63, as 3Fh does. The data is the first source, always a register, and the indices are the operand that may be in memory, without embedded broadcast.
The result is a mask, so the write mask works as it does for
VPCMPD: a bit the write mask leaves out becomes 0
instead of keeping its old value, which makes k1{k2} the AND of k2
and the gathered bits, and the bits above 16 or 32 of the xmm and ymm
forms are cleared.
Uses
- A bit permutation of a 64-bit value: broadcast it to all eight quadwords with VPBROADCASTQ, gather with 64 indices that list the source bit of each result bit, and move the mask to a general register with KMOVQ. Any permutation, repetition or selection of bits takes these three instructions, where PEXT can only pack selected bits in their original order.
- Eight bit fields at once: with different data in each quadword, one instruction tests a chosen bit in each of 64 bitmaps, or picks the same eight positions out of eight words, and the mask can drive masked stores or VPCOMPRESSB directly.
Neither GCC 14 nor Clang 23 forms the instruction from plain C; it comes from the intrinsics.
AMD’s Zen 5 guide lists VPSHUFBITQMB with a latency of 3, 4 and 6 cycles for xmm, ymm and zmm sources; the register forms are one macro-op and the memory forms two.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VPSHUFBITQMB k {k}, xmm, xmm
VPSHUFBITQMB_MASKmskw_MASKmskw_XMMu64_XMMu8_AVX512 | EVEX.128.66.0F38.W0 8F /r | AVX10.1 or AVX512_BITALG + AVX512VL |
VPSHUFBITQMB k {k}, xmm, m128
VPSHUFBITQMB_MASKmskw_MASKmskw_XMMu64_MEMu8_AVX512 | EVEX.128.66.0F38.W0 8F /r | AVX10.1 or AVX512_BITALG + AVX512VL |
VPSHUFBITQMB k {k}, ymm, ymm
VPSHUFBITQMB_MASKmskw_MASKmskw_YMMu64_YMMu8_AVX512 | EVEX.256.66.0F38.W0 8F /r | AVX10.1 or AVX512_BITALG + AVX512VL |
VPSHUFBITQMB k {k}, ymm, m256
VPSHUFBITQMB_MASKmskw_MASKmskw_YMMu64_MEMu8_AVX512 | EVEX.256.66.0F38.W0 8F /r | AVX10.1 or AVX512_BITALG + AVX512VL |
VPSHUFBITQMB k {k}, zmm, zmm
VPSHUFBITQMB_MASKmskw_MASKmskw_ZMMu64_ZMMu8_AVX512 | EVEX.512.66.0F38.W0 8F /r | AVX10.1 or AVX512_BITALG |
VPSHUFBITQMB k {k}, zmm, m512
VPSHUFBITQMB_MASKmskw_MASKmskw_ZMMu64_MEMu8_AVX512 | EVEX.512.66.0F38.W0 8F /r | AVX10.1 or AVX512_BITALG |
Latency and throughput
| Model | k {k}, xmm, xmmno mask | k {k}, xmm, xmmwith a mask | k {k}, xmm, m128no mask | k {k}, xmm, m128with a mask | k {k}, ymm, ymmno mask | k {k}, ymm, ymmwith a mask | k {k}, ymm, m256no mask | k {k}, ymm, m256with a mask | k {k}, zmm, zmmno mask | k {k}, zmm, zmmwith a mask | k {k}, zmm, m512no mask | k {k}, zmm, m512with a mask |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Ice Lake | 5 / 0.5p01 | 5 / 0.5p01 | 11 / 0.5p01 | 11 / 0.5p01 | 5 / 0.5p01 | 5 / 0.5p01 | 12 / 0.5p01 | 12 / 0.5p01 | 5 / 0.5p05 | 5 / 0.5p05 | 12 / 0.5p05 | 12 / 0.5p05 |
| Sapphire Rapids | 6 / 1p05 | 8 / 1p05 | 6 / 1p05 | 8 / 1p05 | 6 / 1p05 | 8 / 1p05 | 6 / 1p05 | 8 / 1p05 | 6 / 1p05 | 8 / 1p05 | 6 / 1p05 | 8 / 1p05 |
| Zen 4 | 2 / 11FP0 FP1 | 2 / 11FP0 FP1 | 10 / 0.5FP0 FP3 | 10 / 0.5FP0 FP3 | 3 / 0.52FP0 FP3 | 3 / 0.52FP0 FP3 | 10 / 0.5FP0 FP3 | 10 / 0.5FP0 FP3 | 3 / 1FP0 FP3 | 3 / 1FP0 FP3 | 10 / 1FP0 FP3 | 10 / 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.
Example control bytes in zmm3 (element 0 on the right), as numbers. Where a bit of the write mask k2 is 0, the result bit is 0. Shown for quadword 0 of zmm2 and zmm3, with a tick between bits; every quadword works alike, bits 8q+7 to 8q of k1 from quadword q.
With the example control bytes, result bit i is bit c of quadword 0 of zmm2, c being its control byte. Result bits 7 to 0: bit 63, 0 (bit 6 of k2 is 0), bit 47, bit 40, bit 5, bit 21, bit 12, bit 3.
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 // 8): # bit i, of quadword i // 8
if k2[i]: # 1 without a write mask
c = src3.b[i] & 63 # the bit it takes
k1[i] = zmm2.q[i // 8] >> c & 1
else:
k1[i] = 0 # never merged
# the other bits of k1 are clearedRun on AMD Zen 5 (EPYC 9645): 14 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
VPSHUFBITQMB k {k}, xmm, xmm/m128 VPSHUFBITQMB k {k}, ymm, ymm/m256 VPSHUFBITQMB k {k}, zmm, zmm/m512 | ||
k | explicit | write (masked) |
{k} | explicit | read (write mask) |
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
- write masking
- Memory forms
- memory fault suppression
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to VPSHUFBITQMB, 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_bitshuffle_epi64_mask
__mmask16 _mm_bitshuffle_epi64_mask(__m128i __A, __m128i __B) |
|
_mm_mask_bitshuffle_epi64_mask
__mmask16 _mm_mask_bitshuffle_epi64_mask(__mmask16 __U, __m128i __A, __m128i __B) |
|
_mm256_bitshuffle_epi64_mask
__mmask32 _mm256_bitshuffle_epi64_mask(__m256i __A, __m256i __B) |
|
_mm256_mask_bitshuffle_epi64_mask
__mmask32 _mm256_mask_bitshuffle_epi64_mask(__mmask32 __U, __m256i __A, __m256i __B) |
|
_mm512_bitshuffle_epi64_mask
__mmask64 _mm512_bitshuffle_epi64_mask(__m512i __A, __m512i __B) |
|
_mm512_mask_bitshuffle_epi64_mask
__mmask64 _mm512_mask_bitshuffle_epi64_mask(__mmask64 __U, __m512i __A, __m512i __B) |
|
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 |
|---|---|---|
AVX512_BITALG_128 | AVX10.1 or AVX512_BITALG + AVX512VL | Ice Lake (client), Tiger Lake, Nova Lake, Ice Lake (server), Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Zen 4, Zen 5, Zen 6 |
AVX512_BITALG_256 | Same as AVX512_BITALG_128 | Same as AVX512_BITALG_128 |
AVX512_BITALG_512 | AVX10.1 or AVX512_BITALG | Same as AVX512_BITALG_128 |
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 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-634 (VPSHUFBITQMB)
- 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.