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

📄 e_log.s

📁 Glibc 2.3.2源代码(解压后有100多M)
💻 S
📖 第 1 页 / 共 3 页
字号:
.file "log.s"// Copyright (C) 2000, 2001, Intel Corporation// All rights reserved.// // Contributed 2/2/2000 by John Harrison, Ted Kubaska, Bob Norin, Shane Story,// and Ping Tak Peter Tang of the Computational Software Lab, 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://developer.intel.com/opensource.//// History//==============================================================// 2/02/00  Initial version// 4/04/00  Unwind support added// 6/16/00  Updated table to be rounded correctly// 8/15/00  Bundle added after call to __libm_error_support to properly//          set [the previously overwritten] GR_Parameter_RESULT.// 8/17/00  Improved speed of main path by 5 cycles//          Shortened path for x=1.0// 1/09/01  Improved speed, fixed flags for neg denormals////// API//==============================================================// double log(double)// double log10(double)//// Overview of operation//==============================================================// Background//// Consider  x = 2^N 1.f1 f2 f3 f4...f63// Log(x) = log(frcpa(x) x/frcpa(x))//        = log(1/frcpa(x)) + log(frcpa(x) x)//        = -log(frcpa(x)) + log(frcpa(x) 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) //                = +Nlog2 - log(frcpa(1.f1 f2 ... f63))//// -log(frcpa(x)) = -log(C) //                = +Nlog2 + log(frcpa(1.f1 f2 ... f63))//// Log(x) = log(1/frcpa(x)) + log(frcpa(x) x)// Log(x) =  +Nlog2 + log(1./frcpa(1.f1 f2 ... f63)) + log(frcpa(x) x)// Log(x) =  +Nlog2 - log(/frcpa(1.f1 f2 ... f63))   + log(frcpa(x) x)// Log(x) =  +Nlog2 + T                              + log(frcpa(x) x)//// Log(x) =  +Nlog2 + T                     + log(C x)//// Cx = 1 + r//// Log(x) =  +Nlog2 + T  + log(1+r)// Log(x) =  +Nlog2 + 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//===============// CASE 1:  |x-1| >= 2^-6// 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// CASE 2:  |x-1| < 2^-6// w = x - 1//// Form wseries = w + Q1*w^2 + Q2*w^3 + ... + Q7*w^8 + Q8*w^9//// result = wseries// Special values //==============================================================// log(+0)    = -inf// log(-0)    = -inf// log(+qnan) = +qnan // log(-qnan) = -qnan // log(+snan) = +qnan // log(-snan) = -qnan // log(-n)    = QNAN Indefinite// log(-inf)  = QNAN Indefinite // log(+inf)  = +inf// Registers used//==============================================================// Floating Point registers used: // f8, input// f9 -> f15,  f32 -> f68// General registers used:  // r32 -> r51// Predicate registers used:// p6 -> p15// p8 log base e// p6 log base e special// p9 used in the frcpa// p13 log base e large W// p14 log base e small w// p7 log base 10// p10 log base 10 large W// p11 log base 10 small w// p12 log base 10 special#include "libm_support.h"// Assembly macros//==============================================================log_int_Nfloat   = f9 log_Nfloat       = f10 log_P5           = f11 log_P4           = f12 log_P3           = f13 log_P2           = f14 log_half         = f15log_log2         = f32 log_T            = f33 log_rp_p4        = f34 log_rp_p32       = f35 log_rp_p2        = f36 log_w6           = f37log_rp_p10       = f38log_rcube        = f39log_rsq          = f40 log_T_plus_Nlog2 = f41 log_w3           = f42log_r            = f43log_C            = f44log_w            = f45log_Q8           = f46log_Q7           = f47log_Q4           = f48 log_Q3           = f49log_Q6           = f50 log_Q5           = f51log_Q2           = f52log_Q1           = f53 log_P1           = f53 log_rp_q7        = f54 log_rp_q65       = f55log_Qlo          = f56log_rp_q3        = f57log_rp_q21       = f58log_Qhi          = f59log_wsq          = f60log_w4           = f61log_Q            = f62log_inv_ln10     = f63log_log10_hi     = f64log_log10_lo     = f65log_rp_q10       = f66log_NORM_f8      = f67log_r2P_r        = f68 // ===================================log_GR_exp_17_ones               = r33log_GR_exp_16_ones               = r34log_GR_exp_f8                    = r35log_GR_signexp_f8                = r36log_GR_true_exp_f8               = r37log_GR_significand_f8            = r38log_GR_half_exp                  = r39log_GR_index                     = r39log_AD_1                         = r40log_GR_signexp_w                 = r41log_GR_fff9                      = r42log_AD_2                         = r43log_GR_exp_w                     = r44GR_SAVE_B0                       = r45GR_SAVE_GP                       = r46GR_SAVE_PFS                      = r47GR_Parameter_X                   = r48GR_Parameter_Y                   = r49GR_Parameter_RESULT              = r50log_GR_tag                       = r51// Data tables//==============================================================#ifdef _LIBC.rodata#else.data#endif.align 16log_table_1:ASM_TYPE_DIRECTIVE(log_table_1,@object)data8 0xBFC5555DA7212371 // P5data8 0x3FC999A19EEF5826 // P4data8 0x3FBC756AC654273B // Q8data8 0xBFC001A42489AB4D // Q7data8 0x3FC99999999A169B // Q4data8 0xBFD00000000019AC // Q3ASM_SIZE_DIRECTIVE(log_table_1)log_table_2:ASM_TYPE_DIRECTIVE(log_table_2,@object)data8 0xBFCFFFFFFFFEF009 // P3data8 0x3FD555555554ECB2 // P2data8 0x3FC2492479AA0DF8 // Q6data8 0xBFC5555544986F52 // Q5data8 0x3FD5555555555555 // Q2data8 0xBFE0000000000000 // Q1, P1 = -0.5data8 0xde5bd8a937287195, 0x00003ffd  // double-extended 1/ln(10)data8 0xb17217f7d1cf79ac, 0x00003ffe  // log2//      b17217f7d1cf79ab c9e3b39803f2f6adata8 0x80200aaeac44ef38 , 0x00003ff6 //   log(1/frcpa(1+  0/2^-8))data8 0xc09090a2c35aa070 , 0x00003ff7 //   log(1/frcpa(1+  1/2^-8))data8 0xa0c94fcb41977c75 , 0x00003ff8 //   log(1/frcpa(1+  2/2^-8))data8 0xe18b9c263af83301 , 0x00003ff8 //   log(1/frcpa(1+  3/2^-8))data8 0x8d35c8d6399c30ea , 0x00003ff9 //   log(1/frcpa(1+  4/2^-8))data8 0xadd4d2ecd601cbb8 , 0x00003ff9 //   log(1/frcpa(1+  5/2^-8))data8 0xce95403a192f9f01 , 0x00003ff9 //   log(1/frcpa(1+  6/2^-8))data8 0xeb59392cbcc01096 , 0x00003ff9 //   log(1/frcpa(1+  7/2^-8))data8 0x862c7d0cefd54c5d , 0x00003ffa //   log(1/frcpa(1+  8/2^-8))data8 0x94aa63c65e70d499 , 0x00003ffa //   log(1/frcpa(1+  9/2^-8))data8 0xa54a696d4b62b382 , 0x00003ffa //   log(1/frcpa(1+ 10/2^-8))data8 0xb3e4a796a5dac208 , 0x00003ffa //   log(1/frcpa(1+ 11/2^-8))data8 0xc28c45b1878340a9 , 0x00003ffa //   log(1/frcpa(1+ 12/2^-8))data8 0xd35c55f39d7a6235 , 0x00003ffa //   log(1/frcpa(1+ 13/2^-8))data8 0xe220f037b954f1f5 , 0x00003ffa //   log(1/frcpa(1+ 14/2^-8))data8 0xf0f3389b036834f3 , 0x00003ffa //   log(1/frcpa(1+ 15/2^-8))data8 0xffd3488d5c980465 , 0x00003ffa //   log(1/frcpa(1+ 16/2^-8))data8 0x87609ce2ed300490 , 0x00003ffb //   log(1/frcpa(1+ 17/2^-8))data8 0x8ede9321e8c85927 , 0x00003ffb //   log(1/frcpa(1+ 18/2^-8))data8 0x96639427f2f8e2f4 , 0x00003ffb //   log(1/frcpa(1+ 19/2^-8))data8 0x9defad3e8f73217b , 0x00003ffb //   log(1/frcpa(1+ 20/2^-8))data8 0xa582ebd50097029c , 0x00003ffb //   log(1/frcpa(1+ 21/2^-8))data8 0xac06dbe75ab80fee , 0x00003ffb //   log(1/frcpa(1+ 22/2^-8))data8 0xb3a78449b2d3ccca , 0x00003ffb //   log(1/frcpa(1+ 23/2^-8))data8 0xbb4f79635ab46bb2 , 0x00003ffb //   log(1/frcpa(1+ 24/2^-8))data8 0xc2fec93a83523f3f , 0x00003ffb //   log(1/frcpa(1+ 25/2^-8))data8 0xc99af2eaca4c4571 , 0x00003ffb //   log(1/frcpa(1+ 26/2^-8))data8 0xd1581106472fa653 , 0x00003ffb //   log(1/frcpa(1+ 27/2^-8))data8 0xd8002560d4355f2e , 0x00003ffb //   log(1/frcpa(1+ 28/2^-8))data8 0xdfcb43b4fe508632 , 0x00003ffb //   log(1/frcpa(1+ 29/2^-8))data8 0xe67f6dff709d4119 , 0x00003ffb //   log(1/frcpa(1+ 30/2^-8))data8 0xed393b1c22351280 , 0x00003ffb //   log(1/frcpa(1+ 31/2^-8))data8 0xf5192bff087bcc35 , 0x00003ffb //   log(1/frcpa(1+ 32/2^-8))data8 0xfbdf4ff6dfef2fa3 , 0x00003ffb //   log(1/frcpa(1+ 33/2^-8))data8 0x81559a97f92f9cc7 , 0x00003ffc //   log(1/frcpa(1+ 34/2^-8))data8 0x84be72bce90266e8 , 0x00003ffc //   log(1/frcpa(1+ 35/2^-8))data8 0x88bc74113f23def2 , 0x00003ffc //   log(1/frcpa(1+ 36/2^-8))data8 0x8c2ba3edf6799d11 , 0x00003ffc //   log(1/frcpa(1+ 37/2^-8))data8 0x8f9dc92f92ea08b1 , 0x00003ffc //   log(1/frcpa(1+ 38/2^-8))data8 0x9312e8f36efab5a7 , 0x00003ffc //   log(1/frcpa(1+ 39/2^-8))data8 0x968b08643409ceb6 , 0x00003ffc //   log(1/frcpa(1+ 40/2^-8))data8 0x9a062cba08a1708c , 0x00003ffc //   log(1/frcpa(1+ 41/2^-8))data8 0x9d845b3abf95485c , 0x00003ffc //   log(1/frcpa(1+ 42/2^-8))data8 0xa06fd841bc001bb4 , 0x00003ffc //   log(1/frcpa(1+ 43/2^-8))data8 0xa3f3a74652fbe0db , 0x00003ffc //   log(1/frcpa(1+ 44/2^-8))data8 0xa77a8fb2336f20f5 , 0x00003ffc //   log(1/frcpa(1+ 45/2^-8))data8 0xab0497015d28b0a0 , 0x00003ffc //   log(1/frcpa(1+ 46/2^-8))data8 0xae91c2be6ba6a615 , 0x00003ffc //   log(1/frcpa(1+ 47/2^-8))data8 0xb189d1b99aebb20b , 0x00003ffc //   log(1/frcpa(1+ 48/2^-8))data8 0xb51cced5de9c1b2c , 0x00003ffc //   log(1/frcpa(1+ 49/2^-8))data8 0xb819bee9e720d42f , 0x00003ffc //   log(1/frcpa(1+ 50/2^-8))data8 0xbbb2a0947b093a5d , 0x00003ffc //   log(1/frcpa(1+ 51/2^-8))data8 0xbf4ec1505811684a , 0x00003ffc //   log(1/frcpa(1+ 52/2^-8))data8 0xc2535bacfa8975ff , 0x00003ffc //   log(1/frcpa(1+ 53/2^-8))data8 0xc55a3eafad187eb8 , 0x00003ffc //   log(1/frcpa(1+ 54/2^-8))data8 0xc8ff2484b2c0da74 , 0x00003ffc //   log(1/frcpa(1+ 55/2^-8))data8 0xcc0b1a008d53ab76 , 0x00003ffc //   log(1/frcpa(1+ 56/2^-8))data8 0xcfb6203844b3209b , 0x00003ffc //   log(1/frcpa(1+ 57/2^-8))data8 0xd2c73949a47a19f5 , 0x00003ffc //   log(1/frcpa(1+ 58/2^-8))data8 0xd5daae18b49d6695 , 0x00003ffc //   log(1/frcpa(1+ 59/2^-8))data8 0xd8f08248cf7e8019 , 0x00003ffc //   log(1/frcpa(1+ 60/2^-8))data8 0xdca7749f1b3e540e , 0x00003ffc //   log(1/frcpa(1+ 61/2^-8))data8 0xdfc28e033aaaf7c7 , 0x00003ffc //   log(1/frcpa(1+ 62/2^-8))data8 0xe2e012a5f91d2f55 , 0x00003ffc //   log(1/frcpa(1+ 63/2^-8))data8 0xe600064ed9e292a8 , 0x00003ffc //   log(1/frcpa(1+ 64/2^-8))data8 0xe9226cce42b39f60 , 0x00003ffc //   log(1/frcpa(1+ 65/2^-8))data8 0xec4749fd97a28360 , 0x00003ffc //   log(1/frcpa(1+ 66/2^-8))data8 0xef6ea1bf57780495 , 0x00003ffc //   log(1/frcpa(1+ 67/2^-8))data8 0xf29877ff38809091 , 0x00003ffc //   log(1/frcpa(1+ 68/2^-8))data8 0xf5c4d0b245cb89be , 0x00003ffc //   log(1/frcpa(1+ 69/2^-8))data8 0xf8f3afd6fcdef3aa , 0x00003ffc //   log(1/frcpa(1+ 70/2^-8))

⌨️ 快捷键说明

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