Instruction
VPSHRDW
Joins each word of the second source above the matching one of the first, shifts the pair right by an immediate and keeps the lower half.
- Extensions
- Forms
- 6 (6 EVEX)
- Data
- Intel XED v2026.08.23
VPSHRDW is the word form of VPSHRDD and the
right-shifting twin of VPSHLDW: each word of the
second source is joined above the matching word of the first, the
32-bit pair is shifted right by the immediate and the low 16 bits are
kept. Only bits 3:0 of the immediate count, so the bits shifted out of
the first source are replaced by up to 15 low bits of the second. It
belongs to AVX512_VBMI2, which -march=znver5 enables and x86-64-v4
does not; VPSHRDVW takes a count per word.
Recorded on Zen 5
- One bit. In
vpshrdw ymm1{k3}{z}, ymm2, ymm3, 0x1, 0000h under 0001h gave 8000h and 7FFFh under 0001h gave BFFFh: the low bit of the second source became the top bit of the result. - Fifteen bits. With 0Fh, or FFh acting as 15, the result is the
second source shifted left by one, with the top bit of the first
below it: in
{evex} vpshrdw ymm17, ymm30, [mem], 0xf, 8000h under 0001h gave 0003h and 0001h under FFFFh gave FFFEh. - Counts wrap at 16.
{evex} vpshrdw xmm5, xmm5, xmm5, 0x10left the words of XMM5 as they were, and an immediate of 0 wrote the first source unchanged to the words the mask selected.
In compiled code
Clang 23 never emits it. Built with -march=znver5 at -O2, it
compiles _mm512_shrdi_epi16(a, b, 3) to
vpshldw zmm0, zmm1, zmm0, 13, the same funnel shift written as a
left shift with the sources swapped, and over uint16_t arrays it
turns the rotate (a[i] >> 3) | (a[i] << 13) and the funnel shift
(a[i] >> 3) | (b[i] << 13) into VPSHLDW as well. GCC 14 emits
VPSHRDW for the intrinsic and compiles both loops to
VPSRLW, VPSLLW and
VPORQ.
AMD’s Zen 5 latency spreadsheet gives VPSHRDW 2 cycles and two per cycle on pipes FP0 and FP1, as VPSHRDD. Zen 5’s 6 recorded cases cover the register and memory forms at all three widths.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VPSHRDW xmm {k}{z}, xmm, xmm, imm8
VPSHRDW_XMMu16_MASKmskw_XMMu16_XMMu16_IMM8_AVX512 | EVEX.128.66.0F3A.W1 72 /r ib | AVX10.1 or AVX512_VBMI2 + AVX512VL |
VPSHRDW xmm {k}{z}, xmm, m128, imm8
VPSHRDW_XMMu16_MASKmskw_XMMu16_MEMu16_IMM8_AVX512 | EVEX.128.66.0F3A.W1 72 /r ib | AVX10.1 or AVX512_VBMI2 + AVX512VL |
VPSHRDW ymm {k}{z}, ymm, ymm, imm8
VPSHRDW_YMMu16_MASKmskw_YMMu16_YMMu16_IMM8_AVX512 | EVEX.256.66.0F3A.W1 72 /r ib | AVX10.1 or AVX512_VBMI2 + AVX512VL |
VPSHRDW ymm {k}{z}, ymm, m256, imm8
VPSHRDW_YMMu16_MASKmskw_YMMu16_MEMu16_IMM8_AVX512 | EVEX.256.66.0F3A.W1 72 /r ib | AVX10.1 or AVX512_VBMI2 + AVX512VL |
VPSHRDW zmm {k}{z}, zmm, zmm, imm8
VPSHRDW_ZMMu16_MASKmskw_ZMMu16_ZMMu16_IMM8_AVX512 | EVEX.512.66.0F3A.W1 72 /r ib | AVX10.1 or AVX512_VBMI2 |
VPSHRDW zmm {k}{z}, zmm, m512, imm8
VPSHRDW_ZMMu16_MASKmskw_ZMMu16_MEMu16_IMM8_AVX512 | EVEX.512.66.0F3A.W1 72 /r ib | AVX10.1 or AVX512_VBMI2 |
Latency and throughput
| Model | xmm {k}{z}, xmm, xmm, imm8no maskymm {k}{z}, ymm, ymm, imm8no mask | xmm {k}{z}, xmm, xmm, imm8with a mask, zeroingymm {k}{z}, ymm, ymm, imm8with a mask, zeroing | xmm {k}{z}, xmm, m128, imm8no mask | xmm {k}{z}, xmm, m128, imm8with a mask, zeroing | ymm {k}{z}, ymm, m256, imm8no mask | ymm {k}{z}, ymm, m256, imm8with a mask, zeroing | zmm {k}{z}, zmm, zmm, imm8no mask | zmm {k}{z}, zmm, zmm, imm8with a mask, zeroing | zmm {k}{z}, zmm, m512, imm8no mask | zmm {k}{z}, zmm, m512, imm8with a mask, zeroing |
|---|---|---|---|---|---|---|---|---|---|---|
| Ice Lake | 5 / 0.5p01 | 5 / 0.5p01 | 11 / 0.5p01 | 11 / 0.5p01 | 12 / 0.5p01 | 12 / 0.5p01 | 5 / 0.5p05 | 5 / 0.5p05 | 12 / 0.5p05 | 12 / 0.5p05 |
| Sapphire Rapids | 1 / 0.5p01 | 4 / 0.67p015 | 8 / 0.5p01 | 11 / 0.67p015 | 9 / 0.5p01 | 12 / 0.67p015 | 1 / 1p0 | 4 / 1p05 | 9 / 1p0 | 12 / 1p05 |
| Zen 4 | 2 / 11FP0 FP1 | 2 / 11FP0 FP1 | 10 / 0.5FP0 FP3 | 10 / 0.5FP0 FP3 | 10 / 0.5FP0 FP3 | 10 / 0.5FP0 FP3 | 2 / 1FP0 FP1 | 2 / 1FP0 FP1 | 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.
Every word works alike: 8, 16 and 32 words in the xmm, ymm and zmm forms. The forms write under a mask: where its bit is 0, the element keeps its old value, or zeroes it with {z}.
Result word i comes from word i of xmm2 and xmm3. Result words 7 to 0: r7, unchanged (bit 6 of k1 is 0), r5, r4, r3, r2, 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 // 16):
if k1[i]:
a = zmm2.w[i]
b = src3.w[i]
x = b << 16 | a
zmm1.w[i] = x >> (imm8 & 15)
elif zeroing:
zmm1.w[i] = 0
# else: zmm1.w[i] keeps its value
# zmm1 is zeroed from bit VL upRun on AMD Zen 5 (EPYC 9645): 6 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
VPSHRDW xmm {k}{z}, xmm, xmm/m128, imm8 VPSHRDW ymm {k}{z}, ymm, ymm/m256, imm8 VPSHRDW zmm {k}{z}, zmm, zmm/m512, imm8 | ||
xmm, ymm, zmm | explicit | write (masked) |
{k} | explicit | read (write mask) |
xmm, ymm, zmm | explicit | read |
xmm/m128, ymm/m256, zmm/m512 | explicit | read |
imm8 | 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
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_VBMI2_128 | AVX10.1 or AVX512_VBMI2 + 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_VBMI2_256 | Same as AVX512_VBMI2_128 | Same as AVX512_VBMI2_128 |
AVX512_VBMI2_512 | AVX10.1 or AVX512_VBMI2 | Same as AVX512_VBMI2_128 |
More AVX10.1 instructions
- VPRORD
- VPRORQ
- VPRORVD
- VPRORVQ
- VPSADBW
- VPSCATTERDD
- VPSCATTERDQ
- VPSCATTERQD
- VPSCATTERQQ
- VPSHLDD
- VPSHLDQ
- VPSHLDVD
- VPSHLDVQ
- VPSHLDVW
- VPSHLDW
- VPSHRDD
- VPSHRDQ
- VPSHRDVD
- VPSHRDVQ
- VPSHRDVW
- VPSHUFB
- VPSHUFBITQMB
- VPSHUFD
- VPSHUFHW
- VPSHUFLW
- VPSLLD
- VPSLLDQ
- VPSLLQ
- VPSLLVD
- VPSLLVQ
- VPSLLVW
- VPSLLW
- VPSRAD
- VPSRAQ
- VPSRAVD
- VPSRAVQ
- VPSRAVW
- VPSRAW
- VPSRLD
- VPSRLDQ
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-628 (VPSHRD)
- 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.