VPGATHERDD, VPGATHERDQ
组合包装的词, 包装带有签名的词索引的词
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
EVEX.128.66.0F38.W0 90 /vsib | VPGATHERDD xmm1 {k1}, vm32x | A | 有效 | 有效 | 使用签名的dword指数,从内存中收集dword值AVX512F)OR AVX10.1,使用写掩码 k1进行合并-遮盖. |
EVEX.256.66.0F38.W0 90 /vsib | VPGATHERDD ymm1 {k1}, vm32y | A | 有效 | 有效 | 使用签名的dword指数,从内存中收集dword值AVX512F)OR AVX10.1,使用写掩码 k1进行合并-遮盖. |
EVEX.512.66.0F38.W0 90 /vsib | VPGATHERDD zmm1 {k1}, vm32z | A | 有效 | 有效 | 使用签名的dword索引,从内存中收集dword值OR AVX10.1,使用写掩码 k1进行合并-遮盖. |
EVEX.128.66.0F38.W1 90 /vsib | VPGATHERDQ xmm1 {k1}, vm32x | A | 有效 | 有效 | 使用签名的dword指数,从内存中收集四字值AVX512F)OR AVX10.1,使用写掩码 k1进行合并-遮盖. |
EVEX.256.66.0F38.W1 90 /vsib | VPGATHERDQ ymm1 {k1}, vm32x | A | 有效 | 有效 | 使用签名的dword指数,从内存中收集四字值AVX512F)OR AVX10.1,使用写掩码 k1进行合并-遮盖. |
EVEX.512.66.0F38.W1 90 /vsib | VPGATHERDQ zmm1 {k1}, vm32y | A | 有效 | 有效 | 使用签名的dword指数,从内存中收集四字值OR AVX10.1,使用写掩码 k1进行合并-遮盖. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)BaseReg (R): VSIB:base,
Tupla: Tuple1 Scalar
实测开销
正在从 arch-data 加载实测数据...
说明
集合了由基址BASE APDR和指数矢量VINDEX和比例尺SCALE指向的16或8个双字/quadword内存位置. 结果写入矢量zmm1. 元素通过 VSIB 指定(即索引寄存器为zmm,持有已打包的索引). 元素只有在相应的掩码位为一时才会被加载. 如果元素的掩码位没有设置,则目的地寄存器(zmm1)的相应元素保持不变. 整个口罩寄存器将被本指令设定为零,除非它触发例外.
如果至少有一个元素已经收集(即例外是由除最右侧有其遮罩比特集的元素以外的元素触发),此指令可以被例外中止. 发生这种情况时,目的地注册和面具注册(k1)会部分更新;那些已经收集到的元素会被放入目的地注册,并将他们的面具比特设定为零. 如果任何陷阱或中断从已经收集的元素中待决,它们将被交付来代替例外;在这种情况下,EFLAG.RF被设定为一个,因此在继续指令时,指令断点不会被重新触发.
如果数据元素大小小于索引元素大小,则目标寄存器和掩码寄存器的较高部分与正在采集的任何元素不对应. 本指令将较高部分设置为零。 它可以将这些未使用元素更新到其中一个或两个登记册,即使该指令触发了例外,即使该指令在收集任何元素之前触发了例外。
注意:
- 这些值可以按任何顺序从内存中读取. 内存命令和其他指令 遵循Intel -
64 内存订购模型.
- 过失以右向左的方式交付. 也就是说,如果一个错误是由一个元素引发并交付的,所有
离目的地zmm的LSB更近的元素将完成(和不故障). 离MSB更近的单个元素可能完成也可能不完成. 如果某一元素触发多个断层,则按常规顺序交付.
- 要件可以按任何顺序收集,但错误必须按右到左顺序交付;因此,要件必须按下列顺序提交:
在交付过失之前,可以收集过失的左边。 执行该指令可以重复--鉴于相同的输入值和建筑状态,将收集错误的指令左边相同的一组元素。
- 该指示不进行AC检查,因此永远不会造成AC故障。 16位有效地址无效 。 将带来#UD的过失. 由于 k1 中的 0 值是用来确定完成的,所以这些指令不接受零擦拭。
注意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
VPGATHERDD (EVEX encoded version)
(KL, VL) = (4, 128), (8, 256), (16, 512)
FOR j := 0 TO KL-1
i := j * 32
IF k1[j]
THEN DEST[i+31:i] := MEM[BASE_ADDR +
SignExtend(VINDEX[i+31:i]) * 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] := 0
VPGATHERDQ (EVEX encoded version)
(KL, VL) = (2, 128), (4, 256), (8, 512)
FOR j := 0 TO KL-1
i := j * 64
k := j * 32
IF k1[j]
THEN DEST[i+63:i] :=
MEM[BASE_ADDR + SignExtend(VINDEX[k+31:k]) * 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] := 0Intel C/C++ 内在编译器
VPGATHERDD __m512i _mm512_i32gather_epi32( __m512i vdx, void * base, int scale);
VPGATHERDD __m512i _mm512_mask_i32gather_epi32(__m512i s, __mmask16 k, __m512i vdx, void * base, int scale);
VPGATHERDD __m256i _mm256_mmask_i32gather_epi32(__m256i s, __mmask8 k, __m256i vdx, void * base, int scale);
VPGATHERDD __m128i _mm_mmask_i32gather_epi32(__m128i s, __mmask8 k, __m128i vdx, void * base, int scale);
VPGATHERDQ __m512i _mm512_i32logather_epi64( __m256i vdx, void * base, int scale);
VPGATHERDQ __m512i _mm512_mask_i32logather_epi64(__m512i s, __mmask8 k, __m256i vdx, void * base, int scale);
VPGATHERDQ __m256i _mm256_mmask_i32logather_epi64(__m256i s, __mmask8 k, __m128i vdx, void * base, int scale);
VPGATHERDQ __m128i _mm_mmask_i32gather_epi64(__m128i s, __mmask8 k, __m128i vdx, void * base, int scale);SIMD 浮点 例外
None.
其他例外
参见表2-63"Type E12类例外条件".