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

📄 e_atanh.s

📁 glibc 2.9,最新版的C语言库函数
💻 S
📖 第 1 页 / 共 3 页
字号:
.file "atanh.s"// Copyright (c) 2000 - 2005, Intel Corporation// All rights reserved.//// Contributed 2000 by the Intel Numerics Group, Intel Corporation//// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met://// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.//// * Redistributions in binary form must reproduce the above copyright// notice, this list of conditions and the following disclaimer in the// documentation and/or other materials provided with the distribution.//// * The name of Intel Corporation may not be used to endorse or promote// products derived from this software without specific prior written// permission.// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.//// Intel Corporation is the author of this code, and requests that all// problem reports or change requests be submitted to it directly at// http://www.intel.com/software/products/opensource/libraries/num.htm.//// ==============================================================// History// ==============================================================// 05/03/01  Initial version// 05/20/02  Cleaned up namespace and sf0 syntax// 02/06/03  Reordered header: .section, .global, .proc, .align// 05/26/03  Improved performance, fixed to handle unorms// 03/31/05  Reformatted delimiters between data tables//// API// ==============================================================// double atanh(double)//// Overview of operation// ==============================================================//// There are 7 paths:// 1. x = +/-0.0//    Return atanh(x) = +/-0.0//// 2. 0.0 < |x| < 1/4//    Return atanh(x) = Po2l(x),//    where Po2l(x) = (((((((((C9*x^2 + C8)*x^2 + C7)*x^2 + C6)*x^2 +//          C5)*x^2 + C4)*x^2 + C3)*x^2 + C2)*x^2 + C1)* x^2 + C0)*x^3 + x// 3. 1/4 <= |x| < 1//    Return atanh(x) = sign(x) * log((1 + |x|)/(1 - |x|))//    To compute (1 + |x|)/(1 - |x|) modified Newton Raphson method is used//    (3 iterations)//    Algorithm description for log function see below.//// 4. |x| = 1//    Return atanh(x) = sign(x) * +INF//// 5. 1 < |x| <= +INF//    Return atanh(x) = QNaN//// 6. x = [S,Q]NaN//    Return atanh(x) = QNaN//// 7. x = denormal//    Return atanh(x) = x////==============================================================// Algorithm Description for log(x) function// Below we are using the fact that inequality x - 1.0 > 2^(-6) is always true// for this atanh implementation//// Consider  x = 2^N 1.f1 f2 f3 f4...f63// Log(x) = log(x * frcpa(x) / frcpa(x))//        = log(x * frcpa(x)) + log(1/frcpa(x))//        = log(x * frcpa(x)) - log(frcpa(x))//// frcpa(x)       = 2^-N * frcpa(1.f1 f2 ... f63)//// -log(frcpa(x)) = -log(C)//                = -log(2^-N) - log(frcpa(1.f1 f2 ... f63))//// -log(frcpa(x)) = -log(C)//                = N*log2 - log(frcpa(1.f1 f2 ... f63))////// Log(x) = log(1/frcpa(x)) + log(frcpa(x) x)//// Log(x) = N*log2 + log(1./frcpa(1.f1 f2 ... f63)) + log(x * frcpa(x))// Log(x) = N*log2 + T                              + log(frcpa(x) x)//// Log(x) = N*log2 + T                              + log(C * x)//// C * x = 1 + r//// Log(x) = N*log2 + T + log(1 + r)// Log(x) = N*log2 + T + Series(r - r^2/2 + r^3/3 - r^4/4 + ...)//// 1.f1 f2 ... f8 has 256 entries.// They are 1 + k/2^8, k = 0 ... 255// These 256 values are the table entries.//// Implementation//==============================================================// C = frcpa(x)// r = C * x - 1//// Form rseries = r + P1*r^2 + P2*r^3 + P3*r^4 + P4*r^5 + P5*r^6//// x = f * 2*N where f is 1.f_1f_2f_3...f_63// Nfloat = float(n)  where n is the true unbiased exponent// pre-index = f_1f_2....f_8// index = pre_index * 16// get the dxt table entry at index + offset = T//// result = (T + Nfloat * log(2)) + rseries//// The T table is calculated as follows// Form x_k = 1 + k/2^8 where k goes from 0... 255//      y_k = frcpa(x_k)//      log(1/y_k)  in quad and round to double-extended////// Registers used//==============================================================// Floating Point registers used:// f8, input// f32 -> f77// General registers used:// r14 -> r27, r33 -> r39// Predicate registers used:// p6 -> p14// p10, p11      to indicate is argument positive or negative// p12           to filter out case when x = [Q,S]NaN or +/-0// p13           to filter out case when x = denormal// p6, p7        to filter out case when |x| >= 1// p8            to filter out case when |x| < 1/4// Assembly macros//==============================================================Data2Ptr              = r14Data3Ptr              = r15RcpTablePtr           = r16rExpbMask             = r17rBias                 = r18rNearZeroBound        = r19rArgSExpb             = r20rArgExpb              = r21rSExpb                = r22rExpb                 = r23rSig                  = r24rN                    = r25rInd                  = r26DataPtr               = r27GR_SAVE_B0            = r33GR_SAVE_GP            = r34GR_SAVE_PFS           = r35GR_Parameter_X        = r36GR_Parameter_Y        = r37GR_Parameter_RESULT   = r38atanh_GR_tag          = r39//==============================================================fAbsX                 = f32fOneMx                = f33fOnePx                = f34fY                    = f35fR                    = f36fR2                   = f37fR3                   = f38fRcp                  = f39fY4Rcp                = f40fRcp0                 = f41fRcp0n                = f42fRcp1                 = f43fRcp2                 = f44fRcp3                 = f45fN4Cvt                = f46fN                    = f47fY2                   = f48fLog2                 = f49fLogT                 = f50fLogT_N               = f51fX2                   = f52fX3                   = f53fX4                   = f54fX8                   = f55fP0                   = f56fP5                   = f57fP4                   = f58fP3                   = f59fP2                   = f60fP1                   = f61fNormX                = f62fC9                   = f63fC8                   = f64fC7                   = f65fC6                   = f66fC5                   = f67fC4                   = f68fC3                   = f69fC2                   = f70fC1                   = f71fC0                   = f72fP98                  = f73fP76                  = f74fP54                  = f75fP32                  = f76fP10                  = f77// Data tables//==============================================================RODATA.align 16LOCAL_OBJECT_START(atanh_data)data8 0xBFC5555DA7212371              //   P5data8 0x3FC999A19EEF5826              //   P4data8 0xBFCFFFFFFFFEF009              //   P3data8 0x3FD555555554ECB2              //   P2data8 0xBFE0000000000000              //   P1 = -0.5data8 0x0000000000000000              //   paddata8 0xb17217f7d1cf79ac , 0x00003ffd //   0.5*log(2)data8 0x0000000000000000 , 0x00000000 //   pad to eliminate bank conflictsLOCAL_OBJECT_END(atanh_data)LOCAL_OBJECT_START(atanh_data_2)data8 0x8649FB89D3AD51FB , 0x00003FFB //   C9data8 0xCC10AABEF160077A , 0x00003FFA //   C8data8 0xF1EDB99AC0819CE2 , 0x00003FFA //   C7data8 0x8881E53A809AD24D , 0x00003FFB //   C6data8 0x9D8A116EF212F271 , 0x00003FFB //   C5data8 0xBA2E8A6D1D756453 , 0x00003FFB //   C4data8 0xE38E38E7A0945692 , 0x00003FFB //   C3data8 0x924924924536891A , 0x00003FFC //   C2data8 0xCCCCCCCCCCD08D51 , 0x00003FFC //   C1data8 0xAAAAAAAAAAAAAA0C , 0x00003FFD //   C0LOCAL_OBJECT_END(atanh_data_2)LOCAL_OBJECT_START(atanh_data_3)data8 0x80200aaeac44ef38 , 0x00003ff5 //   log(1/frcpa(1+0/2^-8))/2//data8 0xc09090a2c35aa070 , 0x00003ff6 //   log(1/frcpa(1+1/2^-8))/2data8 0xa0c94fcb41977c75 , 0x00003ff7 //   log(1/frcpa(1+2/2^-8))/2data8 0xe18b9c263af83301 , 0x00003ff7 //   log(1/frcpa(1+3/2^-8))/2data8 0x8d35c8d6399c30ea , 0x00003ff8 //   log(1/frcpa(1+4/2^-8))/2data8 0xadd4d2ecd601cbb8 , 0x00003ff8 //   log(1/frcpa(1+5/2^-8))/2//data8 0xce95403a192f9f01 , 0x00003ff8 //   log(1/frcpa(1+6/2^-8))/2data8 0xeb59392cbcc01096 , 0x00003ff8 //   log(1/frcpa(1+7/2^-8))/2data8 0x862c7d0cefd54c5d , 0x00003ff9 //   log(1/frcpa(1+8/2^-8))/2data8 0x94aa63c65e70d499 , 0x00003ff9 //   log(1/frcpa(1+9/2^-8))/2data8 0xa54a696d4b62b382 , 0x00003ff9 //   log(1/frcpa(1+10/2^-8))/2//data8 0xb3e4a796a5dac208 , 0x00003ff9 //   log(1/frcpa(1+11/2^-8))/2data8 0xc28c45b1878340a9 , 0x00003ff9 //   log(1/frcpa(1+12/2^-8))/2data8 0xd35c55f39d7a6235 , 0x00003ff9 //   log(1/frcpa(1+13/2^-8))/2data8 0xe220f037b954f1f5 , 0x00003ff9 //   log(1/frcpa(1+14/2^-8))/2data8 0xf0f3389b036834f3 , 0x00003ff9 //   log(1/frcpa(1+15/2^-8))/2//data8 0xffd3488d5c980465 , 0x00003ff9 //   log(1/frcpa(1+16/2^-8))/2data8 0x87609ce2ed300490 , 0x00003ffa //   log(1/frcpa(1+17/2^-8))/2data8 0x8ede9321e8c85927 , 0x00003ffa //   log(1/frcpa(1+18/2^-8))/2data8 0x96639427f2f8e2f4 , 0x00003ffa //   log(1/frcpa(1+19/2^-8))/2data8 0x9defad3e8f73217b , 0x00003ffa //   log(1/frcpa(1+20/2^-8))/2//data8 0xa582ebd50097029c , 0x00003ffa //   log(1/frcpa(1+21/2^-8))/2data8 0xac06dbe75ab80fee , 0x00003ffa //   log(1/frcpa(1+22/2^-8))/2data8 0xb3a78449b2d3ccca , 0x00003ffa //   log(1/frcpa(1+23/2^-8))/2data8 0xbb4f79635ab46bb2 , 0x00003ffa //   log(1/frcpa(1+24/2^-8))/2data8 0xc2fec93a83523f3f , 0x00003ffa //   log(1/frcpa(1+25/2^-8))/2//data8 0xc99af2eaca4c4571 , 0x00003ffa //   log(1/frcpa(1+26/2^-8))/2data8 0xd1581106472fa653 , 0x00003ffa //   log(1/frcpa(1+27/2^-8))/2data8 0xd8002560d4355f2e , 0x00003ffa //   log(1/frcpa(1+28/2^-8))/2data8 0xdfcb43b4fe508632 , 0x00003ffa //   log(1/frcpa(1+29/2^-8))/2data8 0xe67f6dff709d4119 , 0x00003ffa //   log(1/frcpa(1+30/2^-8))/2//data8 0xed393b1c22351280 , 0x00003ffa //   log(1/frcpa(1+31/2^-8))/2data8 0xf5192bff087bcc35 , 0x00003ffa //   log(1/frcpa(1+32/2^-8))/2data8 0xfbdf4ff6dfef2fa3 , 0x00003ffa //   log(1/frcpa(1+33/2^-8))/2data8 0x81559a97f92f9cc7 , 0x00003ffb //   log(1/frcpa(1+34/2^-8))/2data8 0x84be72bce90266e8 , 0x00003ffb //   log(1/frcpa(1+35/2^-8))/2//data8 0x88bc74113f23def2 , 0x00003ffb //   log(1/frcpa(1+36/2^-8))/2data8 0x8c2ba3edf6799d11 , 0x00003ffb //   log(1/frcpa(1+37/2^-8))/2data8 0x8f9dc92f92ea08b1 , 0x00003ffb //   log(1/frcpa(1+38/2^-8))/2data8 0x9312e8f36efab5a7 , 0x00003ffb //   log(1/frcpa(1+39/2^-8))/2data8 0x968b08643409ceb6 , 0x00003ffb //   log(1/frcpa(1+40/2^-8))/2//data8 0x9a062cba08a1708c , 0x00003ffb //   log(1/frcpa(1+41/2^-8))/2data8 0x9d845b3abf95485c , 0x00003ffb //   log(1/frcpa(1+42/2^-8))/2data8 0xa06fd841bc001bb4 , 0x00003ffb //   log(1/frcpa(1+43/2^-8))/2data8 0xa3f3a74652fbe0db , 0x00003ffb //   log(1/frcpa(1+44/2^-8))/2data8 0xa77a8fb2336f20f5 , 0x00003ffb //   log(1/frcpa(1+45/2^-8))/2//data8 0xab0497015d28b0a0 , 0x00003ffb //   log(1/frcpa(1+46/2^-8))/2data8 0xae91c2be6ba6a615 , 0x00003ffb //   log(1/frcpa(1+47/2^-8))/2data8 0xb189d1b99aebb20b , 0x00003ffb //   log(1/frcpa(1+48/2^-8))/2data8 0xb51cced5de9c1b2c , 0x00003ffb //   log(1/frcpa(1+49/2^-8))/2data8 0xb819bee9e720d42f , 0x00003ffb //   log(1/frcpa(1+50/2^-8))/2//data8 0xbbb2a0947b093a5d , 0x00003ffb //   log(1/frcpa(1+51/2^-8))/2data8 0xbf4ec1505811684a , 0x00003ffb //   log(1/frcpa(1+52/2^-8))/2data8 0xc2535bacfa8975ff , 0x00003ffb //   log(1/frcpa(1+53/2^-8))/2data8 0xc55a3eafad187eb8 , 0x00003ffb //   log(1/frcpa(1+54/2^-8))/2data8 0xc8ff2484b2c0da74 , 0x00003ffb //   log(1/frcpa(1+55/2^-8))/2//data8 0xcc0b1a008d53ab76 , 0x00003ffb //   log(1/frcpa(1+56/2^-8))/2data8 0xcfb6203844b3209b , 0x00003ffb //   log(1/frcpa(1+57/2^-8))/2data8 0xd2c73949a47a19f5 , 0x00003ffb //   log(1/frcpa(1+58/2^-8))/2data8 0xd5daae18b49d6695 , 0x00003ffb //   log(1/frcpa(1+59/2^-8))/2data8 0xd8f08248cf7e8019 , 0x00003ffb //   log(1/frcpa(1+60/2^-8))/2//data8 0xdca7749f1b3e540e , 0x00003ffb //   log(1/frcpa(1+61/2^-8))/2data8 0xdfc28e033aaaf7c7 , 0x00003ffb //   log(1/frcpa(1+62/2^-8))/2data8 0xe2e012a5f91d2f55 , 0x00003ffb //   log(1/frcpa(1+63/2^-8))/2data8 0xe600064ed9e292a8 , 0x00003ffb //   log(1/frcpa(1+64/2^-8))/2data8 0xe9226cce42b39f60 , 0x00003ffb //   log(1/frcpa(1+65/2^-8))/2//data8 0xec4749fd97a28360 , 0x00003ffb //   log(1/frcpa(1+66/2^-8))/2data8 0xef6ea1bf57780495 , 0x00003ffb //   log(1/frcpa(1+67/2^-8))/2data8 0xf29877ff38809091 , 0x00003ffb //   log(1/frcpa(1+68/2^-8))/2data8 0xf5c4d0b245cb89be , 0x00003ffb //   log(1/frcpa(1+69/2^-8))/2data8 0xf8f3afd6fcdef3aa , 0x00003ffb //   log(1/frcpa(1+70/2^-8))/2//data8 0xfc2519756be1abc7 , 0x00003ffb //   log(1/frcpa(1+71/2^-8))/2data8 0xff59119f503e6832 , 0x00003ffb //   log(1/frcpa(1+72/2^-8))/2data8 0x8147ce381ae0e146 , 0x00003ffc //   log(1/frcpa(1+73/2^-8))/2data8 0x82e45f06cb1ad0f2 , 0x00003ffc //   log(1/frcpa(1+74/2^-8))/2data8 0x842f5c7c573cbaa2 , 0x00003ffc //   log(1/frcpa(1+75/2^-8))/2//data8 0x85ce471968c8893a , 0x00003ffc //   log(1/frcpa(1+76/2^-8))/2data8 0x876e8305bc04066d , 0x00003ffc //   log(1/frcpa(1+77/2^-8))/2data8 0x891012678031fbb3 , 0x00003ffc //   log(1/frcpa(1+78/2^-8))/2data8 0x8a5f1493d766a05f , 0x00003ffc //   log(1/frcpa(1+79/2^-8))/2data8 0x8c030c778c56fa00 , 0x00003ffc //   log(1/frcpa(1+80/2^-8))/2//

⌨️ 快捷键说明

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