⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_atanl.s

📁 glibc 2.9,最新版的C语言库函数
💻 S
📖 第 1 页 / 共 4 页
字号:
wsq         =   f40poly        =   f41Tbl_hi      =   f42Tbl_lo      =   f43P_hi        =   f44P_lo        =   f45A_hi        =   f46A_lo        =   f47sigma       =   f48Res_hi      =   f49Res_lo      =   f50Z           =   f52zsq         =   f53z4          =   f54z8          =   f54poly1       =   f55poly2       =   f56z_lo        =   f57tmp         =   f58P_1         =   f59Q_1         =   f60P_2         =   f61Q_2         =   f62P_3         =   f63Q_3         =   f64P_4         =   f65Q_4         =   f66P_5         =   f67P_6         =   f68P_7         =   f69P_8         =   f70U_hold      =   f71TWO_TO_NEG3 =   f72C_hi_hold   =   f73E_hold      =   f74M           =   f75ArgX_abs    =   f76ArgY_abs    =   f77Result_lo   =   f78A_temp      =   f79FR_temp     =   f80Xsq         =   f81Ysq         =   f82tmp_small   =   f83GR_SAVE_PFS   = r33GR_SAVE_B0    = r34GR_SAVE_GP    = r35sign_X        = r36sign_Y        = r37 swap          = r38 table_ptr1    = r39 table_ptr2    = r40 k             = r41 lookup        = r42 exp_ArgX      = r43 exp_ArgY      = r44 exponent_Q    = r45 significand_Q = r46 special       = r47 sp_exp_Q      = r48 sp_exp_4sig_Q = r49 table_base    = r50 int_temp      = r51GR_Parameter_X      = r49GR_Parameter_Y      = r50GR_Parameter_RESULT = r51GR_Parameter_TAG    = r52GR_temp             = r52RODATA.align 16 LOCAL_OBJECT_START(Constants_atan)//       double pi/2data8 0x3FF921FB54442D18//       single lo_pi/2, two**(-3)data4 0x248D3132, 0x3E000000data8 0xAAAAAAAAAAAAAAA3, 0xBFFD // P_1data8 0xCCCCCCCCCCCC54B2, 0x3FFC // P_2data8 0x9249249247E4D0C2, 0xBFFC // P_3data8 0xE38E38E058870889, 0x3FFB // P_4data8 0xBA2E895B290149F8, 0xBFFB // P_5data8 0x9D88E6D4250F733D, 0x3FFB // P_6data8 0x884E51FFFB8745A0, 0xBFFB // P_7data8 0xE1C7412B394396BD, 0x3FFA // P_8data8 0xAAAAAAAAAAAAA52F, 0xBFFD // Q_1data8 0xCCCCCCCCC75B60D3, 0x3FFC // Q_2data8 0x924923AD011F1940, 0xBFFC // Q_3data8 0xE36F716D2A5F89BD, 0x3FFB // Q_4////    Entries Tbl_hi  (double precision)//    B = 1+Index/16+1/32  Index = 0//    Entries Tbl_lo (single precision)//    B = 1+Index/16+1/32  Index = 0//data8 0x3FE9A000A935BD8E data4 0x23ACA08F, 0x00000000////    Entries Tbl_hi  (double precision) Index = 0,1,...,15//    B = 2^(-1)*(1+Index/16+1/32)//    Entries Tbl_lo (single precision)//    Index = 0,1,...,15  B = 2^(-1)*(1+Index/16+1/32)//data8 0x3FDE77EB7F175A34 data4 0x238729EE, 0x00000000data8 0x3FE0039C73C1A40B data4 0x249334DB, 0x00000000data8 0x3FE0C6145B5B43DA data4 0x22CBA7D1, 0x00000000data8 0x3FE1835A88BE7C13 data4 0x246310E7, 0x00000000data8 0x3FE23B71E2CC9E6A data4 0x236210E5, 0x00000000data8 0x3FE2EE628406CBCA data4 0x2462EAF5, 0x00000000data8 0x3FE39C391CD41719 data4 0x24B73EF3, 0x00000000data8 0x3FE445065B795B55 data4 0x24C11260, 0x00000000data8 0x3FE4E8DE5BB6EC04 data4 0x242519EE, 0x00000000data8 0x3FE587D81F732FBA data4 0x24D4346C, 0x00000000data8 0x3FE6220D115D7B8D data4 0x24ED487B, 0x00000000data8 0x3FE6B798920B3D98 data4 0x2495FF1E, 0x00000000data8 0x3FE748978FBA8E0F data4 0x223D9531, 0x00000000data8 0x3FE7D528289FA093 data4 0x242B0411, 0x00000000data8 0x3FE85D69576CC2C5 data4 0x2335B374, 0x00000000data8 0x3FE8E17AA99CC05D data4 0x24C27CFB, 0x00000000////    Entries Tbl_hi  (double precision) Index = 0,1,...,15//    B = 2^(-2)*(1+Index/16+1/32)//    Entries Tbl_lo (single precision)//    Index = 0,1,...,15  B = 2^(-2)*(1+Index/16+1/32)//data8 0x3FD025FA510665B5 data4 0x24263482, 0x00000000data8 0x3FD1151A362431C9data4 0x242C8DC9, 0x00000000data8 0x3FD2025567E47C95data4 0x245CF9BA, 0x00000000data8 0x3FD2ED987A823CFEdata4 0x235C892C, 0x00000000data8 0x3FD3D6D129271134data4 0x2389BE52, 0x00000000data8 0x3FD4BDEE586890E6data4 0x24436471, 0x00000000data8 0x3FD5A2E0175E0F4Edata4 0x2389DBD4, 0x00000000data8 0x3FD685979F5FA6FDdata4 0x2476D43F, 0x00000000data8 0x3FD7660752817501data4 0x24711774, 0x00000000data8 0x3FD84422B8DF95D7data4 0x23EBB501, 0x00000000data8 0x3FD91FDE7CD0C662data4 0x23883A0C, 0x00000000data8 0x3FD9F93066168001data4 0x240DF63F, 0x00000000data8 0x3FDAD00F5422058Bdata4 0x23FE261A, 0x00000000data8 0x3FDBA473378624A5data4 0x23A8CD0E, 0x00000000data8 0x3FDC76550AAD71F8data4 0x2422D1D0, 0x00000000data8 0x3FDD45AEC9EC862Bdata4 0x2344A109, 0x00000000////    Entries Tbl_hi  (double precision) Index = 0,1,...,15//    B = 2^(-3)*(1+Index/16+1/32)//    Entries Tbl_lo (single precision)//    Index = 0,1,...,15  B = 2^(-3)*(1+Index/16+1/32)//data8 0x3FC068D584212B3Ddata4 0x239874B6, 0x00000000data8 0x3FC1646541060850data4 0x2335E774, 0x00000000data8 0x3FC25F6E171A535Cdata4 0x233E36BE, 0x00000000data8 0x3FC359E8EDEB99A3data4 0x239680A3, 0x00000000data8 0x3FC453CEC6092A9Edata4 0x230FB29E, 0x00000000data8 0x3FC54D18BA11570Adata4 0x230C1418, 0x00000000data8 0x3FC645BFFFB3AA73data4 0x23F0564A, 0x00000000data8 0x3FC73DBDE8A7D201data4 0x23D4A5E1, 0x00000000data8 0x3FC8350BE398EBC7data4 0x23D4ADDA, 0x00000000data8 0x3FC92BA37D050271data4 0x23BCB085, 0x00000000data8 0x3FCA217E601081A5data4 0x23BC841D, 0x00000000data8 0x3FCB1696574D780Bdata4 0x23CF4A8E, 0x00000000data8 0x3FCC0AE54D768466data4 0x23BECC90, 0x00000000data8 0x3FCCFE654E1D5395data4 0x2323DCD2, 0x00000000data8 0x3FCDF110864C9D9Ddata4 0x23F53F3A, 0x00000000data8 0x3FCEE2E1451D980Cdata4 0x23CCB11F, 0x00000000//data8 0x400921FB54442D18, 0x3CA1A62633145C07 // PI two doublesdata8 0x3FF921FB54442D18, 0x3C91A62633145C07 // PI_by_2 two dblesdata8 0x3FE921FB54442D18, 0x3C81A62633145C07 // PI_by_4 two dblesdata8 0x4002D97C7F3321D2, 0x3C9A79394C9E8A0A // 3PI_by_4 two dblesLOCAL_OBJECT_END(Constants_atan).section .textGLOBAL_IEEE754_ENTRY(atanl)// Use common code with atan2l after setting x=1.0{ .mfi      alloc r32 = ar.pfs, 0, 17, 4, 0      fma.s1 Ysq = ArgY_orig, ArgY_orig, f0          // Form y*y      nop.i 999}{ .mfi      addl table_ptr1 = @ltoff(Constants_atan#), gp  // Address of table pointer      fma.s1 Xsq = f1, f1, f0                        // Form x*x      nop.i 999};;{ .mfi      ld8 table_ptr1 = [table_ptr1]                  // Get table pointer      fnorm.s1 ArgY = ArgY_orig      nop.i 999}{ .mfi      nop.m 999      fnorm.s1 ArgX = f1      nop.i 999};;{ .mfi      getf.exp sign_X = f1               // Get signexp of x      fmerge.s ArgX_abs = f0, f1         // Form |x|      nop.i 999}{ .mfi      nop.m 999      fnorm.s1 ArgX_orig = f1      nop.i 999};;{ .mfi      getf.exp sign_Y = ArgY_orig        // Get signexp of y      fmerge.s ArgY_abs = f0, ArgY_orig  // Form |y|      mov table_base = table_ptr1        // Save base pointer to tables};;{ .mfi      ldfd P_hi = [table_ptr1],8         // Load double precision hi part of pi      fclass.m p8,p0 = ArgY_orig, 0x1e7  // Test y natval, nan, inf, zero      nop.i 999 };;{ .mfi      ldfps P_lo, TWO_TO_NEG3 = [table_ptr1], 8 // Load P_lo and constant 2^-3      nop.f 999       nop.i 999 }{ .mfi      nop.m 999      fma.s1 M = f1, f1, f0              // Set M = 1.0      nop.i 999 };;////     Check for everything - if false, then must be pseudo-zero//     or pseudo-nan (IA unsupporteds).//{ .mfb      nop.m 999      fclass.m p0,p12 = f1, 0x1FF        // Test x unsupported(p8)  br.cond.spnt ATANL_Y_SPECIAL       // Branch if y natval, nan, inf, zero};;//     U = max(ArgX_abs,ArgY_abs)//     V = min(ArgX_abs,ArgY_abs){ .mfi      nop.m 999      fcmp.ge.s1 p6,p7 = Xsq, Ysq        // Test for |x| >= |y| using squares      nop.i 999 }{ .mfb      nop.m 999      fma.s1 V = ArgX_abs, f1, f0        // Set V assuming |x| < |y|      br.cond.sptk ATANL_COMMON          // Branch to common code};;GLOBAL_IEEE754_END(atanl)GLOBAL_IEEE754_ENTRY(atan2l){ .mfi      alloc r32 = ar.pfs, 0, 17, 4, 0      fma.s1 Ysq = ArgY_orig, ArgY_orig, f0          // Form y*y      nop.i 999}{ .mfi      addl table_ptr1 = @ltoff(Constants_atan#), gp  // Address of table pointer      fma.s1 Xsq = ArgX_orig, ArgX_orig, f0          // Form x*x      nop.i 999};;{ .mfi      ld8 table_ptr1 = [table_ptr1]                  // Get table pointer      fnorm.s1 ArgY = ArgY_orig      nop.i 999}{ .mfi      nop.m 999      fnorm.s1 ArgX = ArgX_orig      nop.i 999};;{ .mfi      getf.exp sign_X = ArgX_orig        // Get signexp of x      fmerge.s ArgX_abs = f0, ArgX_orig  // Form |x|      nop.i 999};;{ .mfi      getf.exp sign_Y = ArgY_orig        // Get signexp of y      fmerge.s ArgY_abs = f0, ArgY_orig  // Form |y|      mov table_base = table_ptr1        // Save base pointer to tables};;{ .mfi      ldfd P_hi = [table_ptr1],8         // Load double precision hi part of pi      fclass.m p8,p0 = ArgY_orig, 0x1e7  // Test y natval, nan, inf, zero      nop.i 999 };;{ .mfi      ldfps P_lo, TWO_TO_NEG3 = [table_ptr1], 8 // Load P_lo and constant 2^-3      fclass.m p9,p0 = ArgX_orig, 0x1e7  // Test x natval, nan, inf, zero      nop.i 999 }{ .mfi      nop.m 999      fma.s1 M = f1, f1, f0              // Set M = 1.0      nop.i 999 };;////     Check for everything - if false, then must be pseudo-zero//     or pseudo-nan (IA unsupporteds).//{ .mfb      nop.m 999      fclass.m p0,p12 = ArgX_orig, 0x1FF // Test x unsupported(p8)  br.cond.spnt ATANL_Y_SPECIAL       // Branch if y natval, nan, inf, zero};;//     U = max(ArgX_abs,ArgY_abs)//     V = min(ArgX_abs,ArgY_abs){ .mfi      nop.m 999      fcmp.ge.s1 p6,p7 = Xsq, Ysq        // Test for |x| >= |y| using squares      nop.i 999 }{ .mfb      nop.m 999      fma.s1 V = ArgX_abs, f1, f0        // Set V assuming |x| < |y|(p9)  br.cond.spnt ATANL_X_SPECIAL       // Branch if x natval, nan, inf, zero};;// Now common code for atanl and atan2lATANL_COMMON:{ .mfi      nop.m 999      fclass.m p0,p13 = ArgY_orig, 0x1FF // Test y unsupported      shr sign_X = sign_X, 17            // Get sign bit of x}{ .mfi      nop.m 999      fma.s1 U = ArgY_abs, f1, f0        // Set U assuming |x| < |y|      adds table_ptr1 = 176, table_ptr1  // Point to Q4};;{ .mfi(p6)  add swap = r0, r0                  // Set swap=0 if |x| >= |y|(p6)  frcpa.s1 E, p0 = ArgY_abs, ArgX_abs // Compute E if |x| >= |y|      shr sign_Y = sign_Y, 17            // Get sign bit of y}{ .mfb      nop.m 999(p6)  fma.s1 V = ArgY_abs, f1, f0        // Set V if |x| >= |y|(p12) br.cond.spnt ATANL_UNSUPPORTED     // Branch if x unsupported};;// Set p8 if y >=0// Set p9 if y < 0// Set p10 if |x| >= |y| and x >=0// Set p11 if |x| >= |y| and x < 0{ .mfi      cmp.eq p8, p9 = 0, sign_Y          // Test for y >= 0(p7)  frcpa.s1 E, p0 = ArgX_abs, ArgY_abs // Compute E if |x| < |y|(p7)  add swap = 1, r0                   // Set swap=1 if |x| < |y|}{ .mfb(p6)  cmp.eq.unc p10, p11 = 0, sign_X    // If |x| >= |y|, test for x >= 0(p6)  fma.s1 U = ArgX_abs, f1, f0        // Set U if |x| >= |y|(p13) br.cond.spnt ATANL_UNSUPPORTED     // Branch if y unsupported};;////     if p8, s_Y = 1.0//     if p9, s_Y = -1.0//.pred.rel "mutex",p8,p9{ .mfi      nop.m 999(p8)  fadd.s1 s_Y = f0, f1               // If y >= 0 set s_Y = 1.0      nop.i 999}{ .mfi      nop.m 999(p9)  fsub.s1 s_Y = f0, f1               // If y < 0 set s_Y = -1.0      nop.i 999};;.pred.rel "mutex",p10,p11{ .mfi      nop.m 999(p10) fsub.s1 M = M, f1                  // If |x| >= |y| and x >=0, set M=0      nop.i 999}{ .mfi      nop.m 999(p11) fadd.s1 M = M, f1                  // If |x| >= |y| and x < 0, set M=2.0      nop.i 999};;{ .mfi      nop.m 999      fcmp.eq.s0 p0, p9 = ArgX_orig, ArgY_orig // Dummy to set denormal flag      nop.i 999}// *************************************************// ********************* STEP2 *********************// *************************************************////     Q = E * V//{ .mfi      nop.m 999      fmpy.s1 Q = E, V      nop.i 999};;{ .mfi      nop.m 999      fnma.s1 E_hold = E, U, f1           // E_hold = 1.0 - E*U (1) if POLY path      nop.i 999};;// Create a single precision representation of the signexp of Q with the // 4 most significant bits of the significand followed by a 1 and then 18 0's{ .mfi      nop.m 999      fmpy.s1 P_hi = M, P_hi      dep.z special = 0x1, 18, 1           // Form 0x0000000000040000}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -