VPERMT2W, VPERMT2D, VPERMT2Q, VPERMT2PS, VPERMT2PD
从两个表格覆盖一个表格
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
EVEX.128.66.0F38.W1 7D /r | VPERMT2W xmm1 {k1}{z}, xmm2, xmm3/m128 | A | 有效 | 有效 | 两个表格的永久单词整数AVX512BW(或)xmm3/m128和xmm1使用索引xmm2和AVX10.1存储结果到xmm1使用写掩码 k1. |
EVEX.256.66.0F38.W1 7D /r | VPERMT2W ymm1 {k1}{z}, ymm2, ymm3/m256 | A | 有效 | 有效 | 两个表格的永久单词整数AVX512BW(或)ymm3/m256和ymm1使用索引ymm2和AVX10.1存储结果到ymm1使用写掩码 k1. |
EVEX.512.66.0F38.W1 7D /r | VPERMT2W zmm1 {k1}{z}, zmm2, zmm3/m512 | A | 有效 | 有效 | 在OR AVX10.1 zmm3/m512和zmm1两个表格中,使用zmm2的索引,将结果存储为zmm1,使用writemask k1. |
EVEX.128.66.0F38.W0 7E /r | VPERMT2D xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcst | B | 有效 | 有效 | AVX512F) OR xmm3/m128/m32bcst和xmm1中两个表格的永久双字使用AVX10.1 xmm2中的索引,并将结果存储在使用writemask k1的xmm1中. |
EVEX.256.66.0F38.W0 7E /r | VPERMT2D ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcst | B | 有效 | 有效 | AVX512F) OR ymm3/m256/m32bcst和ymm1中两个表格的永久双字使用AVX10.1 ymm2中的索引,并将结果存储在使用writemask k1的ymm1中. |
EVEX.512.66.0F38.W0 7E /r | VPERMT2D zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | B | 有效 | 有效 | OR AVX10.1 zmm3/m512/m32bcst和zmm1中两个表格的永久双字使用zmm2中的指数,并将结果存储在使用writemask k1的zmm1中. |
EVEX.128.66.0F38.W1 7E /r | VPERMT2Q xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst | B | 有效 | 有效 | AVX512F) OR xmm3/m128/m64bcst和xmm1中使用AVX10.1 xmm2中的索引,并将结果存储在使用writemask k1的xmm1中. |
EVEX.256.66.0F38.W1 7E /r | VPERMT2Q ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst | B | 有效 | 有效 | AVX512F) OR ymm3/m256/m64bcst和ymm1中使用AVX10.1 ymm2中的索引,并将结果存储在使用writemask k1的ymm1中. |
EVEX.512.66.0F38.W1 7E /r | VPERMT2Q zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | B | 有效 | 有效 | OR AVX10.1 zmm3/m512/m64bcst和zmm1中两个表格的永久四字使用zmm2中的指数,并将结果存储在使用writemask k1的zmm1中. |
EVEX.128.66.0F38.W0 7F /r | VPERMT2PS xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcst | B | 有效 | 有效 | 永远单精度浮点来自AVX512F)或两个表格在xmm3/m128/平方米bcst和xmm1 AVX10.1使用索引xmm2并存储结果xmm1使用写掩码 k1. |
EVEX.256.66.0F38.W0 7F /r | VPERMT2PS ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcst | B | 有效 | 有效 | 永远单精度浮点来自AVX512F)或两个表格在ymm3/m256/平方米bcst和ymm1 AVX10.1使用索引ymm2并存储结果ymm1使用写掩码 k1. |
EVEX.512.66.0F38.W0 7F /r | VPERMT2PS zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst Opcode/ Op Instruction En | B | 有效 | 有效 | OR AVX10.1的Permute 单精度浮点值用zmm3/m512/m32bcst和zmm1两个表格使用zmm2的指数,并将结果使用写掩码和k1存储在zmm1中. / 6 4/32 CPUID 特性描述 b S It Mode Flag上端 |
EVEX.128.66.0F38.W1 7F /r | VPERMT2PD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst | B | 有效 | 永远双精度浮点来自AVX512F)或两个表格在xmm3/m128/m64bcst 和 (中文(简体) ).xmm1 AVX10.1使用索引xmm2并存储结果xmm1使用写掩码 k1. | |
EVEX.256.66.0F38.W1 7F /r | VPERMT2PD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst | B | 有效 | 永远双精度浮点来自AVX512F)或两个表格在ymm3/m256/m64bcst 和 (中文(简体) ).ymm1 AVX10.1使用索引ymm2并存储结果ymm1使用写掩码 k1. | |
EVEX.512.66.0F38.W1 7F /r | VPERMT2PD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | B | 有效 | 永远双精度浮点来自 OR 的值AVX10.1两个表格zmm3/m512/m64bcst 和 (中文(简体) ).zmm1使用指数zmm2并存储结果zmm1使用写掩码 k1. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)evex.vvvvlecturaEVEX 前缀的 vvvv 字段(按位取反)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
Tupla: Full Mem
B
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)evex.vvvvlecturaEVEX 前缀的 vvvv 字段(按位取反)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
Tupla: Full
实测开销
正在从 arch-data 加载实测数据...
说明
Permute在第一个操作数和第三个操作数(第二源操作数)中使用第二个操作数(第一源操作数)的指数来从第一个和第三个操作数中选择元素. 所选的元素根据写掩码 k1写成目标操作数(第一个操作数).
第一个和第二个操作数是ZMM/YMM/XMM登记册. 第二个操作数包含输入指数,从第1和第3个操作数的两个输入表中选择元素. 第一个操作数也是结果的目的地.
D/Q/PS/PD元素版本: 第二源操作数可以是ZMM/YMM/XMM的寄存器,512/256/128位内存位置或512/256/128位矢量从32/64位内存位置播出. 如果设置了 EVEX.b 和表格选择的 id 位( 选择表 2) , 则从低位 32/64 位 内存位置 进行广播 。
词/PS版本: 表选的id位是比特4/3/2,取决于VL=512,256,128. Bits [3:0]/[2:0]/[1:0] 输入索引向量中的每个元素在两个源操作数范围内选择一个元素,如果id位为0,则选择表 1(第一个来源);否则选择第二源操作数.
Qword/PD版本 : 表格选择的 id 比特是比特 3/2/1,比特 [2:0]/[1:0]/比特 0 在每个输入表中选择元素.
单词元素版本 : 第二源操作数可以是ZMM/YMM/XMM注册,也可以是512/256/128位内存位置. 表格选择的 id 比特是比特 5/4/3,比特 [4:0]/[3:0]/[2:0] 在每个输入表中选择元素.
注意这些指令允许将源操作数中的16位/32位/64位值复制到目标操作数中多个位置. 请注意,在这种情况下,同样的指数可以重复使用,例如第二次重复,而被穿透的表格元素则被覆盖。
目的地被清零的位数(MAXVL-1:256/128)为VL=256,128.
行动
VPERMT2W (EVEX encoded versions)
(KL, VL) = (8, 128), (16, 256), (32, 512)
IF VL = 128
id := 2
FI;
IF VL = 256
id := 3
FI;
IF VL = 512
id := 4
FI;
TMP_DEST := DEST
FOR j := 0 TO KL-1
i := j * 16
off := 16*SRC1[i+id:i]
IF k1[j] OR *no writemask*
THEN
DEST[i+15:i]=SRC1[i+id+1] ? SRC2[off+15:off]
: TMP_DEST[off+15:off]
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+15:i] remains unchanged*
ELSE ; zeroing-masking
DEST[i+15:i] := 0
FI
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0
VPERMT2D/VPERMT2PS (EVEX encoded versions)
(KL, VL) = (4, 128), (8, 256), (16, 512)
IF VL = 128
id := 1
FI;
IF VL = 256
id := 2
FI;
IF VL = 512
id := 3
FI;
TMP_DEST := DEST
FOR j := 0 TO KL-1
i := j * 32
off := 32*SRC1[i+id:i]
IF k1[j] OR *no writemask*
THEN
IF (EVEX.b = 1) AND (SRC2 *is memory*)
THEN
DEST[i+31:i] := SRC1[i+id+1] ? SRC2[31:0]
: TMP_DEST[off+31:off]
ELSE
DEST[i+31:i] := SRC1[i+id+1] ? SRC2[off+31:off]
: TMP_DEST[off+31:off]
FI
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+31:i] remains unchanged*
ELSE ; zeroing-masking
DEST[i+31:i] := 0
FI
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0
VPERMT2Q/VPERMT2PD (EVEX encoded versions)
(KL, VL) = (2, 128), (4, 256), (8 512)
IF VL = 128
id := 0
FI;
IF VL = 256
id := 1
FI;
IF VL = 512
id := 2
FI;
TMP_DEST:= DEST
FOR j := 0 TO KL-1
i := j * 64
off := 64*SRC1[i+id:i]
IF k1[j] OR *no writemask*
THEN
IF (EVEX.b = 1) AND (SRC2 *is memory*)
THEN
DEST[i+63:i] := SRC1[i+id+1] ? SRC2[63:0]
: TMP_DEST[off+63:off]
ELSE
DEST[i+63:i] := SRC1[i+id+1] ? SRC2[off+63:off]
: TMP_DEST[off+63:off]
FI
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+63:i] remains unchanged*
ELSE ; zeroing-masking
DEST[i+63:i] := 0
FI
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0Intel C/C++ 内在编译器
VPERMT2D __m512i _mm512_permutex2var_epi32(__m512i a, __m512i idx, __m512i b);
VPERMT2D __m512i _mm512_mask_permutex2var_epi32(__m512i a, __mmask16 k, __m512i idx, __m512i b);
VPERMT2D __m512i _mm512_mask2_permutex2var_epi32(__m512i a, __m512i idx, __mmask16 k, __m512i b);
VPERMT2D __m512i _mm512_maskz_permutex2var_epi32(__mmask16 k, __m512i a, __m512i idx, __m512i b);
VPERMT2D __m256i _mm256_permutex2var_epi32(__m256i a, __m256i idx, __m256i b);
VPERMT2D __m256i _mm256_mask_permutex2var_epi32(__m256i a, __mmask8 k, __m256i idx, __m256i b);
VPERMT2D __m256i _mm256_mask2_permutex2var_epi32(__m256i a, __m256i idx, __mmask8 k, __m256i b);
VPERMT2D __m256i _mm256_maskz_permutex2var_epi32(__mmask8 k, __m256i a, __m256i idx, __m256i b);
VPERMT2D __m128i _mm_permutex2var_epi32(__m128i a, __m128i idx, __m128i b);
VPERMT2D __m128i _mm_mask_permutex2var_epi32(__m128i a, __mmask8 k, __m128i idx, __m128i b);
VPERMT2D __m128i _mm_mask2_permutex2var_epi32(__m128i a, __m128i idx, __mmask8 k, __m128i b);
VPERMT2D __m128i _mm_maskz_permutex2var_epi32(__mmask8 k, __m128i a, __m128i idx, __m128i b);
VPERMT2PD __m512d _mm512_permutex2var_pd(__m512d a, __m512i idx, __m512d b);
VPERMT2PD __m512d _mm512_mask_permutex2var_pd(__m512d a, __mmask8 k, __m512i idx, __m512d b);
VPERMT2PD __m512d _mm512_mask2_permutex2var_pd(__m512d a, __m512i idx, __mmask8 k, __m512d b);
VPERMT2PD __m512d _mm512_maskz_permutex2var_pd(__mmask8 k, __m512d a, __m512i idx, __m512d b);
VPERMT2PD __m256d _mm256_permutex2var_pd(__m256d a, __m256i idx, __m256d b);
VPERMT2PD __m256d _mm256_mask_permutex2var_pd(__m256d a, __mmask8 k, __m256i idx, __m256d b);
VPERMT2PD __m256d _mm256_mask2_permutex2var_pd(__m256d a, __m256i idx, __mmask8 k, __m256d b);
VPERMT2PD __m256d _mm256_maskz_permutex2var_pd(__mmask8 k, __m256d a, __m256i idx, __m256d b);
VPERMT2PD __m128d _mm_permutex2var_pd(__m128d a, __m128i idx, __m128d b);
VPERMT2PD __m128d _mm_mask_permutex2var_pd(__m128d a, __mmask8 k, __m128i idx, __m128d b);
VPERMT2PD __m128d _mm_mask2_permutex2var_pd(__m128d a, __m128i idx, __mmask8 k, __m128d b);
VPERMT2PD __m128d _mm_maskz_permutex2var_pd(__mmask8 k, __m128d a, __m128i idx, __m128d b);
VPERMT2PS __m512 _mm512_permutex2var_ps(__m512 a, __m512i idx, __m512 b);
VPERMT2PS __m512 _mm512_mask_permutex2var_ps(__m512 a, __mmask16 k, __m512i idx, __m512 b);
VPERMT2PS __m512 _mm512_mask2_permutex2var_ps(__m512 a, __m512i idx, __mmask16 k, __m512 b);
VPERMT2PS __m512 _mm512_maskz_permutex2var_ps(__mmask16 k, __m512 a, __m512i idx, __m512 b);
VPERMT2PS __m256 _mm256_permutex2var_ps(__m256 a, __m256i idx, __m256 b);
VPERMT2PS __m256 _mm256_mask_permutex2var_ps(__m256 a, __mmask8 k, __m256i idx, __m256 b);
VPERMT2PS __m256 _mm256_mask2_permutex2var_ps(__m256 a, __m256i idx, __mmask8 k, __m256 b);
VPERMT2PS __m256 _mm256_maskz_permutex2var_ps(__mmask8 k, __m256 a, __m256i idx, __m256 b);
VPERMT2PS __m128 _mm_permutex2var_ps(__m128 a, __m128i idx, __m128 b);
VPERMT2PS __m128 _mm_mask_permutex2var_ps(__m128 a, __mmask8 k, __m128i idx, __m128 b);
VPERMT2PS __m128 _mm_mask2_permutex2var_ps(__m128 a, __m128i idx, __mmask8 k, __m128 b);
VPERMT2PS __m128 _mm_maskz_permutex2var_ps(__mmask8 k, __m128 a, __m128i idx, __m128 b);
VPERMT2Q __m512i _mm512_permutex2var_epi64(__m512i a, __m512i idx, __m512i b);
VPERMT2Q __m512i _mm512_mask_permutex2var_epi64(__m512i a, __mmask8 k, __m512i idx, __m512i b);
VPERMT2Q __m512i _mm512_mask2_permutex2var_epi64(__m512i a, __m512i idx, __mmask8 k, __m512i b);
VPERMT2Q __m512i _mm512_maskz_permutex2var_epi64(__mmask8 k, __m512i a, __m512i idx, __m512i b);
VPERMT2Q __m256i _mm256_permutex2var_epi64(__m256i a, __m256i idx, __m256i b);
VPERMT2Q __m256i _mm256_mask_permutex2var_epi64(__m256i a, __mmask8 k, __m256i idx, __m256i b);
VPERMT2Q __m256i _mm256_mask2_permutex2var_epi64(__m256i a, __m256i idx, __mmask8 k, __m256i b);
VPERMT2Q __m256i _mm256_maskz_permutex2var_epi64(__mmask8 k, __m256i a, __m256i idx, __m256i b);
VPERMT2Q __m128i _mm_permutex2var_epi64(__m128i a, __m128i idx, __m128i b);
VPERMT2Q __m128i _mm_mask_permutex2var_epi64(__m128i a, __mmask8 k, __m128i idx, __m128i b);
VPERMT2Q __m128i _mm_mask2_permutex2var_epi64(__m128i a, __m128i idx, __mmask8 k, __m128i b);
VPERMT2Q __m128i _mm_maskz_permutex2var_epi64(__mmask8 k, __m128i a, __m128i idx, __m128i b);
VPERMT2W __m512i _mm512_permutex2var_epi16(__m512i a, __m512i idx, __m512i b);
VPERMT2W __m512i _mm512_mask_permutex2var_epi16(__m512i a, __mmask32 k, __m512i idx, __m512i b);
VPERMT2W __m512i _mm512_mask2_permutex2var_epi16(__m512i a, __m512i idx, __mmask32 k, __m512i b);
VPERMT2W __m512i _mm512_maskz_permutex2var_epi16(__mmask32 k, __m512i a, __m512i idx, __m512i b);
VPERMT2W __m256i _mm256_permutex2var_epi16(__m256i a, __m256i idx, __m256i b);
VPERMT2W __m256i _mm256_mask_permutex2var_epi16(__m256i a, __mmask16 k, __m256i idx, __m256i b);
VPERMT2W __m256i _mm256_mask2_permutex2var_epi16(__m256i a, __m256i idx, __mmask16 k, __m256i b);
VPERMT2W __m256i _mm256_maskz_permutex2var_epi16(__mmask16 k, __m256i a, __m256i idx, __m256i b);
VPERMT2W __m128i _mm_permutex2var_epi16(__m128i a, __m128i idx, __m128i b);
VPERMT2W __m128i _mm_mask_permutex2var_epi16(__m128i a, __mmask8 k, __m128i idx, __m128i b);
VPERMT2W __m128i _mm_mask2_permutex2var_epi16(__m128i a, __m128i idx, __mmask8 k, __m128i b);
VPERMT2W __m128i _mm_maskz_permutex2var_epi16(__mmask8 k, __m128i a, __m128i idx, __m128i b);SIMD 浮点 例外
None.
其他例外
VPERMT2D/Q/PS/PD: (中文(简体) ). 参见表2-52"Type E4NF类例外条件". VPERMT2W: 参见表2-52中的例外类型E4NF.nb,"Type E4NF类例外条件".