Instruction
VPSLLVD
Shifts each doubleword left by the count in the matching element of the second source.
VPSLLVD shifts each doubleword left by its own count, taken from the matching element of the second source, and fills with zeros from the right. VPSLLD shifts every element by one count, from an immediate or the low quadword of an XMM register. AVX2 introduced the variable shifts in three directions, VPSLLVD, VPSRLVD and VPSRAVD, each for doublewords and quadwords (VPSLLVQ); AVX-512 added masking, a broadcast count and the 512-bit form, and AVX512BW the word form VPSLLVW.
Counts of 32 and more
Each count is the whole unsigned doubleword. From 32 up the element
becomes zero, as the page’s pseudocode says; the count is not masked to
5 bits as SHL masks it. The cases recorded on Zen 5 show
zero for counts 32, 33, 63, 80000000h and FFFFFFFFh. C leaves x << n
undefined for n of 32 and more, so GCC 14 and Clang 23 at -O2 with
-march=x86-64-v3 compile a[i] = b[i] << c[i] over a fixed-size
uint32_t array to VPSLLVD alone, and 1u << c[i] to VPSLLVD of a
vector of ones.
Clang also relies on the zero. For a rotate by a variable count,
(x << (n & 31)) | (x >> (-n & 31)), it shifts right by 32 - (n & 31)
with VPSRLVD; when n & 31 is 0 that count is 32, which gives 0 and
leaves x intact. GCC computes -n & 31 instead. With AVX-512, Clang
turns the whole rotate into one VPROLVD, while GCC
keeps the shifts.
Without AVX2
SSE has no variable shift. For the baseline or SSE4.1, GCC keeps the loop scalar with SAL, while Clang builds 2 to the power of each count as a float: it shifts the count into the exponent field with PSLLD by 23, adds the bits of 1.0, converts with CVTTPS2DQ, and multiplies, with PMULLD under SSE4.1 or two PMULUDQs under SSE2.
AMD’s Zen 5 guide lists VPSLLVD as one macro-op with a latency of one cycle. Intel’s guide puts the variable shifts in the same execution units of Golden Cove as the shifts by an immediate count, two for 256-bit vectors and one for 512-bit ones (Table 2-4).
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VPSLLVD xmm, xmm, m128
VPSLLVD_XMMdq_XMMdq_MEMdq | VEX.128.66.0F38.W0 47 /r | AVX2 |
VPSLLVD xmm, xmm, xmm
VPSLLVD_XMMdq_XMMdq_XMMdq | VEX.128.66.0F38.W0 47 /r | AVX2 |
VPSLLVD ymm, ymm, m256
VPSLLVD_YMMqq_YMMqq_MEMqq | VEX.256.66.0F38.W0 47 /r | AVX2 |
VPSLLVD ymm, ymm, ymm
VPSLLVD_YMMqq_YMMqq_YMMqq | VEX.256.66.0F38.W0 47 /r | AVX2 |
VPSLLVD zmm {k}{z}, zmm, zmm
VPSLLVD_ZMMu32_MASKmskw_ZMMu32_ZMMu32_AVX512 | EVEX.512.66.0F38.W0 47 /r | AVX10.1 or AVX512F |
VPSLLVD zmm {k}{z}, zmm, m512/m32bcst
VPSLLVD_ZMMu32_MASKmskw_ZMMu32_MEMu32_AVX512 | EVEX.512.66.0F38.W0 47 /r | AVX10.1 or AVX512F |
VPSLLVD xmm {k}{z}, xmm, xmm
VPSLLVD_XMMu32_MASKmskw_XMMu32_XMMu32_AVX512 | EVEX.128.66.0F38.W0 47 /r | AVX10.1 or AVX512F + AVX512VL |
VPSLLVD xmm {k}{z}, xmm, m128/m32bcst
VPSLLVD_XMMu32_MASKmskw_XMMu32_MEMu32_AVX512 | EVEX.128.66.0F38.W0 47 /r | AVX10.1 or AVX512F + AVX512VL |
VPSLLVD ymm {k}{z}, ymm, ymm
VPSLLVD_YMMu32_MASKmskw_YMMu32_YMMu32_AVX512 | EVEX.256.66.0F38.W0 47 /r | AVX10.1 or AVX512F + AVX512VL |
VPSLLVD ymm {k}{z}, ymm, m256/m32bcst
VPSLLVD_YMMu32_MASKmskw_YMMu32_MEMu32_AVX512 | EVEX.256.66.0F38.W0 47 /r | AVX10.1 or AVX512F + AVX512VL |
Latency and throughput
| Model | xmm, xmm, m128xmm {k}{z}, xmm, m128/m32bcst | xmm, xmm, xmmxmm {k}{z}, xmm, xmmymm {k}{z}, ymm, ymm | ymm, ymm, m256ymm {k}{z}, ymm, m256/m32bcst | ymm, ymm, ymm | zmm {k}{z}, zmm, zmm | zmm {k}{z}, zmm, m512/m32bcst |
|---|---|---|---|---|---|---|
| Haswell | 9 / 2p05 | 3 / 2p05 | 10 / 2p05 | 3 / 2p05 | ||
| Broadwell | 8 / 2p05 | 3 / 2p05 | 9 / 2p05 | 3 / 2p05 | ||
| Skylake | 7 / 0.5p01 | 1 / 0.5p01 | 8 / 0.5p01 | 1 / 0.5p01 | ||
| Skylake-SP, Ice Lake | 7 / 0.5p01 | 1 / 0.5p01 | 8 / 0.5p01 | 1 / 0.5p01 | 1 / 1p0 | 8 / 1p0 |
| Alder Lake | 8 / 0.5p01 | 1 / 0.5p01 | 9 / 0.5p01 | 1 / 0.5p01 | ||
| Sapphire Rapids | 8 / 0.5p01 | 1 / 0.5p01 | 9 / 0.5p01 | 1 / 0.5p01 | 1 / 1p0 | 9 / 1p0 |
| Lunar Lake | 7 / 2V0 V1 | 1 / 0.5V0 V1 | 8 / 2.33V0 V1 | 1 / 0.5V0 V1 | ||
| Zen | 10 / 2FPU1 | 3 / 2FPU1 | 10 / 4FPU1 | 3 / 4FPU1 | ||
| Zen 2 | 10 / 2FPU1 | 3 / 2FPU1 | 10 / 2FPU1 | 3 / 2FPU1 | ||
| Zen 3 | 8 / 0.5FP1 FP2 | 1 / 0.5FP1 FP2 | 8 / 0.5FP1 FP2 | 1 / 0.5FP1 FP2 | ||
| Zen 4 | 8 / 0.5FP1 FP2 | 1 / 0.5FP1 FP2 | 8 / 0.5FP1 FP2 | 1 / 0.5FP1 FP2 | 1 / 1FP1 FP2 | 8 / 1FP1 FP2 |
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. The EVEX forms write under a mask: where its bit is 0, the element keeps its old value, or zeroes it with {z}. With m32bcst, one doubleword from memory stands for every element of the last source.
Result doubleword i comes from doubleword i of xmm2 and xmm3. Result doublewords 3 to 0: r3, unchanged (bit 2 of k1 is 0), r1, r0.
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):
if k1[i]: # 1 without a write mask
a = zmm2.d[i]
b = src3.d[i]
zmm1.d[i] = a << b if b < 32 else 0
elif zeroing:
zmm1.d[i] = 0
# else: zmm1.d[i] keeps its value
# m32bcst: src3.d[i] is the m32 for every i
# zmm1 is zeroed from bit VL upRun on AMD Zen 5 (EPYC 9645): 10 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
VPSLLVD xmm, xmm, xmm/m128 VPSLLVD ymm, ymm, ymm/m256 | ||
xmm, ymm | explicit | write |
xmm, ymm | explicit | read |
xmm/m128, ymm/m256 | explicit | read |
VPSLLVD xmm {k}{z}, xmm, xmm/m128/m32bcst VPSLLVD ymm {k}{z}, ymm, ymm/m256/m32bcst VPSLLVD zmm {k}{z}, zmm, zmm/m512/m32bcst | ||
xmm, ymm, zmm | explicit | write (masked) |
{k} | explicit | read (write mask) |
xmm, ymm, zmm | explicit | read |
xmm/m128/m32bcst, ymm/m256/m32bcst, zmm/m512/m32bcst | 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-4- EVEX forms
AVX512-E4
Attributes
What else XED records about the forms. How to read.
- EVEX forms
- write masking
- EVEX memory forms
- embedded broadcast (tuple Full); memory fault suppression
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to VPSLLVD, 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_sllv_epi32
__m128i _mm_sllv_epi32(__m128i __X, __m128i __Y) |
|
_mm_mask_sllv_epi32
__m128i _mm_mask_sllv_epi32(__m128i __W, __mmask8 __U, __m128i __X, __m128i __Y) |
|
_mm_maskz_sllv_epi32
__m128i _mm_maskz_sllv_epi32(__mmask8 __U, __m128i __X, __m128i __Y) |
|
_mm256_sllv_epi32
__m256i _mm256_sllv_epi32(__m256i __X, __m256i __Y) |
|
_mm256_mask_sllv_epi32
__m256i _mm256_mask_sllv_epi32(__m256i __W, __mmask8 __U, __m256i __X, __m256i __Y) |
|
_mm256_maskz_sllv_epi32
__m256i _mm256_maskz_sllv_epi32(__mmask8 __U, __m256i __X, __m256i __Y) |
|
_mm512_sllv_epi32
__m512i _mm512_sllv_epi32(__m512i __X, __m512i __Y) |
|
_mm512_mask_sllv_epi32
__m512i _mm512_mask_sllv_epi32(__m512i __W, __mmask16 __U, __m512i __X, __m512i __Y) |
|
_mm512_maskz_sllv_epi32
__m512i _mm512_maskz_sllv_epi32(__mmask16 __U, __m512i __X, __m512i __Y) |
|
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.
More AVX2 instructions
- VPMOVZXWQ
- VPMULDQ
- VPMULHRSW
- VPMULHUW
- VPMULHW
- VPMULLD
- VPMULLW
- VPMULUDQ
- VPOR
- VPSADBW
- VPSHUFB
- VPSHUFD
- VPSHUFHW
- VPSHUFLW
- VPSIGNB
- VPSIGND
- VPSIGNW
- VPSLLD
- VPSLLDQ
- VPSLLQ
- VPSLLVQ
- VPSLLW
- VPSRAD
- VPSRAVD
- VPSRAW
- VPSRLD
- VPSRLDQ
- VPSRLQ
- VPSRLVD
- VPSRLVQ
- VPSRLW
- VPSUBB
- VPSUBD
- VPSUBQ
- VPSUBSB
- VPSUBSW
- VPSUBUSB
- VPSUBUSW
- VPSUBW
- VPUNPCKHBW
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 2C, page 5-636 (VPSLLVW/
VPSLLVD/ VPSLLVQ) - Intel Advanced Vector Extensions 10.2 Architecture Specification, revision 7.0 (361050-007, April 2026)
- Intel 64 and IA-32 Architectures Optimization Reference Manual, Volume 1 (248966-051, October 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.