VPTESTNMB, VPTESTNMW, VPTESTNMD, VPTESTNMQ

逻辑 NAND 和 设置

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.F3.0F38.W0 26 /rVPTESTNMB k2 {k1}, xmm2, xmm3/m128A有效有效在 xmm2 和 AVX512BW 中,以位元化方式设置了已包装字节整数的 NAND OR xmm3/m128 并设置了遮罩 k2 以反映结果中每个元素的零/非 AVX10.1 零状态,在 writemask k1 下.
EVEX.256.F3.0F38.W0 26 /rVPTESTNMB k2 {k1}, ymm2, ymm3/m256A有效有效在 ymm2 和 AVX512BW 中,以位元化方式设置了已包装字节整数的 NAND OR ymm3/m256 并设置了遮罩 k2 以反映结果中每个元素的零/非 AVX10.1 零状态,在 writemask k1 下.
EVEX.512.F3.0F38.W0 26 /rVPTESTNMB k2 {k1}, zmm2, zmm3/m512A有效有效在 zmm2 和 AVX512BW 中,以位元化方式设置了已包装字节整数的 NAND OR zmm3/m512 并设置了遮罩 k2 以反映结果中每个元素的零/非 AVX10.1 零状态,在 writemask k1 下.
EVEX.128.F3.0F38.W1 26 /rVPTESTNMW k2 {k1}, xmm2, xmm3/m128A有效有效在 xmm2 和 AVX512BW 中以位元表示的包装单词整数的 NAND OR xmm3/m128 并设置掩码 k2 以反映结果中每个元素的0/n- AVX10.1 零状态,在 写掩码 k1 下.
EVEX.256.F3.0F38.W1 26 /rVPTESTNMW k2 {k1}, ymm2, ymm3/m256A有效有效在 ymm2 和 AVX512BW 中以位元表示的包装单词整数的 NAND OR ymm3/m256 并设置掩码 k2 以反映结果中每个元素的0/n- AVX10.1 零状态,在 写掩码 k1 下.
EVEX.512.F3.0F38.W1 26 /rVPTESTNMW k2 {k1}, zmm2, zmm3/m512A有效有效在 zmm2 和 AVX512BW 中以位元表示的包装单词整数的 NAND OR zmm3/m512 并设置掩码 k2 以反映结果中每个元素的0/n- AVX10.1 零状态,在 写掩码 k1 下.
EVEX.128.F3.0F38.W0 27 /rVPTESTNMD k2 {k1}, xmm2, xmm3/m128/m32bcstB有效有效以AVX512F为单位的组合双字整数的位元NAND)OR xmm2和xmm3/m128/m32bcst,并将掩码k2设置为AVX10.1,在写掩码 k1下,反映了结果中每个元素的零/非零状态.
EVEX.256.F3.0F38.W0 27 /rVPTESTNMD k2 {k1}, ymm2, ymm3/m256/m32bcstB有效有效以AVX512F为单位的组合双字整数的位元NAND)OR ymm2和ymm3/m256/m32bcst,并将掩码k2设置为AVX10.1,在写掩码 k1下,反映了结果中每个元素的零/非零状态.
EVEX.512.F3.0F38.W0 27 /rVPTESTNMD k2 {k1}, zmm2, zmm3/m512/m32bcstB有效有效在OR AVX10.1 zmm2 和 zmm3/m512/m32bcst 中,将包装的双字整数的 NAND 设置为掩码 k2,以反映结果中每个元素的零/非零状态,在 写掩码 k1 下.
EVEX.128.F3.0F38.W1 27 /rVPTESTNMQ k2 {k1}, xmm2, xmm3/m128/m64bcstB有效有效在 xmm2 AVX512F) OR 和 xmm3/m128/m64bcst 中以位元化方式组合四字整数的NAND,并设置遮罩 k2,以反映 AVX10.1 中每个元素的零/非零状态,在写入mask k1下.
EVEX.256.F3.0F38.W1 27 /rVPTESTNMQ k2 {k1}, ymm2, ymm3/m256/m64bcstB有效有效在 ymm2 AVX512F) OR 和 ymm3/m256/m64bcst 中以位元化方式组合四字整数的NAND,并设置遮罩 k2,以反映 AVX10.1 中每个元素的零/非零状态,在写入mask k1下.
EVEX.512.F3.0F38.W1 27 /rVPTESTNMQ k2 {k1}, zmm2, zmm3/m512/m64bcstB有效有效在zmm2 OR AVX10.1 和 zmm3/m512/m64bcst 中,以位元化方式将包装的四字整数的 NAND 设置为遮罩 k2,以反映结果中每个元素的零/非零状态,在 写掩码 k1 下.

操作数编码

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

A

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

Tupla: Full

实测开销

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

说明

在第一个源代码的字节/字节/doubleword/quadword元素(第二个源代码)上执行一个位元逻辑NAND操作,与第二个源代码的对应元素(第三个源代码),并将逻辑比较结果存储在按照写入mask k1的每个位元的目的地代码(第一个源代码代码)中. 如果第一个和第二个src 操作数中对应元素的位元AND为零,则结果的每个位值被设定为1;否则则设定为0.

EVEX编码为VPTESTNMD/Q: 第一源操作数是一个ZMM/YMM/XMM登记册. 第二源操作数可以是ZMM/YMM/XMM记录器,512/256/128位的内存位置,也可以是512/256/128位的向量从32/64位的内存位置广播. 目的地根据写掩码更新.

EVEX编码为VPTESTNMB/W: 第一源操作数是一个ZMM/YMM/XMM登记册. 第二源操作数可以是ZMM/YMM/XMM登记器,512/256/128位内存位置. 目的地根据写掩码更新.

