vpermt2b
Permute Two-Source Bytes (Overwrite)
VPERMT2B zmm1 {k1}, zmm2, zmm3/m512
Shuffles bytes from two sources, overwriting index.
Details
Permutes bytes from two sources using indices in the destination register (which is overwritten), selecting from either the index register or the second source based on the index's high bit. This is the two-operand form where indices reside in what becomes the output. No flags are modified; masking via k1 applies to the result with optional zeroing.
Pseudocode Operation
for i = 0 to 63:
idx = zmm1[8*i:8*i+7]
if idx[7] == 0:
result[8*i:8*i+7] ← zmm2[8*(idx[6:0]):8*(idx[6:0])+7]
else:
result[8*i:8*i+7] ← zmm3[8*(idx[6:0]):8*(idx[6:0])+7]
zmm1[8*i:8*i+7] ← result[8*i:8*i+7] & k1_mask[i]
Example
VPERMT2B zmm1, zmm2, zmm3/m512
Encoding
Binary Layout
EVEX
+0
66
+4
0F
+5
38
+6
7D
+7
Operands
-
dest
ZMM -
idx
ZMM -
src
ZMM/Mem
Reference (Intel® SDM)
Instruction Forms
| Opcode | Instruction | Op/En | 64/32-bit Mode | CPUID | Description |
|---|---|---|---|---|---|
| EVEX.128.66.0F38.W0 7D /r | VPERMT2B xmm1 {k1}{z}, xmm2, xmm3/m128 | A | V/V | (AVX512VL AND AVX512_VBMI) OR AVX10.1 | Permute bytes in xmm3/m128 and xmm1 using byte indexes in xmm2 and store the byte results in xmm1 using writemask k1. |
| EVEX.256.66.0F38.W0 7D /r | VPERMT2B ymm1 {k1}{z}, ymm2, ymm3/m256 | A | V/V | (AVX512VL AVX512_VBMI) OR AVX10.1 | Permute bytes in ymm3/m256 and ymm1 using byte indexes in ymm2 and store the byte results in ymm1 using writemask k1. |
| EVEX.512.66.0F38.W0 7D /r | VPERMT2B zmm1 {k1}{z}, zmm2, zmm3/m512 | A | V/V | AVX512_VBMI OR AVX10.1 | Permute bytes in zmm3/m512 and zmm1 using byte indexes in zmm2 and store the byte results in zmm1 using writemask k1. |
Instruction Operand Encoding
| Op/En | Tuple Type | Operand 1 | Operand 2 | Operand 3 | Operand 4 |
|---|---|---|---|---|---|
| A | Full Mem | ModRM:reg (r, w) | EVEX.vvvv (r) | ModRM:r/m (r) | N/A |
Description
Permutes byte values from two tables, comprising of the first operand (also the destination operand) and the third operand (the second source operand). The second operand (the first source operand) provides byte indices to select byte results from the two tables. The selected byte elements are written to the destination at byte granularity under the writemask k1.
The first and second operands are ZMM/YMM/XMM registers. The second operand contains input indices to select elements from the two input tables in the 1st and 3rd operands. The first operand is also the destination of the result. The second source operand can be a ZMM/YMM/XMM register, or a 512/256/128-bit memory location. In each index byte, the id bit for table selection is bit 6/5/4, and bits [5:0]/[4:0]/[3:0] selects element within each input table.
Note that these instructions permit a byte value in the source operands to be copied to more than one location in the destination operand. Also, the second table and the indices can be reused in subsequent iterations, but the first table is overwritten.
Bits (MAX_VL-1:256/128) of the destination are zeroed for VL=256,128.
VPERMT2B—Full Permute of Bytes From Two Tables Overwriting a Table Vol. 2C 5-533
Operation
VPERMT2B (EVEX encoded versions) (KL, VL) = (16, 128), (32, 256), (64, 512) IF VL = 128: id := 3; ELSE IF VL = 256: id := 4; ELSE IF VL = 512: id := 5; FI; TMP_DEST[VL-1:0] := DEST[VL-1:0]; FOR j := 0 TO KL-1 off := 8*SRC1[j*8 + id: j*8] ; IF k1[j] OR *no writemask*: DEST[j*8 + 7: j*8] := SRC1[j*8+id+1]? SRC2[off+7:off] : TMP_DEST[off+7:off]; ELSE IF *zeroing-masking* DEST[j*8 + 7: j*8] := 0; *ELSE DEST[j*8 + 7: j*8] remains unchanged* FI; ENDFOR DEST[MAX_VL-1:VL] := 0;
Intel C/C++ Compiler Intrinsic Equivalent
VPERMT2B __m512i _mm512_permutex2var_epi8(__m512i a, __m512i idx, __m512i b); VPERMT2B __m512i _mm512_mask_permutex2var_epi8(__m512i a, __mmask64 k, __m512i idx, __m512i b); VPERMT2B __m512i _mm512_maskz_permutex2var_epi8(__mmask64 k, __m512i a, __m512i idx, __m512i b); VPERMT2B __m256i _mm256_permutex2var_epi8(__m256i a, __m256i idx, __m256i b); VPERMT2B __m256i _mm256_mask_permutex2var_epi8(__m256i a, __mmask32 k, __m256i idx, __m256i b); VPERMT2B __m256i _mm256_maskz_permutex2var_epi8(__mmask32 k, __m256i a, __m256i idx, __m256i b); VPERMT2B __m128i _mm_permutex2var_epi8(__m128i a, __m128i idx, __m128i b); VPERMT2B __m128i _mm_mask_permutex2var_epi8(__m128i a, __mmask16 k, __m128i idx, __m128i b); VPERMT2B __m128i _mm_maskz_permutex2var_epi8(__mmask16 k, __m128i a, __m128i idx, __m128i b);
Exceptions
SIMD Floating-Point Exceptions
None.
Other Exceptions
See Exceptions Type E4NF.nb in Table 2-52, “Type E4NF Class Exception Conditions.”
VPERMT2B—Full Permute of Bytes From Two Tables Overwriting a Table Vol. 2C 5-534