📄 e_logf.s
字号:
.file "logf.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//==============================================================// 3/01/00 Initial version// 8/15/00 Bundle added after call to __libm_error_support to properly// set [the previously overwritten] GR_Parameter_RESULT.// 1/10/01 Improved speed, fixed flags for neg denormals////// API//==============================================================// float logf(float)// float log10f(float)//// 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^-8// C = frcpa(x)// r = C * x - 1//// Form rseries = r + P1*r^2 + P2*r^3 + P3*r^4//// 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// CASE 2: |x-1| < 2^-6// w = x - 1//// Form wseries = w + Q1*w^2 + Q2*w^3 + Q3*w^4//// 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 -> f47// 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_P3 = f11 log_P2 = f12 log_P1 = f13 log_inv_ln10 = f14log_log2 = f15 log_w = f32log_T = f33 log_rp_p32 = f34 log_rp_p2 = f35 log_rp_p10 = f36log_rsq = f37 log_T_plus_Nlog2 = f38 log_r = f39log_C = f40log_rp_q32 = f41log_rp_q2 = f42log_rp_q10 = f43log_wsq = f44log_Q = f45log_inv_ln10 = f46log_NORM_f8 = f47// ===================================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_index = r39log_AD_1 = r40log_GR_signexp_w = r41log_GR_fff7 = 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 0xbfd0001008f39d59 // p3data8 0x3fd5556073e0c45a // p2ASM_SIZE_DIRECTIVE(log_table_1)log_table_2:ASM_TYPE_DIRECTIVE(log_table_2,@object)data8 0xbfdffffffffaea15 // p1data8 0x3fdbcb7b1526e50e // 1/ln10data8 0x3fe62e42fefa39ef // Log(2)data8 0x0 // paddata8 0x3F60040155D5889E //log(1/frcpa(1+ 0/256)data8 0x3F78121214586B54 //log(1/frcpa(1+ 1/256)data8 0x3F841929F96832F0 //log(1/frcpa(1+ 2/256)data8 0x3F8C317384C75F06 //log(1/frcpa(1+ 3/256)data8 0x3F91A6B91AC73386 //log(1/frcpa(1+ 4/256)data8 0x3F95BA9A5D9AC039 //log(1/frcpa(1+ 5/256)data8 0x3F99D2A8074325F4 //log(1/frcpa(1+ 6/256)data8 0x3F9D6B2725979802 //log(1/frcpa(1+ 7/256)data8 0x3FA0C58FA19DFAAA //log(1/frcpa(1+ 8/256)data8 0x3FA2954C78CBCE1B //log(1/frcpa(1+ 9/256)data8 0x3FA4A94D2DA96C56 //log(1/frcpa(1+ 10/256)data8 0x3FA67C94F2D4BB58 //log(1/frcpa(1+ 11/256)data8 0x3FA85188B630F068 //log(1/frcpa(1+ 12/256)data8 0x3FAA6B8ABE73AF4C //log(1/frcpa(1+ 13/256)data8 0x3FAC441E06F72A9E //log(1/frcpa(1+ 14/256)data8 0x3FAE1E6713606D07 //log(1/frcpa(1+ 15/256)data8 0x3FAFFA6911AB9301 //log(1/frcpa(1+ 16/256)data8 0x3FB0EC139C5DA601 //log(1/frcpa(1+ 17/256)data8 0x3FB1DBD2643D190B //log(1/frcpa(1+ 18/256)data8 0x3FB2CC7284FE5F1C //log(1/frcpa(1+ 19/256)data8 0x3FB3BDF5A7D1EE64 //log(1/frcpa(1+ 20/256)data8 0x3FB4B05D7AA012E0 //log(1/frcpa(1+ 21/256)data8 0x3FB580DB7CEB5702 //log(1/frcpa(1+ 22/256)data8 0x3FB674F089365A7A //log(1/frcpa(1+ 23/256)data8 0x3FB769EF2C6B568D //log(1/frcpa(1+ 24/256)data8 0x3FB85FD927506A48 //log(1/frcpa(1+ 25/256)data8 0x3FB9335E5D594989 //log(1/frcpa(1+ 26/256)data8 0x3FBA2B0220C8E5F5 //log(1/frcpa(1+ 27/256)data8 0x3FBB0004AC1A86AC //log(1/frcpa(1+ 28/256)data8 0x3FBBF968769FCA11 //log(1/frcpa(1+ 29/256)data8 0x3FBCCFEDBFEE13A8 //log(1/frcpa(1+ 30/256)data8 0x3FBDA727638446A2 //log(1/frcpa(1+ 31/256)data8 0x3FBEA3257FE10F7A //log(1/frcpa(1+ 32/256)data8 0x3FBF7BE9FEDBFDE6 //log(1/frcpa(1+ 33/256)data8 0x3FC02AB352FF25F4 //log(1/frcpa(1+ 34/256)data8 0x3FC097CE579D204D //log(1/frcpa(1+ 35/256)data8 0x3FC1178E8227E47C //log(1/frcpa(1+ 36/256)data8 0x3FC185747DBECF34 //log(1/frcpa(1+ 37/256)data8 0x3FC1F3B925F25D41 //log(1/frcpa(1+ 38/256)data8 0x3FC2625D1E6DDF57 //log(1/frcpa(1+ 39/256)data8 0x3FC2D1610C86813A //log(1/frcpa(1+ 40/256)data8 0x3FC340C59741142E //log(1/frcpa(1+ 41/256)data8 0x3FC3B08B6757F2A9 //log(1/frcpa(1+ 42/256)data8 0x3FC40DFB08378003 //log(1/frcpa(1+ 43/256)data8 0x3FC47E74E8CA5F7C //log(1/frcpa(1+ 44/256)data8 0x3FC4EF51F6466DE4 //log(1/frcpa(1+ 45/256)data8 0x3FC56092E02BA516 //log(1/frcpa(1+ 46/256)data8 0x3FC5D23857CD74D5 //log(1/frcpa(1+ 47/256)data8 0x3FC6313A37335D76 //log(1/frcpa(1+ 48/256)data8 0x3FC6A399DABBD383 //log(1/frcpa(1+ 49/256)data8 0x3FC70337DD3CE41B //log(1/frcpa(1+ 50/256)data8 0x3FC77654128F6127 //log(1/frcpa(1+ 51/256)data8 0x3FC7E9D82A0B022D //log(1/frcpa(1+ 52/256)data8 0x3FC84A6B759F512F //log(1/frcpa(1+ 53/256)data8 0x3FC8AB47D5F5A310 //log(1/frcpa(1+ 54/256)data8 0x3FC91FE49096581B //log(1/frcpa(1+ 55/256)data8 0x3FC981634011AA75 //log(1/frcpa(1+ 56/256)data8 0x3FC9F6C407089664 //log(1/frcpa(1+ 57/256)data8 0x3FCA58E729348F43 //log(1/frcpa(1+ 58/256)data8 0x3FCABB55C31693AD //log(1/frcpa(1+ 59/256)data8 0x3FCB1E104919EFD0 //log(1/frcpa(1+ 60/256)data8 0x3FCB94EE93E367CB //log(1/frcpa(1+ 61/256)data8 0x3FCBF851C067555F //log(1/frcpa(1+ 62/256)data8 0x3FCC5C0254BF23A6 //log(1/frcpa(1+ 63/256)data8 0x3FCCC000C9DB3C52 //log(1/frcpa(1+ 64/256)data8 0x3FCD244D99C85674 //log(1/frcpa(1+ 65/256)data8 0x3FCD88E93FB2F450 //log(1/frcpa(1+ 66/256)data8 0x3FCDEDD437EAEF01 //log(1/frcpa(1+ 67/256)data8 0x3FCE530EFFE71012 //log(1/frcpa(1+ 68/256)data8 0x3FCEB89A1648B971 //log(1/frcpa(1+ 69/256)data8 0x3FCF1E75FADF9BDE //log(1/frcpa(1+ 70/256)data8 0x3FCF84A32EAD7C35 //log(1/frcpa(1+ 71/256)data8 0x3FCFEB2233EA07CD //log(1/frcpa(1+ 72/256)data8 0x3FD028F9C7035C1C //log(1/frcpa(1+ 73/256)data8 0x3FD05C8BE0D9635A //log(1/frcpa(1+ 74/256)data8 0x3FD085EB8F8AE797 //log(1/frcpa(1+ 75/256)data8 0x3FD0B9C8E32D1911 //log(1/frcpa(1+ 76/256)data8 0x3FD0EDD060B78081 //log(1/frcpa(1+ 77/256)data8 0x3FD122024CF0063F //log(1/frcpa(1+ 78/256)data8 0x3FD14BE2927AECD4 //log(1/frcpa(1+ 79/256)data8 0x3FD180618EF18ADF //log(1/frcpa(1+ 80/256)data8 0x3FD1B50BBE2FC63B //log(1/frcpa(1+ 81/256)data8 0x3FD1DF4CC7CF242D //log(1/frcpa(1+ 82/256)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -