VP4DPWSSDS

带有填字积累和饱和的署名词的点产品

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.512.F2.0F38.W0 53 /rVP4DPWSSDS zmm1{k1}{z}, zmm2+3, m128A有效有效从源寄存器块中以 zmm2 表示的签名单词由 m128 表示,并用 zmm1 中签名的饱和度来累积由此产生的填字结果.

操作数编码

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

A

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

实测开销

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

说明

本指令计算了两个签名单词操作数的4个顺序注册源块点产品,并带有双字累积和签名饱和. 内存操作数在四个步骤中每个步骤按顺序选择.

在上述框中,使用"+3"的标记来表示该指令基于操作数的4源注册;来源是连续的,从4个边界的多个开始,并包含编码的注册号操作数.

本指令支持内存断层抑制. 内存操作数如果将口罩中最低的16位中的任何位设为1,或者使用"无口罩"编码,则全部装入.

Tuple类型Tuple1 4X意味着四个32位元素(16字节)被本指令的内存操作部分引用.

行动

src_reg_id is the 5 bit index of the vector register specified in the instruction as the src1 register.

VP4DPWSSDS dest, src1, src2
(KL,VL) = (16,512)
N := 4

ORIGDEST := DEST
src_base := src_reg_id & ~ (N-1) // for src1 operand

FOR i := 0 to KL-1:
    IF k1[i] or *no writemask*:
         FOR m := 0 to N-1:
               t := SRC2.dword[m]
               p1dword := reg[src_base+m].word[2*i] * t.word[0]
               p2dword := reg[src_base+m].word[2*i+1] * t.word[1]
               DEST.dword[i] := SIGNED_DWORD_SATURATE(DEST.dword[i] + p1dword + p2dword)
    ELSE IF *zeroing*:
         DEST.dword[i] := 0
    ELSE
         DEST.dword[i] := ORIGDEST.dword[i]

DEST[MAX_VL-1:VL] := 0

Intel C/C++ 内在编译器

VP4DPWSSDS __m512i _mm512_4dpwssds_epi32(__m512i, __m512ix4, __m128i *);
VP4DPWSSDS __m512i _mm512_mask_4dpwssds_epi32(__m512i, __mmask16, __m512ix4, __m128i *);
VP4DPWSSDS __m512i _mm512_maskz_4dpwssds_epi32(__mmask16, __m512i, __m512ix4, __m128i *);

SIMD 浮点 例外

None.

其他例外

See Type E4; additionally:

#UD               If the EVEX broadcast bit is set to 1.
#UD               If the MODRM.mod = 0b11.

来源