📄 s_atanl.s
字号:
nop.i 999}{ .mfi nop.m 999 fmpy.s1 poly2 = poly2, zsq // poly2 = zsq * poly2 nop.i 999};;// Create small GR double in case need to raise underflow{ .mfi nop.m 999 fma.s1 poly1 = zsq, poly1, P_4 // poly1 = P_4 + zsq * poly1 dep GR_temp = -1,r0,0,53};;// Create small double in case need to raise underflow{ .mfi setf.d FR_temp = GR_temp fma.s1 poly = z8, poly1, poly2 // poly = poly2 + z8 * poly1 nop.i 999};;{ .mfi nop.m 999 fma.s1 A_lo = Z, poly, z_lo // A_lo = z_lo + Z * poly nop.i 999};;{ .mfi nop.m 999 fadd.s1 A_hi = tmp, A_lo // A_hi = tmp + A_lo nop.i 999};;{ .mfi nop.m 999 fsub.s1 tmp = tmp, A_hi // tmp = tmp - A_hi nop.i 999}{ .mfi nop.m 999 fmpy.s1 A_hi = s_Y, A_hi // A_hi = s_Y * A_hi nop.i 999};;{ .mfi nop.m 999 fadd.s1 A_lo = tmp, A_lo // A_lo = tmp + A_lo nop.i 999}{ .mfi nop.m 999 fma.s1 Res_hi = sigma, A_hi, P_hi // Res_hi = P_hi + sigma * A_hi nop.i 999};;{ .mfi nop.m 999 fsub.s1 tmp = P_hi, Res_hi // tmp = P_hi - Res_hi nop.i 999};;//// Test if A_lo is zero//{ .mfi nop.m 999 fclass.m p6,p0 = A_lo, 0x007 // Test A_lo = 0 nop.i 999};;{ .mfi nop.m 999(p6) mov A_lo = tmp_small // If A_lo zero, make very small nop.i 999};;{ .mfi nop.m 999 fma.s1 tmp = A_hi, sigma, tmp // tmp = sigma * A_hi + tmp nop.i 999}{ .mfi nop.m 999 fma.s1 sigma = A_lo, sigma, P_lo // sigma = A_lo * sigma + P_lo nop.i 999};;{ .mfi nop.m 999 fma.s1 Res_lo = s_Y, sigma, tmp // Res_lo = s_Y * sigma + tmp nop.i 999};;//// Test if Res_lo is denormal//{ .mfi nop.m 999 fclass.m p14, p15 = Res_lo, 0x0b nop.i 999};;//// Compute Result = Res_lo + Res_hi. Use s3 if Res_lo is denormal.//{ .mfi nop.m 999(p14) fadd.s3 Result = Res_lo, Res_hi // Result for Res_lo denormal nop.i 999}{ .mfi nop.m 999(p15) fadd.s0 Result = Res_lo, Res_hi // Result for Res_lo normal nop.i 999};;// // If Res_lo is denormal test if Result equals zero// { .mfi nop.m 999(p14) fclass.m.unc p14, p0 = Result, 0x07 nop.i 999};;//// If Res_lo is denormal and Result equals zero, raise inexact, underflow// by squaring small double//{ .mfb nop.m 999(p14) fmpy.d.s0 FR_temp = FR_temp, FR_temp br.ret.sptk b0 // Exit POLY path, 0 < Q < 2^-3};;ATANL_UNSUPPORTED: { .mfb nop.m 999 fmpy.s0 Result = ArgX,ArgY br.ret.sptk b0};;// Here if y natval, nan, inf, zeroATANL_Y_SPECIAL:// Here if x natval, nan, inf, zeroATANL_X_SPECIAL:{ .mfi nop.m 999 fclass.m p13,p12 = ArgY_orig, 0x0c3 // Test y nan nop.i 999};;{ .mfi nop.m 999 fclass.m p15,p14 = ArgY_orig, 0x103 // Test y natval nop.i 999};;{ .mfi nop.m 999(p12) fclass.m p13,p0 = ArgX_orig, 0x0c3 // Test x nan nop.i 999};;{ .mfi nop.m 999(p14) fclass.m p15,p0 = ArgX_orig, 0x103 // Test x natval nop.i 999};;{ .mfb nop.m 999(p13) fmpy.s0 Result = ArgX_orig, ArgY_orig // Result nan if x or y nan(p13) br.ret.spnt b0 // Exit if x or y nan};;{ .mfb nop.m 999(p15) fmpy.s0 Result = ArgX_orig, ArgY_orig // Result natval if x or y natval(p15) br.ret.spnt b0 // Exit if x or y natval};;// Here if x or y inf or zeroATANL_SPECIAL_HANDLING: { .mfi nop.m 999 fclass.m p6, p7 = ArgY_orig, 0x007 // Test y zero mov special = 992 // Offset to table};;{ .mfb add table_ptr1 = table_base, special // Point to 3pi/4 fcmp.eq.s0 p0, p9 = ArgX_orig, ArgY_orig // Dummy to set denormal flag(p7) br.cond.spnt ATANL_ArgY_Not_ZERO // Branch if y not zero};;// Here if y zero{ .mmf ldfd Result = [table_ptr1], 8 // Get pi high nop.m 999 fclass.m p14, p0 = ArgX, 0x035 // Test for x>=+0};;{ .mmf nop.m 999 ldfd Result_lo = [table_ptr1], -8 // Get pi lo fclass.m p15, p0 = ArgX, 0x036 // Test for x<=-0};;//// Return sign_Y * 0 when ArgX > +0//{ .mfi nop.m 999(p14) fmerge.s Result = ArgY, f0 // If x>=+0, y=0, hi sgn(y)*0 nop.i 999};;{ .mfi nop.m 999 fclass.m p13, p0 = ArgX, 0x007 // Test for x=0 nop.i 999};;{ .mfi nop.m 999(p14) fmerge.s Result_lo = ArgY, f0 // If x>=+0, y=0, lo sgn(y)*0 nop.i 999};;{ .mfi(p13) mov GR_Parameter_TAG = 36 // Error tag for x=0, y=0 nop.f 999 nop.i 999};;//// Return sign_Y * pi when ArgX < -0//{ .mfi nop.m 999(p15) fmerge.s Result = ArgY, Result // If x<0, y=0, hi=sgn(y)*pi nop.i 999};;{ .mfi nop.m 999(p15) fmerge.s Result_lo = ArgY, Result_lo // If x<0, y=0, lo=sgn(y)*pi nop.i 999};;//// Call error support function for atan(0,0)//{ .mfb nop.m 999 fadd.s0 Result = Result, Result_lo(p13) br.cond.spnt __libm_error_region // Branch if atan(0,0)};;{ .mib nop.m 999 nop.i 999 br.ret.sptk b0 // Exit for y=0, x not 0};;// Here if y not zeroATANL_ArgY_Not_ZERO: { .mfi nop.m 999 fclass.m p0, p10 = ArgY, 0x023 // Test y inf nop.i 999};;{ .mfb nop.m 999 fclass.m p6, p0 = ArgX, 0x017 // Test for 0 <= |x| < inf(p10) br.cond.spnt ATANL_ArgY_Not_INF // Branch if 0 < |y| < inf};;// Here if y=inf//// Return +PI/2 when ArgY = +Inf and ArgX = +/-0 or normal// Return -PI/2 when ArgY = -Inf and ArgX = +/-0 or normal// Return +PI/4 when ArgY = +Inf and ArgX = +Inf// Return -PI/4 when ArgY = -Inf and ArgX = +Inf// Return +3PI/4 when ArgY = +Inf and ArgX = -Inf// Return -3PI/4 when ArgY = -Inf and ArgX = -Inf//{ .mfi nop.m 999 fclass.m p7, p0 = ArgX, 0x021 // Test for x=+inf nop.i 999};;{ .mfi(p6) add table_ptr1 = 16, table_ptr1 // Point to pi/2, if x finite fclass.m p8, p0 = ArgX, 0x022 // Test for x=-inf nop.i 999};;{ .mmi(p7) add table_ptr1 = 32, table_ptr1 // Point to pi/4 if x=+inf;;(p8) add table_ptr1 = 48, table_ptr1 // Point to 3pi/4 if x=-inf nop.i 999};;{ .mmi ldfd Result = [table_ptr1], 8 // Load pi/2, pi/4, or 3pi/4 hi;; ldfd Result_lo = [table_ptr1], -8 // Load pi/2, pi/4, or 3pi/4 lo nop.i 999};;{ .mfi nop.m 999 fmerge.s Result = ArgY, Result // Merge sgn(y) in hi nop.i 999};;{ .mfi nop.m 999 fmerge.s Result_lo = ArgY, Result_lo // Merge sgn(y) in lo nop.i 999};;{ .mfb nop.m 999 fadd.s0 Result = Result, Result_lo // Compute complete result br.ret.sptk b0 // Exit for y=inf};;// Here if y not INF, and x=0 or INFATANL_ArgY_Not_INF: //// Return +PI/2 when ArgY NOT Inf, ArgY > 0 and ArgX = +/-0// Return -PI/2 when ArgY NOT Inf, ArgY < 0 and ArgX = +/-0// Return +0 when ArgY NOT Inf, ArgY > 0 and ArgX = +Inf// Return -0 when ArgY NOT Inf, ArgY > 0 and ArgX = +Inf// Return +PI when ArgY NOT Inf, ArgY > 0 and ArgX = -Inf// Return -PI when ArgY NOT Inf, ArgY > 0 and ArgX = -Inf//{ .mfi nop.m 999 fclass.m p7, p9 = ArgX, 0x021 // Test for x=+inf nop.i 999};;{ .mfi nop.m 999 fclass.m p6, p0 = ArgX, 0x007 // Test for x=0 nop.i 999};;{ .mfi(p6) add table_ptr1 = 16, table_ptr1 // Point to pi/2 fclass.m p8, p0 = ArgX, 0x022 // Test for x=-inf nop.i 999};;.pred.rel "mutex",p7,p9{ .mfi(p9) ldfd Result = [table_ptr1], 8 // Load pi or pi/2 hi(p7) fmerge.s Result = ArgY, f0 // If y not inf, x=+inf, sgn(y)*0 nop.i 999};;{ .mfi(p9) ldfd Result_lo = [table_ptr1], -8 // Load pi or pi/2 lo(p7) fnorm.s0 Result = Result // If y not inf, x=+inf normalize nop.i 999};;{ .mfi nop.m 999(p9) fmerge.s Result = ArgY, Result // Merge sgn(y) in hi nop.i 999};;{ .mfi nop.m 999(p9) fmerge.s Result_lo = ArgY, Result_lo // Merge sgn(y) in lo nop.i 999};;{ .mfb nop.m 999(p9) fadd.s0 Result = Result, Result_lo // Compute complete result br.ret.spnt b0 // Exit for y not inf, x=0,inf};;GLOBAL_IEEE754_END(atan2l) 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 // Save 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 nop.b 0 // Parameter 3 address}{ .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 nop.m 0 nop.m 0 add GR_Parameter_RESULT = 48,sp};;{ .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 + -