VPSHUFBITQMB

使用字节索引从四字节元素切换位数

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.0F38.W0 8F /rVPSHUFBITQMB k1{k2}, xmm2, xmm3/m128A有效有效使用 AND AVX512VL 的控制位点在 xmm2 中提取值 xmm3/m128 与 写掩码 k2 并离开 OR AVX10.1 生成掩码 k1.
EVEX.256.66.0F38.W0 8F /rVPSHUFBITQMB k1{k2}, ymm2, ymm3/m256A有效有效使用 AND AVX512VL 的控制位点在 ymm2 中提取值 ymm3/m256 与 写掩码 k2 并离开 OR AVX10.1 生成掩码 k1.
EVEX.512.66.0F38.W0 8F /rVPSHUFBITQMB k1{k2}, zmm2, zmm3/m512A有效有效使用 OR AVX10.1 zmm3/m512 与 写掩码 k2 的控制位点提取 zmm2 中的值,并将结果保存为 mask register 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

实测开销

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

说明

VPSHUFBITQMB 指令执行一个位集选择,使用第二个源作为控制,第一个源作为数据. 每个比特使用6个控制比特(2nd 源操作数)来选择要收集的数据比特(第一源操作数). 一个给定比特只能访问64个不同的比特数据(第一个64个目的地比特可以访问第一个64个数据比特,第二个64个目的地比特可以访问第二个64个数据比特等).

每个输出位的控制数据被存储在SRC2的8位元素中,但每个元素中只有6个最小的位.

本指令使用写掩码(仅零). 本指令支持内存断层抑制.

第一源操作数是一个ZMM登记册. 第二源操作数是一个ZMM的寄存器或内存位置. 目标操作数是一个面具寄存器.

行动

VPSHUFBITQMB DEST, SRC1, SRC2

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

FOR i := 0 TO KL/8-1:      //Qword

FOR j := 0 to 7:           // Byte

IF k2[i*8+j] or *no writemask*:

           m := SRC2.qword[i].byte[j] & 0x3F

           k1[i*8+j] := SRC1.qword[i].bit[m]

ELSE:

           k1[i*8+j] := 0

k1[MAX_KL-1:KL] := 0

Intel C/C++ 内在编译器

VPSHUFBITQMB __mmask16 _mm_bitshuffle_epi64_mask(__m128i, __m128i);
VPSHUFBITQMB __mmask16 _mm_mask_bitshuffle_epi64_mask(__mmask16, __m128i, __m128i);
VPSHUFBITQMB __mmask32 _mm256_bitshuffle_epi64_mask(__m256i, __m256i);
VPSHUFBITQMB __mmask32 _mm256_mask_bitshuffle_epi64_mask(__mmask32, __m256i, __m256i);
VPSHUFBITQMB __mmask64 _mm512_bitshuffle_epi64_mask(__m512i, __m512i);
VPSHUFBITQMB __mmask64 _mm512_mask_bitshuffle_epi64_mask(__mmask64, __m512i, __m512i);

来源