Introduction
Three sets that complete AVX-512 Foundation. They use the same zmm and mask registers and the same EVEX encoding, masking, broadcast, rounding and disp8×N, all explained on the AVX-512 Foundation page; the tuple type after each encoding below is defined there too.
- AVX-512 BW (byte and word) gives the 8-bit and 16-bit integer instructions of SSE and AVX2 their EVEX forms, with a mask bit per byte or word, and adds a few of its own (VPERMW, VPSLLVW, VDBPSADBW, the moves between masks and vectors). A zmm register holds 64 bytes, so BW also brought the 32-bit and 64-bit mask instructions. CPUID leaf 7, sub-leaf 0, EBX bit 30.
- AVX-512 DQ (dword and qword) adds the floating-point logic instructions, conversions between floating point and 64-bit integers, VPMULLQ, the two-element and eight-element broadcasts, inserts and extracts, VRANGE, VREDUCE and VFPCLASS. It brought the 8-bit mask instructions. EBX bit 17.
- AVX-512 CD (conflict detection) finds equal elements in a vector, so that a loop that scatters to computed addresses can see where two lanes would write the same place. EBX bit 28.
CD came first, with AVX-512 F, in Intel’s Xeon Phi Knights Landing (2016). BW and DQ came with the Skylake-SP Xeons and Skylake-X Core i9s (2017), together with AVX512VL, and every later AVX-512 processor has all three, AMD’s Zen 4 and Zen 5 included. Xeon Phi never had BW or DQ.
The tables give the 512-bit form. Unless a row says otherwise, each packed instruction also has 128-bit and 256-bit forms, which need AVX512VL as well (CPUID EBX bit 31). The instructions with fixed xmm operands (VPEXTRB, VPINSRW and the rest) are EVEX.128 only.
The instructions
Byte and word arithmetic (BW)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpaddb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG FC /r FVM | Adds 64 bytes, wrapping. | AVX-512 BW (Skylake-SP, 2017) |
vpaddw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG FD /r FVM | Adds 32 words, wrapping. | AVX-512 BW (Skylake-SP, 2017) |
vpaddsb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG EC /r FVM | Adds signed bytes, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpaddsw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG ED /r FVM | Adds signed words, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpaddusb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG DC /r FVM | Adds unsigned bytes, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpaddusw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG DD /r FVM | Adds unsigned words, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpsubb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG F8 /r FVM | zmm1 = zmm2 − zmm3, bytes, wrapping. | AVX-512 BW (Skylake-SP, 2017) |
vpsubw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG F9 /r FVM | The same for words. | AVX-512 BW (Skylake-SP, 2017) |
vpsubsb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG E8 /r FVM | Subtracts signed bytes, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpsubsw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG E9 /r FVM | Subtracts signed words, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpsubusb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG D8 /r FVM | Subtracts unsigned bytes, saturating at 0. | AVX-512 BW (Skylake-SP, 2017) |
vpsubusw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG D9 /r FVM | Subtracts unsigned words, saturating at 0. | AVX-512 BW (Skylake-SP, 2017) |
vpmullw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG D5 /r FVM | Multiplies words, keeping the low 16 bits. | AVX-512 BW (Skylake-SP, 2017) |
vpmulhw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG E5 /r FVM | Multiplies signed words, keeping the high 16 bits. | AVX-512 BW (Skylake-SP, 2017) |
vpmulhuw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG E4 /r FVM | Multiplies unsigned words, keeping the high 16 bits. | AVX-512 BW (Skylake-SP, 2017) |
vpmulhrsw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.WIG 0B /r FVM | Multiplies signed words and keeps bits 30–15 of each product, rounded: ((a × b >> 14) + 1) >> 1. | AVX-512 BW (Skylake-SP, 2017) |
vpmaddwd | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG F5 /r FVM | Multiplies signed words and adds each adjacent pair of products into a dword. The mask works per dword. | AVX-512 BW (Skylake-SP, 2017) |
vpmaddubsw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.WIG 04 /r FVM | Multiplies unsigned bytes of zmm2 by signed bytes of zmm3 and adds each adjacent pair into a signed word, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpavgb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG E0 /r FVM | Rounded average of unsigned bytes: (a + b + 1) >> 1. | AVX-512 BW (Skylake-SP, 2017) |
vpavgw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG E3 /r FVM | The same for unsigned words. | AVX-512 BW (Skylake-SP, 2017) |
vpsadbw | zmm1, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG F6 /r FVM | For each qword, the sum of the absolute differences of its 8 unsigned bytes, in the low word; the rest is cleared. No mask. | AVX-512 BW (Skylake-SP, 2017) |
vdbpsadbw | zmm1 {k1}{z}, zmm2, zmm3/m512, imm8 | EVEX.512.66.0F3A.W0 42 /r ib FVM | Double-block sums of absolute differences: the dwords of zmm3 are shuffled within each 128-bit lane by imm8, then each word of the result is the sum of |a − b| over four unsigned bytes of zmm2 and four of the shuffled zmm3, at offsets that slide by a byte. The mask works per word. | AVX-512 BW (Skylake-SP, 2017) |
vpabsb | zmm1 {k1}{z}, zmm2/m512 | EVEX.512.66.0F38.WIG 1C /r FVM | Absolute values of signed bytes. | AVX-512 BW (Skylake-SP, 2017) |
vpabsw | zmm1 {k1}{z}, zmm2/m512 | EVEX.512.66.0F38.WIG 1D /r FVM | Absolute values of signed words. | AVX-512 BW (Skylake-SP, 2017) |
vpmaxsb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.WIG 3C /r FVM | The larger of each pair of signed bytes. | AVX-512 BW (Skylake-SP, 2017) |
vpmaxsw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG EE /r FVM | The larger of each pair of signed words. | AVX-512 BW (Skylake-SP, 2017) |
vpmaxub | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG DE /r FVM | The larger of each pair of unsigned bytes. | AVX-512 BW (Skylake-SP, 2017) |
vpmaxuw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.WIG 3E /r FVM | The larger of each pair of unsigned words. | AVX-512 BW (Skylake-SP, 2017) |
vpminsb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.WIG 38 /r FVM | The smaller of each pair of signed bytes. | AVX-512 BW (Skylake-SP, 2017) |
vpminsw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG EA /r FVM | The smaller of each pair of signed words. | AVX-512 BW (Skylake-SP, 2017) |
vpminub | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG DA /r FVM | The smaller of each pair of unsigned bytes. | AVX-512 BW (Skylake-SP, 2017) |
vpminuw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.WIG 3A /r FVM | The smaller of each pair of unsigned words. | AVX-512 BW (Skylake-SP, 2017) |
Byte and word shifts (BW)
As in AVX-512 F, the immediate forms take their destination from EVEX.vvvv.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpsllw | zmm1 {k1}{z}, zmm2, xmm3/m128zmm1 {k1}{z}, zmm2/m512, imm8 | EVEX.512.66.0F.WIG F1 /r M128EVEX.512.66.0F.WIG 71 /6 ib FVM | Shifts words left, by the count in the low qword of xmm3 or by imm8; a count above 15 gives 0. | AVX-512 BW (Skylake-SP, 2017) |
vpsrlw | zmm1 {k1}{z}, zmm2, xmm3/m128zmm1 {k1}{z}, zmm2/m512, imm8 | EVEX.512.66.0F.WIG D1 /r M128EVEX.512.66.0F.WIG 71 /2 ib FVM | Shifts words right, filling with zeros. | AVX-512 BW (Skylake-SP, 2017) |
vpsraw | zmm1 {k1}{z}, zmm2, xmm3/m128zmm1 {k1}{z}, zmm2/m512, imm8 | EVEX.512.66.0F.WIG E1 /r M128EVEX.512.66.0F.WIG 71 /4 ib FVM | Shifts words right, filling with the sign bit. | AVX-512 BW (Skylake-SP, 2017) |
vpsllvw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 12 /r FVM | Shifts each word of zmm2 left by the matching word of zmm3 (new in AVX-512). | AVX-512 BW (Skylake-SP, 2017) |
vpsrlvw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 10 /r FVM | Shifts each word right by its own count, filling with zeros. | AVX-512 BW (Skylake-SP, 2017) |
vpsravw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 11 /r FVM | Shifts each word right by its own count, filling with the sign bit. | AVX-512 BW (Skylake-SP, 2017) |
vpslldq | zmm1, zmm2/m512, imm8 | EVEX.512.66.0F.WIG 73 /7 ib FVM | Shifts each 128-bit lane left by imm8 bytes. No mask. | AVX-512 BW (Skylake-SP, 2017) |
vpsrldq | zmm1, zmm2/m512, imm8 | EVEX.512.66.0F.WIG 73 /3 ib FVM | Shifts each 128-bit lane right by imm8 bytes. No mask. | AVX-512 BW (Skylake-SP, 2017) |
Byte and word compares and tests (BW)
These write a mask with a bit per byte or word. VPCMPB and its kin take the predicate in imm8 bits 2–0, as VPCMPD does (0 eq, 1 lt, 2 le, 3 false, 4 neq, 5 nlt, 6 nle, 7 true); the disassembler shows predicates 0, 1, 2, 4, 5 and 6 by name.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpcmpb | k1 {k2}, zmm2, zmm3/m512, imm8 | EVEX.512.66.0F3A.W0 3F /r ib FVM | Compares signed bytes by the predicate. Predicate names: vpcmpeqb (shared with VPCMPEQB) vpcmpltb vpcmpleb vpcmpneqb vpcmpnltb vpcmpnleb | AVX-512 BW (Skylake-SP, 2017) |
vpcmpw | k1 {k2}, zmm2, zmm3/m512, imm8 | EVEX.512.66.0F3A.W1 3F /r ib FVM | Compares signed words. Predicate names: vpcmpeqw (shared with VPCMPEQW) vpcmpltw vpcmplew vpcmpneqw vpcmpnltw vpcmpnlew | AVX-512 BW (Skylake-SP, 2017) |
vpcmpub | k1 {k2}, zmm2, zmm3/m512, imm8 | EVEX.512.66.0F3A.W0 3E /r ib FVM | Compares unsigned bytes. Predicate names: vpcmpequb vpcmpltub vpcmpleub vpcmpnequb vpcmpnltub vpcmpnleub | AVX-512 BW (Skylake-SP, 2017) |
vpcmpuw | k1 {k2}, zmm2, zmm3/m512, imm8 | EVEX.512.66.0F3A.W1 3E /r ib FVM | Compares unsigned words. Predicate names: vpcmpequw vpcmpltuw vpcmpleuw vpcmpnequw vpcmpnltuw vpcmpnleuw | AVX-512 BW (Skylake-SP, 2017) |
vpcmpeqb | k1 {k2}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 74 /r FVM | Sets a mask bit where bytes are equal. Also the name of VPCMPB with predicate 0. | AVX-512 BW (Skylake-SP, 2017) |
vpcmpeqw | k1 {k2}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 75 /r FVM | Sets a mask bit where words are equal. Also the name of VPCMPW with predicate 0. | AVX-512 BW (Skylake-SP, 2017) |
vpcmpgtb | k1 {k2}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 64 /r FVM | Sets a mask bit where the signed byte of zmm2 is greater. | AVX-512 BW (Skylake-SP, 2017) |
vpcmpgtw | k1 {k2}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 65 /r FVM | The same for signed words. | AVX-512 BW (Skylake-SP, 2017) |
vptestmb | k2 {k1}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W0 26 /r FVM | Sets a mask bit where zmm2 AND zmm3 is not zero, by byte. | AVX-512 BW (Skylake-SP, 2017) |
vptestmw | k2 {k1}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 26 /r FVM | The same by word. | AVX-512 BW (Skylake-SP, 2017) |
vptestnmb | k2 {k1}, zmm2, zmm3/m512 | EVEX.512.F3.0F38.W0 26 /r FVM | Sets a mask bit where zmm2 AND zmm3 is zero, by byte. | AVX-512 BW (Skylake-SP, 2017) |
vptestnmw | k2 {k1}, zmm2, zmm3/m512 | EVEX.512.F3.0F38.W1 26 /r FVM | The same by word. | AVX-512 BW (Skylake-SP, 2017) |
Byte and word moves, shuffles and packs (BW)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vmovdqu8 | zmm1 {k1}{z}, zmm2/m512zmm2/m512 {k1}{z}, zmm1 | EVEX.512.F2.0F.W0 6F /r FVMEVEX.512.F2.0F.W0 7F /r FVM | Moves 64 bytes, unaligned, with a mask bit per byte. A store to memory takes {k1} but not {z}. | AVX-512 BW (Skylake-SP, 2017) |
vmovdqu16 | zmm1 {k1}{z}, zmm2/m512zmm2/m512 {k1}{z}, zmm1 | EVEX.512.F2.0F.W1 6F /r FVMEVEX.512.F2.0F.W1 7F /r FVM | Moves 32 words, with a mask bit per word. | AVX-512 BW (Skylake-SP, 2017) |
vpbroadcastb | zmm1 {k1}{z}, xmm2/m8zmm1 {k1}{z}, r32 | EVEX.512.66.0F38.W0 78 /r T1SEVEX.512.66.0F38.W0 7A /r | Copies one byte, from a vector, memory or the low byte of a general register, to every byte. | AVX-512 BW (Skylake-SP, 2017) |
vpbroadcastw | zmm1 {k1}{z}, xmm2/m16zmm1 {k1}{z}, r32 | EVEX.512.66.0F38.W0 79 /r T1SEVEX.512.66.0F38.W0 7B /r | Copies one word to every word. | AVX-512 BW (Skylake-SP, 2017) |
vpblendmb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W0 66 /r FVM | Takes each byte from zmm3 where the mask bit is set and from zmm2 where it is clear. | AVX-512 BW (Skylake-SP, 2017) |
vpblendmw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 66 /r FVM | The same for words. | AVX-512 BW (Skylake-SP, 2017) |
vpshufb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.WIG 00 /r FVM | Within each 128-bit lane, picks each byte of zmm2 by the low four bits of the matching byte of zmm3, or writes 0 where that byte’s bit 7 is set. | AVX-512 BW (Skylake-SP, 2017) |
vpshufhw | zmm1 {k1}{z}, zmm2/m512, imm8 | EVEX.512.F3.0F.WIG 70 /r ib FVM | Within each lane, reorders the high four words by imm8 and copies the low four. | AVX-512 BW (Skylake-SP, 2017) |
vpshuflw | zmm1 {k1}{z}, zmm2/m512, imm8 | EVEX.512.F2.0F.WIG 70 /r ib FVM | Within each lane, reorders the low four words by imm8 and copies the high four. | AVX-512 BW (Skylake-SP, 2017) |
vpalignr | zmm1 {k1}{z}, zmm2, zmm3/m512, imm8 | EVEX.512.66.0F3A.WIG 0F /r ib FVM | Within each lane, joins zmm2’s lane (high) and zmm3’s (low), shifts the pair right by imm8 bytes and keeps the low 16. | AVX-512 BW (Skylake-SP, 2017) |
vpermw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 8D /r FVM | Each word of the result is the word of zmm3 picked by the matching index in zmm2, across the whole vector. | AVX-512 BW (Skylake-SP, 2017) |
vpermi2w | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 75 /r FVM | A lookup of words in two tables, zmm2 and zmm3, by the indices in zmm1, which the result overwrites. | AVX-512 BW (Skylake-SP, 2017) |
vpermt2w | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F38.W1 7D /r FVM | A lookup of words in two tables, zmm1 and zmm3, by the indices in zmm2; the result overwrites the first table. | AVX-512 BW (Skylake-SP, 2017) |
vpunpcklbw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 60 /r FVM | Interleaves the low eight bytes of each lane of zmm2 and zmm3. | AVX-512 BW (Skylake-SP, 2017) |
vpunpckhbw | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 68 /r FVM | Interleaves the high eight bytes of each lane. | AVX-512 BW (Skylake-SP, 2017) |
vpunpcklwd | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 61 /r FVM | Interleaves the low four words of each lane. | AVX-512 BW (Skylake-SP, 2017) |
vpunpckhwd | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 69 /r FVM | Interleaves the high four words of each lane. | AVX-512 BW (Skylake-SP, 2017) |
vpacksswb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 63 /r FVM | Packs signed words of zmm2 and zmm3 into signed bytes, saturating, lane by lane. | AVX-512 BW (Skylake-SP, 2017) |
vpackuswb | zmm1 {k1}{z}, zmm2, zmm3/m512 | EVEX.512.66.0F.WIG 67 /r FVM | Packs signed words into unsigned bytes, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpackssdw | zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | EVEX.512.66.0F.W0 6B /r FV | Packs signed dwords into signed words, saturating. The sources are dwords, so it can broadcast. | AVX-512 BW (Skylake-SP, 2017) |
vpackusdw | zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | EVEX.512.66.0F38.W0 2B /r FV | Packs signed dwords into unsigned words, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpmovwb | ymm1/m256 {k1}{z}, zmm2 | EVEX.512.F3.0F38.W0 30 /r HVM | 32 words to bytes, truncating. A store to memory takes {k1} but not {z}. | AVX-512 BW (Skylake-SP, 2017) |
vpmovswb | ymm1/m256 {k1}{z}, zmm2 | EVEX.512.F3.0F38.W0 20 /r HVM | Signed words to bytes, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpmovuswb | ymm1/m256 {k1}{z}, zmm2 | EVEX.512.F3.0F38.W0 10 /r HVM | Unsigned words to bytes, saturating. | AVX-512 BW (Skylake-SP, 2017) |
vpmovsxbw | zmm1 {k1}{z}, ymm2/m256 | EVEX.512.66.0F38.WIG 20 /r HVM | 32 bytes to words, sign-extending. | AVX-512 BW (Skylake-SP, 2017) |
vpmovzxbw | zmm1 {k1}{z}, ymm2/m256 | EVEX.512.66.0F38.WIG 30 /r HVM | 32 bytes to words, zero-extending. | AVX-512 BW (Skylake-SP, 2017) |
vpinsrb | xmm1, xmm2, r32/m8, imm8 | EVEX.128.66.0F3A.WIG 20 /r ib T1S | xmm1 = xmm2 with the byte picked by imm8 bits 3–0 replaced. No mask. | AVX-512 BW (Skylake-SP, 2017) |
vpinsrw | xmm1, xmm2, r32/m16, imm8 | EVEX.128.66.0F.WIG C4 /r ib T1S | xmm1 = xmm2 with the word picked by imm8 bits 2–0 replaced. | AVX-512 BW (Skylake-SP, 2017) |
vpextrb | r32/m8, xmm2, imm8 | EVEX.128.66.0F3A.WIG 14 /r ib T1S | Copies the byte picked by imm8 bits 3–0, zero-extended into a register. | AVX-512 BW (Skylake-SP, 2017) |
vpextrw | r32, xmm1, imm8r32/m16, xmm2, imm8 | EVEX.128.66.0F.WIG C5 /r ibEVEX.128.66.0F3A.WIG 15 /r ib T1S | Copies the word picked by imm8 bits 2–0. The first form (in ModRM.reg) is register only; the second can store to memory. | AVX-512 BW (Skylake-SP, 2017) |
Between masks and vectors (BW, DQ)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpmovb2m | k1, zmm1 | EVEX.512.F3.0F38.W0 29 /r | Each bit of k1 is the sign bit of a byte. | AVX-512 BW (Skylake-SP, 2017) |
vpmovw2m | k1, zmm1 | EVEX.512.F3.0F38.W1 29 /r | Each bit of k1 is the sign bit of a word. | AVX-512 BW (Skylake-SP, 2017) |
vpmovd2m | k1, zmm1 | EVEX.512.F3.0F38.W0 39 /r | Each bit of k1 is the sign bit of a dword. | AVX-512 DQ (Skylake-SP, 2017) |
vpmovq2m | k1, zmm1 | EVEX.512.F3.0F38.W1 39 /r | Each bit of k1 is the sign bit of a qword. | AVX-512 DQ (Skylake-SP, 2017) |
vpmovm2b | zmm1, k1 | EVEX.512.F3.0F38.W0 28 /r | Each byte is all ones where its bit of k1 is set, and 0 where it is clear. | AVX-512 BW (Skylake-SP, 2017) |
vpmovm2w | zmm1, k1 | EVEX.512.F3.0F38.W1 28 /r | The same for words. | AVX-512 BW (Skylake-SP, 2017) |
vpmovm2d | zmm1, k1 | EVEX.512.F3.0F38.W0 38 /r | The same for dwords. | AVX-512 DQ (Skylake-SP, 2017) |
vpmovm2q | zmm1, k1 | EVEX.512.F3.0F38.W1 38 /r | The same for qwords. | AVX-512 DQ (Skylake-SP, 2017) |
Floating-point logic and VPMULLQ (DQ)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vandps | zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | EVEX.512.0F.W0 54 /r FV | zmm1 = zmm2 AND zmm3, masked by single. | AVX-512 DQ (Skylake-SP, 2017) |
vandpd | zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | EVEX.512.66.0F.W1 54 /r FV | The same, by double. | AVX-512 DQ (Skylake-SP, 2017) |
vandnps | zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | EVEX.512.0F.W0 55 /r FV | zmm1 = (NOT zmm2) AND zmm3. | AVX-512 DQ (Skylake-SP, 2017) |
vandnpd | zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | EVEX.512.66.0F.W1 55 /r FV | The same, by double. | AVX-512 DQ (Skylake-SP, 2017) |
vorps | zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | EVEX.512.0F.W0 56 /r FV | zmm1 = zmm2 OR zmm3. | AVX-512 DQ (Skylake-SP, 2017) |
vorpd | zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | EVEX.512.66.0F.W1 56 /r FV | The same, by double. | AVX-512 DQ (Skylake-SP, 2017) |
vxorps | zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | EVEX.512.0F.W0 57 /r FV | zmm1 = zmm2 XOR zmm3. | AVX-512 DQ (Skylake-SP, 2017) |
vxorpd | zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | EVEX.512.66.0F.W1 57 /r FV | The same, by double. | AVX-512 DQ (Skylake-SP, 2017) |
vpmullq | zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | EVEX.512.66.0F38.W1 40 /r FV | Multiplies qwords, keeping the low 64 bits of each product. | AVX-512 DQ (Skylake-SP, 2017) |
Conversions with 64-bit integers (DQ)
As in AVX-512 F, the conversions with a t truncate, and a value that does not fit gives the integer indefinite value.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vcvtpd2qq | zmm1 {k1}{z}, zmm2/m512/m64bcst{er} | EVEX.512.66.0F.W1 7B /r FV | 8 doubles to signed qwords. | AVX-512 DQ (Skylake-SP, 2017) |
vcvttpd2qq | zmm1 {k1}{z}, zmm2/m512/m64bcst{sae} | EVEX.512.66.0F.W1 7A /r FV | The same, truncating. | AVX-512 DQ (Skylake-SP, 2017) |
vcvtpd2uqq | zmm1 {k1}{z}, zmm2/m512/m64bcst{er} | EVEX.512.66.0F.W1 79 /r FV | 8 doubles to unsigned qwords. | AVX-512 DQ (Skylake-SP, 2017) |
vcvttpd2uqq | zmm1 {k1}{z}, zmm2/m512/m64bcst{sae} | EVEX.512.66.0F.W1 78 /r FV | The same, truncating. | AVX-512 DQ (Skylake-SP, 2017) |
vcvtps2qq | zmm1 {k1}{z}, ymm2/m256/m32bcst{er} | EVEX.512.66.0F.W0 7B /r HV | 8 singles to signed qwords. | AVX-512 DQ (Skylake-SP, 2017) |
vcvttps2qq | zmm1 {k1}{z}, ymm2/m256/m32bcst{sae} | EVEX.512.66.0F.W0 7A /r HV | The same, truncating. | AVX-512 DQ (Skylake-SP, 2017) |
vcvtps2uqq | zmm1 {k1}{z}, ymm2/m256/m32bcst{er} | EVEX.512.66.0F.W0 79 /r HV | 8 singles to unsigned qwords. | AVX-512 DQ (Skylake-SP, 2017) |
vcvttps2uqq | zmm1 {k1}{z}, ymm2/m256/m32bcst{sae} | EVEX.512.66.0F.W0 78 /r HV | The same, truncating. | AVX-512 DQ (Skylake-SP, 2017) |
vcvtqq2pd | zmm1 {k1}{z}, zmm2/m512/m64bcst{er} | EVEX.512.F3.0F.W1 E6 /r FV | 8 signed qwords to doubles. | AVX-512 DQ (Skylake-SP, 2017) |
vcvtqq2ps | ymm1 {k1}{z}, zmm2/m512/m64bcst{er} | EVEX.512.0F.W1 5B /r FV | 8 signed qwords to singles. | AVX-512 DQ (Skylake-SP, 2017) |
vcvtuqq2pd | zmm1 {k1}{z}, zmm2/m512/m64bcst{er} | EVEX.512.F3.0F.W1 7A /r FV | 8 unsigned qwords to doubles. | AVX-512 DQ (Skylake-SP, 2017) |
vcvtuqq2ps | ymm1 {k1}{z}, zmm2/m512/m64bcst{er} | EVEX.512.F2.0F.W1 7A /r FV | 8 unsigned qwords to singles. | AVX-512 DQ (Skylake-SP, 2017) |
Broadcast, insert and extract (DQ)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vbroadcastf32x2 | zmm1 {k1}{z}, xmm2/m64 | EVEX.512.66.0F38.W0 19 /r T2 | Copies two singles to every 64-bit pair. 256 and 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vbroadcasti32x2 | zmm1 {k1}{z}, xmm2/m64 | EVEX.512.66.0F38.W0 59 /r T2 | Copies two dwords to every 64-bit pair. 128, 256 and 512 bits. | AVX-512 DQ (Skylake-SP, 2017) |
vbroadcastf64x2 | zmm1 {k1}{z}, m128 | EVEX.512.66.0F38.W1 1A /r T2 | Copies two doubles to every 128-bit lane; the mask works per double. 256 and 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vbroadcasti64x2 | zmm1 {k1}{z}, m128 | EVEX.512.66.0F38.W1 5A /r T2 | Copies two qwords to every lane. 256 and 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vbroadcastf32x8 | zmm1 {k1}{z}, m256 | EVEX.512.66.0F38.W0 1B /r T8 | Copies eight singles to both halves; the mask works per single. 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vbroadcasti32x8 | zmm1 {k1}{z}, m256 | EVEX.512.66.0F38.W0 5B /r T8 | Copies eight dwords to both halves. 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vinsertf64x2 | zmm1 {k1}{z}, zmm2, xmm3/m128, imm8 | EVEX.512.66.0F3A.W1 18 /r ib T2 | zmm1 = zmm2 with the 128-bit lane picked by imm8 replaced; masked per double. 256 and 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vinserti64x2 | zmm1 {k1}{z}, zmm2, xmm3/m128, imm8 | EVEX.512.66.0F3A.W1 38 /r ib T2 | The same, masked per qword. | AVX-512 DQ (Skylake-SP, 2017) |
vinsertf32x8 | zmm1 {k1}{z}, zmm2, ymm3/m256, imm8 | EVEX.512.66.0F3A.W0 1A /r ib T8 | zmm1 = zmm2 with the half picked by imm8 bit 0 replaced; masked per single. 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vinserti32x8 | zmm1 {k1}{z}, zmm2, ymm3/m256, imm8 | EVEX.512.66.0F3A.W0 3A /r ib T8 | The same, masked per dword. | AVX-512 DQ (Skylake-SP, 2017) |
vextractf64x2 | xmm1/m128 {k1}{z}, zmm2, imm8 | EVEX.512.66.0F3A.W1 19 /r ib T2 | Copies the 128-bit lane picked by imm8, masked per double. 256 and 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vextracti64x2 | xmm1/m128 {k1}{z}, zmm2, imm8 | EVEX.512.66.0F3A.W1 39 /r ib T2 | The same, masked per qword. | AVX-512 DQ (Skylake-SP, 2017) |
vextractf32x8 | ymm1/m256 {k1}{z}, zmm2, imm8 | EVEX.512.66.0F3A.W0 1B /r ib T8 | Copies the half picked by imm8 bit 0, masked per single. 512 bits only. | AVX-512 DQ (Skylake-SP, 2017) |
vextracti32x8 | ymm1/m256 {k1}{z}, zmm2, imm8 | EVEX.512.66.0F3A.W0 3B /r ib T8 | The same, masked per dword. | AVX-512 DQ (Skylake-SP, 2017) |
vpinsrd | xmm1, xmm2, r32/m32, imm8 | EVEX.128.66.0F3A.W0 22 /r ib T1S | xmm1 = xmm2 with the dword picked by imm8 bits 1–0 replaced. No mask. | AVX-512 DQ (Skylake-SP, 2017) |
vpinsrq | xmm1, xmm2, r64/m64, imm8 | EVEX.128.66.0F3A.W1 22 /r ib T1S | xmm1 = xmm2 with the qword picked by imm8 bit 0 replaced. Intel’s manual gives it for 64-bit mode. | AVX-512 DQ (Skylake-SP, 2017) |
vpextrd | r32/m32, xmm2, imm8 | EVEX.128.66.0F3A.W0 16 /r ib T1S | Copies the dword picked by imm8 bits 1–0. | AVX-512 DQ (Skylake-SP, 2017) |
vpextrq | r64/m64, xmm2, imm8 | EVEX.128.66.0F3A.W1 16 /r ib T1S | Copies the qword picked by imm8 bit 0. Intel’s manual gives it for 64-bit mode. | AVX-512 DQ (Skylake-SP, 2017) |
Range, reduce and classify (DQ)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vrangeps | zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst{sae}, imm8 | EVEX.512.66.0F3A.W0 50 /r ib FV | For each pair of singles, the minimum, maximum, minimum by absolute value or maximum by absolute value (imm8 bits 1–0); bits 3–2 set the sign of the result. | AVX-512 DQ (Skylake-SP, 2017) |
vrangepd | zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst{sae}, imm8 | EVEX.512.66.0F3A.W1 50 /r ib FV | The same for doubles. | AVX-512 DQ (Skylake-SP, 2017) |
vrangess | xmm1 {k1}{z}, xmm2, xmm3/m32{sae}, imm8 | EVEX.LLIG.66.0F3A.W0 51 /r ib T1S | The same for the low singles. | AVX-512 DQ (Skylake-SP, 2017) |
vrangesd | xmm1 {k1}{z}, xmm2, xmm3/m64{sae}, imm8 | EVEX.LLIG.66.0F3A.W1 51 /r ib T1S | The same for the low doubles. | AVX-512 DQ (Skylake-SP, 2017) |
vreduceps | zmm1 {k1}{z}, zmm2/m512/m32bcst{sae}, imm8 | EVEX.512.66.0F3A.W0 56 /r ib FV | x minus x rounded to imm8 bits 7–4 binary places: the part that VRNDSCALEPS would drop. imm8 bits 3–0 control the rounding as for VRNDSCALEPS. | AVX-512 DQ (Skylake-SP, 2017) |
vreducepd | zmm1 {k1}{z}, zmm2/m512/m64bcst{sae}, imm8 | EVEX.512.66.0F3A.W1 56 /r ib FV | The same for doubles. | AVX-512 DQ (Skylake-SP, 2017) |
vreducess | xmm1 {k1}{z}, xmm2, xmm3/m32{sae}, imm8 | EVEX.LLIG.66.0F3A.W0 57 /r ib T1S | The same for the low single of xmm3. | AVX-512 DQ (Skylake-SP, 2017) |
vreducesd | xmm1 {k1}{z}, xmm2, xmm3/m64{sae}, imm8 | EVEX.LLIG.66.0F3A.W1 57 /r ib T1S | The same for the low double of xmm3. | AVX-512 DQ (Skylake-SP, 2017) |
vfpclassps | k2 {k1}, zmm2/m512/m32bcst, imm8 | EVEX.512.66.0F3A.W0 66 /r ib FV | Sets a mask bit where the single is in any class that imm8 selects: bit 0 QNaN, 1 +0, 2 −0, 3 +∞, 4 −∞, 5 denormal, 6 negative finite, 7 SNaN. | AVX-512 DQ (Skylake-SP, 2017) |
vfpclasspd | k2 {k1}, zmm2/m512/m64bcst, imm8 | EVEX.512.66.0F3A.W1 66 /r ib FV | The same for doubles. | AVX-512 DQ (Skylake-SP, 2017) |
vfpclassss | k2 {k1}, xmm2/m32, imm8 | EVEX.LLIG.66.0F3A.W0 67 /r ib T1S | The same for the low single, into bit 0. | AVX-512 DQ (Skylake-SP, 2017) |
vfpclasssd | k2 {k1}, xmm2/m64, imm8 | EVEX.LLIG.66.0F3A.W1 67 /r ib T1S | The same for the low double. | AVX-512 DQ (Skylake-SP, 2017) |
Conflict detection (CD)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
vpconflictd | zmm1 {k1}{z}, zmm2/m512/m32bcst | EVEX.512.66.0F38.W0 C4 /r FV | Each dword of the result has bit j set where element j, below it, holds the same value. | AVX-512 CD (Knights Landing, 2016) |
vpconflictq | zmm1 {k1}{z}, zmm2/m512/m64bcst | EVEX.512.66.0F38.W1 C4 /r FV | The same for qwords. | AVX-512 CD (Knights Landing, 2016) |
vplzcntd | zmm1 {k1}{z}, zmm2/m512/m32bcst | EVEX.512.66.0F38.W0 44 /r FV | Counts the leading zero bits of each dword (32 for 0). | AVX-512 CD (Knights Landing, 2016) |
vplzcntq | zmm1 {k1}{z}, zmm2/m512/m64bcst | EVEX.512.66.0F38.W1 44 /r FV | Counts the leading zero bits of each qword (64 for 0). | AVX-512 CD (Knights Landing, 2016) |
vpbroadcastmb2q | zmm1, k1 | EVEX.512.F3.0F38.W1 2A /r | Copies the low 8 bits of k1, zero-extended, into every qword. | AVX-512 CD (Knights Landing, 2016) |
vpbroadcastmw2d | zmm1, k1 | EVEX.512.F3.0F38.W0 3A /r | Copies the low 16 bits of k1, zero-extended, into every dword. | AVX-512 CD (Knights Landing, 2016) |
Notes
- The byte and word instructions cannot broadcast: their tuple type is Full Mem. VPACKSSDW and VPACKUSDW, whose sources are dwords, can.
- VPSRLW, VPSRAW and VPSLLW by an xmm count (66 0F D1, E1 and F1) and VPALIGNR (66 0F 3A 0F) ignore EVEX.W, as Intel’s manual writes them (WIG). LLVM 21 decodes only the W0 forms; our decoder takes both.
- Outside 64-bit mode, Intel’s manual gives the W1 forms VBROADCASTF64X2, VBROADCASTI64X2, VINSERTF64X2 and VEXTRACTF64X2 (and their integer partners) as valid. LLVM 21 shows them there as the W0 instructions (VBROADCASTF32X4 …); our decoder follows Intel.
- None of these instructions changes the flags.
Links
Reference
- Intel 64 and IA-32 Architectures Software Developer’s Manuals – Intel’s manual; volume 2 describes every instruction on this page
- AMD64 Architecture Programmer’s Manual, Volume 4 – AMD’s reference to the 128-bit, 256-bit and 512-bit media instructions
- x86 and amd64 instruction reference – Félix Cloutier’s copy of the instruction pages of Intel’s manual