VPERMI2W, VPERMI2D, VPERMI2Q, VPERMI2PS, VPERMI2PD

从两个表格中完全覆盖索引

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.0F38.W1 75 /rVPERMI2W xmm1 {k1}{z}, xmm2, xmm3/m128A有效有效AVX512BW) OR xmm3/m128和xmm2中两个表格的永久单词整数,使用xmm1 AVX10.1中的索引,并将结果存储在使用writemask k1的xmm1中.
EVEX.256.66.0F38.W1 75 /rVPERMI2W ymm1 {k1}{z}, ymm2, ymm3/m256A有效有效AVX512BW) OR ymm3/m256和ymm2中两个表格的永久单词整数,使用ymm1 AVX10.1中的索引,并将结果存储在使用writemask k1的ymm1中.
EVEX.512.66.0F38.W1 75 /rVPERMI2W zmm1 {k1}{z}, zmm2, zmm3/m512A有效有效在OR AVX10.1 zmm3/m512和zmm2两个表格中,使用zmm1的索引,将结果存储为zmm1,使用writemask k1.
EVEX.128.66.0F38.W0 76 /rVPERMI2D xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcstB有效有效AVX512F) OR xmm3/m128/m32bcst和xmm2中两个表格的永久双字使用AVX10.1 xmm1中的索引,并将结果存储在使用writemask k1的xmm1中.
EVEX.256.66.0F38.W0 76 /rVPERMI2D ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcstB有效有效AVX512F) OR ymm3/m256/m32bcst和ymm2中两个表格的永久双字使用AVX10.1 ymm1中的索引,并将结果存储在使用writemask k1的ymm1中.
EVEX.512.66.0F38.W0 76 /rVPERMI2D zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcstB有效有效OR AVX10.1 zmm3/m512/m32bcst和zmm2中两个表格的永久双字使用zmm1中的指数,并将结果存储在使用writemask k1的zmm1中.
EVEX.128.66.0F38.W1 76 /rVPERMI2Q xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcstB有效有效AVX512F) OR xmm3/m128/m64bcst和xmm2中使用AVX10.1 xmm1中的索引,并将结果存储在使用writemask k1的xmm1中.
EVEX.256.66.0F38.W1 76 /rVPERMI2Q ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcstB有效有效AVX512F) OR ymm3/m256/m64bcst和ymm2中使用AVX10.1 ymm1中的索引,并将结果存储在使用writemask k1的ymm1中.
EVEX.512.66.0F38.W1 76 /rVPERMI2Q zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcstB有效有效OR AVX10.1 zmm3/m512/m64bcst和zmm2中两个表格的永久四字使用zmm1中的指数,并将结果存储在使用writemask k1的zmm1中.
EVEX.128.66.0F38.W0 77 /rVPERMI2PS xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcstB有效有效永远单精度浮点数值AVX512F或来自下列两个表格:xmm3/m128/平方米bcst和AVX10.1 xmm2使用索引xmm1并存储结果xmm1使用写掩码 k1.
EVEX.256.66.0F38.W0 77 /rVPERMI2PS ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcstB有效有效永远单精度浮点数值AVX512F或来自下列两个表格:ymm3/m256/平方米bcst和AVX10.1 ymm2使用索引ymm1并存储结果ymm1使用写掩码 k1.
EVEX.512.66.0F38.W0 77 /rVPERMI2PS zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst Opcode/ InstructionB有效有效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 /rVPERMI2PD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcstB有效有效永远双精度浮点数值AVX512F或来自下列两个表格:xmm3/m128/m64bcst 和 (中文(简体) ).AVX10.1 xmm2使用索引xmm1并存储结果xmm1使用写掩码 k1.
EVEX.256.66.0F38.W1 77 /rVPERMI2PD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcstB有效有效永远双精度浮点数值AVX512F或来自下列两个表格:ymm3/m256/m64bcst 和 (中文(简体) ).AVX10.1 ymm2使用索引ymm1并存储结果ymm1使用写掩码 k1.
EVEX.512.66.0F38.W1 77 /rVPERMI2PD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcstB有效有效永远双精度浮点数值或AVX10.1从两个表格中zmm3/m512/m64bcst 和 (中文(简体) ).zmm2使用指数zmm1并存储结果zmm1使用写掩码 k1.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

A

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. evex.vvvv lecturaEVEX 前缀的 vvvv 字段(按位取反)
  3. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

Tupla: Full Mem

B

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. evex.vvvv lecturaEVEX 前缀的 vvvv 字段(按位取反)
  3. modrm.rm lecturaModRM 字节的 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] := 0

Intel 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类例外条件".

来源