VGETEXPPH

将包装的 FP16 值转换为 FP16 值

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
EVEX.128.66.MAP6.W0 42 /rVGETEXPPH xmm1{k1}{z}, xmm2/m128/m16bcstA有效有效将来源 AND AVX512VL 中的 FP16 值的表达符转换为 FP16 的结果,表示无偏倚的 OR AVX10.1 整数表达符,并将结果存储在目标寄存符中,以写入 k1 。
EVEX.256.66.MAP6.W0 42 /rVGETEXPPH ymm1{k1}{z}, ymm2/m256/m16bcstA有效有效将来源 AND AVX512VL 中的 FP16 值的表达符转换为 FP16 的结果,表示无偏倚的 OR AVX10.1 整数表达符,并将结果存储在目标寄存符中,以写入 k1 。
EVEX.512.66.MAP6.W0 42 /rVGETEXPPH zmm1{k1}{z}, zmm2/m512/m16bcst {sae}A有效有效将来源 OR AVX10.1 操作数 中的 FP16 值的参数转换为 FP16 的结果,表示无偏差的整数参数,并将结果存储在受 写掩码 k1 约束的目的地寄存器中.

操作数编码

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

A

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

Tupla: Full

实测开销

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

说明

本指令从源操作数(第二个操作数)每个词元的正态化的FP16表示法中提取出偏差的表示法,作为无偏差的签名整数,或者将输入数据的非正常表示法转换为无偏差的负整数. 无偏差代词的每个整数值被转换成FP16值,并将目标操作数(第一个操作数)的相应单词元素写成FP16数字.

目的地元素根据写掩码更新.

每个 GETEXP 操作将表示值转换为 浮点 数字(在非正常表示中允许输入值). 输入值的特殊情况见表5-8。

The formula is:

GETEXP(x) = 地板(log2(Xx|)) 标记地板(x) 代表最大整数不超过实际数字x.

VGETEXPxx和VGETMANTxxx指令的软件使用一般涉及GETEXP操作和GETMANT操作的组合(参见VGETMANTPH). 因此,VGETEXPPH指令对句柄 SIMD 浮点的例外不需要软件.

VGETEXPPH/VGETEXPSH 特殊情况

输入 操作数结果评论
src1=纳恩QNaN( 弧1)
0 < |src1| < INF楼层(log2(|src1|))如果(SRC = SNaN),则#IE.
| src1| = +INF+INF如果(SRC = 异常),则#DE.
| src1| = 0-INF

行动

def normalize_exponent_tiny_fp16(src):

jbit := 0

// src & dst are FP16 numbers with sign(1b), exp(5b) and fraction (10b) fields

dst.exp := 1                    // write bits 14:10

dst.fraction := src.fraction // copy bits 9:0

while jbit == 0:

       jbit := dst.fraction[9]  // msb of the fraction

       dst.fraction := dst.fraction << 1

       dst.exp := dst.exp - 1

dst.fraction := 0

return dst

def getexp_fp16(src):

src.sign := 0                   // make positive

exponent_all_ones := (src[14:10] == 0x1F)

exponent_all_zeros := (src[14:10] == 0)

mantissa_all_zeros := (src[9:0] == 0)

zero := exponent_all_zeros and mantissa_all_zeros

signaling_bit := src[9]

nan := exponent_all_ones and not(mantissa_all_zeros)
snan := nan and not(signaling_bit)
qnan := nan and signaling_bit
positive_infinity := not(negative) and exponent_all_ones and mantissa_all_zeros
denormal := exponent_all_zeros and not(mantissa_all_zeros)

if nan:

       if snan:

           MXCSR.IE := 1

       return qnan(src)         // convert snan to a qnan

if positive_infinity:

       return src

if zero:

       return -INF

if denormal:

       tmp := normalize_exponent_tiny_fp16(src)

       MXCSR.DE := 1

else:

       tmp := src

tmp := SAR(tmp, 10)             // shift arithmetic right

tmp := tmp - 15                 // subtract bias

return convert_integer_to_fp16(tmp)


VGETEXPPH dest{k1}, src
VL = 128, 256 or 512
KL := VL/16

FOR i := 0 to KL-1:
    IF k1[i] or *no writemask*:
          IF SRC is memory and (EVEX.b = 1):
                tsrc := src.fp16[0]
          ELSE:
                tsrc := src.fp16[i]
          DEST.fp16[i] := getexp_fp16(tsrc)
    ELSE IF *zeroing*:
          DEST.fp16[i] := 0
    //else DEST.fp16[i] remains unchanged

DEST[MAXVL-1:VL] := 0

Intel C/C++ 内在编译器

VGETEXPPH __m128h _mm_getexp_ph (__m128h a);
VGETEXPPH __m128h _mm_mask_getexp_ph (__m128h src, __mmask8 k, __m128h a);
VGETEXPPH __m128h _mm_maskz_getexp_ph (__mmask8 k, __m128h a);
VGETEXPPH __m256h _mm256_getexp_ph (__m256h a);
VGETEXPPH __m256h _mm256_mask_getexp_ph (__m256h src, __mmask16 k, __m256h a);
VGETEXPPH __m256h _mm256_maskz_getexp_ph (__mmask16 k, __m256h a);
VGETEXPPH __m512h _mm512_getexp_ph (__m512h a);
VGETEXPPH __m512h _mm512_mask_getexp_ph (__m512h src, __mmask32 k, __m512h a);
VGETEXPPH __m512h _mm512_maskz_getexp_ph (__mmask32 k, __m512h a);
VGETEXPPH __m512h _mm512_getexp_round_ph (__m512h a, const int sae);
VGETEXPPH __m512h _mm512_mask_getexp_round_ph (__m512h src, __mmask32 k, __m512h a, const int sae);
VGETEXPPH __m512h _mm512_maskz_getexp_round_ph (__mmask32 k, __m512h a, const int sae);

SIMD 浮点 例外

Invalid, Denormal.

其他例外

EVEX-encoded 指令,参见表2-48,"Type E2 Class Exception Centers".

来源