| 1 | //===-- Common constants for acoshf function --------------------*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #ifndef LLVM_LIBC_SRC___SUPPORT_MATH_ACOSH_FLOAT_CONSTANTS_H |
| 10 | #define LLVM_LIBC_SRC___SUPPORT_MATH_ACOSH_FLOAT_CONSTANTS_H |
| 11 | |
| 12 | #include "src/__support/macros/attributes.h" |
| 13 | #include "src/__support/macros/config.h" |
| 14 | |
| 15 | namespace LIBC_NAMESPACE_DECL { |
| 16 | |
| 17 | namespace acoshf_internal { |
| 18 | |
| 19 | // Look up table for log range reduction: |
| 20 | // r(0) = 1 |
| 21 | // r(63) = 0.5 |
| 22 | // > for i from 1 to 62 do { |
| 23 | // r = 2^-7 * ceil(2^7 * (1 - 2^-7) / (1 + i * 2^-6)); |
| 24 | // print(r, ","); |
| 25 | // }; |
| 26 | LIBC_INLINE_VAR constexpr double R_LOG[64] = { |
| 27 | 0x1.0p+0, 0x1.f8p-1, 0x1.fp-1, 0x1.e8p-1, 0x1.ep-1, 0x1.d8p-1, 0x1.d4p-1, |
| 28 | 0x1.ccp-1, 0x1.c4p-1, 0x1.cp-1, 0x1.b8p-1, 0x1.b4p-1, 0x1.acp-1, 0x1.a8p-1, |
| 29 | 0x1.a4p-1, 0x1.9cp-1, 0x1.98p-1, 0x1.94p-1, 0x1.9p-1, 0x1.88p-1, 0x1.84p-1, |
| 30 | 0x1.8p-1, 0x1.7cp-1, 0x1.78p-1, 0x1.74p-1, 0x1.7p-1, 0x1.6cp-1, 0x1.68p-1, |
| 31 | 0x1.64p-1, 0x1.6p-1, 0x1.5cp-1, 0x1.58p-1, 0x1.54p-1, 0x1.5p-1, 0x1.4cp-1, |
| 32 | 0x1.4cp-1, 0x1.48p-1, 0x1.44p-1, 0x1.4p-1, 0x1.3cp-1, 0x1.3cp-1, 0x1.38p-1, |
| 33 | 0x1.34p-1, 0x1.3p-1, 0x1.3p-1, 0x1.2cp-1, 0x1.28p-1, 0x1.28p-1, 0x1.24p-1, |
| 34 | 0x1.2p-1, 0x1.2p-1, 0x1.1cp-1, 0x1.1cp-1, 0x1.18p-1, 0x1.14p-1, 0x1.14p-1, |
| 35 | 0x1.1p-1, 0x1.1p-1, 0x1.0cp-1, 0x1.0cp-1, 0x1.08p-1, 0x1.08p-1, 0x1.04p-1, |
| 36 | 0x1.0p-1}; |
| 37 | |
| 38 | // Compensated constants for exact logarithm range reduction when FMA is not |
| 39 | // available. |
| 40 | // Generated by Sollya with the formula: CD[i] = RD[i]*(1 + i*2^-6) - 1 |
| 41 | // for RD[i] defined on the table above. |
| 42 | LIBC_INLINE_VAR constexpr double C_LOG[64] = { |
| 43 | 0.0, -0x1p-12, -0x1p-10, -0x1.2p-9, -0x1p-8, -0x1.9p-8, |
| 44 | -0x1p-12, -0x1.bp-9, -0x1.cp-8, -0x1p-9, -0x1.ap-8, -0x1.1p-9, |
| 45 | -0x1.ep-8, -0x1.ep-9, -0x1p-12, -0x1.b8p-8, -0x1p-8, -0x1.6p-10, |
| 46 | 0x1p-10, -0x1.dp-8, -0x1.6p-8, -0x1p-8, -0x1.6p-9, -0x1.cp-10, |
| 47 | -0x1p-10, -0x1p-11, -0x1p-12, -0x1p-12, -0x1p-11, -0x1p-10, |
| 48 | -0x1.cp-10, -0x1.6p-9, -0x1p-8, -0x1.6p-8, -0x1.dp-8, 0x1.9p-9, |
| 49 | 0x1p-10, -0x1.6p-10, -0x1p-8, -0x1.b8p-8, 0x1.8p-9, -0x1p-12, |
| 50 | -0x1.ep-9, -0x1.ep-8, 0x1p-9, -0x1.1p-9, -0x1.ap-8, 0x1.6p-9, |
| 51 | -0x1p-9, -0x1.cp-8, 0x1p-9, -0x1.bp-9, 0x1.6p-8, -0x1p-12, |
| 52 | -0x1.9p-8, 0x1.3p-9, -0x1p-8, 0x1.2p-8, -0x1.2p-9, 0x1.88p-8, |
| 53 | -0x1p-10, 0x1.dp-8, -0x1p-12, -0x1.0p-7}; |
| 54 | |
| 55 | // Lookup table for log(r) = log(1 + n*2^(-7)) where n = 0..127. |
| 56 | LIBC_INLINE_VAR constexpr double LOG_R[64] = { |
| 57 | 0x0.0000000000000p+0, 0x1.0205658935847p-6, |
| 58 | 0x1.0415d89e74444p-5, 0x1.894aa149fb343p-5, |
| 59 | 0x1.08598b59e3a07p-4, 0x1.4d3115d207eacp-4, |
| 60 | 0x1.700d30aeac0e1p-4, 0x1.b6ac88dad5b1cp-4, |
| 61 | 0x1.fe89139dbd566p-4, 0x1.1178e8227e47cp-3, |
| 62 | 0x1.365fcb0159016p-3, 0x1.4913d8333b561p-3, |
| 63 | 0x1.6f0128b756abcp-3, 0x1.823c16551a3c2p-3, |
| 64 | 0x1.95a5adcf7017fp-3, 0x1.bd087383bd8adp-3, |
| 65 | 0x1.d1037f2655e7bp-3, 0x1.e530effe71012p-3, |
| 66 | 0x1.f991c6cb3b379p-3, 0x1.1178e8227e47cp-2, |
| 67 | 0x1.1bf99635a6b95p-2, 0x1.269621134db92p-2, |
| 68 | 0x1.314f1e1d35ce4p-2, 0x1.3c25277333184p-2, |
| 69 | 0x1.4718dc271c41bp-2, 0x1.522ae0738a3d8p-2, |
| 70 | 0x1.5d5bddf595f3p-2, 0x1.68ac83e9c6a14p-2, |
| 71 | 0x1.741d876c67bb1p-2, 0x1.7fafa3bd8151cp-2, |
| 72 | 0x1.8b639a88b2df5p-2, 0x1.973a3431356aep-2, |
| 73 | 0x1.a33440224fa79p-2, 0x1.af5295248cddp-2, |
| 74 | 0x1.bb9611b80e2fbp-2, 0x1.bb9611b80e2fbp-2, |
| 75 | 0x1.c7ff9c74554c9p-2, 0x1.d490246defa6bp-2, |
| 76 | 0x1.e148a1a2726cep-2, 0x1.ee2a156b413e5p-2, |
| 77 | 0x1.ee2a156b413e5p-2, 0x1.fb358af7a4884p-2, |
| 78 | 0x1.04360be7603adp-1, 0x1.0ae76e2d054fap-1, |
| 79 | 0x1.0ae76e2d054fap-1, 0x1.11af823c75aa8p-1, |
| 80 | 0x1.188ee40f23ca6p-1, 0x1.188ee40f23ca6p-1, |
| 81 | 0x1.1f8635fc61659p-1, 0x1.269621134db92p-1, |
| 82 | 0x1.269621134db92p-1, 0x1.2dbf557b0df43p-1, |
| 83 | 0x1.2dbf557b0df43p-1, 0x1.35028ad9d8c86p-1, |
| 84 | 0x1.3c6080c36bfb5p-1, 0x1.3c6080c36bfb5p-1, |
| 85 | 0x1.43d9ff2f923c5p-1, 0x1.43d9ff2f923c5p-1, |
| 86 | 0x1.4b6fd6f970c1fp-1, 0x1.4b6fd6f970c1fp-1, |
| 87 | 0x1.5322e26867857p-1, 0x1.5322e26867857p-1, |
| 88 | 0x1.5af405c3649ep-1, 0.0}; |
| 89 | |
| 90 | } // namespace acoshf_internal |
| 91 | |
| 92 | } // namespace LIBC_NAMESPACE_DECL |
| 93 | |
| 94 | #endif // LLVM_LIBC_SRC___SUPPORT_MATH_ACOSH_FLOAT_CONSTANTS_H |
| 95 | |