VPMOVB2M, VPMOVW2M, VPMOVD2M, VPMOVQ2M

将矢量记录转换为遮罩

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.F3.0F38.W0 29 /rVPMOVB2M k1, xmm1RM有效有效根据 AVX512BW 或 AVX10.1 的值,将每个比特在 k1 中设置为 1 或 0 。 OR AVX10.1 在 XMM1 中对应字节的最显著比特 。
EVEX.256.F3.0F38.W0 29 /rVPMOVB2M k1, ymm1RM有效有效根据 AVX512BW 或 AVX10.1 的值,将每个比特在 k1 中设置为 1 或 0 。 OR AVX10.1 在 YMM1 中对应字节的最显著比特 。
EVEX.512.F3.0F38.W0 29 /rVPMOVB2M k1, zmm1RM有效有效根据ZMM1中对应字节中OR AVX10.1最显著的位值,将每个位以k1设置为1或0.
EVEX.128.F3.0F38.W1 29 /rVPMOVW2M k1, xmm1RM有效有效根据 AVX512BW 或 AVX10.1 的值,将每个比特在 k1 中设置为 1 或 0 , OR AVX10.1 在 XMM1 中对应单词最显著的比特.
EVEX.256.F3.0F38.W1 29 /rVPMOVW2M k1, ymm1RM有效有效根据 AVX512BW 或 AVX10.1 的值,将每个比特在 k1 中设置为 1 或 0 , OR AVX10.1 在 YMM1 中对应单词最显著的比特.
EVEX.512.F3.0F38.W1 29 /rVPMOVW2M k1, zmm1RM有效有效根据 OR AVX10.1 在 ZMM1 中对应单词最显著的位值,将每个位以 k1 设置为 1 或 0 。
EVEX.128.F3.0F38.W0 39 /rVPMOVD2M k1, xmm1RM有效有效根据 AVX512DQ 的值,将 k1 中的每个位值设置为 1 或 0 ,OR AVX10.1 在 XMM1 中对应双词中最显著的位值.
EVEX.256.F3.0F38.W0 39 /rVPMOVD2M k1, ymm1RM有效有效根据 AVX512DQ 的值,将 k1 中的每个位值设置为 1 或 0 ,OR AVX10.1 在 YMM1 中对应双词中最显著的位值.
EVEX.512.F3.0F38.W0 39 /rVPMOVD2M k1, zmm1RM有效有效根据ZMM1中对应双词中OR AVX10.1最显著的位值,将每个位以 k1 设置为1或0.
EVEX.128.F3.0F38.W1 39 /rVPMOVQ2M k1, xmm1RM有效有效根据 AVX512DQ 或 AVX10.1 的值,将 k1 中的每个位值设置为 1 或 0 。 OR AVX10.1 在 XMM1 中对应四字的最显著位值 。
EVEX.256.F3.0F38.W1 39 /rVPMOVQ2M k1, ymm1RM有效有效根据 AVX512DQ 或 AVX10.1 的值,将 k1 中的每个位值设置为 1 或 0 。 OR AVX10.1 在 YMM1 中对应四字的最显著位值 。
EVEX.512.F3.0F38.W1 39 /rVPMOVQ2M k1, zmm1RM有效有效根据ZMM1中对应四字中OR AVX10.1最显著的位值,将每个位以k1设置为1或0.

操作数编码

每个模式对应上表 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.

行动

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

    i := j * 8
    IF SRC[i+7]

          THEN DEST[j] := 1
          ELSE DEST[j] := 0
    FI;
ENDFOR
DEST[MAX_KL-1:KL] := 0

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

    i := j * 16
    IF SRC[i+15]

          THEN DEST[j] := 1
          ELSE DEST[j] := 0
    FI;
ENDFOR
DEST[MAX_KL-1:KL] := 0

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

    i := j * 32
    IF SRC[i+31]

          THEN DEST[j] := 1
          ELSE DEST[j] := 0
    FI;
ENDFOR
DEST[MAX_KL-1:KL] := 0

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

    i := j * 64
    IF SRC[i+63]

          THEN DEST[j] := 1
          ELSE DEST[j] := 0
    FI;
ENDFOR
DEST[MAX_KL-1:KL] := 0

Intel C/C++ 内在编译器

VPMPOVB2M __mmask64 _mm512_movepi8_mask( __m512i );
VPMPOVD2M __mmask16 _mm512_movepi32_mask( __m512i );
VPMPOVQ2M __mmask8 _mm512_movepi64_mask( __m512i );
VPMPOVW2M __mmask32 _mm512_movepi16_mask( __m512i );
VPMPOVB2M __mmask32 _mm256_movepi8_mask( __m256i );
VPMPOVD2M __mmask8 _mm256_movepi32_mask( __m256i );
VPMPOVQ2M __mmask8 _mm256_movepi64_mask( __m256i );
VPMPOVW2M __mmask16 _mm256_movepi16_mask( __m256i );
VPMPOVB2M __mmask16 _mm_movepi8_mask( __m128i );
VPMPOVD2M __mmask8 _mm_movepi32_mask( __m128i );
VPMPOVQ2M __mmask8 _mm_movepi64_mask( __m128i );
VPMPOVW2M __mmask8 _mm_movepi16_mask( __m128i );

SIMD 浮点 例外

None.

其他例外

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

Additionally: If EVEX.vvvv != 1111B.

#UD

来源