行动

VPTESTNMB
(KL, VL) = (16, 128), (32, 256), (64, 512)
FOR j := 0 TO KL-1

    i := j*8
    IF MaskBit(j) OR *no writemask*

          THEN
                 DEST[j] := (SRC1[i+7:i] BITWISE AND SRC2[i+7:i] == 0)? 1 : 0

          ELSE DEST[j] := 0; zeroing masking only
    FI
ENDFOR
DEST[MAX_KL-1:KL] := 0

VPTESTNMW
(KL, VL) = (8, 128), (16, 256), (32, 512)
FOR j := 0 TO KL-1

    i := j*16
    IF MaskBit(j) OR *no writemask*

          THEN
                DEST[j] := (SRC1[i+15:i] BITWISE AND SRC2[i+15:i] == 0)? 1 : 0

          ELSE DEST[j] := 0; zeroing masking only
    FI
ENDFOR
DEST[MAX_KL-1:KL] := 0


VPTESTNMD
(KL, VL) = (4, 128), (8, 256), (16, 512)
FOR j := 0 TO KL-1

    i := j*32
    IF MaskBit(j) OR *no writemask*

          THEN
                IF (EVEX.b = 1) AND (SRC2 *is memory*)
                       THEN DEST[i+31:i] := (SRC1[i+31:i] BITWISE AND SRC2[31:0] == 0)? 1 : 0
                       ELSE DEST[j] := (SRC1[i+31:i] BITWISE AND SRC2[i+31:i] == 0)? 1 : 0
                FI

          ELSE DEST[j] := 0; zeroing masking only
    FI
ENDFOR
DEST[MAX_KL-1:KL] := 0

VPTESTNMQ
(KL, VL) = (2, 128), (4, 256), (8, 512)
FOR j := 0 TO KL-1

    i := j*64
    IF MaskBit(j) OR *no writemask*

          THEN
                IF (EVEX.b = 1) AND (SRC2 *is memory*)
                       THEN DEST[j] := (SRC1[i+63:i] BITWISE AND SRC2[63:0] == 0)? 1 : 0;
                       ELSE DEST[j] := (SRC1[i+63:i] BITWISE AND SRC2[i+63:i] == 0)? 1 : 0;
                FI;

          ELSE DEST[j] := 0; zeroing masking only
    FI
ENDFOR
DEST[MAX_KL-1:KL] := 0

Intel C/C++ 内在编译器

VPTESTNMB __mmask64 _mm512_testn_epi8_mask( __m512i a, __m512i b);
VPTESTNMB __mmask64 _mm512_mask_testn_epi8_mask(__mmask64, __m512i a, __m512i b);
VPTESTNMB __mmask32 _mm256_testn_epi8_mask(__m256i a, __m256i b);
VPTESTNMB __mmask32 _mm256_mask_testn_epi8_mask(__mmask32, __m256i a, __m256i b);
VPTESTNMB __mmask16 _mm_testn_epi8_mask(__m128i a, __m128i b);
VPTESTNMB __mmask16 _mm_mask_testn_epi8_mask(__mmask16, __m128i a, __m128i b);
VPTESTNMW __mmask32 _mm512_testn_epi16_mask( __m512i a, __m512i b);
VPTESTNMW __mmask32 _mm512_mask_testn_epi16_mask(__mmask32, __m512i a, __m512i b);
VPTESTNMW __mmask16 _mm256_testn_epi16_mask(__m256i a, __m256i b);
VPTESTNMW __mmask16 _mm256_mask_testn_epi16_mask(__mmask16, __m256i a, __m256i b);
VPTESTNMW __mmask8 _mm_testn_epi16_mask(__m128i a, __m128i b);
VPTESTNMW __mmask8 _mm_mask_testn_epi16_mask(__mmask8, __m128i a, __m128i b);
VPTESTNMD __mmask16 _mm512_testn_epi32_mask( __m512i a, __m512i b);
VPTESTNMD __mmask16 _mm512_mask_testn_epi32_mask(__mmask16, __m512i a, __m512i b);
VPTESTNMD __mmask8 _mm256_testn_epi32_mask(__m256i a, __m256i b);
VPTESTNMD __mmask8 _mm256_mask_testn_epi32_mask(__mmask8, __m256i a, __m256i b);
VPTESTNMD __mmask8 _mm_testn_epi32_mask(__m128i a, __m128i b);
VPTESTNMD __mmask8 _mm_mask_testn_epi32_mask(__mmask8, __m128i a, __m128i b);
VPTESTNMQ __mmask8 _mm512_testn_epi64_mask(__m512i a, __m512i b);
VPTESTNMQ __mmask8 _mm512_mask_testn_epi64_mask(__mmask8, __m512i a, __m512i b);
VPTESTNMQ __mmask8 _mm256_testn_epi64_mask(__m256i a, __m256i b);
VPTESTNMQ __mmask8 _mm256_mask_testn_epi64_mask(__mmask8, __m256i a, __m256i b);
VPTESTNMQ __mmask8 _mm_testn_epi64_mask(__m128i a, __m128i b);
VPTESTNMQ __mmask8 _mm_mask_testn_epi64_mask(__mmask8, __m128i a, __m128i b);

SIMD 浮点 例外

None.

其他例外

VPTESTNMD/VPTESTNMQ 坐标: 参见表2-51,"Type E4类例外条件". VPTESTNMB/VPTESTNMW: 参见表2-51中的例外类型E4.nb,"类型E4类例外条件".

来源