VGATHERDPD, VGATHERQPD
使用 打包双精度浮点值 来集合
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
VEX.128.66.0F38.W1 92 /r | VGATHERDPD xmm1, vm32x, xmm2 | RMV | 有效 | 有效 | 使用 vm32x 中指定的dword 指数,从 xmm2 指定的口罩上附加条件的内存中收集 双精度浮点 值. 有条件收集的ele- ments 合并为 xmm1. |
VEX.128.66.0F38.W1 93 /r | VGATHERQPD xmm1, vm64x, xmm2 | RMV | 有效 | 有效 | 使用 vm64x 指定的qword 指数,从 xmm2 指定的掩码条件的内存中收集 双精度浮点 值. 有条件的集合ele- ments 合并为 xmm1. |
VEX.256.66.0F38.W1 92 /r | VGATHERDPD ymm1, vm32x, ymm2 | RMV | 有效 | 有效 | 使用 vm32x 中指定的dword 指数,从 ymm2 指定的口罩上附加条件的内存中收集 双精度浮点 值. 有条件收集的ele- ments 合并为 ymm1. |
VEX.256.66.0F38.W1 93 /r | VGATHERQPD ymm1, vm64y, ymm2 | RMV | 有效 | 有效 | 使用 vm64y 中指定的qword 指数,从 ymm2 指定的掩码条件的内存中收集 双精度浮点 值. 有条件的集合ele- ments 合并为 ymm1. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
RMV
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)BaseReg (R): VSIB:base,vex.vvvvlectura y escrituraVEX 前缀的 vvvv 字段(按位取反)
实测开销
正在从 arch-data 加载实测数据...
说明
指令从 内存操作数(第二个操作数)指定的内存地址上有条件地加载最多2或4 双精度浮点值,并使用qword指数. 内存操作数使用SIB字节的VSIB形式来指定一个通用的寄存器操作数作为共同的基数,相对于基数的一系列指数的矢量寄存器和一个恒定的尺度因子.
面具操作数(第三个操作数)指定了每个内存地址的有条件负载操作以及目标操作数(第一个操作数)每个数据元素的相应更新. 条件性由面具寄存器中每个数据元素中最显著的位指定. 如果元素的掩码位没有设置,则目的地寄存器的相应元素保持不变. 目的地寄存器和面具寄存器中数据元素的宽度相同. 整个口罩寄存器将被本指令设定为零,除非该指令导致例外.
使用面具寄存器下半部的dword指数,指令从VSIB地址内存操作数的双精度浮点中有条件地加载2或4双精度浮点值,并更新目的地寄存器.
如果至少有一个元素已经收集(即例外是由除最右侧有其遮罩比特集的元素以外的元素触发),此指令可以被例外中止. 发生这种情况时,目的地登记册和面具操作数被部分更新;那些已经收集到的元素被放置在目的地登记册中,并将他们的面具比特设定为零. 如果任何陷阱或中断从已经收集的元素中待决,它们将被交付来代替例外;在这种情况下,EFLAG.RF被设定为一个,因此在继续指令时,指令断点不会被重新触发.
如果数据大小和索引大小不同,则目的地登记册的一部分和面具登记册的一部分并不对应正在采集的任何元素. 本指令将这些部分设置为零。 即使指令触发了例外,即使指令在收集任何要素之前触发了例外,它也可能对其中一个或两个登记册这样做。
VEX.128 版本 : 指令将收集两个 双精度浮点 值 。 对于词条指数,只使用矢量指数登记册中较低的两个指数.
VEX.256 版本 : 该指令将收集四个 双精度浮点 值 。 对于词条指数,只使用矢量指数登记册中较低的四个指数.
注意:
- 如果索引、面具或目的地登记册中的任何一对是相同的,则本指令产生#UD的断层。 * 这些值可以按任何顺序从内存中读取. 内存命令和其他指令 遵循Intel -
64 内存订购模型.
- 过失以右向左的方式交付. 也就是说,如果一个错误是由一个元素引发并交付的,所有
离目的地LSB更近的元素将完成(和无故障). 离MSB更近的单个元素可能完成也可能不完成. 如果某一元素触发多个断层,则按常规顺序交付.
- 要件可以按任何顺序收集,但错误必须按右到左顺序交付;因此,要件必须按下列顺序提交:
在交付过失之前,可以收集过失的左边。 执行该指令可以重复--鉴于相同的输入值和建筑状态,将收集错误的指令左边相同的一组元素。
- 该指示不进行AC检查,因此永远不会造成AC故障。 如果地址大小属性为 16- bit, 此指令将会导致 #UD 。 如果 内存操作数 编码时没有 SIB 字节,此指令将会导致 #UD 。 * 此指令不应用于访问所绘制的内存 I/ O , 因为它命令了单个负载
执行是具体的,一些执行可能使用大于数据元素大小的负载或加载元素的不确定次数。
- 缩放索引可能比处理器使用的地址比特需要更多的比特表示(例如,32-
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;
VGATHERDPD (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;
VGATHERQPD (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 this instruction
FI;
MASK[i +63: i] := 0;
ENDFOR
DEST[MAXVL-1:128] := 0;
VGATHERQPD (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;
VGATHERDPD (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++ 内在编译器
VGATHERDPD: __m128d _mm_i32gather_pd (double const * base, __m128i index, const int scale);
VGATHERDPD: __m128d _mm_mask_i32gather_pd (__m128d src, double const * base, __m128i index, __m128d mask, const int scale);
VGATHERDPD: __m256d _mm256_i32gather_pd (double const * base, __m128i index, const int scale);
VGATHERDPD: __m256d _mm256_mask_i32gather_pd (__m256d src, double const * base, __m128i index, __m256d mask, const int scale);
VGATHERQPD: __m128d _mm_i64gather_pd (double const * base, __m128i index, const int scale);
VGATHERQPD: __m128d _mm_mask_i64gather_pd (__m128d src, double const * base, __m128i index, __m128d mask, const int scale);
VGATHERQPD: __m256d _mm256_i64gather_pd (double const * base, __m256i index, const int scale);
VGATHERQPD: __m256d _mm256_mask_i64gather_pd (__m256d src, double const * base, __m256i index, __m256d mask, const int scale);SIMD 浮点 例外
None.
其他例外
参见表2-2-27,"十二类例外条件".