VPERMI2W, VPERMI2D, VPERMI2Q, VPERMI2PS, VPERMI2PD
从两个表格中完全覆盖索引
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
EVEX.128.66.0F38.W1 75 /r | VPERMI2W xmm1 {k1}{z}, xmm2, xmm3/m128 | A | 有效 | 有效 | AVX512BW) OR xmm3/m128和xmm2中两个表格的永久单词整数,使用xmm1 AVX10.1中的索引,并将结果存储在使用writemask k1的xmm1中. |
EVEX.256.66.0F38.W1 75 /r | VPERMI2W ymm1 {k1}{z}, ymm2, ymm3/m256 | A | 有效 | 有效 | AVX512BW) OR ymm3/m256和ymm2中两个表格的永久单词整数,使用ymm1 AVX10.1中的索引,并将结果存储在使用writemask k1的ymm1中. |
EVEX.512.66.0F38.W1 75 /r | VPERMI2W zmm1 {k1}{z}, zmm2, zmm3/m512 | A | 有效 | 有效 | 在OR AVX10.1 zmm3/m512和zmm2两个表格中,使用zmm1的索引,将结果存储为zmm1,使用writemask k1. |
EVEX.128.66.0F38.W0 76 /r | VPERMI2D xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcst | B | 有效 | 有效 | AVX512F) OR xmm3/m128/m32bcst和xmm2中两个表格的永久双字使用AVX10.1 xmm1中的索引,并将结果存储在使用writemask k1的xmm1中. |
EVEX.256.66.0F38.W0 76 /r | VPERMI2D ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcst | B | 有效 | 有效 | AVX512F) OR ymm3/m256/m32bcst和ymm2中两个表格的永久双字使用AVX10.1 ymm1中的索引,并将结果存储在使用writemask k1的ymm1中. |
EVEX.512.66.0F38.W0 76 /r | VPERMI2D zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | B | 有效 | 有效 | OR AVX10.1 zmm3/m512/m32bcst和zmm2中两个表格的永久双字使用zmm1中的指数,并将结果存储在使用writemask k1的zmm1中. |
EVEX.128.66.0F38.W1 76 /r | VPERMI2Q xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst | B | 有效 | 有效 | AVX512F) OR xmm3/m128/m64bcst和xmm2中使用AVX10.1 xmm1中的索引,并将结果存储在使用writemask k1的xmm1中. |
EVEX.256.66.0F38.W1 76 /r | VPERMI2Q ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst | B | 有效 | 有效 | AVX512F) OR ymm3/m256/m64bcst和ymm2中使用AVX10.1 ymm1中的索引,并将结果存储在使用writemask k1的ymm1中. |
EVEX.512.66.0F38.W1 76 /r | VPERMI2Q zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | B | 有效 | 有效 | OR AVX10.1 zmm3/m512/m64bcst和zmm2中两个表格的永久四字使用zmm1中的指数,并将结果存储在使用writemask k1的zmm1中. |
EVEX.128.66.0F38.W0 77 /r | VPERMI2PS xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcst | B | 有效 | 有效 | 永远单精度浮点数值AVX512F或来自下列两个表格:xmm3/m128/平方米bcst和AVX10.1 xmm2使用索引xmm1并存储结果xmm1使用写掩码 k1. |
EVEX.256.66.0F38.W0 77 /r | VPERMI2PS ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcst | B | 有效 | 有效 | 永远单精度浮点数值AVX512F或来自下列两个表格:ymm3/m256/平方米bcst和AVX10.1 ymm2使用索引ymm1并存储结果ymm1使用写掩码 k1. |
EVEX.512.66.0F38.W0 77 /r | VPERMI2PS zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst Opcode/ Instruction | B | 有效 | 有效 | Zmm3/m512/m32bcst和zmm2两个表格的纯度单精度浮点值 OR AVX10.1 使用zmm1的指数,并使用 writemask k1 存储 zmm1 的结果。 Op/64/32 CPUID 特性描述 En bit M Suppo ode Flag rt |
EVEX.128.66.0F38.W1 77 /r | VPERMI2PD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst | B | 有效 | 有效 | 永远双精度浮点数值AVX512F或来自下列两个表格:xmm3/m128/m64bcst 和 (中文(简体) ).AVX10.1 xmm2使用索引xmm1并存储结果xmm1使用写掩码 k1. |
EVEX.256.66.0F38.W1 77 /r | VPERMI2PD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst | B | 有效 | 有效 | 永远双精度浮点数值AVX512F或来自下列两个表格:ymm3/m256/m64bcst 和 (中文(简体) ).AVX10.1 ymm2使用索引ymm1并存储结果ymm1使用写掩码 k1. |
EVEX.512.66.0F38.W1 77 /r | VPERMI2PD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | B | 有效 | 有效 | 永远双精度浮点数值或AVX10.1从两个表格中zmm3/m512/m64bcst 和 (中文(简体) ).zmm2使用指数zmm1并存储结果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 加载实测数据...
说明
Permutes 16-bit/32-bit/64-bit值在第二首歌词(第一首源歌词)和第三首歌词(第二首源歌词)中,使用第一首歌词中的索引从第二首歌词和第三首歌词中选择元素. 所选的元素根据写掩码 k1写成目标操作数(第一个操作数).
第一个和第二个操作数是ZMM/YMM/XMM登记册. 第一个操作数包含输入指数,从第2和第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.
行动
VPERMI2W (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*TMP_DEST[i+id:i]
IF k1[j] OR *no writemask*
THEN
DEST[i+15:i]=TMP_DEST[i+id+1] ? SRC2[off+15:off]
: SRC1[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
VPERMI2D/VPERMI2PS (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*TMP_DEST[i+id:i]
IF k1[j] OR *no writemask*
THEN
IF (EVEX.b = 1) AND (SRC2 *is memory*)
THEN
DEST[i+31:i] := TMP_DEST[i+id+1] ? SRC2[31:0]
: SRC1[off+31:off]
ELSE
DEST[i+31:i] := TMP_DEST[i+id+1] ? SRC2[off+31:off]
: SRC1[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
VPERMI2Q/VPERMI2PD (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*TMP_DEST[i+id:i]
IF k1[j] OR *no writemask*
THEN
IF (EVEX.b = 1) AND (SRC2 *is memory*)
THEN
DEST[i+63:i] := TMP_DEST[i+id+1] ? SRC2[63:0]
: SRC1[off+63:off]
ELSE
DEST[i+63:i] := TMP_DEST[i+id+1] ? SRC2[off+63:off]
: SRC1[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++ 内在编译器
VPERMI2D __m512i _mm512_permutex2var_epi32(__m512i a, __m512i idx, __m512i b);
VPERMI2D __m512i _mm512_mask_permutex2var_epi32(__m512i a, __mmask16 k, __m512i idx, __m512i b);
VPERMI2D __m512i _mm512_mask2_permutex2var_epi32(__m512i a, __m512i idx, __mmask16 k, __m512i b);
VPERMI2D __m512i _mm512_maskz_permutex2var_epi32(__mmask16 k, __m512i a, __m512i idx, __m512i b);
VPERMI __m256i _mm256_permutex2var_epi32(__m256i a, __m256i idx, __m256i b);
VPERMI2D __m256i _mm256_mask_permutex2var_epi32(__m256i a, __mmask8 k, __m256i idx, __m256i b);
VPERMI2D __m256i _mm256_mask2_permutex2var_epi32(__m256i a, __m256i idx, __mmask8 k, __m256i b);
VPERMI2D __m256i _mm256_maskz_permutex2var_epi32(__mmask8 k, __m256i a, __m256i idx, __m256i b);
VPERMI2D __m128i _mm_permutex2var_epi32(__m128i a, __m128i idx, __m128i b);
VPERMI2D __m128i _mm_mask_permutex2var_epi32(__m128i a, __mmask8 k, __m128i idx, __m128i b);
VPERMI2D __m128i _mm_mask2_permutex2var_epi32(__m128i a, __m128i idx, __mmask8 k, __m128i b);
VPERMI2D __m128i _mm_maskz_permutex2var_epi32(__mmask8 k, __m128i a, __m128i idx, __m128i b);
VPERMI2PD __m512d _mm512_permutex2var_pd(__m512d a, __m512i idx, __m512d b);
VPERMI2PD __m512d _mm512_mask_permutex2var_pd(__m512d a, __mmask8 k, __m512i idx, __m512d b);
VPERMI2PD __m512d _mm512_mask2_permutex2var_pd(__m512d a, __m512i idx, __mmask8 k, __m512d b);
VPERMI2PD __m512d _mm512_maskz_permutex2var_pd(__mmask8 k, __m512d a, __m512i idx, __m512d b);
VPERMI2PD __m256d _mm256_permutex2var_pd(__m256d a, __m256i idx, __m256d b);
VPERMI2PD __m256d _mm256_mask_permutex2var_pd(__m256d a, __mmask8 k, __m256i idx, __m256d b);
VPERMI2PD __m256d _mm256_mask2_permutex2var_pd(__m256d a, __m256i idx, __mmask8 k, __m256d b);
VPERMI2PD __m256d _mm256_maskz_permutex2var_pd(__mmask8 k, __m256d a, __m256i idx, __m256d b);
VPERMI2PD __m128d _mm_permutex2var_pd(__m128d a, __m128i idx, __m128d b);
VPERMI2PD __m128d _mm_mask_permutex2var_pd(__m128d a, __mmask8 k, __m128i idx, __m128d b);
VPERMI2PD __m128d _mm_mask2_permutex2var_pd(__m128d a, __m128i idx, __mmask8 k, __m128d b);
VPERMI2PD __m128d _mm_maskz_permutex2var_pd(__mmask8 k, __m128d a, __m128i idx, __m128d b);
VPERMI2PS __m512 _mm512_permutex2var_ps(__m512 a, __m512i idx, __m512 b);
VPERMI2PS __m512 _mm512_mask_permutex2var_ps(__m512 a, __mmask16 k, __m512i idx, __m512 b);
VPERMI2PS __m512 _mm512_mask2_permutex2var_ps(__m512 a, __m512i idx, __mmask16 k, __m512 b);
VPERMI2PS __m512 _mm512_maskz_permutex2var_ps(__mmask16 k, __m512 a, __m512i idx, __m512 b);
VPERMI2PS __m256 _mm256_permutex2var_ps(__m256 a, __m256i idx, __m256 b);
VPERMI2PS __m256 _mm256_mask_permutex2var_ps(__m256 a, __mmask8 k, __m256i idx, __m256 b);
VPERMI2PS __m256 _mm256_mask2_permutex2var_ps(__m256 a, __m256i idx, __mmask8 k, __m256 b);
VPERMI2PS __m256 _mm256_maskz_permutex2var_ps(__mmask8 k, __m256 a, __m256i idx, __m256 b);
VPERMI2PS __m128 _mm_permutex2var_ps(__m128 a, __m128i idx, __m128 b);
VPERMI2PS __m128 _mm_mask_permutex2var_ps(__m128 a, __mmask8 k, __m128i idx, __m128 b);
VPERMI2PS __m128 _mm_mask2_permutex2var_ps(__m128 a, __m128i idx, __mmask8 k, __m128 b);
VPERMI2PS __m128 _mm_maskz_permutex2var_ps(__mmask8 k, __m128 a, __m128i idx, __m128 b);
VPERMI2Q __m512i _mm512_permutex2var_epi64(__m512i a, __m512i idx, __m512i b);
VPERMI2Q __m512i _mm512_mask_permutex2var_epi64(__m512i a, __mmask8 k, __m512i idx, __m512i b);
VPERMI2Q __m512i _mm512_mask2_permutex2var_epi64(__m512i a, __m512i idx, __mmask8 k, __m512i b);
VPERMI2Q __m512i _mm512_maskz_permutex2var_epi64(__mmask8 k, __m512i a, __m512i idx, __m512i b);
VPERMI2Q __m256i _mm256_permutex2var_epi64(__m256i a, __m256i idx, __m256i b);
VPERMI2Q __m256i _mm256_mask_permutex2var_epi64(__m256i a, __mmask8 k, __m256i idx, __m256i b);
VPERMI2Q __m256i _mm256_mask2_permutex2var_epi64(__m256i a, __m256i idx, __mmask8 k, __m256i b);
VPERMI2Q __m256i _mm256_maskz_permutex2var_epi64(__mmask8 k, __m256i a, __m256i idx, __m256i b);
VPERMI2Q __m128i _mm_permutex2var_epi64(__m128i a, __m128i idx, __m128i b);
VPERMI2Q __m128i _mm_mask_permutex2var_epi64(__m128i a, __mmask8 k, __m128i idx, __m128i b);
VPERMI2Q __m128i _mm_mask2_permutex2var_epi64(__m128i a, __m128i idx, __mmask8 k, __m128i b);
VPERMI2Q __m128i _mm_maskz_permutex2var_epi64(__mmask8 k, __m128i a, __m128i idx, __m128i b);
VPERMI2W __m512i _mm512_permutex2var_epi16(__m512i a, __m512i idx, __m512i b);
VPERMI2W __m512i _mm512_mask_permutex2var_epi16(__m512i a, __mmask32 k, __m512i idx, __m512i b);
VPERMI2W __m512i _mm512_mask2_permutex2var_epi16(__m512i a, __m512i idx, __mmask32 k, __m512i b);
VPERMI2W __m512i _mm512_maskz_permutex2var_epi16(__mmask32 k, __m512i a, __m512i idx, __m512i b);
VPERMI2W __m256i _mm256_permutex2var_epi16(__m256i a, __m256i idx, __m256i b);
VPERMI2W __m256i _mm256_mask_permutex2var_epi16(__m256i a, __mmask16 k, __m256i idx, __m256i b);
VPERMI2W __m256i _mm256_mask2_permutex2var_epi16(__m256i a, __m256i idx, __mmask16 k, __m256i b);
VPERMI2W __m256i _mm256_maskz_permutex2var_epi16(__mmask16 k, __m256i a, __m256i idx, __m256i b);
VPERMI2W __m128i _mm_permutex2var_epi16(__m128i a, __m128i idx, __m128i b);
VPERMI2W __m128i _mm_mask_permutex2var_epi16(__m128i a, __mmask8 k, __m128i idx, __m128i b);
VPERMI2W __m128i _mm_mask2_permutex2var_epi16(__m128i a, __m128i idx, __mmask8 k, __m128i b);
VPERMI2W __m128i _mm_maskz_permutex2var_epi16(__mmask8 k, __m128i a, __m128i idx, __m128i b);SIMD 浮点 例外
None.
其他例外
VPERMI2D/Q/PS/PD: (中文(简体) ). 参见表2-52"Type E4NF类例外条件". VPERMI2W: 参见表2-52中的例外类型E4NF.nb,"Type E4NF类例外条件".