📄 e_log2f.s
字号:
shl r24=r24,60}{.mfi mov r26=0x804 nop.f 0 // r23=bias-1 mov r23=0xfffe;;}{.mmf getf.exp r29=f8 // load start address for C_1...C_6 followed by T_table ld8 r2=[r2] // will continue only for positive normal/denormal numbers fclass.nm.unc p12,p7 = f8, 0x19 ;;}.pred.rel "mutex",p8,p10{.mfi // denormal input, repeat get significand (after normalization) (p8) getf.sig r25=f7 // x=1 ? fcmp.eq.s0 p6,p0=f8,f1 // get T_index (p10) shr.u r28=r25,63-8}{.mfi // f12=0.5 setf.exp f12=r23 nop.f 0 // r27=bias mov r27=0xffff;;}{.mfb // denormal input, repeat get exponent (after normalization) (p8) getf.exp r29=f7 nop.f 0 (p12) br.cond.spnt SPECIAL_log2f}{.mfi cmp.geu p12,p0=r25,r24 nop.f 0 mov r23=0xff;;}{.mfi add r3=32,r2 // r=1-x*y fms.s1 f6=f6,f8,f1 // r26=0x80400...0 (threshold for using polynomial approximation) shl r26=r26,64-12}{.mfi // load C_3, C_4 ldfpd f10,f11=[r2],16 nop.f 0 // r27=bias-1 (if index >=128, will add exponent+1) (p12) mov r27=0xfffe;;}{.mfi // load C_1 ldfe f14=[r2],32 // x=1, return 0 (p6) fma.s.s0 f8=f0,f0,f0 (p8) shr.u r28=r25,63-8}{.mib // load C_2 ldfe f13=[r3] // r29=exponent-bias sub r29=r29,r27 // x=1, return (p6) br.ret.spnt b0;;}{.mfi // get T_index and r28=r28,r23 fmerge.se f7=f1,f7 // if first 9 bits after leading 1 are all zero, then p8=1 cmp.ltu p8,p12=r25,r26;;}{.mfi // f8=expon - bias setf.sig f8=r29 nop.f 0 // get T address shladd r2=r28,3,r2}{.mfi // first 8 bits after leading 1 are all ones ? cmp.eq p10,p0=r23,r28 // if first 8 bits after leading bit are 0, use polynomial approx. only (p8) fms.s1 f6=f7,f1,f1 nop.i 0;;}{.mfi //r26=1 mov r26=1 // if first 8 bits after leading 1 are all ones, use polynomial approx. only (p10) fms.s1 f6=f7,f12,f1 nop.i 0;;}.pred.rel "mutex",p8,p12{.mmf // load T (unless first 9 bits after leading 1 are 0) (p12) ldfd f12=[r2] nop.m 0 // set T=0 (if first 9 bits after leading 1 are 0) (p8) fma.s1 f12=f0,f0,f0;;}{.mfi nop.m 0 // P34=C_3+C_4*r fma.s1 f10=f11,f6,f10 // r26=2^{63} shl r26=r26,63}{.mfi nop.m 0 // r2=r*r fma.s1 f11=f6,f6,f0 nop.i 0;;}{.mfi // significand of x is 1 ? cmp.eq p0,p6=r25,r26 // P12=C_1+C_2*r fma.s1 f14=f13,f6,f14 nop.i 0;;}{.mfi nop.m 0 // normalize additive term (l=exponent of x) fcvt.xf f8=f8 // if significand(x)=1, return exponent (l) nop.i 0;;}{.mfi nop.m 0 // add T+l (p6) fma.s1 f8=f8,f1,f12 nop.i 0}{.mfi nop.m 0 // P14=P12+r2*P34 (p6) fma.s1 f13=f10,f11,f14 nop.i 0;;}{.mfb nop.m 0 // result=T+l+r*P14 (p6) fma.s.s0 f8=f13,f6,f8 // return br.ret.sptk b0;;}SPECIAL_log2f:{.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;;}{.mfi nop.m 0 // x=-Infinity, -normal, -denormal ? fclass.m p6,p0=f8,0x3a nop.i 0;;}{.mfb nop.m 0 // log2f(+Infinity)=+Infinity nop.f 0 (p7) br.ret.spnt b0;;}{.mfi (p8) mov GR_Parameter_TAG = 172 // log2f(+/-0)=-infinity, raises Divide by Zero // set f8=-0 (p8) fmerge.ns f8=f0,f8 nop.i 0;;}{.mfb nop.m 0 (p8) frcpa.s0 f8,p0=f1,f8 (p8) br.cond.sptk __libm_error_region;;}{.mfb (p6) mov GR_Parameter_TAG = 173 // x<0: return NaN, raise Invalid (p6) frcpa.s0 f8,p0=f0,f0 (p6) br.cond.sptk __libm_error_region;;} {.mfb nop.m 0 // Remaining cases: NaNs fma.s.s0 f8=f8,f1,f0 br.ret.sptk b0;;}GLOBAL_LIBM_END(log2f)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 stfs [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 stfs [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 stfs [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 nop.m 0 nop.m 0 add GR_Parameter_RESULT = 48,sp};;{ .mmi ldfs 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 + -