📄 e_exp2l.s
字号:
// GR_CONST1 = bias+15 mov GR_CONST1 = 0xffff+15 nop.f 0 mov GR_CONST3 = 0x1ffff ;;}{.mfi // load start address for C_1...C_6 followed by T_table ld8 GR_ADDR = [ GR_ADDR0 ] nop.f 0 // get sign of argument andcm GR_SGN = GR_EBIAS, GR_CONST3}{.mfi // GR_D_ADDR = pointer to D_table ld8 GR_D_ADDR = [ GR_D_ADDR0 ] nop.f 0 // get argument exponent and GR_ARGEXP = GR_CONST3, GR_EBIAS ;;}{.mfi alloc GR_SREG = ar.pfs, 1, 4, 4, 0 nop.f 0 // p6 = 1 if sign = 1 cmp.ne p6, p8 = GR_SGN, r0}{.mfi // p7 = 1 if exponent> = 15 (argument out of range) cmp.ge p7, p0 = GR_ARGEXP, GR_CONST1 nop.f 0 sub GR_EXPON = GR_CONST2, GR_ARGEXP ;;}{.mib // load C_3, C_4 ldfpd FR_COEFF3, FR_COEFF4 = [ GR_ADDR ], 16 // get first exponent+8 bits shr.u GR_LEADBITS = GR_SIGNIF, GR_EXPON (p12) br.cond.spnt SPECIAL_exp2l}{.mib mov GR_256 = 256 // exponent- = 63 sub GR_EM63 = GR_EBIAS, GR_63 (p7) br.cond.spnt OUT_RANGE_exp2l ;;}{.mlx // load C_5, C_6 ldfpd FR_COEFF5, FR_COEFF6 = [ GR_ADDR ], 16 // GR_2P14 = 2^14 movl GR_2P14 = 0x46800000 ;;}{.mfi // load C_1 ldfe FR_COEFF1 = [ GR_ADDR ], 16 fma.s0 f8 = f8, f1, f0 // GR_BM63 = bias-63 mov GR_BM63 = 0xffff-63 ;;}{.mlx setf.s FR_2P14 = GR_2P14 // GR_UF_TEST = -2^14-62 movl GR_UF_TEST = 0xc6807c00}{.mfi // load C_2 ldfe FR_COEFF2 = [ GR_ADDR ], 16 nop.f 0 mov GR_255 = 255 ;;}{.mib // get 8-bit index and GR_INDEX = GR_255, GR_LEADBITS // get K = integer part shr.u GR_K = GR_LEADBITS, 8 nop.b 0 ;;}{.mmi // if sign = 1 && f>0, set p7 = 1 (p6) cmp.gt.unc p7, p0 = GR_INDEX, r0 setf.s FR_UF_TEST = GR_UF_TEST shl GR_KF = GR_LEADBITS, GR_EXPON ;;}{.mfi // if sign = 1 && f>0, set f = 1-f (p7) sub GR_INDEX = GR_256, GR_INDEX nop.f 0 // if sign = 1 && f>0, set K = K+1 (p7) add GR_K = GR_K, r0, 1 ;;}{.mfi // FR_EXP63 = 2^{expon-63} setf.exp FR_EXP63 = GR_EM63 nop.f 0 nop.i 0 ;;}.pred.rel "mutex", p6, p8{.mfi // if sign = 0, set scale factor exponent S = K+bias-63 (p8) add GR_K = GR_K, GR_BM63 nop.f 0 // if sign = 1, set scale factor exponent S = -K+bias-63 (p6) sub GR_K = GR_BM63, GR_K ;;}{.mmi // FR_KF0 = 2^{63-expon}*(K+f) setf.sig FR_KF0 = GR_KF nop.m 0 // GR_EMIN = EMIN = 2-2^14 mov GR_EMIN = 0x18cfff ;;}{.mfi // get T_table index shladd GR_IT = GR_INDEX, 3, GR_ADDR // p7 = 1 if x> = 2^10 fcmp.ge.s1 p7, p12 = f8, FR_2P14 // get D_table index shladd GR_ID = GR_INDEX, 2, GR_D_ADDR ;;}{.mfi // load T_table value ldf8 FR_T = [ GR_IT ] // p7 = 1 if x<-2^10-50 (p12) fcmp.lt.s1 p7, p0 = f8, FR_UF_TEST // GR_EMIN1 = EMIN = 2-2^14 shl GR_EMIN1 = GR_EMIN, 11 ;;}{.mmb // f50 = scale factor = 2^{K-63} setf.exp FR_2EXP = GR_K // load D_table value ldfs FR_D = [ GR_ID ] (p7) br.cond.spnt OUT_RANGE_exp2l ;;}{.mfi nop.m 0 // get r = x-(K+f) fnma.s1 FR_R = FR_KF0, FR_EXP63, f8 nop.i 0 ;;}{.mfi // FR_EMIN = EMIN setf.s FR_EMIN = GR_EMIN1 // P34 = C_4*r+C_3 fma.s1 FR_P34 = FR_COEFF4, FR_R, FR_COEFF3 nop.i 0}{.mfi nop.m 0 // P56 = C_6*r+C_5 fma.s1 FR_P56 = FR_COEFF6, FR_R, FR_COEFF5 nop.i 0 ;;}{.mfi nop.m 0 // r*r fma.s1 FR_R2 = FR_R, FR_R, f0 nop.i 0}{.mfi nop.m 0 // P12 = C_2*r+C_1 fma.s1 FR_P12 = FR_COEFF2, FR_R, FR_COEFF1 nop.i 0 ;;}{.mfi nop.m 0 // T* = scaling factor fma.s1 FR_TS = FR_T, FR_2EXP, f0 nop.i 0}{.mfi nop.m 0 // P36 = P34+r2*P56 fma.s1 FR_P36 = FR_P56, FR_R2, FR_P34 nop.i 0 ;;}{.mfi nop.m 0 // P02 = D+r*P12 fma.s1 FR_P02 = FR_P12, FR_R, FR_D nop.i 0}{.mfi nop.m 0 // GR_ID = r*r2 fma.s1 FR_R3 = FR_R2, FR_R, f0 nop.i 0 ;;}{.mfi nop.m 0 // P06 = P02+r3*P36 fma.s1 FR_P06 = FR_P36, FR_R3, FR_P02 nop.i 0 ;;}{.mfi nop.m 0 // underflow (x<EMIN) ? fcmp.lt.s0 p6, p8 = f8, FR_EMIN nop.i 0 ;;}{.mfb nop.m 0 // result = T+T*P06 fma.s0 f8 = FR_TS, FR_P06, FR_TS // return (p8) br.ret.sptk b0}{.mfb (p6) mov GR_Parameter_TAG = 160 nop.f 0 (p6) br.cond.sptk __libm_error_region ;;}SPECIAL_exp2l:{.mfi nop.m 0 // x = -Infinity ? fclass.m p6, p0 = f8, 0x22 nop.i 0 ;;}{.mfi nop.m 0 // x = +Infinity ? fclass.m p7, p0 = f8, 0x21 nop.i 0 ;;}{.mfi nop.m 0 // x = +/-Zero ? fclass.m p8, p0 = f8, 0x7 nop.i 0}{.mfb nop.m 0 // exp2l(-Infinity) = 0 (p6) mov f8 = f0 (p6) br.ret.spnt b0 ;;}{.mfb nop.m 0 // exp2l(+Infinity) = +Infinity nop.f 0 (p7) br.ret.spnt b0 ;;}{.mfb nop.m 0 // exp2l(+/-0) = 1 (p8) mov f8 = f1 (p8) br.ret.spnt b0 ;;}{.mfb nop.m 0 // Remaining cases: NaNs fma.s0 f8 = f8, f1, f0 br.ret.sptk b0 ;;}OUT_RANGE_exp2l:{.mfi // overflow: p8 = 1 (p8) mov GR_EM63 = 0x1fffe // normalize input, to detect pseudo-zeroes fma.s0 f8 = f8, f1, f0 nop.i 0 ;;}{.mfi nop.m 0 // f8 = 0? fcmp.eq.s1 p7, p0 = f8, f0 nop.i 0 ;;}{.mmb (p8) mov GR_Parameter_TAG = 159 (p8) setf.exp FR_TS = GR_EM63 nop.b 999 ;;}{.mfb nop.m 0 // pseudo-zero (p7) mov f8 = f1 (p7) br.ret.sptk b0 ;;}{.mfi nop.m 999 (p8) fma.s0 f8 = FR_TS, FR_TS, f0 nop.i 999}{.mii nop.m 0 // underflow: p6 = 1 (p6) mov GR_EM63 = 1 nop.i 0 ;;}{.mmb (p6) mov GR_Parameter_TAG = 160 (p6) setf.exp FR_TS = GR_EM63 nop.b 999 ;;}{.mfb nop.m 999 (p6) fma.s0 f8 = FR_TS, FR_TS, f0 nop.b 0 ;;}GLOBAL_LIBM_END(exp2l)LOCAL_LIBM_ENTRY(__libm_error_region).prologue{.mfi add GR_Parameter_Y = -32, sp // Parameter 2 value nop.f 0.save ar.pfs, GR_SAVE_PFS mov GR_SAVE_PFS = ar.pfs // Save ar.pfs}{.mfi.fframe 64 add sp = -64, sp // Create new stack nop.f 0 mov GR_SAVE_GP = gp ;; // Save gp}{.mmi stfe [ GR_Parameter_Y ] = FR_Y, 16 // STORE Parameter 2 on stack add GR_Parameter_X = 16, sp // Parameter 1 address.save b0, GR_SAVE_B0 mov GR_SAVE_B0 = b0 ;; // Save b0}.body{.mib stfe [ GR_Parameter_X ] = FR_X // STORE Parameter 1 on stack add GR_Parameter_RESULT = 0, GR_Parameter_Y // Parameter 3 address nop.b 0}{.mib stfe [ GR_Parameter_Y ] = FR_RESULT // STORE Parameter 3 on stack add GR_Parameter_Y = -16, GR_Parameter_Y br.call.sptk b0 = __libm_error_support# ;; // Call error handling function}{.mmi add GR_Parameter_RESULT = 48, sp nop.m 0 nop.i 0 ;;}{.mmi ldfe f8 = [ GR_Parameter_RESULT ] // Get return result off stack.restore sp add sp = 64, sp // Restore stack pointer mov b0 = GR_SAVE_B0 ;; // Restore return address}{.mib mov gp = GR_SAVE_GP // Restore gp mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs br.ret.sptk b0 ;; // Return}LOCAL_LIBM_END(__libm_error_region).type __libm_error_support#, @function.global __libm_error_support#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -