xref: /aosp_15_r20/external/llvm-libc/src/math/generic/common_constants.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Common constants for math functions ---------------------*- C++ -*-===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #ifndef LLVM_LIBC_SRC_MATH_GENERIC_COMMON_CONSTANTS_H
10*71db0c75SAndroid Build Coastguard Worker #define LLVM_LIBC_SRC_MATH_GENERIC_COMMON_CONSTANTS_H
11*71db0c75SAndroid Build Coastguard Worker 
12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/triple_double.h"
13*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h"
14*71db0c75SAndroid Build Coastguard Worker #include "src/__support/number_pair.h"
15*71db0c75SAndroid Build Coastguard Worker 
16*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL {
17*71db0c75SAndroid Build Coastguard Worker 
18*71db0c75SAndroid Build Coastguard Worker // Lookup table for (1/f) where f = 1 + n*2^(-7), n = 0..127.
19*71db0c75SAndroid Build Coastguard Worker extern const double ONE_OVER_F[128];
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker // Lookup table for log(f) = log(1 + n*2^(-7)) where n = 0..127.
22*71db0c75SAndroid Build Coastguard Worker extern const double LOG_F[128];
23*71db0c75SAndroid Build Coastguard Worker 
24*71db0c75SAndroid Build Coastguard Worker // Lookup table for range reduction constants r for logarithms.
25*71db0c75SAndroid Build Coastguard Worker extern const float R[128];
26*71db0c75SAndroid Build Coastguard Worker 
27*71db0c75SAndroid Build Coastguard Worker // Lookup table for range reduction constants r for logarithms.
28*71db0c75SAndroid Build Coastguard Worker extern const double RD[128];
29*71db0c75SAndroid Build Coastguard Worker 
30*71db0c75SAndroid Build Coastguard Worker // Lookup table for compensated constants for exact range reduction when FMA
31*71db0c75SAndroid Build Coastguard Worker // instructions are not available.
32*71db0c75SAndroid Build Coastguard Worker extern const double CD[128];
33*71db0c75SAndroid Build Coastguard Worker 
34*71db0c75SAndroid Build Coastguard Worker // Lookup table for -log(r)
35*71db0c75SAndroid Build Coastguard Worker extern const double LOG_R[128];
36*71db0c75SAndroid Build Coastguard Worker extern const NumberPair<double> LOG_R_DD[128];
37*71db0c75SAndroid Build Coastguard Worker 
38*71db0c75SAndroid Build Coastguard Worker // Lookup table for -log2(r)
39*71db0c75SAndroid Build Coastguard Worker extern const double LOG2_R[128];
40*71db0c75SAndroid Build Coastguard Worker 
41*71db0c75SAndroid Build Coastguard Worker // Minimax polynomial for (log(1 + x) - x)/x^2, generated by sollya with:
42*71db0c75SAndroid Build Coastguard Worker // > P = fpminimax((log(1 + x) - x)/x^2, 5, [|D...|], [-2^-8, 2^-7]);
43*71db0c75SAndroid Build Coastguard Worker constexpr double LOG_COEFFS[6] = {-0x1.fffffffffffffp-2, 0x1.5555555554a9bp-2,
44*71db0c75SAndroid Build Coastguard Worker                                   -0x1.0000000094567p-2, 0x1.99999dcc9823cp-3,
45*71db0c75SAndroid Build Coastguard Worker                                   -0x1.55550ac2e537ap-3, 0x1.21a02c4e624d7p-3};
46*71db0c75SAndroid Build Coastguard Worker 
47*71db0c75SAndroid Build Coastguard Worker // Logarithm Range Reduction - Step 2, 3, and 4.
48*71db0c75SAndroid Build Coastguard Worker extern const int S2[193];
49*71db0c75SAndroid Build Coastguard Worker extern const int S3[161];
50*71db0c75SAndroid Build Coastguard Worker extern const int S4[130];
51*71db0c75SAndroid Build Coastguard Worker 
52*71db0c75SAndroid Build Coastguard Worker extern const double R2[193];
53*71db0c75SAndroid Build Coastguard Worker 
54*71db0c75SAndroid Build Coastguard Worker // log(2) generated by Sollya with:
55*71db0c75SAndroid Build Coastguard Worker // > a = 2^-43 * nearestint(2^43*log(2));
56*71db0c75SAndroid Build Coastguard Worker // LSB = 2^-43 is chosen so that e_x * LOG_2_HI is exact for -1075 < e_x < 1024.
57*71db0c75SAndroid Build Coastguard Worker constexpr double LOG_2_HI = 0x1.62e42fefa38p-1; // LSB = 2^-43
58*71db0c75SAndroid Build Coastguard Worker // > b = round(log10(2) - a, D, RN);
59*71db0c75SAndroid Build Coastguard Worker constexpr double LOG_2_LO = 0x1.ef35793c7673p-45; // LSB = 2^-97
60*71db0c75SAndroid Build Coastguard Worker 
61*71db0c75SAndroid Build Coastguard Worker // Lookup table for exp(m) with m = -104, ..., 89.
62*71db0c75SAndroid Build Coastguard Worker //   -104 = floor(log(single precision's min denormal))
63*71db0c75SAndroid Build Coastguard Worker //     89 = ceil(log(single precision's max normal))
64*71db0c75SAndroid Build Coastguard Worker // Table is generated with Sollya as follow:
65*71db0c75SAndroid Build Coastguard Worker // > display = hexadecimal;
66*71db0c75SAndroid Build Coastguard Worker // > for i from -104 to 89 do { D(exp(i)); };
67*71db0c75SAndroid Build Coastguard Worker extern const double EXP_M1[195];
68*71db0c75SAndroid Build Coastguard Worker 
69*71db0c75SAndroid Build Coastguard Worker // Lookup table for exp(m * 2^(-7)) with m = 0, ..., 127.
70*71db0c75SAndroid Build Coastguard Worker // Table is generated with Sollya as follow:
71*71db0c75SAndroid Build Coastguard Worker // > display = hexadecimal;
72*71db0c75SAndroid Build Coastguard Worker // > for i from 0 to 127 do { D(exp(i / 128)); };
73*71db0c75SAndroid Build Coastguard Worker extern const double EXP_M2[128];
74*71db0c75SAndroid Build Coastguard Worker 
75*71db0c75SAndroid Build Coastguard Worker // Lookup table for 2^(k * 2^-6) with k = 0..63.
76*71db0c75SAndroid Build Coastguard Worker extern const fputil::TripleDouble EXP2_MID1[64];
77*71db0c75SAndroid Build Coastguard Worker 
78*71db0c75SAndroid Build Coastguard Worker // Lookup table for 2^(k * 2^-12) with k = 0..63.
79*71db0c75SAndroid Build Coastguard Worker extern const fputil::TripleDouble EXP2_MID2[64];
80*71db0c75SAndroid Build Coastguard Worker 
81*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL
82*71db0c75SAndroid Build Coastguard Worker 
83*71db0c75SAndroid Build Coastguard Worker #endif // LLVM_LIBC_SRC_MATH_GENERIC_COMMON_CONSTANTS_H
84