VPMOVM2B, VPMOVM2W, VPMOVM2D, VPMOVM2Q

将遮罩登记器转换为矢量

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.F3.0F38.W0 28 /rVPMOVM2B xmm1, k1RM有效有效设置每个字节XMM1所有1's或所有0's基于AVX512BW(或)AVX10.1相应的位值k1.
EVEX.256.F3.0F38.W0 28 /rVPMOVM2B ymm1, k1RM有效有效设置每个字节YMM1所有1's或所有0's基于AVX512BW(或)AVX10.1相应的位值k1.
EVEX.512.F3.0F38.W0 28 /rVPMOVM2B zmm1, k1RM有效有效根据k1中对应位值的OR AVX10.1,将ZMM1中的每个字节设定为所有1'或所有0'.
EVEX.128.F3.0F38.W1 28 /rVPMOVM2W xmm1, k1RM有效有效将 XMM1 中的每个单词设定为所有 1 的或所有 0 的基于 AVX512BW) OR AVX10.1 的对应位值为 k1.
EVEX.256.F3.0F38.W1 28 /rVPMOVM2W ymm1, k1RM有效有效将 YMM1 中的每个单词设定为所有 1 的或所有 0 的基于 AVX512BW) OR AVX10.1 的对应位值为 k1.
EVEX.512.F3.0F38.W1 28 /rVPMOVM2W zmm1, k1RM有效有效根据 OR AVX10.1 将 ZMM1 中的每个单词设定为全部 1'或全部 0',以 k1 中的对应位值为准.
EVEX.128.F3.0F38.W0 38 /rVPMOVM2D xmm1, k1RM有效有效根据k1中对应位的值,将XMM1中的每个双字设定为全部1'或全部0'的AVX512DQ)OR AVX10.1.
EVEX.256.F3.0F38.W0 38 /rVPMOVM2D ymm1, k1RM有效有效将 YMM1 中的每个双词设定为所有 1 的或所有 0 的基于 AVX512DQ) OR AVX10.1 在 k1 中对应位的值.
EVEX.512.F3.0F38.W0 38 /rVPMOVM2D zmm1, k1RM有效有效根据k1中对应位的值,将ZMM1中的每个双词设定为所有1'或所有0'的OR AVX10.1.
EVEX.128.F3.0F38.W1 38 /rVPMOVM2Q xmm1, k1RM有效有效将 XMM1 中的每个四字设定为所有 1 的或所有 0 的基于 AVX512DQ) OR AVX10.1 在 k1 中对应位的值.
EVEX.256.F3.0F38.W1 38 /rVPMOVM2Q ymm1, k1RM有效有效将 YMM1 中的每个四字设定为所有 1 的或所有 0 的基于 AVX512DQ) OR AVX10.1 在 k1 中对应位的值.
EVEX.512.F3.0F38.W1 38 /rVPMOVM2Q zmm1, k1RM有效有效将 ZMM1 中的每个四字设定为所有 1 的或所有 0 的基于 OR AVX10.1 的基于 k1 的对应位值.

操作数编码

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

RM

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

说明

将掩码寄存器转换为矢量寄存器。 目的地寄存器中的每个元素被设定为全部1'或全部0',这取决于源面罩寄存器中对应位的值. 源操作数是一个面具寄存器. 目标操作数是一个ZMM/YMM/XMM登记册. EVEX.vvvv是保留的,必须是1111b,否则指令会#UD.

行动

VPMOVM2B (EVEX encoded versions)
(KL, VL) = (16, 128), (32, 256), (64, 512)
FOR j := 0 TO KL-1

    i := j * 8
    IF SRC[j]

          THEN DEST[i+7:i] := -1
          ELSE DEST[i+7:i] := 0
    FI;
ENDFOR
DEST[MAXVL-1:VL] := 0

VPMOVM2W (EVEX encoded versions)
(KL, VL) = (8, 128), (16, 256), (32, 512)
FOR j := 0 TO KL-1

    i := j * 16
    IF SRC[j]

          THEN DEST[i+15:i] := -1
          ELSE DEST[i+15:i] := 0
    FI;
ENDFOR
DEST[MAXVL-1:VL] := 0

VPMOVM2D (EVEX encoded versions)
(KL, VL) = (4, 128), (8, 256), (16, 512)
FOR j := 0 TO KL-1

    i := j * 32
    IF SRC[j]

          THEN DEST[i+31:i] := -1
          ELSE DEST[i+31:i] := 0
    FI;
ENDFOR
DEST[MAXVL-1:VL] := 0

VPMOVM2Q (EVEX encoded versions)
(KL, VL) = (2, 128), (4, 256), (8, 512)
FOR j := 0 TO KL-1

    i := j * 64
    IF SRC[j]

          THEN DEST[i+63:i] := -1
          ELSE DEST[i+63:i] := 0
    FI;
ENDFOR
DEST[MAXVL-1:VL] := 0

Intel C/C++ 内在编译器

VPMOVM2B __m512i _mm512_movm_epi8(__mmask64 );
VPMOVM2D __m512i _mm512_movm_epi32(__mmask8 );
VPMOVM2Q __m512i _mm512_movm_epi64(__mmask16 );
VPMOVM2W __m512i _mm512_movm_epi16(__mmask32 );
VPMOVM2B __m256i _mm256_movm_epi8(__mmask32 );
VPMOVM2D __m256i _mm256_movm_epi32(__mmask8 );
VPMOVM2Q __m256i _mm256_movm_epi64(__mmask8 );
VPMOVM2W __m256i _mm256_movm_epi16(__mmask16 );
VPMOVM2B __m128i _mm_movm_epi8(__mmask16 );
VPMOVM2D __m128i _mm_movm_epi32(__mmask8 );
VPMOVM2Q __m128i _mm_movm_epi64(__mmask8 );
VPMOVM2W __m128i _mm_movm_epi16(__mmask8 );

SIMD 浮点 例外

None.

其他例外

EVEX-encoded discription,参见表2-57"Type E7NM类例外条件".

Additionally: If EVEX.vvvv != 1111B.

#UD

来源