VPGATHERDQ, VPGATHERQQ

使用已签名的 Dword/ Qword 索引集合包装的字值

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
VEX.128.66.0F38.W1 90 /rVPGATHERDQ xmm1, vm32x, xmm2A有效有效使用 vm32x 指定的dword 指数,从以 xmm2 指定的面具为条件的内存中收集 qword val- ues. 有条件的集合元素被合并到 xmm1 中.
VEX.128.66.0F38.W1 91 /rVPGATHERQQ xmm1, vm64x, xmm2A有效有效使用 vm64x 指定的qword 索引,从以 xmm2 指定的面具为条件的内存中收集 qword val- ues. 有条件的集合元素被合并到 xmm1 中.
VEX.256.66.0F38.W1 90 /rVPGATHERDQ ymm1, vm32x, ymm2A有效有效使用 vm32x 指定的dword 指数,从以 ymm2 指定的面具为条件的内存中收集 qword val- ues. 有条件的集合元素被合并到 ymm1 中.
VEX.256.66.0F38.W1 91 /rVPGATHERQQ ymm1, vm64y, ymm2A有效有效使用vm64y中指定的qword指数,从以ymm2指定的面具为条件的内存中收集qword val-ues. 有条件的集合元素被合并为ymm1.

操作数编码

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

A

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. BaseReg (R): VSIB:base,
  3. vex.vvvv lectura y escrituraVEX 前缀的 vvvv 字段(按位取反)

实测开销

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

说明

指令从 内存操作数(第二个 操作数) 指定的内存地址上有条件地加载最多2或4qword 值,并使用 qword 指数. 内存操作数使用SIB字节的VSIB形式来指定一个通用的寄存器操作数作为共同的基数,相对于基数的一系列指数的矢量寄存器和一个恒定的尺度因子.

面具操作数(第三个操作数)指定了每个内存地址的有条件负载操作以及目标操作数(第一个操作数)每个数据元素的相应更新. 条件性由面具寄存器中每个数据元素中最显著的位指定. 如果元素的掩码位没有设置,则目的地寄存器的相应元素保持不变. 目的地寄存器和面具寄存器中数据元素的宽度相同. 整个口罩寄存器将被本指令设定为零,除非该指令导致例外.

使用面具寄存器下半部的dword指数,指令有条件地从VSIB地址内存操作数的VSIB加载最多2或4qword值,并更新目的地寄存器.

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

如果数据大小和索引大小不同,则目的地登记册的一部分和面具登记册的一部分并不对应正在采集的任何元素. 本指令将这些部分设置为零。 即使指令触发了例外,即使指令在收集任何要素之前触发了例外,它也可能对其中一个或两个登记册这样做。

VEX.128 版本 : 指令将收集两个qword值. 对于词条指数,只使用矢量指数登记册中较低的两个指数.

VEX.256 版本 : 该指令将收集四个qword值. 对于词条指数,只使用矢量指数登记册中较低的四个指数.

注意:

64 内存订购模型.

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

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

执行是具体的,一些执行可能使用大于数据元素大小的负载或加载元素的不确定次数。

bit 模式,如果比例大于一个。 在这种情况下,除了地址位数之外,最重要的位数会被忽略.

行动

DEST := SRC1;
BASE_ADDR: base register encoded in VSIB addressing;
VINDEX: the vector index register encoded by VSIB addressing;
SCALE: scale factor encoded by SIB:[7:6];
DISP: optional 1, 4 byte displacement;
MASK := SRC3;

VPGATHERDQ (VEX.128 version)
MASK[MAXVL-1:128] := 0;
FOR j := 0 to 1

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 1
    k := j * 32;
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX[k+31:k])*SCALE + DISP);
    IF MASK[63+i] THEN

          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits the instruction
    FI;
    MASK[i +63:i] := 0;
ENDFOR
DEST[MAXVL-1:128] := 0;


VPGATHERQQ (VEX.128 version)
MASK[MAXVL-1:128] := 0;
FOR j := 0 to 1

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 1
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX1[i+63:i])*SCALE + DISP);
    IF MASK[63+i] THEN

          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits the instruction
    FI;
    MASK[i +63:i] := 0;
ENDFOR
DEST[MAXVL-1:128] := 0;

VPGATHERQQ (VEX.256 version)
MASK[MAXVL-1:256] := 0;
FOR j := 0 to 3

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 3
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX1[i+63:i])*SCALE + DISP);
    IF MASK[63+i] THEN

          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits the instruction
    FI;
    MASK[i +63:i] := 0;
ENDFOR
DEST[MAXVL-1:256] := 0;

VPGATHERDQ (VEX.256 version)
MASK[MAXVL-1:256] := 0;
FOR j := 0 to 3

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 3
    k := j * 32;
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX1[k+31:k])*SCALE + DISP);


    IF MASK[63+i] THEN
          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits the instruction

    FI;
    MASK[i +63:i] := 0;
ENDFOR
DEST[MAXVL-1:256] := 0;

Intel C/C++ 内在编译器

VPGATHERDQ: __m128i _mm_i32gather_epi64 (__int64 const * base, __m128i index, const int scale);
VPGATHERDQ: __m128i _mm_mask_i32gather_epi64 (__m128i src, __int64 const * base, __m128i index, __m128i mask, const int scale);
VPGATHERDQ: __m256i _mm256_i32gather_epi64 (__int64 const * base, __m128i index, const int scale);
VPGATHERDQ: __m256i _mm256_mask_i32gather_epi64 (__m256i src, __int64 const * base, __m128i index, __m256i mask, const int scale);
VPGATHERQQ: __m128i _mm_i64gather_epi64 (__int64 const * base, __m128i index, const int scale);
VPGATHERQQ: __m128i _mm_mask_i64gather_epi64 (__m128i src, __int64 const * base, __m128i index, __m128i mask, const int scale);
VPGATHERQQ: __m256i _mm256_i64gather_epi64 __(int64 const * base, __m256i index, const int scale);
VPGATHERQQ: __m256i _mm256_mask_i64gather_epi64 (__m256i src, __int64 const * base, __m256i index, __m256i mask, const int scale);

SIMD 浮点 例外

None.

其他例外

参见表2-2-27,"十二类例外条件".

来源