VGATHERDPS, VGATHERDPD

组合包装单笔, 包式双笔, 有签名的字词索引

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.0F38.W0 92 /vsibVGATHERDPS xmm1 {k1}, vm32xA有效有效使用签名的dword指数,从内存中收集单精度AVX512F)OR AVX10.1浮点值,使用k1作为完成面罩.
EVEX.256.66.0F38.W0 92 /vsibVGATHERDPS ymm1 {k1}, vm32yA有效有效使用签名的dword指数,从内存中收集单精度AVX512F)OR AVX10.1浮点值,使用k1作为完成面罩.
EVEX.512.66.0F38.W0 92 /vsibVGATHERDPS zmm1 {k1}, vm32zA有效有效使用签名的dword指数,从内存中收集单精度OR AVX10.1 浮点值,使用k1作为完成面罩.
EVEX.128.66.0F38.W1 92 /vsibVGATHERDPD xmm1 {k1}, vm32xA有效有效使用署名的dword指数,将浮动64矢量收集到AVX512F) R AVX10.11 浮动64矢量xmm1 使用k1作为完成掩码.
EVEX.256.66.0F38.W1 92 /vsibVGATHERDPD ymm1 {k1}, vm32xA有效有效使用签名的dword指数,将浮点64向量收集到 AVX512F) OR 浮点64向量 ymm1 使用 k1 作为完成掩码. AVX10.1
EVEX.512.66.0F38.W1 92 /vsibVGATHERDPD zmm1 {k1}, vm32yA有效有效使用签名的dword指数,将浮标64向量收集到OR AVX10.1浮标64向量zmm1中,使用k1作为完成掩码.

操作数编码

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

A

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

Tupla: Tuple1 Scalar

实测开销

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

说明

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

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

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

注意:

64 内存订购模型.

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

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

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

本指令有特殊的Disp8*N和对齐规则. N被认为是单个矢量元素的大小.

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

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

行动

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

VGATHERDPS (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*
    FI;
ENDFOR
k1[MAX_KL-1:KL] := 0
DEST[MAXVL-1:VL] := 0

VGATHERDPD (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*
    FI;
ENDFOR
k1[MAX_KL-1:KL] := 0
DEST[MAXVL-1:VL] := 0

Intel C/C++ 内在编译器

VGATHERDPD __m512d _mm512_i32gather_pd( __m256i vdx, void * base, int scale);
VGATHERDPD __m512d _mm512_mask_i32gather_pd(__m512d s, __mmask8 k, __m256i vdx, void * base, int scale);
VGATHERDPD __m256d _mm256_mmask_i32gather_pd(__m256d s, __mmask8 k, __m128i vdx, void * base, int scale);
VGATHERDPD __m128d _mm_mmask_i32gather_pd(__m128d s, __mmask8 k, __m128i vdx, void * base, int scale);
VGATHERDPS __m512 _mm512_i32gather_ps( __m512i vdx, void * base, int scale);
VGATHERDPS __m512 _mm512_mask_i32gather_ps(__m512 s, __mmask16 k, __m512i vdx, void * base, int scale);
VGATHERDPS __m256 _mm256_mmask_i32gather_ps(__m256 s, __mmask8 k, __m256i vdx, void * base, int scale);
GATHERDPS __m128 _mm_mmask_i32gather_ps(__m128 s, __mmask8 k, __m128i vdx, void * base, int scale);

SIMD 浮点 例外

None.

其他例外

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

来源