VPMULTISHIFTQB

从四字形源选择包装的未对齐字节

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.0F38.W1 83 /rVPMULTISHIFTQB xmm1 {k1}{z}, xmm2,xmm3/m128/m64bcstA有效有效从 AVX512 VBMI 中的qwords 中选择不匹配的字节xmm3/m128/m64bcst 在 OR 中使用控制字节AVX10.1 xmm2,将字节结果写入xmm1下级k1.
EVEX.256.66.0F38.W1 83 /rVPMULTISHIFTQB ymm1 {k1}{z}, ymm2,ymm3/m256/m64bcstA有效有效从 AVX512 VBMI 中的qwords 中选择不匹配的字节ymm3/m256/m64bcst 在 OR 中使用控制字节AVX10.1 ymm2,将字节结果写入ymm1下级k1.
EVEX.512.66.0F38.W1 83 /rVPMULTISHIFTQB zmm1 {k1}{z}, zmm2,zmm3/m512/m64bcstA有效有效在 OR AVX10.1 zmm3/m512/m64bcst 中使用 zmm2 中的控制字节,从qwords中选择不匹配字节,在 k1 下将字节结果写入 zmm1.

操作数编码

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

实测开销

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

说明

本指令从第二源操作数(第三个操作数)的每个输入qword元素中选择8个不匹配的字节,并在目标操作数(第一个操作数)中为每个qword元素写入8个组装的字节. 每个字节结果在第一源操作数(第二个操作数)对应的qword元素内使用一个字节-granular移位控制来选择. 目标操作数的每个字节结果在写掩码 k1下更新.

只使用每个控制字节的低6位来选择一个8位的槽,从第二源操作数的qword数据中提取输出字节. 8位位槽的起始位点相对于任意字节边界可以不匹配,从控制位点低6位指定位置的输入qword源中提取. 如果8位槽将超过qword边界,则8位槽的出界部分会被包回,从输入qword元素的比特0开始.

第一源操作数是一个ZMM/YMM/XMM登记册. 第二源操作数可以是ZMM/YMM/XMM的寄存器,512/256/128位内存位置或512/256/128位向量从64位内存位置广播. 目标操作数是一个ZMM/YMM/XMM登记册.

行动

VPMULTISHIFTQB DEST, SRC1, SRC2 (EVEX encoded version)
(KL, VL) = (2, 128),(4, 256), (8, 512)
FOR i := 0 TO KL-1

    IF EVEX.b=1 AND src2 is memory THEN
                tcur := src2.qword[0]; //broadcasting

    ELSE
                tcur := src2.qword[i];

    FI;
    FOR j := 0 to 7

          ctrl := src1.qword[i].byte[j] & 63;
          FOR k := 0 to 7

                res.bit[k] := tcur.bit[ (ctrl+k) mod 64 ];
          ENDFOR
          IF k1[i*8+j] or no writemask THEN

                DEST.qword[i].byte[j] := res;
          ELSE IF zeroing-masking THEN

                DEST.qword[i].byte[j] := 0;
    ENDFOR
ENDFOR
DEST.qword[MAX_VL-1:VL] := 0;

Intel C/C++ 内在编译器

VPMULTISHIFTQB __m512i _mm512_multishift_epi64_epi8( __m512i a, __m512i b);
VPMULTISHIFTQB __m512i _mm512_mask_multishift_epi64_epi8(__m512i s, __mmask64 k, __m512i a, __m512i b);
VPMULTISHIFTQB __m512i _mm512_maskz_multishift_epi64_epi8( __mmask64 k, __m512i a, __m512i b);
VPMULTISHIFTQB __m256i _mm256_multishift_epi64_epi8( __m256i a, __m256i b);
VPMULTISHIFTQB __m256i _mm256_mask_multishift_epi64_epi8(__m256i s, __mmask32 k, __m256i a, __m256i b);
VPMULTISHIFTQB __m256i _mm256_maskz_multishift_epi64_epi8( __mmask32 k, __m256i a, __m256i b);
VPMULTISHIFTQB __m128i _mm_multishift_epi64_epi8( __m128i a, __m128i b);
VPMULTISHIFTQB __m128i _mm_mask_multishift_epi64_epi8(__m128i s, __mmask8 k, __m128i a, __m128i b);
VPMULTISHIFTQB __m128i _mm_maskz_multishift_epi64_epi8( __mmask8 k, __m128i a, __m128i b);

SIMD 浮点 例外

None.

其他例外

参见表2-52"Type E4NF类例外条件".

来源