VFIXUPIMMPD
修复特殊包装浮点64值
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
EVEX.128.66.0F3A.W1 54 /r ib | VFIXUPIMMPD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst, imm8 | A | 有效 | 有效 | 在浮点64矢量xmm1,AVX512F)OR浮点64矢量xmm2和int64矢量AVX10.1xmm3/m128/m64bcst中固定特殊编号,并将结果存储在xmm1,在写掩码下. |
EVEX.256.66.0F3A.W1 54 /r ib | VFIXUPIMMPD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst, imm8 | A | 有效 | 有效 | 在浮点64矢量ymm1,AVX512F)OR浮点64矢量ymm2和int64矢量AVX10.1ymm3/m256/m64bcst中固定特殊编号,并将结果存储在ymm1,在写掩码下. |
EVEX.512.66.0F3A.W1 54 /r ib | VFIXUPIMMPD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst{sae}, imm8 | A | 有效 | 有效 | 使用 OR AVX10.1 int64 矢量表在 zmm3/m512/m64bcst 中修复 zmm2中浮力64 矢量的元素,与 zmm1中保存的元素结合,并将结果存储在 zmm1中. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)evex.vvvvlecturaEVEX 前缀的 vvvv 字段(按位取反)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移imm8指令后的立即数字节
Tupla: Full
实测开销
正在从 arch-data 加载实测数据...
说明
使用在第二源操作(第三源操作)对应的四字元素中指定的32位双层仰视表,在第一源操作(第二源操作)中以双精度浮点格式编码的四字元素进行修复,但报告规格为imm8的除外. 固定的元素由 opmask k1 中指定的 1 的掩码位选择. Opmask k1或表响应动作0000b中的遮罩比特0保留了第一个操作数的相应元素. 来自第一源操作数的固定元件和第一个操作数中保存的元件被合并为目标操作数(第一个操作数)中的最后结果.
目的地和第一个源操作数是ZMM/YMM/XMM登记册. 第二源操作数可以是ZMM/YMM/XMM的寄存器,512/256/128位内存位置或512/256/128位向量从64位内存位置广播.
双层浏览表通过将输入数据编码为8个令牌类型,对第一个源操作中的每个双精度浮点输入数据进行修复. 对第一源操作数中以16个响应动作之一转换输入编码的每个符号类型都定义了一个响应表.
本指令专门用于确定涉及一个源的算术计算结果,使其与光谱相匹配,虽然它一般有助于确定多指令序列的结果,以反映特殊数字输入. 例如,考虑rcp(0). 输入 0 到 rcp,您应该根据 DX10 的光谱得到 INF 。 然而,通过牛顿-拉弗森(Newton-Raphson)来评价rcp,其中x=约(1/0)产生不正确的结果. 为了处理这个问题,VFIXUPIMMPD可以在N-R对等序列后用于设定结果为正确的值(即输入为0时的INF).
如果MXCSR.DAZ没有设置,则第一源操作数中的异常输入元素被认为是正常输入,不会触发任何修复或故障报告.
Imm8用于设定所需的旗帜报告. 它支持#ZE和#IE断层报告(详见下文).
MXCSR 面具比特被忽略,并被当作所有面具比特被设定为面具反应. 如果设置了imm8比特,并且满足了错误报告的条件,则MXCSR.IE或MXCSR.ZE可能会被更新.
此指令被写入, 因此只有那些在矢量掩码中的对应比特设置的元素 k1 被计算并存储到 zmm1 中. 目的地中在 k1 中对应的比特清晰的元素保留其先前的值或被设定为 0 。
行动
enum TOKEN_TYPE
{
QNAN_TOKEN := 0,
SNAN_TOKEN := 1,
ZERO_VALUE_TOKEN := 2,
POS_ONE_VALUE_TOKEN := 3,
NEG_INF_TOKEN := 4,
POS_INF_TOKEN := 5,
NEG_VALUE_TOKEN := 6,
POS_VALUE_TOKEN := 7
}
FIXUPIMM_DP (dest[63:0], src1[63:0],tbl3[63:0], imm8 [7:0]){
tsrc[63:0] := ((src1[62:52] = 0) AND (MXCSR.DAZ =1)) ? 0.0 : src1[63:0]
CASE(tsrc[63:0] of TOKEN_TYPE) {
QNAN_TOKEN: j := 0;
SNAN_TOKEN: j := 1;
ZERO_VALUE_TOKEN: j := 2;
POS_ONE_VALUE_TOKEN: j := 3;
NEG_INF_TOKEN: j := 4;
POS_INF_TOKEN: j := 5;
NEG_VALUE_TOKEN: j := 6;
POS_VALUE_TOKEN: j := 7;
} ; end source special CASE(tsrc...)
; The required response from src3 table is extracted
token_response[3:0] = tbl3[3+4*j:4*j];
CASE(token_response[3:0]) {
0000: dest[63:0] := dest[63:0]; ; preserve content of DEST
0001: dest[63:0] := tsrc[63:0]; ; pass through src1 normal input value, denormal as zero
0010: dest[63:0] := QNaN(tsrc[63:0]);
0011: dest[63:0] := QNAN_Indefinite;
0100: dest[63:0] := -INF;
0101: dest[63:0] := +INF;
0110: dest[63:0] := tsrc.sign? INF : +INF;
0111: dest[63:0] := -0;
1000: dest[63:0] := +0;
1001: dest[63:0] := -1;
1010: dest[63:0] := +1;
1011: dest[63:0] := 1/2;
1100: dest[63:0] := 90.0;
1101: dest[63:0] := PI/2;
1110: dest[63:0] := MAX_FLOAT;
1111: dest[63:0] := -MAX_FLOAT;
} ; end of token_response CASE
; The required fault reporting from imm8 is extracted
; TOKENs are mutually exclusive and TOKENs priority defines the order.
; Multiple faults related to a single token can occur simultaneously.
IF (tsrc[63:0] of TOKEN_TYPE: ZERO_VALUE_TOKEN) AND imm8[0] then set #ZE;
IF (tsrc[63:0] of TOKEN_TYPE: ZERO_VALUE_TOKEN) AND imm8[1] then set #IE;
IF (tsrc[63:0] of TOKEN_TYPE: ONE_VALUE_TOKEN) AND imm8[2] then set #ZE;
IF (tsrc[63:0] of TOKEN_TYPE: ONE_VALUE_TOKEN) AND imm8[3] then set #IE;
IF (tsrc[63:0] of TOKEN_TYPE: SNAN_TOKEN) AND imm8[4] then set #IE;
IF (tsrc[63:0] of TOKEN_TYPE: NEG_INF_TOKEN) AND imm8[5] then set #IE;
IF (tsrc[63:0] of TOKEN_TYPE: NEG_VALUE_TOKEN) AND imm8[6] then set #IE;
IF (tsrc[63:0] of TOKEN_TYPE: POS_INF_TOKEN) AND imm8[7] then set #IE;
; end fault reporting
return dest[63:0];
} ; end of FIXUPIMM_DP()
VFIXUPIMMPD
(KL, VL) = (2, 128), (4, 256), (8, 512)
FOR j := 0 TO KL-1
i := j * 64
IF k1[j] OR *no writemask*
THEN
IF (EVEX.b = 1) AND (SRC2 *is memory*)
THEN
DEST[i+63:i] := FIXUPIMM_DP(DEST[i+63:i], SRC1[i+63:i], SRC2[63:0], imm8 [7:0])
ELSE
DEST[i+63:i] := FIXUPIMM_DP(DEST[i+63:i], SRC1[i+63:i], SRC2[i+63:i], imm8 [7:0])
FI;
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+63:i] remains unchanged*
ELSE DEST[i+63:i] := 0 ; zeroing-masking
FI
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0
Immediate Control Description:
76543210
+ INF #IE
- VE #IE
- INF #IE
SNaN #IE
ONE #IE
ONE #ZE
ZERO #IE
ZERO #ZE
Figure 5-9. VFIXUPIMMPD Immediate Control DescriptionIntel C/C++ 内在编译器
VFIXUPIMMPD __m512d _mm512_fixupimm_pd( __m512d a, __m512d b, __m512i c, int imm8);
VFIXUPIMMPD __m512d _mm512_mask_fixupimm_pd(__m512d a, __mmask8 k, __m512d b, __m512i c, int imm8);
VFIXUPIMMPD __m512d _mm512_maskz_fixupimm_pd( __mmask8 k, __m512d a, __m512d b, __m512i c, int imm8);
VFIXUPIMMPD __m512d _mm512_fixupimm_round_pd( __m512d a, __m512d b, __m512i c, int imm8, int sae);
VFIXUPIMMPD __m512d _mm512_mask_fixupimm_round_pd(__m512d a, __mmask8 k, __m512d b, __m512i c, int imm8, int sae);
VFIXUPIMMPD __m512d _mm512_maskz_fixupimm_round_pd( __mmask8 k, __m512d a, __m512d b, __m512i c, int imm8, int sae);
VFIXUPIMMPD __m256d _mm256_fixupimm_pd( __m256d a, m256d b, __m256i c, int imm8);
VFIXUPIMMPD __m256d _mm256_mask_fixupimm_pd(__m256d a, __mmask8 k, __m256d b, __m256i c, int imm8);
VFIXUPIMMPD __m256d _mm256_maskz_fixupimm_pd( __mmask8 k, __m256d a, __m256d b, __m256i c, int imm8);
VFIXUPIMMPD __m128d _mm_fixupimm_pd( __m128d a, __m128d b, __m128i c, int imm8);
VFIXUPIMMPD __m128d _mm_mask_fixupimm_pd(__m128d a, __mmask8 k, __m128d b, __m128i c, int imm8);
VFIXUPIMMPD __m128d _mm_maskz_fixupimm_pd( __mmask8 k, __m128d a, __m128d b, __m128i c, int imm8);SIMD 浮点 例外
Zero, Invalid.
其他例外
见表2-48"E2类例外条件"。