📄 s_expm1f.s
字号:
nop.i 999 ;;}{ .mfi(p13) ldfe f57 = [r35],0 nop.f 999 nop.i 999 ;;}{ .mfi nop.m 999//// For Flag_not_1, load p5,p6,p1,p2// Else load p5,p6,p1,p2//(p12) fma.s1 f60 = f52, f42, f53 nop.i 999 ;;}{ .mfi nop.m 999(p13) fma.s1 f60 = f51, f42, f52 nop.i 999 ;;}{ .mfi nop.m 999(p12) fma.s1 f60 = f60, f42, f54 nop.i 999 ;;}{ .mfi nop.m 999(p12) fma.s1 f59 = f56, f42, f57 nop.i 999 ;;}{ .mfi nop.m 999(p13) fma.s1 f60 = f42, f60, f53 nop.i 999 ;;}{ .mfi nop.m 999(p12) fma.s1 f59 = f59, f48, f42 nop.i 999 ;;}{ .mfi nop.m 999//// Flag_1: poly_lo = Q_5 + r*(Q_6 + r*Q_7) // Flag_not1: poly_lo = P_4 + r*(P_5 + r*P_6)// Flag_not1: poly_hi = (P_1 + r*P_2)//(p13) fmpy.s1 f60 = f60, f58 nop.i 999 ;;}{ .mfi nop.m 999(p12) fma.s1 f60 = f60, f42, f55 nop.i 999 ;;}{ .mfi nop.m 999//// Flag_1: poly_lo = r6 *(Q_5 + ....)// Flag_not1: poly_hi = r + rsq *(P_1 + r*P_2)//(p12) fma.s1 f35 = f60, f50, f59 nop.i 999}{ .mfi nop.m 999(p13) fma.s1 f59 = f54, f42, f55 nop.i 999 ;;}{ .mfi nop.m 999//// Flag_not1: Y_lo = rsq* poly_hi + poly_lo // Flag_1: poly_lo = rsq* poly_hi + poly_lo //(p13) fma.s1 f59 = f59, f42, f56 nop.i 999 ;;}{ .mfi nop.m 999//// Flag_not_1: (P_1 + r*P_2) //(p13) fma.s1 f59 = f59, f42, f57 nop.i 999 ;;}{ .mfi nop.m 999//// Flag_not_1: poly_hi = r + rsq * (P_1 + r*P_2) //(p13) fma.s1 f35 = f59, f48, f60 nop.i 999 ;;}{ .mfi nop.m 999//// Create 0.000...01//(p0) for f37 = f35, f37 nop.i 999 ;;}{ .mfb nop.m 999//// Set lsb of Y_lo to 1//(p0) fmerge.se f35 = f35,f37 (p0) br.cond.sptk EXPF_MAIN ;; }EXPF_VERY_SMALL: { .mmi nop.m 999(p13) addl r34 = @ltoff(Constants_exp_64_Exponents#),gp nop.i 999;;}{ .mfi(p13) ld8 r34 = [r34];(p12) mov f35 = f9 nop.i 999 ;;}{ .mfb nop.m 999(p12) mov f34 = f1 (p12) br.cond.sptk EXPF_MAIN ;; }{ .mlx(p13) add r34 = 8,r34 (p13) movl r39 = 0x0FFFE ;; }//// Load big_exp_neg // Create 1/2's exponent//{ .mii(p13) setf.exp f56 = r39 (p13) shladd r34 = r32,4,r34 ;; nop.i 999}//// Negative exponents are stored after positive//{ .mfi(p13) ld8 r45 = [r34],0//// Y_hi = x// Scale = 1//(p13) fmpy.s1 f35 = f9, f9 nop.i 999 ;;}{ .mfi nop.m 999//// Reset Safe if necessary // Create 1/2//(p13) mov f34 = f9 nop.i 999 ;;}{ .mfi(p13) cmp.lt.unc p0, p15 = r37, r45 (p13) mov f36 = f1 nop.i 999 ;;}{ .mfb nop.m 999//// Y_lo = x * x//(p13) fmpy.s1 f35 = f35, f56 //// Y_lo = x*x/2 //(p13) br.cond.sptk EXPF_MAIN ;; }EXPF_HUGE: { .mfi nop.m 999(p0) fcmp.gt.unc.s1 p14, p0 = f9, f0 nop.i 999}{ .mlx nop.m 999(p0) movl r39 = 0x15DC0 ;; }{ .mfi(p14) setf.exp f34 = r39 (p14) mov f35 = f1 (p14) cmp.eq p0, p15 = r0, r0 ;; }{ .mfb nop.m 999(p14) mov f36 = f34 //// If x > 0, Set Safe = False// If x > 0, Y_hi = 2**(24,000)// If x > 0, Y_lo = 1.0// If x > 0, Scale = 2**(24,000)//(p14) br.cond.sptk EXPF_MAIN ;; }{ .mlx nop.m 999(p12) movl r39 = 0xA240 }{ .mlx nop.m 999(p12) movl r38 = 0xA1DC ;; }{ .mmb(p13) cmp.eq p15, p14 = r0, r0 (p12) setf.exp f34 = r39 nop.b 999 ;;}{ .mlx(p12) setf.exp f35 = r38 (p13) movl r39 = 0xFF9C }{ .mfi nop.m 999(p13) fsub.s1 f34 = f0, f1 nop.i 999 ;;}{ .mfi nop.m 999(p12) mov f36 = f34 (p12) cmp.eq p0, p15 = r0, r0 ;; }{ .mfi(p13) setf.exp f35 = r39 (p13) mov f36 = f1 nop.i 999 ;;}EXPF_MAIN: { .mfi(p0) cmp.ne.unc p12, p0 = 0x01, r33(p0) fmpy.s1 f101 = f36, f35 nop.i 999 ;;}{ .mfb nop.m 999(p0) fma.s.s0 f99 = f34, f36, f101 (p15) br.cond.sptk EXPF_64_RETURN ;;}{ .mfi nop.m 999(p0) fsetc.s3 0x7F,0x01 nop.i 999}{ .mlx nop.m 999(p0) movl r50 = 0x0000000001007F ;;}// // S0 user supplied status// S2 user supplied status + WRE + TD (Overflows) // S3 user supplied status + RZ + TD (Underflows) // // // If (Safe) is true, then// Compute result using user supplied status field.// No overflow or underflow here, but perhaps inexact.// Return// Else// Determine if overflow or underflow was raised.// Fetch +/- overflow threshold for IEEE single, double,// double extended // { .mfi(p0) setf.exp f60 = r50(p0) fma.s.s3 f102 = f34, f36, f101 nop.i 999}{ .mfi nop.m 999(p0) fsetc.s3 0x7F,0x40 nop.i 999 ;;}{ .mfi nop.m 999//// For Safe, no need to check for over/under. // For expm1, handle errors like exp. //(p0) fsetc.s2 0x7F,0x42 nop.i 999;;}{ .mfi nop.m 999(p0) fma.s.s2 f100 = f34, f36, f101 nop.i 999 ;;}{ .mfi nop.m 999(p0) fsetc.s2 0x7F,0x40 nop.i 999 ;;}{ .mfi nop.m 999(p7) fclass.m.unc p12, p0 = f102, 0x00F nop.i 999}{ .mfi nop.m 999(p0) fclass.m.unc p11, p0 = f102, 0x00F nop.i 999 ;;}{ .mfi nop.m 999(p7) fcmp.ge.unc.s1 p10, p0 = f100, f60 nop.i 999}{ .mfi nop.m 999// // Create largest double exponent + 1.// Create smallest double exponent - 1.// (p0) fcmp.ge.unc.s1 p8, p0 = f100, f60 nop.i 999 ;;}// // fcmp: resultS2 >= + overflow threshold -> set (a) if true// fcmp: resultS2 <= - overflow threshold -> set (b) if true// fclass: resultS3 is denorm/unorm/0 -> set (d) if true// { .mib(p10) mov GR_Parameter_TAG = 43 nop.i 999(p10) br.cond.sptk __libm_error_region ;;}{ .mib(p8) mov GR_Parameter_TAG = 16 nop.i 999(p8) br.cond.sptk __libm_error_region ;;}// // Report that exp overflowed// { .mib(p12) mov GR_Parameter_TAG = 44 nop.i 999(p12) br.cond.sptk __libm_error_region ;;}{ .mib(p11) mov GR_Parameter_TAG = 17 nop.i 999(p11) br.cond.sptk __libm_error_region ;;}{ .mib nop.m 999 nop.i 999// // Report that exp underflowed// (p0) br.cond.sptk EXPF_64_RETURN ;;}EXPF_64_SPECIAL: { .mfi nop.m 999(p0) fclass.m.unc p6, p0 = f8, 0x0c3 nop.i 999}{ .mfi nop.m 999(p0) fclass.m.unc p13, p8 = f8, 0x007 nop.i 999 ;;}{ .mfi nop.m 999(p7) fclass.m.unc p14, p0 = f8, 0x007 nop.i 999}{ .mfi nop.m 999(p0) fclass.m.unc p12, p9 = f8, 0x021 nop.i 999 ;;}{ .mfi nop.m 999(p0) fclass.m.unc p11, p0 = f8, 0x022 nop.i 999}{ .mfi nop.m 999(p7) fclass.m.unc p10, p0 = f8, 0x022 nop.i 999 ;;}{ .mfi nop.m 999// // Identify +/- 0, Inf, or -Inf // Generate the right kind of NaN.// (p13) fadd.s.s0 f99 = f0, f1 nop.i 999 ;;}{ .mfi nop.m 999(p14) mov f99 = f8 nop.i 999 ;;}{ .mfb nop.m 999(p6) fadd.s.s0 f99 = f8, f1 // // expf(+/-0) = 1 // expm1f(+/-0) = +/-0 // No exceptions raised// (p6) br.cond.sptk EXPF_64_RETURN ;;}{ .mib nop.m 999 nop.i 999(p14) br.cond.sptk EXPF_64_RETURN ;;}{ .mfi nop.m 999(p11) mov f99 = f0 nop.i 999 ;;}{ .mfb nop.m 999(p10) fsub.s.s1 f99 = f0, f1 // // expf(-Inf) = 0 // expm1f(-Inf) = -1 // No exceptions raised.// (p10) br.cond.sptk EXPF_64_RETURN ;;}{ .mfb nop.m 999(p12) fmpy.s.s1 f99 = f8, f1 // // expf(+Inf) = Inf // No exceptions raised.// (p0) br.cond.sptk EXPF_64_RETURN ;; }EXPF_64_UNSUPPORTED: { .mfb nop.m 999(p0) fmpy.s.s0 f99 = f8, f0 nop.b 0;;}EXPF_64_RETURN:{ .mfb nop.m 999(p0) mov f8 = f99(p0) br.ret.sptk b0}.endp expm1fASM_SIZE_DIRECTIVE(expm1f).proc __libm_error_region__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 nop.b 0 // Parameter 3 address}{ .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};; .endp __libm_error_regionASM_SIZE_DIRECTIVE(__libm_error_region).type __libm_error_support#,@function.global __libm_error_support#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -