Introduction
AVX made the vector registers 256 bits wide, but only for floating point: its integer instructions stayed at 128 bits. AVX2 gives almost every integer instruction of SSE2 to SSE4.2 a 256-bit form on the ymm registers. It also adds broadcasts from a register, permutes that cross the two 128-bit halves, shifts with a count per element, masked integer loads and stores, and gathers, which load each element from its own address. Intel brought AVX2 with Haswell, in 2013; AMD added it with Excavator, in 2015. A program checks CPUID leaf 07H, sub-leaf 0, EBX bit 5 (AVX2).
The later extensions on this page are VEX-encoded too. Some are the VEX forms of AVX-512 instructions, for processors without AVX-512; others are new:
- AVX-VNNI (Intel Alder Lake, 2021): the dot products of AVX-512 VNNI, for neural-network inference. CPUID leaf 07H, sub-leaf 1, EAX bit 4.
- AVX-IFMA (Intel Sierra Forest and Lunar Lake, 2024): the 52-bit integer multiply-adds of AVX-512 IFMA, for big-number arithmetic. EAX bit 23 of the same leaf.
- AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024): loads of BF16 and FP16 values converted to single precision, and single precision to BF16. EDX bit 5.
- AVX-VNNI-INT8 (Intel Sierra Forest and Lunar Lake, 2024): byte dot products with every mix of signed and unsigned. EDX bit 4.
- AVX-VNNI-INT16 (Intel Arrow Lake and Lunar Lake, 2024): the same for words. EDX bit 10.
Every VEX instruction also needs the operating system to save the AVX state: CPUID leaf 01H, ECX bit 27 (OSXSAVE) must be set, and XGETBV with ECX = 0 must show bits 1 and 2 of XCR0 set. The ymm registers are 16 in 64-bit mode and 8 elsewhere. A 128-bit form clears bits 255:128 of its destination.
Most 256-bit integer instructions work on each 128-bit half (lane) of the register on its own, as two 128-bit instructions would: the unpacks, packs, shuffles, vpalignr, the horizontal adds, the byte shifts and vpsadbw. Only the permutes, broadcasts, inserts and extracts move data between the lanes.
The encodings are written as Intel writes them: VEX.L.pp.map.W opcode, where a missing pp means no prefix (00), WIG means W is ignored, and LIG means L is ignored. See Instruction encoding for the VEX prefix itself.
New AVX2 instructions
Broadcast
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpbroadcastb | xmm1, xmm2/m8ymm1, xmm2/m8 | VEX.128.66.0F38.W0 78 /rVEX.256.66.0F38.W0 78 /r | Copies the low byte of the source to every byte of the destination | AVX2 (Intel Haswell, 2013) |
vpbroadcastw | xmm1, xmm2/m16ymm1, xmm2/m16 | VEX.128.66.0F38.W0 79 /rVEX.256.66.0F38.W0 79 /r | Copies the low word to every word | AVX2 (Intel Haswell, 2013) |
vpbroadcastd | xmm1, xmm2/m32ymm1, xmm2/m32 | VEX.128.66.0F38.W0 58 /rVEX.256.66.0F38.W0 58 /r | Copies the low doubleword to every doubleword | AVX2 (Intel Haswell, 2013) |
vpbroadcastq | xmm1, xmm2/m64ymm1, xmm2/m64 | VEX.128.66.0F38.W0 59 /rVEX.256.66.0F38.W0 59 /r | Copies the low quadword to every quadword | AVX2 (Intel Haswell, 2013) |
vbroadcasti128 | ymm1, m128 | VEX.256.66.0F38.W0 5A /r | Copies 128 bits from memory to both halves of the destination | AVX2 (Intel Haswell, 2013) |
vbroadcastss | xmm1, xmm2ymm1, xmm2 | VEX.128.66.0F38.W0 18 /rVEX.256.66.0F38.W0 18 /r | Copies the low single-precision value of a register to every element. The forms from memory came with AVX (AVX page) | AVX2 (Intel Haswell, 2013) |
vbroadcastsd | ymm1, xmm2 | VEX.256.66.0F38.W0 19 /r | Copies the low double-precision value of a register to all four elements. The form from memory came with AVX (AVX page) | AVX2 (Intel Haswell, 2013) |
Permute, insert and extract across the lanes
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpermd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.W0 36 /r | Picks each doubleword of the result from the eight of the third operand, by the index in bits 2:0 of the matching doubleword of the second | AVX2 (Intel Haswell, 2013) |
vpermps | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.W0 16 /r | The same for single-precision values | AVX2 (Intel Haswell, 2013) |
vpermq | ymm1, ymm2/m256, imm8 | VEX.256.66.0F3A.W1 00 /r ib | Picks each quadword of the result from the four of the source, by a two-bit field of imm8 | AVX2 (Intel Haswell, 2013) |
vpermpd | ymm1, ymm2/m256, imm8 | VEX.256.66.0F3A.W1 01 /r ib | The same for double-precision values | AVX2 (Intel Haswell, 2013) |
vperm2i128 | ymm1, ymm2, ymm3/m256, imm8 | VEX.256.66.0F3A.W0 46 /r ib | Fills each half of the result with one of the four halves of the two sources (imm8[1:0] for the low half, imm8[5:4] for the high), or with zero where imm8 bit 3 or bit 7 is set | AVX2 (Intel Haswell, 2013) |
vinserti128 | ymm1, ymm2, xmm3/m128, imm8 | VEX.256.66.0F3A.W0 38 /r ib | Copies the second operand and replaces the half that imm8[0] names with the third | AVX2 (Intel Haswell, 2013) |
vextracti128 | xmm1/m128, ymm2, imm8 | VEX.256.66.0F3A.W0 39 /r ib | Writes the half of the source that imm8[0] names | AVX2 (Intel Haswell, 2013) |
Blend, variable shifts and masked moves
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpblendd | xmm1, xmm2, xmm3/m128, imm8ymm1, ymm2, ymm3/m256, imm8 | VEX.128.66.0F3A.W0 02 /r ibVEX.256.66.0F3A.W0 02 /r ib | Takes each doubleword from the third operand where its bit of imm8 is set, and from the second where it is clear | AVX2 (Intel Haswell, 2013) |
vpsllvd | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 47 /rVEX.256.66.0F38.W0 47 /r | Shifts each doubleword of the second operand left by the count in the matching doubleword of the third; a count over 31 gives 0 | AVX2 (Intel Haswell, 2013) |
vpsllvq | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W1 47 /rVEX.256.66.0F38.W1 47 /r | The same for quadwords; a count over 63 gives 0 | AVX2 (Intel Haswell, 2013) |
vpsrlvd | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 45 /rVEX.256.66.0F38.W0 45 /r | Shifts each doubleword right, filling with zeros, by its own count; a count over 31 gives 0 | AVX2 (Intel Haswell, 2013) |
vpsrlvq | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W1 45 /rVEX.256.66.0F38.W1 45 /r | The same for quadwords; a count over 63 gives 0 | AVX2 (Intel Haswell, 2013) |
vpsravd | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 46 /rVEX.256.66.0F38.W0 46 /r | Shifts each signed doubleword right, filling with its sign bit, by its own count; a count over 31 fills the whole element with the sign | AVX2 (Intel Haswell, 2013) |
vpmaskmovd | xmm1, xmm2, m128ymm1, ymm2, m256m128, xmm1, xmm2m256, ymm1, ymm2 | VEX.128.66.0F38.W0 8C /rVEX.256.66.0F38.W0 8C /rVEX.128.66.0F38.W0 8E /rVEX.256.66.0F38.W0 8E /r | Loads or stores only the doublewords whose mask (the top bit of the matching doubleword of the register in VEX.vvvv, the middle operand) is set. A load zeroes the others. Masked-out elements cause no faults | AVX2 (Intel Haswell, 2013) |
vpmaskmovq | xmm1, xmm2, m128ymm1, ymm2, m256m128, xmm1, xmm2m256, ymm1, ymm2 | VEX.128.66.0F38.W1 8C /rVEX.256.66.0F38.W1 8C /rVEX.128.66.0F38.W1 8E /rVEX.256.66.0F38.W1 8E /r | The same for quadwords | AVX2 (Intel Haswell, 2013) |
Gather
A gather loads each element from its own address. The memory operand uses VSIB addressing: the SIB byte’s index is a vector register (xmm or ymm), and each of its doubleword (vm32) or quadword (vm64) elements, scaled and added to the base and displacement, gives one address. The third operand is a mask: an element is loaded only where the top bit of its mask element is set, and otherwise keeps the destination’s value. As each element is loaded its mask element is cleared, so after a fault the instruction can be restarted where it stopped; when it ends, the whole mask is zero.
The destination, the index and the mask must be three different registers, or the processor raises #UD. We still decode such an instruction, as LLVM does. VSIB needs a SIB byte, which 16-bit addressing does not have, so we decode gathers only with 32-bit or 64-bit addressing (in 16-bit code, after a 67 prefix).
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpgatherdd | xmm1, vm32x, xmm2ymm1, vm32y, ymm2 | VEX.128.66.0F38.W0 90 /rVEX.256.66.0F38.W0 90 /r | Gathers doublewords, with doubleword indices | AVX2 (Intel Haswell, 2013) |
vpgatherdq | xmm1, vm32x, xmm2ymm1, vm32x, ymm2 | VEX.128.66.0F38.W1 90 /rVEX.256.66.0F38.W1 90 /r | Gathers quadwords, with doubleword indices | AVX2 (Intel Haswell, 2013) |
vpgatherqd | xmm1, vm64x, xmm2xmm1, vm64y, xmm2 | VEX.128.66.0F38.W0 91 /rVEX.256.66.0F38.W0 91 /r | Gathers doublewords, with quadword indices | AVX2 (Intel Haswell, 2013) |
vpgatherqq | xmm1, vm64x, xmm2ymm1, vm64y, ymm2 | VEX.128.66.0F38.W1 91 /rVEX.256.66.0F38.W1 91 /r | Gathers quadwords, with quadword indices | AVX2 (Intel Haswell, 2013) |
vgatherdps | xmm1, vm32x, xmm2ymm1, vm32y, ymm2 | VEX.128.66.0F38.W0 92 /rVEX.256.66.0F38.W0 92 /r | Gathers single-precision values, with doubleword indices | AVX2 (Intel Haswell, 2013) |
vgatherdpd | xmm1, vm32x, xmm2ymm1, vm32x, ymm2 | VEX.128.66.0F38.W1 92 /rVEX.256.66.0F38.W1 92 /r | Gathers double-precision values, with doubleword indices | AVX2 (Intel Haswell, 2013) |
vgatherqps | xmm1, vm64x, xmm2xmm1, vm64y, xmm2 | VEX.128.66.0F38.W0 93 /rVEX.256.66.0F38.W0 93 /r | Gathers single-precision values, with quadword indices | AVX2 (Intel Haswell, 2013) |
vgatherqpd | xmm1, vm64x, xmm2ymm1, vm64y, ymm2 | VEX.128.66.0F38.W1 93 /rVEX.256.66.0F38.W1 93 /r | Gathers double-precision values, with quadword indices | AVX2 (Intel Haswell, 2013) |
256-bit forms of the SSE integer instructions
Each of these is the VEX.256 form of an SSE2, SSSE3 or SSE4 instruction. Its VEX.128 form came earlier, with AVX, and has its row on the AVX page, which each row links to. The legacy SSE forms are on the SSE2, SSE3 and SSSE3 and SSE4 pages. Where an instruction has a source and a destination of different widths, the forms say so.
Add, subtract and multiply
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpaddb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG FC /r | Adds packed bytes, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpaddw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG FD /r | Adds packed words, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpaddd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG FE /r | Adds packed doublewords, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpaddq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG D4 /r | Adds packed quadwords, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpaddsb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG EC /r | Adds packed signed bytes with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpaddsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG ED /r | Adds packed signed words with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpaddusb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG DC /r | Adds packed unsigned bytes with unsigned saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpaddusw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG DD /r | Adds packed unsigned words with unsigned saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG F8 /r | Subtracts the third operand’s bytes from the second’s, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG F9 /r | Subtracts packed words, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG FA /r | Subtracts packed doublewords, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG FB /r | Subtracts packed quadwords, wrapping round (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubsb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG E8 /r | Subtracts packed signed bytes with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG E9 /r | Subtracts packed signed words with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubusb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG D8 /r | Subtracts packed unsigned bytes with unsigned saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsubusw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG D9 /r | Subtracts packed unsigned words with unsigned saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmullw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG D5 /r | Multiplies packed words and keeps the low 16 bits of each product (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmulhw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG E5 /r | Multiplies packed signed words and keeps the high 16 bits of each product (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmulhuw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG E4 /r | Multiplies packed unsigned words and keeps the high 16 bits of each product (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmulld | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 40 /r | Multiplies packed doublewords and keeps the low 32 bits of each product (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmuludq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG F4 /r | Multiplies the unsigned low doubleword of each quadword into a 64-bit product (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmuldq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 28 /r | Multiplies the signed low doubleword of each quadword into a 64-bit product (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmulhrsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 0B /r | Multiplies packed signed words and keeps bits 30:15 of each product, rounded: (x × y + 4000h) >> 15 (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaddwd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG F5 /r | Multiplies packed signed words and adds each adjacent pair of products into a doubleword (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaddubsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 04 /r | Multiplies the unsigned bytes of the second operand by the signed bytes of the third and adds each adjacent pair of products into a word, with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
Average, absolute value, sign and sums of differences
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpavgb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG E0 /r | Averages packed unsigned bytes, rounding up: (x + y + 1) >> 1 (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpavgw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG E3 /r | Averages packed unsigned words, rounding up (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpabsb | ymm1, ymm2/m256 | VEX.256.66.0F38.WIG 1C /r | The absolute value of each signed byte (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpabsw | ymm1, ymm2/m256 | VEX.256.66.0F38.WIG 1D /r | The absolute value of each signed word (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpabsd | ymm1, ymm2/m256 | VEX.256.66.0F38.WIG 1E /r | The absolute value of each signed doubleword (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsignb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 08 /r | Negates, zeroes or keeps each byte of the second operand as the matching byte of the third is negative, zero or positive (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsignw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 09 /r | The same for words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsignd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 0A /r | The same for doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsadbw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG F6 /r | Adds the absolute differences of the eight unsigned bytes in each quadword into the low word of that quadword, and clears the rest of it (128-bit form) | AVX2 (Intel Haswell, 2013) |
vmpsadbw | ymm1, ymm2, ymm3/m256, imm8 | VEX.256.66.0F3A.WIG 42 /r ib | In each lane, sums the absolute differences between one four-byte group of the third operand and eight overlapping four-byte groups of the second, into eight words; imm8[2:0] picks the groups of the low lane and imm8[5:3] those of the high lane (128-bit form) | AVX2 (Intel Haswell, 2013) |
Horizontal add and subtract
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vphaddw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 01 /r | Adds each adjacent pair of words, those of the second operand into the low half of each lane and those of the third into the high half (128-bit form) | AVX2 (Intel Haswell, 2013) |
vphaddd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 02 /r | The same for doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vphaddsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 03 /r | As vphaddw, with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vphsubw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 05 /r | Subtracts the upper word of each adjacent pair from the lower, arranged as vphaddw (128-bit form) | AVX2 (Intel Haswell, 2013) |
vphsubd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 06 /r | The same for doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vphsubsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 07 /r | As vphsubw, with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
Minimum and maximum
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpminsb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 38 /r | The smaller of each pair of signed bytes (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpminsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG EA /r | The smaller of each pair of signed words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpminsd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 39 /r | The smaller of each pair of signed doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpminub | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG DA /r | The smaller of each pair of unsigned bytes (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpminuw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 3A /r | The smaller of each pair of unsigned words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpminud | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 3B /r | The smaller of each pair of unsigned doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaxsb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 3C /r | The larger of each pair of signed bytes (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaxsw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG EE /r | The larger of each pair of signed words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaxsd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 3D /r | The larger of each pair of signed doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaxub | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG DE /r | The larger of each pair of unsigned bytes (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaxuw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 3E /r | The larger of each pair of unsigned words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmaxud | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 3F /r | The larger of each pair of unsigned doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
Compare and logic
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpcmpeqb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 74 /r | Sets each byte to all ones where the two bytes are equal, and to zero where not (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpcmpeqw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 75 /r | The same for words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpcmpeqd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 76 /r | The same for doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpcmpeqq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 29 /r | The same for quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpcmpgtb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 64 /r | Sets each byte to all ones where the signed byte of the second operand is greater than that of the third, and to zero where not (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpcmpgtw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 65 /r | The same for signed words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpcmpgtd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 66 /r | The same for signed doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpcmpgtq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 37 /r | The same for signed quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpand | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG DB /r | Bitwise AND (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpandn | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG DF /r | Bitwise AND of the inverted second operand with the third (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpor | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG EB /r | Bitwise OR (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpxor | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG EF /r | Bitwise exclusive OR (128-bit form) | AVX2 (Intel Haswell, 2013) |
Shift
The forms with an xmm count shift every element by the same count, the low 64 bits of that operand. The forms with imm8 write the register in VEX.vvvv (the first operand) and read ModRM.rm. A count larger than the element’s width gives 0, or for the arithmetic shifts fills the element with its sign. vpslldq and vpsrldq shift each 128-bit lane by whole bytes.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpsllw | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG F1 /rVEX.256.66.0F.WIG 71 /6 ib | Shifts each word left, filling with zeros (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpslld | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG F2 /rVEX.256.66.0F.WIG 72 /6 ib | Shifts each doubleword left (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsllq | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG F3 /rVEX.256.66.0F.WIG 73 /6 ib | Shifts each quadword left (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsrlw | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG D1 /rVEX.256.66.0F.WIG 71 /2 ib | Shifts each word right, filling with zeros (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsrld | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG D2 /rVEX.256.66.0F.WIG 72 /2 ib | Shifts each doubleword right, filling with zeros (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsrlq | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG D3 /rVEX.256.66.0F.WIG 73 /2 ib | Shifts each quadword right, filling with zeros (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsraw | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG E1 /rVEX.256.66.0F.WIG 71 /4 ib | Shifts each signed word right, filling with its sign bit (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsrad | ymm1, ymm2, xmm3/m128ymm1, ymm2, imm8 | VEX.256.66.0F.WIG E2 /rVEX.256.66.0F.WIG 72 /4 ib | Shifts each signed doubleword right, filling with its sign bit (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpslldq | ymm1, ymm2, imm8 | VEX.256.66.0F.WIG 73 /7 ib | Shifts each 128-bit lane left by imm8 bytes, filling with zeros; a count over 15 clears the lane (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpsrldq | ymm1, ymm2, imm8 | VEX.256.66.0F.WIG 73 /3 ib | Shifts each 128-bit lane right by imm8 bytes, filling with zeros (128-bit form) | AVX2 (Intel Haswell, 2013) |
Pack and unpack
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpacksswb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 63 /r | Narrows the signed words of both sources to bytes with signed saturation, those of the second operand into the low half of each lane (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpackssdw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 6B /r | Narrows signed doublewords to words with signed saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpackuswb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 67 /r | Narrows signed words to unsigned bytes with unsigned saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpackusdw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 2B /r | Narrows signed doublewords to unsigned words with unsigned saturation (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpcklbw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 60 /r | Interleaves the bytes of the low halves of each lane of the two sources (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpcklwd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 61 /r | Interleaves the low words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpckldq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 62 /r | Interleaves the low doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpcklqdq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 6C /r | Interleaves the low quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpckhbw | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 68 /r | Interleaves the bytes of the high halves of each lane (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpckhwd | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 69 /r | Interleaves the high words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpckhdq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 6A /r | Interleaves the high doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpunpckhqdq | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F.WIG 6D /r | Interleaves the high quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
Shuffle, align and blend
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpshufb | ymm1, ymm2, ymm3/m256 | VEX.256.66.0F38.WIG 00 /r | Picks each byte from the same lane of the second operand by the low four bits of the matching byte of the third; where that byte’s top bit is set, the result byte is zero (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpshufd | ymm1, ymm2/m256, imm8 | VEX.256.66.0F.WIG 70 /r ib | Picks each doubleword of a lane from that lane by a two-bit field of imm8 (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpshufhw | ymm1, ymm2/m256, imm8 | VEX.256.F3.0F.WIG 70 /r ib | Shuffles the four high words of each lane by imm8 and copies the low quadword (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpshuflw | ymm1, ymm2/m256, imm8 | VEX.256.F2.0F.WIG 70 /r ib | Shuffles the four low words of each lane by imm8 and copies the high quadword (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpalignr | ymm1, ymm2, ymm3/m256, imm8 | VEX.256.66.0F3A.WIG 0F /r ib | In each lane, joins the second operand (high) and the third (low) into 32 bytes, shifts them right by imm8 bytes and keeps the low 16 (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpblendw | ymm1, ymm2, ymm3/m256, imm8 | VEX.256.66.0F3A.WIG 0E /r ib | Takes each word from the third operand where its bit of imm8 is set; the same eight bits serve both lanes (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpblendvb | ymm1, ymm2, ymm3/m256, ymm4 | VEX.256.66.0F3A.W0 4C /r /is4 | Takes each byte from the third operand where the top bit of the matching byte of the fourth is set, and from the second where not (128-bit form) | AVX2 (Intel Haswell, 2013) |
Sign and zero extension
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpmovsxbw | ymm1, xmm2/m128 | VEX.256.66.0F38.WIG 20 /r | Sign-extends 16 bytes to words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovsxbd | ymm1, xmm2/m64 | VEX.256.66.0F38.WIG 21 /r | Sign-extends 8 bytes to doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovsxbq | ymm1, xmm2/m32 | VEX.256.66.0F38.WIG 22 /r | Sign-extends 4 bytes to quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovsxwd | ymm1, xmm2/m128 | VEX.256.66.0F38.WIG 23 /r | Sign-extends 8 words to doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovsxwq | ymm1, xmm2/m64 | VEX.256.66.0F38.WIG 24 /r | Sign-extends 4 words to quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovsxdq | ymm1, xmm2/m128 | VEX.256.66.0F38.WIG 25 /r | Sign-extends 4 doublewords to quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovzxbw | ymm1, xmm2/m128 | VEX.256.66.0F38.WIG 30 /r | Zero-extends 16 bytes to words (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovzxbd | ymm1, xmm2/m64 | VEX.256.66.0F38.WIG 31 /r | Zero-extends 8 bytes to doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovzxbq | ymm1, xmm2/m32 | VEX.256.66.0F38.WIG 32 /r | Zero-extends 4 bytes to quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovzxwd | ymm1, xmm2/m128 | VEX.256.66.0F38.WIG 33 /r | Zero-extends 8 words to doublewords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovzxwq | ymm1, xmm2/m64 | VEX.256.66.0F38.WIG 34 /r | Zero-extends 4 words to quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
vpmovzxdq | ymm1, xmm2/m128 | VEX.256.66.0F38.WIG 35 /r | Zero-extends 4 doublewords to quadwords (128-bit form) | AVX2 (Intel Haswell, 2013) |
Other moves
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpmovmskb | r32, ymm1 | VEX.256.66.0F.WIG D7 /r | Copies the top bit of each of the 32 bytes into the 32 bits of a general register (128-bit form) | AVX2 (Intel Haswell, 2013) |
vmovntdqa | ymm1, m256 | VEX.256.66.0F38.WIG 2A /r | Loads 32 aligned bytes with a non-temporal hint, for write-combining memory; the address must be aligned to 32 bytes (128-bit form) | AVX2 (Intel Haswell, 2013) |
Later VEX extensions
The dot-product instructions below accumulate into the destination: a is the destination and the accumulator, b and c the second and third operands. AVX-VNNI’s four instructions and AVX-IFMA’s two have EVEX forms with the same names (AVX-512 VNNI and AVX-512 IFMA, on the Later AVX-512 page). Assemblers pick the EVEX form unless told otherwise, so in source code the VEX form is written with a {vex} prefix, as in {vex} vpdpbusd ymm0, ymm1, ymm2. We show the plain mnemonic.
AVX-VNNI
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpdpbusd | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 50 /rVEX.256.66.0F38.W0 50 /r | In each doubleword, multiplies the four unsigned bytes of b by the four signed bytes of c and adds the four products to a | AVX-VNNI (Intel Alder Lake, 2021) |
vpdpbusds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 51 /rVEX.256.66.0F38.W0 51 /r | As vpdpbusd, with signed saturation | AVX-VNNI (Intel Alder Lake, 2021) |
vpdpwssd | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 52 /rVEX.256.66.0F38.W0 52 /r | In each doubleword, multiplies the two signed words of b by those of c and adds both products to a | AVX-VNNI (Intel Alder Lake, 2021) |
vpdpwssds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 53 /rVEX.256.66.0F38.W0 53 /r | As vpdpwssd, with signed saturation | AVX-VNNI (Intel Alder Lake, 2021) |
AVX-VNNI-INT8
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpdpbssd | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.F2.0F38.W0 50 /rVEX.256.F2.0F38.W0 50 /r | In each doubleword, multiplies the four signed bytes of b by the four signed bytes of c and adds the products to a | AVX-VNNI-INT8 (Intel Sierra Forest and Lunar Lake, 2024) |
vpdpbssds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.F2.0F38.W0 51 /rVEX.256.F2.0F38.W0 51 /r | As vpdpbssd, with signed saturation | AVX-VNNI-INT8 (Intel Sierra Forest and Lunar Lake, 2024) |
vpdpbsud | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.F3.0F38.W0 50 /rVEX.256.F3.0F38.W0 50 /r | The same with signed bytes in b and unsigned bytes in c | AVX-VNNI-INT8 (Intel Sierra Forest and Lunar Lake, 2024) |
vpdpbsuds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.F3.0F38.W0 51 /rVEX.256.F3.0F38.W0 51 /r | As vpdpbsud, with signed saturation | AVX-VNNI-INT8 (Intel Sierra Forest and Lunar Lake, 2024) |
vpdpbuud | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.0F38.W0 50 /rVEX.256.0F38.W0 50 /r | The same with unsigned bytes in both b and c | AVX-VNNI-INT8 (Intel Sierra Forest and Lunar Lake, 2024) |
vpdpbuuds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.0F38.W0 51 /rVEX.256.0F38.W0 51 /r | As vpdpbuud, with unsigned saturation | AVX-VNNI-INT8 (Intel Sierra Forest and Lunar Lake, 2024) |
AVX-VNNI-INT16
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpdpwsud | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.F3.0F38.W0 D2 /rVEX.256.F3.0F38.W0 D2 /r | In each doubleword, multiplies the two signed words of b by the two unsigned words of c and adds both products to a | AVX-VNNI-INT16 (Intel Arrow Lake and Lunar Lake, 2024) |
vpdpwsuds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.F3.0F38.W0 D3 /rVEX.256.F3.0F38.W0 D3 /r | As vpdpwsud, with signed saturation | AVX-VNNI-INT16 (Intel Arrow Lake and Lunar Lake, 2024) |
vpdpwusd | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 D2 /rVEX.256.66.0F38.W0 D2 /r | The same with unsigned words in b and signed words in c | AVX-VNNI-INT16 (Intel Arrow Lake and Lunar Lake, 2024) |
vpdpwusds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W0 D3 /rVEX.256.66.0F38.W0 D3 /r | As vpdpwusd, with signed saturation | AVX-VNNI-INT16 (Intel Arrow Lake and Lunar Lake, 2024) |
vpdpwuud | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.0F38.W0 D2 /rVEX.256.0F38.W0 D2 /r | The same with unsigned words in both b and c | AVX-VNNI-INT16 (Intel Arrow Lake and Lunar Lake, 2024) |
vpdpwuuds | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.0F38.W0 D3 /rVEX.256.0F38.W0 D3 /r | As vpdpwuud, with unsigned saturation | AVX-VNNI-INT16 (Intel Arrow Lake and Lunar Lake, 2024) |
AVX-IFMA
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpmadd52luq | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W1 B4 /rVEX.256.66.0F38.W1 B4 /r | In each quadword, multiplies the low 52 bits of b and c as unsigned integers and adds the low 52 bits of the 104-bit product to a | AVX-IFMA (Intel Sierra Forest and Lunar Lake, 2024) |
vpmadd52huq | xmm1, xmm2, xmm3/m128ymm1, ymm2, ymm3/m256 | VEX.128.66.0F38.W1 B5 /rVEX.256.66.0F38.W1 B5 /r | The same, adding the high 52 bits of the product | AVX-IFMA (Intel Sierra Forest and Lunar Lake, 2024) |
AVX-NE-CONVERT
These convert without raising floating-point exceptions (“NE”, no exceptions). BF16 (bfloat16) is the top half of a single-precision value: a sign, eight exponent bits and seven fraction bits. FP16 is IEEE half precision. The loads that convert read every second element of memory, the even-numbered (e) or the odd-numbered (o) ones.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vbcstnebf162ps | xmm1, m16ymm1, m16 | VEX.128.F3.0F38.W0 B1 /rVEX.256.F3.0F38.W0 B1 /r | Loads one BF16 value, converts it to single precision and copies it to every element | AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024) |
vbcstnesh2ps | xmm1, m16ymm1, m16 | VEX.128.66.0F38.W0 B1 /rVEX.256.66.0F38.W0 B1 /r | Loads one FP16 value, converts it to single precision and copies it to every element | AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024) |
vcvtneebf162ps | xmm1, m128ymm1, m256 | VEX.128.F3.0F38.W0 B0 /rVEX.256.F3.0F38.W0 B0 /r | Converts the even-numbered BF16 values in memory to single precision | AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024) |
vcvtneeph2ps | xmm1, m128ymm1, m256 | VEX.128.66.0F38.W0 B0 /rVEX.256.66.0F38.W0 B0 /r | Converts the even-numbered FP16 values in memory to single precision | AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024) |
vcvtneobf162ps | xmm1, m128ymm1, m256 | VEX.128.F2.0F38.W0 B0 /rVEX.256.F2.0F38.W0 B0 /r | Converts the odd-numbered BF16 values in memory to single precision | AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024) |
vcvtneoph2ps | xmm1, m128ymm1, m256 | VEX.128.0F38.W0 B0 /rVEX.256.0F38.W0 B0 /r | Converts the odd-numbered FP16 values in memory to single precision | AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024) |
vcvtneps2bf16 | xmm1, xmm2/m128xmm1, ymm2/m256 | VEX.128.F3.0F38.W0 72 /rVEX.256.F3.0F38.W0 72 /r | Converts single-precision values to BF16, rounding to nearest even, into the low half of the destination; the rest is cleared | AVX-NE-CONVERT (Intel Sierra Forest and Lunar Lake, 2024) |
Notes
- Alignment. VEX memory operands need no alignment, except where a row says so (
vmovntdqa). The masked moves and gathers cause no fault for an element they do not access. - Flags. None of these instructions changes EFLAGS.
- VEX.L. The rows show which lengths exist.
vpermd,vpermps,vpermq,vpermpd,vperm2i128,vinserti128,vextracti128,vbroadcasti128and the register form ofvbroadcastsdhave only VEX.256; with L = 0 they are invalid. - VEX.W. WIG means VEX.W is ignored. Where W0 or W1 is given, the other value is a different instruction (
vpsllvdandvpsllvq) or invalid. - 16-bit code. VEX instructions run in 16-bit protected mode, so we decode them in 16-bit code too. They are not available in real mode or virtual-8086 mode, where C4 and C5 are
lesandlds. - The fourth register outside 64-bit mode. For
vpblendvbonly xmm0–xmm7 exist there, so bit 7 of the/is4byte has no register to name. We ignore it, as GNU binutils does; LLVM does not.
Links
Reference
- Intel 64 and IA-32 Architectures Software Developer’s Manuals – Intel’s manual; volume 2 describes each AVX2 instruction, and the CPUID leaves that report them
- Intel Architecture Instruction Set Extensions and Future Features – Intel’s specification of new extensions, where AVX-VNNI-INT8, AVX-VNNI-INT16, AVX-IFMA and AVX-NE-CONVERT were first described
- AMD64 Architecture Programmer’s Manual, Volume 4 – AMD’s manual of the media instructions, with AVX2
- x86 and amd64 instruction reference – Félix Cloutier’s unofficial HTML copy of volume 2 of Intel’s manual