VPERMT2W, VPERMT2D, VPERMT2Q, VPERMT2PS, VPERMT2PD

从两个表格覆盖一个表格

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.0F38.W1 7D /rVPERMT2W xmm1 {k1}{z}, xmm2, xmm3/m128A有效有效两个表格的永久单词整数AVX512BW(或)xmm3/m128和xmm1使用索引xmm2和AVX10.1存储结果到xmm1使用写掩码 k1.
EVEX.256.66.0F38.W1 7D /rVPERMT2W ymm1 {k1}{z}, ymm2, ymm3/m256A有效有效两个表格的永久单词整数AVX512BW(或)ymm3/m256和ymm1使用索引ymm2和AVX10.1存储结果到ymm1使用写掩码 k1.
EVEX.512.66.0F38.W1 7D /rVPERMT2W zmm1 {k1}{z}, zmm2, zmm3/m512A有效有效在OR AVX10.1 zmm3/m512和zmm1两个表格中,使用zmm2的索引,将结果存储为zmm1,使用writemask k1.
EVEX.128.66.0F38.W0 7E /rVPERMT2D xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcstB有效有效AVX512F) OR xmm3/m128/m32bcst和xmm1中两个表格的永久双字使用AVX10.1 xmm2中的索引,并将结果存储在使用writemask k1的xmm1中.
EVEX.256.66.0F38.W0 7E /rVPERMT2D ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcstB有效有效AVX512F) OR ymm3/m256/m32bcst和ymm1中两个表格的永久双字使用AVX10.1 ymm2中的索引,并将结果存储在使用writemask k1的ymm1中.
EVEX.512.66.0F38.W0 7E /rVPERMT2D zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcstB有效有效OR AVX10.1 zmm3/m512/m32bcst和zmm1中两个表格的永久双字使用zmm2中的指数,并将结果存储在使用writemask k1的zmm1中.
EVEX.128.66.0F38.W1 7E /rVPERMT2Q xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcstB有效有效AVX512F) OR xmm3/m128/m64bcst和xmm1中使用AVX10.1 xmm2中的索引,并将结果存储在使用writemask k1的xmm1中.
EVEX.256.66.0F38.W1 7E /rVPERMT2Q ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcstB有效有效AVX512F) OR ymm3/m256/m64bcst和ymm1中使用AVX10.1 ymm2中的索引,并将结果存储在使用writemask k1的ymm1中.
EVEX.512.66.0F38.W1 7E /rVPERMT2Q zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcstB有效有效OR AVX10.1 zmm3/m512/m64bcst和zmm1中两个表格的永久四字使用zmm2中的指数,并将结果存储在使用writemask k1的zmm1中.
EVEX.128.66.0F38.W0 7F /rVPERMT2PS xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcstB有效有效永远单精度浮点来自AVX512F)或两个表格在xmm3/m128/平方米bcst和xmm1 AVX10.1使用索引xmm2并存储结果xmm1使用写掩码 k1.
EVEX.256.66.0F38.W0 7F /rVPERMT2PS ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcstB有效有效永远单精度浮点来自AVX512F)或两个表格在ymm3/m256/平方米bcst和ymm1 AVX10.1使用索引ymm2并存储结果ymm1使用写掩码 k1.
EVEX.512.66.0F38.W0 7F /rVPERMT2PS zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst Opcode/ Op Instruction EnB有效有效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 /rVPERMT2PD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcstB有效永远双精度浮点来自AVX512F)或两个表格在xmm3/m128/m64bcst 和 (中文(简体) ).xmm1 AVX10.1使用索引xmm2并存储结果xmm1使用写掩码 k1.
EVEX.256.66.0F38.W1 7F /rVPERMT2PD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcstB有效永远双精度浮点来自AVX512F)或两个表格在ymm3/m256/m64bcst 和 (中文(简体) ).ymm1 AVX10.1使用索引ymm2并存储结果ymm1使用写掩码 k1.
EVEX.512.66.0F38.W1 7F /rVPERMT2PD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcstB有效永远双精度浮点来自 OR 的值AVX10.1两个表格zmm3/m512/m64bcst 和 (中文(简体) ).zmm1使用指数zmm2并存储结果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 加载实测数据...

说明

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] := 0

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

来源