xref: /llvm-project/libc/src/math/generic/exp_utils.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
1bbb75554SSiva Chandra //===-- Implemention of exp and friends' utils ----------------------------===//
2bbb75554SSiva Chandra //
3bbb75554SSiva Chandra // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bbb75554SSiva Chandra // See https://llvm.org/LICENSE.txt for license information.
5bbb75554SSiva Chandra // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bbb75554SSiva Chandra //
7bbb75554SSiva Chandra //===----------------------------------------------------------------------===//
8bbb75554SSiva Chandra 
9bbb75554SSiva Chandra #include "exp_utils.h"
10*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
11bbb75554SSiva Chandra 
12*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
13bbb75554SSiva Chandra 
14bbb75554SSiva Chandra const Exp2fDataTable exp2f_data = {
15bbb75554SSiva Chandra     // :tab[i] = uint(2^(i/N)) - (i << 52-BITS)
16bbb75554SSiva Chandra     //    used for computing 2^(k/N) for an int |k| < 150 N as
17bbb75554SSiva Chandra     //    double(tab[k%N] + (k << 52-BITS))
18bbb75554SSiva Chandra     {
19bbb75554SSiva Chandra // tab
20bbb75554SSiva Chandra #if N == 8
21bbb75554SSiva Chandra         0x3ff0000000000000,
22bbb75554SSiva Chandra         0x3fef72b83c7d517b,
23bbb75554SSiva Chandra         0x3fef06fe0a31b715,
24bbb75554SSiva Chandra         0x3feebfdad5362a27,
25bbb75554SSiva Chandra         0x3feea09e667f3bcd,
26bbb75554SSiva Chandra         0x3feeace5422aa0db,
27bbb75554SSiva Chandra         0x3feee89f995ad3ad,
28bbb75554SSiva Chandra         0x3fef5818dcfba487,
29bbb75554SSiva Chandra #elif N == 16
30bbb75554SSiva Chandra         0x3ff0000000000000,
31bbb75554SSiva Chandra         0x3fefb5586cf9890f,
32bbb75554SSiva Chandra         0x3fef72b83c7d517b,
33bbb75554SSiva Chandra         0x3fef387a6e756238,
34bbb75554SSiva Chandra         0x3fef06fe0a31b715,
35bbb75554SSiva Chandra         0x3feedea64c123422,
36bbb75554SSiva Chandra         0x3feebfdad5362a27,
37bbb75554SSiva Chandra         0x3feeab07dd485429,
38bbb75554SSiva Chandra         0x3feea09e667f3bcd,
39bbb75554SSiva Chandra         0x3feea11473eb0187,
40bbb75554SSiva Chandra         0x3feeace5422aa0db,
41bbb75554SSiva Chandra         0x3feec49182a3f090,
42bbb75554SSiva Chandra         0x3feee89f995ad3ad,
43bbb75554SSiva Chandra         0x3fef199bdd85529c,
44bbb75554SSiva Chandra         0x3fef5818dcfba487,
45bbb75554SSiva Chandra         0x3fefa4afa2a490da,
46bbb75554SSiva Chandra #elif N == 32
47bbb75554SSiva Chandra         0x3ff0000000000000, 0x3fefd9b0d3158574, 0x3fefb5586cf9890f,
48bbb75554SSiva Chandra         0x3fef9301d0125b51, 0x3fef72b83c7d517b, 0x3fef54873168b9aa,
49bbb75554SSiva Chandra         0x3fef387a6e756238, 0x3fef1e9df51fdee1, 0x3fef06fe0a31b715,
50bbb75554SSiva Chandra         0x3feef1a7373aa9cb, 0x3feedea64c123422, 0x3feece086061892d,
51bbb75554SSiva Chandra         0x3feebfdad5362a27, 0x3feeb42b569d4f82, 0x3feeab07dd485429,
52bbb75554SSiva Chandra         0x3feea47eb03a5585, 0x3feea09e667f3bcd, 0x3fee9f75e8ec5f74,
53bbb75554SSiva Chandra         0x3feea11473eb0187, 0x3feea589994cce13, 0x3feeace5422aa0db,
54bbb75554SSiva Chandra         0x3feeb737b0cdc5e5, 0x3feec49182a3f090, 0x3feed503b23e255d,
55bbb75554SSiva Chandra         0x3feee89f995ad3ad, 0x3feeff76f2fb5e47, 0x3fef199bdd85529c,
56bbb75554SSiva Chandra         0x3fef3720dcef9069, 0x3fef5818dcfba487, 0x3fef7c97337b9b5f,
57bbb75554SSiva Chandra         0x3fefa4afa2a490da, 0x3fefd0765b6e4540,
58bbb75554SSiva Chandra #elif N == 64
59bbb75554SSiva Chandra         0x3ff0000000000000, 0x3fefec9a3e778061, 0x3fefd9b0d3158574,
60bbb75554SSiva Chandra         0x3fefc74518759bc8, 0x3fefb5586cf9890f, 0x3fefa3ec32d3d1a2,
61bbb75554SSiva Chandra         0x3fef9301d0125b51, 0x3fef829aaea92de0, 0x3fef72b83c7d517b,
62bbb75554SSiva Chandra         0x3fef635beb6fcb75, 0x3fef54873168b9aa, 0x3fef463b88628cd6,
63bbb75554SSiva Chandra         0x3fef387a6e756238, 0x3fef2b4565e27cdd, 0x3fef1e9df51fdee1,
64bbb75554SSiva Chandra         0x3fef1285a6e4030b, 0x3fef06fe0a31b715, 0x3feefc08b26416ff,
65bbb75554SSiva Chandra         0x3feef1a7373aa9cb, 0x3feee7db34e59ff7, 0x3feedea64c123422,
66bbb75554SSiva Chandra         0x3feed60a21f72e2a, 0x3feece086061892d, 0x3feec6a2b5c13cd0,
67bbb75554SSiva Chandra         0x3feebfdad5362a27, 0x3feeb9b2769d2ca7, 0x3feeb42b569d4f82,
68bbb75554SSiva Chandra         0x3feeaf4736b527da, 0x3feeab07dd485429, 0x3feea76f15ad2148,
69bbb75554SSiva Chandra         0x3feea47eb03a5585, 0x3feea23882552225, 0x3feea09e667f3bcd,
70bbb75554SSiva Chandra         0x3fee9fb23c651a2f, 0x3fee9f75e8ec5f74, 0x3fee9feb564267c9,
71bbb75554SSiva Chandra         0x3feea11473eb0187, 0x3feea2f336cf4e62, 0x3feea589994cce13,
72bbb75554SSiva Chandra         0x3feea8d99b4492ed, 0x3feeace5422aa0db, 0x3feeb1ae99157736,
73bbb75554SSiva Chandra         0x3feeb737b0cdc5e5, 0x3feebd829fde4e50, 0x3feec49182a3f090,
74bbb75554SSiva Chandra         0x3feecc667b5de565, 0x3feed503b23e255d, 0x3feede6b5579fdbf,
75bbb75554SSiva Chandra         0x3feee89f995ad3ad, 0x3feef3a2b84f15fb, 0x3feeff76f2fb5e47,
76bbb75554SSiva Chandra         0x3fef0c1e904bc1d2, 0x3fef199bdd85529c, 0x3fef27f12e57d14b,
77bbb75554SSiva Chandra         0x3fef3720dcef9069, 0x3fef472d4a07897c, 0x3fef5818dcfba487,
78bbb75554SSiva Chandra         0x3fef69e603db3285, 0x3fef7c97337b9b5f, 0x3fef902ee78b3ff6,
79bbb75554SSiva Chandra         0x3fefa4afa2a490da, 0x3fefba1bee615a27, 0x3fefd0765b6e4540,
80bbb75554SSiva Chandra         0x3fefe7c1819e90d8,
81bbb75554SSiva Chandra #endif
82bbb75554SSiva Chandra     },
83bbb75554SSiva Chandra     as_double(0x4338000000000000) / N, // shift_scaled
84bbb75554SSiva Chandra     {
85bbb75554SSiva Chandra // poly
86bbb75554SSiva Chandra #if N == 8
87bbb75554SSiva Chandra         as_double(0x3fac6a00335106e2),
88bbb75554SSiva Chandra         as_double(0x3fcec0c313449f55),
89bbb75554SSiva Chandra         as_double(0x3fe62e431111f69f),
90bbb75554SSiva Chandra #elif N == 16
91bbb75554SSiva Chandra         as_double(0x3fac6ac6aa313963),
92bbb75554SSiva Chandra         as_double(0x3fcebfff4532d9ba),
93bbb75554SSiva Chandra         as_double(0x3fe62e43001bc49f),
94bbb75554SSiva Chandra #elif N == 32
95bbb75554SSiva Chandra         as_double(0x3fac6af84b912394),
96bbb75554SSiva Chandra         as_double(0x3fcebfce50fac4f3),
97bbb75554SSiva Chandra         as_double(0x3fe62e42ff0c52d6),
98bbb75554SSiva Chandra #elif N == 64
99bbb75554SSiva Chandra         as_double(0x3fac6b04b4221b2a),
100bbb75554SSiva Chandra         as_double(0x3fcebfc213e184d7),
101bbb75554SSiva Chandra         as_double(0x3fe62e42fefb5b7f),
102bbb75554SSiva Chandra #endif
103bbb75554SSiva Chandra     },
104bbb75554SSiva Chandra     as_double(0x4338000000000000),     // shift
105bbb75554SSiva Chandra     as_double(0x3ff71547652b82fe) * N, // invln2_scaled
106bbb75554SSiva Chandra     {
107bbb75554SSiva Chandra // poly_scaled
108bbb75554SSiva Chandra #if N == 8
109bbb75554SSiva Chandra         as_double(0x3fac6a00335106e2) / N / N / N,
110bbb75554SSiva Chandra         as_double(0x3fcec0c313449f55) / N / N,
111bbb75554SSiva Chandra         as_double(0x3fe62e431111f69f) / N,
112bbb75554SSiva Chandra #elif N == 16
113bbb75554SSiva Chandra         as_double(0x3fac6ac6aa313963) / N / N / N,
114bbb75554SSiva Chandra         as_double(0x3fcebfff4532d9ba) / N / N,
115bbb75554SSiva Chandra         as_double(0x3fe62e43001bc49f) / N,
116bbb75554SSiva Chandra #elif N == 32
117bbb75554SSiva Chandra         as_double(0x3fac6af84b912394) / N / N / N,
118bbb75554SSiva Chandra         as_double(0x3fcebfce50fac4f3) / N / N,
119bbb75554SSiva Chandra         as_double(0x3fe62e42ff0c52d6) / N,
120bbb75554SSiva Chandra #elif N == 64
121bbb75554SSiva Chandra         as_double(0x3fac6b04b4221b2a) / N / N / N,
122bbb75554SSiva Chandra         as_double(0x3fcebfc213e184d7) / N / N,
123bbb75554SSiva Chandra         as_double(0x3fe62e42fefb5b7f) / N,
124bbb75554SSiva Chandra #endif
125bbb75554SSiva Chandra     },
126bbb75554SSiva Chandra };
127bbb75554SSiva Chandra 
128*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
129