VPGATHERQD, VPGATHERQQ

组合包装的字, 带有签名的字索引的包装字

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.0F38.W0 91 /vsibVPGATHERQD xmm1 {k1}, vm64xA有效有效使用签名的qword指数,从内存中收集dword值AVX512F)OR AVX10.1,使用写掩码 k1进行合并-遮盖.
EVEX.256.66.0F38.W0 91 /vsibVPGATHERQD xmm1 {k1}, vm64yA有效有效使用签名的qword指数,从内存中收集dword值AVX512F)OR AVX10.1,使用写掩码 k1进行合并-遮盖.
EVEX.512.66.0F38.W0 91 /vsibVPGATHERQD ymm1 {k1}, vm64zA有效有效使用签名的qword索引,从内存中收集dword值OR AVX10.1,使用写掩码 k1进行合并-遮盖.
EVEX.128.66.0F38.W1 91 /vsibVPGATHERQQ xmm1 {k1}, vm64xA有效有效使用签名的qword指数,从内存中收集四字形的AVX512F) OR AVX10.1值,使用写掩码 k1进行合并-遮盖.
EVEX.256.66.0F38.W1 91 /vsibVPGATHERQQ ymm1 {k1}, vm64yA有效有效使用签名的qword指数,从内存中收集四字形的AVX512F) OR AVX10.1值,使用写掩码 k1进行合并-遮盖.
EVEX.512.66.0F38.W1 91 /vsibVPGATHERQQ zmm1 {k1}, vm64zA有效有效使用已签名的qword指数,从内存中收集四字 OR AVX10.1 值,使用 写掩码 k1 进行合并-混音.

操作数编码

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

A

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. BaseReg (R): VSIB:base,

Tupla: Tuple1 Scalar

实测开销

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

说明

集合了由BASE APDR和带有SCALE尺度的索引矢量VINDEX指向的8个双字/quadword内存位置. 结果被写入矢量寄存器中. 元素通过VSIB指定(即索引寄存器是矢量寄存器,持有打包指数). 元素只有在相应的掩码位为一时才会被加载. 如果元素的掩码位没有设置,则目的地寄存器的相应元素保持不变. 整个口罩寄存器将被本指令设定为零,除非它触发例外.

如果至少有一个元素已经收集(即例外是由除最右侧有其遮罩比特集的元素以外的元素触发),此指令可以被例外中止. 发生这种情况时,目的地注册和面具注册(k1)会部分更新;那些已经收集到的元素会被放入目的地注册,并将他们的面具比特设定为零. 如果任何陷阱或中断从已经收集的元素中待决,它们将被交付来代替例外;在这种情况下,EFLAG.RF被设定为一个,因此在继续指令时,指令断点不会被重新触发.

如果数据元素大小小于索引元素大小,则目标寄存器和掩码寄存器的较高部分与正在采集的任何元素不对应. 本指令将较高部分设置为零。 它可以将这些未使用元素更新到其中一个或两个登记册,即使该指令触发了例外,即使该指令在收集任何元素之前触发了例外。

注意:

64 内存订购模型.

离目的地zmm的LSB更近的元素将完成(和不故障). 离MSB更近的单个元素可能完成也可能不完成. 如果某一元素触发多个断层,则按常规顺序交付.

在交付过失之前,可以收集过失的左边。 执行该指令可以重复--鉴于相同的输入值和建筑状态,将收集错误的指令左边相同的一组元素。

注意VSIB字节的存在在本指令中执行. 因此,如果 ModRM.rm 与 100b 不同, 指令将会有 #UD 错误 。

本指令有与标量指令(Tuple 1)相同的Disp8*N和对齐规则.

如果目的地矢量zmm1与指数矢量VINDEX相同,则指令会#UD断层. 如果指定 k0 口罩寄存器, 指令会显示 #UD 错误 。

缩放索引可能比处理器使用的地址比特需要更多的比特表示(例如,在32位模式下,如果比特大于一个). 在这种情况下,除了地址位数之外,最重要的位数会被忽略.

行动

BASE_ADDR stands for the memory operand base address (a GPR); may not exist
VINDEX stands for the memory operand vector of indices (a ZMM register)
SCALE stands for the memory operand scalar (1, 2, 4 or 8)
DISP is the optional 1 or 4 byte displacement

VPGATHERQD (EVEX encoded version)

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

FOR j := 0 TO KL-1

i := j * 32

k := j * 64

IF k1[j]

     THEN DEST[i+31:i] := MEM[BASE_ADDR + (VINDEX[k+63:k]) * SCALE + DISP]

             k1[j] := 0

     ELSE *DEST[i+31:i] := remains unchanged*  ; Only merging masking is allowed

FI;

ENDFOR

k1[MAX_KL-1:KL] := 0

DEST[MAXVL-1:VL/2] := 0

VPGATHERQQ (EVEX encoded version)

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

FOR j := 0 TO KL-1

i := j * 64

IF k1[j]

     THEN DEST[i+63:i] :=

             MEM[BASE_ADDR + (VINDEX[i+63:i]) * SCALE + DISP]

             k1[j] := 0

     ELSE *DEST[i+63:i] := remains unchanged*  ; Only merging masking is allowed

FI;

ENDFOR

k1[MAX_KL-1:KL] := 0

DEST[MAXVL-1:VL] := 0

Intel C/C++ 内在编译器

VPGATHERQD __m256i _mm512_i64gather_epi32(__m512i vdx, void * base, int scale);
VPGATHERQD __m256i _mm512_mask_i64gather_epi32lo(__m256i s, __mmask8 k, __m512i vdx, void * base, int scale);
VPGATHERQD __m128i _mm256_mask_i64gather_epi32lo(__m128i s, __mmask8 k, __m256i vdx, void * base, int scale);
VPGATHERQD __m128i _mm_mask_i64gather_epi32(__m128i s, __mmask8 k, __m128i vdx, void * base, int scale);
VPGATHERQQ __m512i _mm512_i64gather_epi64( __m512i vdx, void * base, int scale);
VPGATHERQQ __m512i _mm512_mask_i64gather_epi64(__m512i s, __mmask8 k, __m512i vdx, void * base, int scale);
VPGATHERQQ __m256i _mm256_mask_i64gather_epi64(__m256i s, __mmask8 k, __m256i vdx, void * base, int scale);
VPGATHERQQ __m128i _mm_mask_i64gather_epi64(__m128i s, __mmask8 k, __m128i vdx, void * base, int scale);

SIMD 浮点 例外

None.

其他例外

参见表2-63"Type E12类例外条件".

来源