📄 s_atanl.s
字号:
// A_temp = Q//(p0) add table_ptr1 = 128, table_ptr1 ;;}{ .mmf nop.m 999//// E = E + E_hold*E (1)// Point to P_8.//(p0) ldfe P_8 = [table_ptr1], -16//// poly = z8*poly1 + poly2 (Typo in writeup)// Is (swap) != 0 ?//(p0) fnma.s1 z_lo = A_temp, U, V ;;}{ .mmb nop.m 999//// E_hold = 1.0 - E * U (2)//(p0) ldfe P_7 = [table_ptr1], -16 nop.b 999 ;;}{ .mmb nop.m 999//// E = E + E_hold*E (2)//(p0) ldfe P_6 = [table_ptr1], -16 nop.b 999 ;;}{ .mmb nop.m 999//// E_hold = 1.0 - E * U (3)//(p0) ldfe P_5 = [table_ptr1], -16 nop.b 999 ;;}{ .mmf nop.m 999//// E = E + E_hold*E (3)////// At this point E approximates 1/U to roughly working precision// z = V*E approximates V/U//(p0) ldfe P_4 = [table_ptr1], -16(p0) fnma.s1 E_hold = E, U, f1 ;;}{ .mmb nop.m 999//// Z = V * E//(p0) ldfe P_3 = [table_ptr1], -16 nop.b 999 ;;}{ .mmb nop.m 999//// zsq = Z * Z//(p0) ldfe P_2 = [table_ptr1], -16 nop.b 999 ;;}{ .mmb nop.m 999//// z8 = zsq * zsq//(p0) ldfe P_1 = [table_ptr1], -16 nop.b 999 ;;}{ .mlx nop.m 999(p0) movl int_temp = 0x24005}{ .mfi nop.m 999(p0) fma.s1 E = E, E_hold, E nop.i 999 ;;}{ .mfi nop.m 999(p0) fnma.s1 E_hold = E, U, f1 nop.i 999 ;;}{ .mfi nop.m 999(p0) fma.s1 E = E, E_hold, E nop.i 999 ;;}{ .mfi nop.m 999(p0) fmpy.s1 Z = V, E nop.i 999}{ .mfi nop.m 999//// z_lo = V - A_temp * U// if (PR_2) sigma = 1.0//(p0) fmpy.s1 z_lo = z_lo, E nop.i 999 ;;}{ .mfi nop.m 999(p0) fmpy.s1 zsq = Z, Z nop.i 999}{ .mfi nop.m 999//// z_lo = z_lo * E// if (PR_1) sigma = -1.0//(p0) fadd.s1 A_hi = A_temp, z_lo nop.i 999 ;;}{ .mfi nop.m 999//// z8 = z8 * z8////// Now what we want to do is// poly1 = P_4 + zsq*(P_5 + zsq*(P_6 + zsq*(P_7 + zsq*P_8)))// poly2 = zsq*(P_1 + zsq*(P_2 + zsq*P_3))//(p0) fma.s1 poly1 = zsq, P_8, P_7 nop.i 999}{ .mfi nop.m 999(p0) fma.s1 poly2 = zsq, P_3, P_2 nop.i 999 ;;}{ .mfi nop.m 999(p0) fmpy.s1 z8 = zsq, zsq nop.i 999}{ .mfi nop.m 999(p0) fsub.s1 A_temp = A_temp, A_hi nop.i 999 ;;}{ .mfi nop.m 999//// A_lo = Z * poly + z_lo//(p0) fmerge.s tmp = A_hi, A_hi nop.i 999 ;;}{ .mfi nop.m 999//// poly1 = P_7 + zsq * P_8// poly2 = P_2 + zsq * P_3//(p0) fma.s1 poly1 = zsq, poly1, P_6 nop.i 999}{ .mfi nop.m 999(p0) fma.s1 poly2 = zsq, poly2, P_1 nop.i 999 ;;}{ .mfi nop.m 999(p0) fmpy.s1 z8 = z8, z8 nop.i 999}{ .mfi nop.m 999(p0) fadd.s1 z_lo = A_temp, z_lo nop.i 999 ;;}{ .mfi nop.m 999//// poly1 = P_6 + zsq * poly1// poly2 = P_2 + zsq * poly2//(p0) fma.s1 poly1 = zsq, poly1, P_5 nop.i 999}{ .mfi nop.m 999(p0) fmpy.s1 poly2 = poly2, zsq nop.i 999 ;;}{ .mfi nop.m 999//// Result = Res_hi + Res_lo (User Supplied Rounding Mode)//(p0) fmpy.s1 P_5 = P_5, P_5 nop.i 999 ;;}{ .mfi nop.m 999(p0) fma.s1 poly1 = zsq, poly1, P_4 nop.i 999 ;;}{ .mfi nop.m 999(p0) fma.s1 poly = z8, poly1, poly2 nop.i 999 ;;}{ .mfi nop.m 999//// Fixup added to force inexact later -// A_hi = A_temp + z_lo// z_lo = (A_temp - A_hi) + z_lo//(p0) fma.s1 A_lo = Z, poly, z_lo nop.i 999 ;;}{ .mfi nop.m 999(p0) fadd.s1 A_hi = tmp, A_lo nop.i 999 ;;}{ .mfi nop.m 999(p0) fsub.s1 tmp = tmp, A_hi nop.i 999}{ .mfi nop.m 999(p0) fmpy.s1 A_hi = s_Y, A_hi nop.i 999 ;;}{ .mfi nop.m 999(p0) fadd.s1 A_lo = tmp, A_lo nop.i 999}{ .mfi(p0) setf.exp tmp = int_temp//// P_hi = s_Y * P_hi// A_hi = s_Y * A_hi//(p0) fma.s1 Res_hi = sigma, A_hi, P_hi nop.i 999 ;;}{ .mfi nop.m 999(p0) fclass.m.unc p6,p0 = A_lo, 0x007 nop.i 999 ;;}{ .mfi nop.m 999(p6) mov A_lo = tmp nop.i 999}{ .mfi nop.m 999//// Res_hi = P_hi + sigma * A_hi//(p0) fsub.s1 tmp = P_hi, Res_hi nop.i 999 ;;}{ .mfi nop.m 999//// tmp = P_hi - Res_hi//(p0) fma.s1 tmp = A_hi, sigma, tmp nop.i 999}{ .mfi nop.m 999(p0) fma.s1 sigma = A_lo, sigma, P_lo nop.i 999 ;;}{ .mfi nop.m 999//// tmp = sigma * A_hi + tmp// sigma = A_lo * sigma + P_lo//(p0) fma.s1 Res_lo = s_Y, sigma, tmp nop.i 999 ;;}{ .mfb nop.m 999//// Res_lo = s_Y * sigma + tmp//(p0) fadd.s0 Result = Res_lo, Res_hibr.ret.sptk b0 ;;}L(ATANL_NATVAL): L(ATANL_UNSUPPORTED): L(ATANL_NAN): { .mfb nop.m 999(p0) fmpy.s0 Result = ArgX,ArgY (p0) br.ret.sptk b0 ;;}L(ATANL_SPECIAL_HANDLING): { .mfi nop.m 999(p0) fcmp.eq.s0 p0, p6 = f1, ArgY_orig nop.i 999}{ .mfi nop.m 999(p0) fcmp.eq.s0 p0, p5 = f1, ArgX_orig nop.i 999 ;;}{ .mfi nop.m 999(p0) fclass.m.unc p6, p7 = ArgY, 0x007 nop.i 999}{ .mlx nop.m 999(p0) movl special = 992};;{ .mmi nop.m 999(p0) addl table_ptr1 = @ltoff(Constants_atan#), gp nop.i 999};;{ .mmi ld8 table_ptr1 = [table_ptr1] nop.m 999 nop.i 999};;{ .mib(p0) add table_ptr1 = table_ptr1, special nop.i 999(p7) br.cond.spnt L(ATANL_ArgY_Not_ZERO) ;;}{ .mmf(p0) ldfd Result = [table_ptr1], 8 nop.m 999(p6) fclass.m.unc p14, p0 = ArgX, 0x035 ;;}{ .mmf nop.m 999(p0) ldfd Result_lo = [table_ptr1], -8(p6) fclass.m.unc p15, p0 = ArgX, 0x036 ;;}{ .mfi nop.m 999(p14) fmerge.s Result = ArgY, f0 nop.i 999}{ .mfi nop.m 999(p6) fclass.m.unc p13, p0 = ArgX, 0x007 nop.i 999 ;;}{ .mfi nop.m 999(p14) fmerge.s Result_lo = ArgY, f0 nop.i 999 ;;}{ .mfi(p13) mov GR_Parameter_TAG = 36 nop.f 999 nop.i 999 ;;}{ .mfi nop.m 999//// Return sign_Y * 0 when ArgX > +0//(p15) fmerge.s Result = ArgY, Result nop.i 999 ;;}{ .mfi nop.m 999(p15) fmerge.s Result_lo = ArgY, Result_lo nop.i 999 ;;}{ .mfb nop.m 999//// Return sign_Y * 0 when ArgX < -0//(p0) fadd.s0 Result = Result, Result_lo(p13) br.cond.spnt __libm_error_region ;;}{ .mib nop.m 999 nop.i 999//// Call error support funciton for atan(0,0)//(p0) br.ret.sptk b0 ;;}L(ATANL_ArgY_Not_ZERO): { .mfi nop.m 999(p0) fclass.m.unc p9, p10 = ArgY, 0x023 nop.i 999 ;;}{ .mib nop.m 999 nop.i 999(p10) br.cond.spnt L(ATANL_ArgY_Not_INF) ;;}{ .mfi nop.m 999(p9) fclass.m.unc p6, p0 = ArgX, 0x017 nop.i 999}{ .mfi nop.m 999(p9) fclass.m.unc p7, p0 = ArgX, 0x021 nop.i 999 ;;}{ .mfi nop.m 999(p9) fclass.m.unc p8, p0 = ArgX, 0x022 nop.i 999 ;;}{ .mmi(p6) add table_ptr1 = 16, table_ptr1 ;;(p0) ldfd Result = [table_ptr1], 8 nop.i 999 ;;}{ .mfi(p0) ldfd Result_lo = [table_ptr1], -8 nop.f 999 nop.i 999 ;;}{ .mfi nop.m 999(p6) fmerge.s Result = ArgY, Result nop.i 999 ;;}{ .mfi nop.m 999(p6) fmerge.s Result_lo = ArgY, Result_lo nop.i 999 ;;}{ .mfb nop.m 999(p6) fadd.s0 Result = Result, Result_lo(p6) br.ret.sptk b0 ;;}//// Load PI/2 and adjust its sign.// Return +PI/2 when ArgY = +Inf and ArgX = +/-0 or normal// Return -PI/2 when ArgY = -Inf and ArgX = +/-0 or normal//{ .mmi(p7) add table_ptr1 = 32, table_ptr1 ;;(p7) ldfd Result = [table_ptr1], 8 nop.i 999 ;;}{ .mfi(p7) ldfd Result_lo = [table_ptr1], -8 nop.f 999 nop.i 999 ;;}{ .mfi nop.m 999(p7) fmerge.s Result = ArgY, Result nop.i 999 ;;}{ .mfi nop.m 999(p7) fmerge.s Result_lo = ArgY, Result_lo nop.i 999 ;;}{ .mfb nop.m 999(p7) fadd.s0 Result = Result, Result_lo(p7) br.ret.sptk b0 ;;}//// Load PI/4 and adjust its sign.// Return +PI/4 when ArgY = +Inf and ArgX = +Inf// Return -PI/4 when ArgY = -Inf and ArgX = +Inf//{ .mmi(p8) add table_ptr1 = 48, table_ptr1 ;;(p8) ldfd Result = [table_ptr1], 8 nop.i 999 ;;}{ .mfi(p8) ldfd Result_lo = [table_ptr1], -8 nop.f 999 nop.i 999 ;;}{ .mfi nop.m 999(p8) fmerge.s Result = ArgY, Result nop.i 999 ;;}{ .mfi nop.m 999(p8) fmerge.s Result_lo = ArgY, Result_lo nop.i 999 ;;}{ .mfb nop.m 999(p8) fadd.s0 Result = Result, Result_lo(p8) br.ret.sptk b0 ;; }L(ATANL_ArgY_Not_INF): { .mfi nop.m 999//// Load PI/4 and adjust its sign.// Return +3PI/4 when ArgY = +Inf and ArgX = -Inf// Return -3PI/4 when ArgY = -Inf and ArgX = -Inf//(p0) fclass.m.unc p6, p0 = ArgX, 0x007 nop.i 999}{ .mfi nop.m 999(p0) fclass.m.unc p7, p0 = ArgX, 0x021 nop.i 999 ;;}{ .mfi nop.m 999(p0) fclass.m.unc p8, p0 = ArgX, 0x022 nop.i 999 ;;}{ .mmi(p6) add table_ptr1 = 16, table_ptr1 ;;(p6) ldfd Result = [table_ptr1], 8 nop.i 999 ;;}{ .mfi(p6) ldfd Result_lo = [table_ptr1], -8 nop.f 999 nop.i 999 ;;}{ .mfi nop.m 999(p6) fmerge.s Result = ArgY, Result nop.i 999 ;;}{ .mfi nop.m 999(p6) fmerge.s Result_lo = ArgY, Result_lo nop.i 999 ;;}{ .mfb nop.m 999(p6) fadd.s0 Result = Result, Result_lo(p6) br.ret.spnt b0 ;;}{ .mfi nop.m 999//// return = sign_Y * PI/2 when ArgX = 0//(p7) fmerge.s Result = ArgY, f0 nop.i 999 ;;}{ .mfb nop.m 999(p7) fnorm.s0 Result = Result(p7) br.ret.spnt b0 ;;}//// return = sign_Y * 0 when ArgX = Inf//{ .mmi(p8) ldfd Result = [table_ptr1], 8 ;;(p8) ldfd Result_lo = [table_ptr1], -8 nop.i 999 ;;}{ .mfi nop.m 999(p8) fmerge.s Result = ArgY, Result nop.i 999 ;;}{ .mfi nop.m 999(p8) fmerge.s Result_lo = ArgY, Result_lo nop.i 999 ;;}{ .mfb nop.m 999(p8) fadd.s0 Result = Result, Result_lo(p8) br.ret.sptk b0 ;;}//// return = sign_Y * PI when ArgX = -Inf//.endp atan2lASM_SIZE_DIRECTIVE(atan2l)ASM_SIZE_DIRECTIVE(__atan2l)ASM_SIZE_DIRECTIVE(__ieee754_atan2l) .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 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};;.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 + -