Extensions
Forms
2 (2 VEX)
Data
Intel XED v2026.08.23

VEXTRACTI128 copies one 128-bit half of a YMM register, the high one if bit 0 of the immediate is 1, to an XMM register or to 16 bytes of memory at any alignment. The register form clears the destination’s bits above 127. Its most common use is the end of a vectorized reduction: a loop that sums 32-bit integers in YMM registers is left with eight partial sums, and GCC 14 and Clang 23 at -O2 both fold them by extracting the high half and adding it to the low half in an XMM register, then finish with shifts or shuffles (VPSRLDQ in GCC, VPSHUFD in Clang) and additions. The same pattern serves other horizontal operations, such as a minimum or a maximum.

The low half needs no instruction, since the XMM register is that half of the YMM register: _mm256_extracti128_si256(x, 0) and _mm256_castsi256_si128(x) compile to nothing in either compiler. The memory form stores the high half directly: both compilers turn _mm_storeu_si128(p, _mm256_extracti128_si256(x, 1)) into one instruction (VEXTRACTF128 in Clang).

Narrowing with it

Instructions that narrow elements, such as VPACKUSWB, work within lanes, so converting 16-bit elements to bytes in order needs either a VPERMQ after a 256-bit pack or a VEXTRACTI128 before a 128-bit one. For a loop that narrows an array of uint16_t to uint8_t, GCC 14 chooses the first and Clang 23 the second. GCC likewise extracts the high half when it widens 32 bytes in order with VPMOVZXBW.

Intel’s optimization guide counts VEXTRACTF128 among the building blocks for code that keeps data in lanes (Section 15.4.1). VEXTRACTF128 is the AVX version, which Clang emits for integer data too when no integer instruction is near. AVX-512 adds VEXTRACTI32X4 and its kin, which take 128 or 256 bits out of ZMM registers and can mask the result. VINSERTI128 is the reverse, and a function that has used YMM registers ends with VZEROUPPER before it returns to code that may run SSE instructions.

In the optimization guide

What the optimization guide says about VEXTRACTI128, a line per claim. Each links to the claim in the guide, with its sources and where they differ.

Haswell and Broadwell

  • AVX2 and FMA: Every instruction that can move data from one 128-bit half of a YMM register to the other takes 3 cycles, even when it does not: VEXTRACTI128 of the low half still takes 3, where VMOVDQA, which copies the same 128 bits, takes 0 or 1.

Forms

Every encoding of VEXTRACTI128 that Intel XED knows, one row per XED instruction form (iform). How to read the notation.
InstructionEncodingRequires
VEXTRACTI128 m128, ymm, imm8 VEXTRACTI128_MEMdq_YMMqq_IMMbVEX.256.66.0F3A.W0 39 /r ibAVX2
VEXTRACTI128 xmm, ymm, imm8 VEXTRACTI128_XMMdq_YMMqq_IMMbVEX.256.66.0F3A.W0 39 /r ibAVX2

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.

Extract: the 128-bit block of ymm2 that imm8 numbers goes to m128.Memory forms
VEXTRACTI128 with imm8 = 0x02With imm8 = 0x02, result quadwords 1 to 0: a1, a0.0123ymm2aa0a1m128

Example: imm8 = 0x02.

With imm8 = 0x02, result quadwords 1 to 0: a1, a0.

Extract: the 128-bit block of ymm2 that imm8 numbers goes to xmm1.Register forms
VEXTRACTI128 with imm8 = 0x02With imm8 = 0x02, result quadwords 1 to 0: a1, a0.xmm1

Example: imm8 = 0x02.

With imm8 = 0x02, result quadwords 1 to 0: a1, a0.

Operation

What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.

Memory forms
mem.write(ymm2.dq[imm8 & 1])

Run on AMD Zen 5 (EPYC 9645): 1 case.

Register forms
xmm1.write(ymm2.dq[imm8 & 1])
# xmm1 is zeroed from bit 128 up

Run on AMD Zen 5 (EPYC 9645): 1 case.

Operands

What each form reads and writes, as Intel XED records it: the operands of its syntax, in order, and the implicit ones that the syntax does not name. How to read.
OperandKindAction
VEXTRACTI128 xmm/m128, ymm, imm8
xmm/m128explicitwrite
ymmexplicitread
imm8explicitread

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
avx-type-6

Intrinsics

The C intrinsics of Clang 23.1.2 that compile to VEXTRACTI128, 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.

IntrinsicCompiles to
_mm256_extracti128_si256 __m128i _mm256_extracti128_si256(__m256i V, const int M)

VEXTRACTI128 xmm, ymm, imm8 VEX.256 -mavx2

_mm256_extracti32x4_epi32 __m128i _mm256_extracti32x4_epi32(__m256i A, const int imm)

VEXTRACTI128 xmm, ymm, imm8 VEX.256 -mavx512vl

_mm256_extracti64x2_epi64 __m128i _mm256_extracti64x2_epi64(__m256i A, const int imm)

VEXTRACTI128 xmm, ymm, imm8 VEX.256 -mavx512vl -mavx512dq

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.

CPUID requirements and processors of the XED ISA sets above. Alternatives are separated by “or”; processors follow XED’s chip model, whose AMD processors end with Zen 2, and the CPU data of this site for Zen 3 to Zen 6.

More AVX2 instructions

All 138 AVX2 instructions

Sources

  1. Intel XED v2026.08.23 (commit 0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model.
  2. The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s -march feature sets and AMD’s Processor Programming References, which the page of each processor cites.
  3. 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.
  4. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2C, page 5-174 (VEXTRACTI128/VEXTRACTI32x4/VEXTRACTI64x2/VEXTRACTI32x8/VEXTRACTI64x4)
  5. Intel 64 and IA-32 Architectures Optimization Reference Manual, Volume 1 (248966-051, October 2026)

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, part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.