VPTESTMB, VPTESTMW, VPTESTMD, VPTESTMQ

逻辑 AND 和设置遮罩

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.0F38.W0 26 /rVPTESTMB k2 {k1}, xmm2, xmm3/m128A有效有效在 xmm2 和 AVX512BW 中,以位元化方式设置了已包装字节整数的 AND OR xmm3/m128 并设置了遮罩 k2 以反映结果中每个元素的零/非 AVX10.1 零状态,在 writemask k1 下.
EVEX.256.66.0F38.W0 26 /rVPTESTMB k2 {k1}, ymm2, ymm3/m256A有效有效在 ymm2 和 AVX512BW 中,以位元化方式设置了已包装字节整数的 AND OR ymm3/m256 并设置了遮罩 k2 以反映结果中每个元素的零/非 AVX10.1 零状态,在 writemask k1 下.
EVEX.512.66.0F38.W0 26 /rVPTESTMB k2 {k1}, zmm2, zmm3/m512A有效有效在 zmm2 和 OR AVX10.1 zmm3/m512 中,以位元化方式将包装字节整数的 AND 设置为 mask k2 ,以反映结果中每个元素的零/非零状态,在 写掩码 k1 下.
EVEX.128.66.0F38.W1 26 /rVPTESTMW k2 {k1}, xmm2, xmm3/m128A有效有效在 xmm2 和 AVX512BW 中以位元表示的包装单词整数的 AND OR xmm3/m128 并设置掩码 k2 以反映结果中每个元素的0/n- AVX10.1 零状态,在 写掩码 k1 下.
EVEX.256.66.0F38.W1 26 /rVPTESTMW k2 {k1}, ymm2, ymm3/m256A有效有效在 ymm2 和 AVX512BW 中以位元表示的包装单词整数的 AND OR ymm3/m256 并设置掩码 k2 以反映结果中每个元素的0/n- AVX10.1 零状态,在 写掩码 k1 下.
EVEX.512.66.0F38.W1 26 /rVPTESTMW k2 {k1}, zmm2, zmm3/m512A有效有效在 zmm2 和 OR AVX10.1 zmm3/m512 中以位元化方式组合成的单词整数的 AND 并设置了 mask k2 以反映结果中每个元素的零/非零状态,在 写掩码 k1 下.
EVEX.128.66.0F38.W0 27 /rVPTESTMD k2 {k1}, xmm2, xmm3/m128/m32bcstB有效有效AND在xmm2 AVX512F) OR和xmm3/m128/m32bcst中组合的双字整数的位元AND,并设置了遮罩k2,以反映AVX10.1在写掩码 k1下每个结果元素的零/非零状态.
EVEX.256.66.0F38.W0 27 /rVPTESTMD k2 {k1}, ymm2, ymm3/m256/m32bcstB有效有效AND在ymm2 AVX512F) OR和ymm3/m256/m32bcst中组合的双字整数的位元AND,并设置了遮罩k2,以反映AVX10.1在写掩码 k1下每个结果元素的零/非零状态.
EVEX.512.66.0F38.W0 27 /rVPTESTMD k2 {k1}, zmm2, zmm3/m512/m32bcstB有效有效在zmm2 OR AVX10.1 和 zmm3/m512/m32bcst 中,将包装的双字整数的 AND 设置为遮罩 k2,以反映结果的每个元素的零/非零状态,在 写掩码 k1 下.
EVEX.128.66.0F38.W1 27 /rVPTESTMQ k2 {k1}, xmm2, xmm3/m128/m64bcstB有效有效以xmm2和AVX512F为单位的包装四字整数的位元AND)OR xmm3/m128/m64bcst并设置遮罩k2,以反映结果每个元素的AVX10.1零/非零状态,在写掩码 k1下.
EVEX.256.66.0F38.W1 27 /rVPTESTMQ k2 {k1}, ymm2, ymm3/m256/m64bcstB有效有效以ymm2和AVX512F为单位的包装四字整数的位元AND)OR ymm3/m256/m64bcst并设置遮罩k2,以反映结果每个元素的AVX10.1零/非零状态,在写掩码 k1下.
EVEX.512.66.0F38.W1 27 /rVPTESTMQ k2 {k1}, zmm2, zmm3/m512/m64bcstB有效有效在 zmm2 和 OR AVX10.1 zmm3/m512/m64bcst 中,用位元化的 AND 组合四字整数,并设置掩码 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 加载实测数据...

说明

在第一源操作数(第二个操作数)和第二源操作数(第三个操作数)上执行一个位元逻辑的AND操作,并将结果存储在写掩码下的目标操作数(第一个操作数). 如果第一个和第二个src 操作数中对应元素的位元AND为非零,则结果的每个位值被设定为1;否则被设定为0.

VPTESTMD/VPTESTMQ 坐标: 第一源操作数是一个ZMM/YMM/XMM登记册. 第二源操作数可以是ZMM/YMM/XMM的寄存器,512/256/128位内存位置或512/256/128位矢量从32/64位内存位置播出. 目标操作数是一个在写掩码下更新的面具寄存器.

VPTESTMB/VPTESTMW 坐标: 第一源操作数是一个ZMM/YMM/XMM登记册. 第二源操作数可以是ZMM/YMM/XMM登记器或512/256/128位内存位置. 目标操作数是一个在写掩码下更新的面具寄存器.

行动

VPTESTMB (EVEX encoded versions)

(KL, VL) = (16, 128), (32, 256), (64, 512)

FOR j := 0 TO KL-1

i := j * 8

IF k1[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

VPTESTMW (EVEX encoded versions)

(KL, VL) = (8, 128), (16, 256), (32, 512)

FOR j := 0 TO KL-1

i := j * 16

IF k1[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


VPTESTMD (EVEX encoded versions)

(KL, VL) = (4, 128), (8, 256), (16, 512)

FOR j := 0 TO KL-1

i := j * 32

IF k1[j] OR *no writemask*

     THEN

             IF (EVEX.b = 1) AND (SRC2 *is memory*)

                  THEN DEST[j] := (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

VPTESTMQ (EVEX encoded versions)

(KL, VL) = (2, 128), (4, 256), (8, 512)

FOR j := 0 TO KL-1

i := j * 64

IF k1[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++ 内在编译器

VPTESTMB __mmask64 _mm512_test_epi8_mask( __m512i a, __m512i b);
VPTESTMB __mmask64 _mm512_mask_test_epi8_mask(__mmask64, __m512i a, __m512i b);
VPTESTMW __mmask32 _mm512_test_epi16_mask( __m512i a, __m512i b);
VPTESTMW __mmask32 _mm512_mask_test_epi16_mask(__mmask32, __m512i a, __m512i b);
VPTESTMD __mmask16 _mm512_test_epi32_mask( __m512i a, __m512i b);
VPTESTMD __mmask16 _mm512_mask_test_epi32_mask(__mmask16, __m512i a, __m512i b);
VPTESTMQ __mmask8 _mm512_test_epi64_mask(__m512i a, __m512i b);
VPTESTMQ __mmask8 _mm512_mask_test_epi64_mask(__mmask8, __m512i a, __m512i b);

SIMD 浮点 例外

None.

其他例外

VPTESTMD/Q : (中文(简体) ). 参见表2-51,"Type E4类例外条件". VPTESTMB/W: 参见表2-51中的例外类型E4.nb,"类型E4类例外条件".

来源