Instruction
VSHUFPS
Picks singles from the two sources for each position within each 128-bit lane, as an immediate selects.
VSHUFPS is SHUFPS with a separate destination: the low two singles of each result come from the first source and the high two from the second, each picked by a 2-bit field of the immediate, as SHUFPS’s page explains. The ymm and zmm forms apply the one immediate to every 128-bit lane, and a field picks only within its own lane. Memory needs no alignment, and the destination is zeroed above the vector length. The VEX forms need AVX, ymm included; the EVEX forms (AVX-512F, with AVX512VL below 512 bits, or AVX10.1) add a write mask per single and a second source of one broadcast single. Zen 5’s recorded cases:
vshufps ymm7, ymm11, ymm7, 0x88gave elements 0 and 2 of YMM11, then 0 and 2 of YMM7 in the low lane, and elements 4 and 6 of each in the high lane: the even singles of both sources, lane by lane.vshufps zmm5{k6}, zmm5, dword bcst [mem], 0x42wrote the single from memory into elements 2, 7 and 14, where the fields pick the second source, singles of ZMM5’s own lanes into elements 5, 8 and 9, and kept the other ten.
Lanes in compiled code
In our builds at -O2, splitting a global array of (x, y) pairs into
two arrays shows what the lanes cost. With -march=x86-64-v3,
Clang 23 takes the even singles with VSHUFPS 88h and the odd ones with
DDh, as SHUFPS does, and then puts the quadwords in order with
vpermpd ymm, ymm, 0xd8, since each lane holds results of both
sources; GCC 14 uses VPERMD and
VBLENDPS instead. With -march=x86-64-v4 both use
VPERMT2PS, GCC on zmm registers and Clang on ymm.
_mm_set1_ps(x), a SHUFPS for the x86-64 baseline, becomes the
register form of VBROADCASTSS at -v3.
AMD’s latency spreadsheet for Zen 5 gives VSHUFPS, in its VEX row and its EVEX row alike, one macro-op with a latency of 1 cycle, four per cycle.
In the optimization guide
What the optimization guide says about VSHUFPS, a line per claim. Each links to the claim in the guide, with its sources and where they differ.
Vectors
- Shuffles and lane crossing: Intel’s shuffles share one port, so blends and shuffles done by loads relieve it; Ice Lake and Golden Cove add a second, in-lane one.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VSHUFPS xmm, xmm, m128, imm8
VSHUFPS_XMMdq_XMMdq_MEMdq_IMMb | VEX.128.NP.0F.WIG C6 /r ib | AVX |
VSHUFPS xmm, xmm, xmm, imm8
VSHUFPS_XMMdq_XMMdq_XMMdq_IMMb | VEX.128.NP.0F.WIG C6 /r ib | AVX |
VSHUFPS ymm, ymm, m256, imm8
VSHUFPS_YMMqq_YMMqq_MEMqq_IMMb | VEX.256.NP.0F.WIG C6 /r ib | AVX |
VSHUFPS ymm, ymm, ymm, imm8
VSHUFPS_YMMqq_YMMqq_YMMqq_IMMb | VEX.256.NP.0F.WIG C6 /r ib | AVX |
VSHUFPS zmm {k}{z}, zmm, zmm, imm8
VSHUFPS_ZMMf32_MASKmskw_ZMMf32_ZMMf32_IMM8_AVX512 | EVEX.512.NP.0F.W0 C6 /r ib | AVX10.1 or AVX512F |
VSHUFPS zmm {k}{z}, zmm, m512/m32bcst, imm8
VSHUFPS_ZMMf32_MASKmskw_ZMMf32_MEMf32_IMM8_AVX512 | EVEX.512.NP.0F.W0 C6 /r ib | AVX10.1 or AVX512F |
VSHUFPS xmm {k}{z}, xmm, xmm, imm8
VSHUFPS_XMMf32_MASKmskw_XMMf32_XMMf32_IMM8_AVX512 | EVEX.128.NP.0F.W0 C6 /r ib | AVX10.1 or AVX512F + AVX512VL |
VSHUFPS xmm {k}{z}, xmm, m128/m32bcst, imm8
VSHUFPS_XMMf32_MASKmskw_XMMf32_MEMf32_IMM8_AVX512 | EVEX.128.NP.0F.W0 C6 /r ib | AVX10.1 or AVX512F + AVX512VL |
VSHUFPS ymm {k}{z}, ymm, ymm, imm8
VSHUFPS_YMMf32_MASKmskw_YMMf32_YMMf32_IMM8_AVX512 | EVEX.256.NP.0F.W0 C6 /r ib | AVX10.1 or AVX512F + AVX512VL |
VSHUFPS ymm {k}{z}, ymm, m256/m32bcst, imm8
VSHUFPS_YMMf32_MASKmskw_YMMf32_MEMf32_IMM8_AVX512 | EVEX.256.NP.0F.W0 C6 /r ib | AVX10.1 or AVX512F + AVX512VL |
Latency and throughput
| Model | xmm, xmm, m128, imm8xmm {k}{z}, xmm, m128/m32bcst, imm8 | xmm, xmm, xmm, imm8xmm {k}{z}, xmm, xmm, imm8ymm {k}{z}, ymm, ymm, imm8 | ymm, ymm, m256, imm8ymm {k}{z}, ymm, m256/m32bcst, imm8 | ymm, ymm, ymm, imm8 | zmm {k}{z}, zmm, zmm, imm8 | zmm {k}{z}, zmm, m512/m32bcst, imm8 |
|---|---|---|---|---|---|---|
| Sandy Bridge, Haswell, Skylake | 7 / 1p5 | 1 / 1p5 | 8 / 1p5 | 1 / 1p5 | ||
| Broadwell | 6 / 1p5 | 1 / 1p5 | 7 / 1p5 | 1 / 1p5 | ||
| Skylake-SP | 7 / 1p5 | 1 / 1p5 | 8 / 1p5 | 1 / 1p5 | 1 / 1p5 | 8 / 1p5 |
| Ice Lake | 7 / 0.5p15 | 1 / 0.5p15 | 8 / 0.5p15 | 1 / 0.5p15 | 1 / 1p5 | 8 / 1p5 |
| Alder Lake | 8 / 0.5p15 | 1 / 0.5p15 | 9 / 0.5p15 | 1 / 0.5p15 | ||
| Sapphire Rapids | 8 / 0.5p15 | 1 / 0.5p15 | 9 / 0.5p15 | 1 / 0.5p15 | 1 / 1p5 | 9 / 1p5 |
| Lunar Lake | 7 / 2V2 V3 | 1 / 0.5V2 V3 | 9 / 0.5V2 V3 | 1 / 0.5V2 V3 | ||
| Piledriver | 7 / 1.5FPFMA FPU0 FPU1 | 2 / 1FPFMA FPU0 FPU1 | 7 / 2FPFMA FPU0 FPU1 | 2 / 2FPFMA FPU0 FPU1 | ||
| Zen | 8 / 0.5FPU1 FPU2 | 1 / 0.5FPU1 FPU2 | 8 / 1FPU1 FPU2 | 1 / 1FPU1 FPU2 | ||
| Zen 2 | 8 / 0.5FPU1 FPU2 | 1 / 0.5FPU1 FPU2 | 8 / 0.5FPU1 FPU2 | 1 / 0.5FPU1 FPU2 | ||
| 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 |
| Jaguar | 6 / 1FPA FPM FPU0 FPU1 | 1 / 0.5FPA FPM FPU0 FPU1 | 6 / 2FPA FPM FPU0 FPU1 | 1 / 1FPA FPM FPU0 FPU1 | ||
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: imm8 = 0x4E (0100 1110 in binary). The ymm and zmm forms repeat this in each 128-bit lane. 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 single from memory stands for every element of xmm3.
With imm8 = 0x4E, result singles 3 to 0: b1, unchanged (bit 2 of k1 is 0), a3, a2.
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):
k = imm8 >> 2 * (i % 4) & 3
j = i - i % 4 + k
if k1[i]: # 1 without a write mask
if i % 4 < 2:
zmm1.d[i] = zmm2.d[j]
else:
zmm1.d[i] = src3.d[j]
elif zeroing:
zmm1.d[i] = 0
# else: zmm1.d[i] keeps its value
# m32bcst: src3.f32[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 |
|---|---|---|
VSHUFPS xmm, xmm, xmm/m128, imm8 VSHUFPS ymm, ymm, ymm/m256, imm8 | ||
xmm, ymm | explicit | write |
xmm, ymm | explicit | read |
xmm/m128, ymm/m256 | explicit | read |
imm8 | explicit | read |
VSHUFPS xmm {k}{z}, xmm, xmm/m128/m32bcst, imm8 VSHUFPS ymm {k}{z}, ymm, ymm/m256/m32bcst, imm8 VSHUFPS zmm {k}{z}, zmm, zmm/m512/m32bcst, imm8 | ||
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 |
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.
- VEX forms
avx-type-4- EVEX forms
AVX512-E4NF
Attributes
What else XED records about the forms. How to read.
- EVEX forms
- write masking
- EVEX memory forms
- embedded broadcast (tuple Full)
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to VSHUFPS, 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_shuffle_ps
__m128 _mm_shuffle_ps(__m128 a, __m128 b, const int mask) |
|
_mm_mask_permute_ps
__m128 _mm_mask_permute_ps(__m128 W, __mmask8 U, __m128 X, const int C) |
|
_mm_mask_shuffle_ps
__m128 _mm_mask_shuffle_ps(__m128 W, __mmask8 U, __m128 A, __m128 B, const int M) |
|
_mm_maskz_permute_ps
__m128 _mm_maskz_permute_ps(__mmask8 U, __m128 X, const int C) |
|
_mm_maskz_shuffle_ps
__m128 _mm_maskz_shuffle_ps(__mmask8 U, __m128 A, __m128 B, const int M) |
|
_mm256_shuffle_ps
__m256 _mm256_shuffle_ps(__m256 a, __m256 b, const int mask) |
|
_mm256_mask_permute_ps
__m256 _mm256_mask_permute_ps(__m256 W, __mmask8 U, __m256 X, const int C) |
|
_mm256_mask_shuffle_ps
__m256 _mm256_mask_shuffle_ps(__m256 W, __mmask8 U, __m256 A, __m256 B, const int M) |
|
_mm256_maskz_permute_ps
__m256 _mm256_maskz_permute_ps(__mmask8 U, __m256 X, const int C) |
|
_mm256_maskz_shuffle_ps
__m256 _mm256_maskz_shuffle_ps(__mmask8 U, __m256 A, __m256 B, const int M) |
|
_mm512_permute_ps
__m512 _mm512_permute_ps(__m512 X, const int C) |
|
_mm512_shuffle_ps
__m512 _mm512_shuffle_ps(__m512 A, __m512 B, const int M) |
|
_mm512_mask_permute_ps
__m512 _mm512_mask_permute_ps(__m512 W, __mmask16 U, __m512 X, const int C) |
|
_mm512_mask_shuffle_ps
__m512 _mm512_mask_shuffle_ps(__m512 W, __mmask16 U, __m512 A, __m512 B, const int M) |
|
_mm512_maskz_permute_ps
__m512 _mm512_maskz_permute_ps(__mmask16 U, __m512 X, const int C) |
|
_mm512_maskz_shuffle_ps
__m512 _mm512_maskz_shuffle_ps(__mmask16 U, __m512 A, __m512 B, const int M) |
|
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 AVX instructions
- VPSUBW
- VPTEST
- VPUNPCKHBW
- VPUNPCKHDQ
- VPUNPCKHQDQ
- VPUNPCKHWD
- VPUNPCKLBW
- VPUNPCKLDQ
- VPUNPCKLQDQ
- VPUNPCKLWD
- VPXOR
- VRCPPS
- VRCPSS
- VROUNDPD
- VROUNDPS
- VROUNDSD
- VROUNDSS
- VRSQRTPS
- VRSQRTSS
- VSHUFPD
- VSQRTPD
- VSQRTPS
- VSQRTSD
- VSQRTSS
- VSTMXCSR
- VSUBPD
- VSUBPS
- VSUBSD
- VSUBSS
- VTESTPD
- VTESTPS
- VUCOMISD
- VUCOMISS
- VUNPCKHPD
- VUNPCKHPS
- VUNPCKLPD
- VUNPCKLPS
- VXORPD
- VXORPS
- VZEROALL
More AVX10.1 instructions
- VRSQRT14PS
- VRSQRT14SD
- VRSQRT14SS
- VRSQRTPH
- VRSQRTSH
- VSCALEFPD
- VSCALEFPH
- VSCALEFPS
- VSCALEFSD
- VSCALEFSH
- VSCALEFSS
- VSCATTERDPD
- VSCATTERDPS
- VSCATTERQPD
- VSCATTERQPS
- VSHUFF32X4
- VSHUFF64X2
- VSHUFI32X4
- VSHUFI64X2
- VSHUFPD
- VSQRTPD
- VSQRTPH
- VSQRTPS
- VSQRTSD
- VSQRTSH
- VSQRTSS
- VSUBPD
- VSUBPH
- VSUBPS
- VSUBSD
- VSUBSH
- VSUBSS
- VUCOMISD
- VUCOMISH
- VUCOMISS
- VUNPCKHPD
- VUNPCKHPS
- VUNPCKLPD
- VUNPCKLPS
- VXORPD
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 2B, page 4-651 (SHUFPS)
- Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1 (253665-093, September 2026)
- Intel Advanced Vector Extensions 10.2 Architecture Specification, revision 7.0 (361050-007, April 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.