Skip to content

Commit 8ca614a

Browse files
committed
[libc][math] Implement double precision exp2 function correctly rounded for all rounding modes.
Implement double precision exp2 function correctly rounded for all rounding modes. Using the same algorithm as double precision exp function in https://reviews.llvm.org/D158551. Reviewed By: zimmermann6 Differential Revision: https://reviews.llvm.org/D158812
1 parent e3373c6 commit 8ca614a

File tree

19 files changed

+844
-196
lines changed

19 files changed

+844
-196
lines changed

libc/config/darwin/arm/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ set(TARGET_LIBM_ENTRYPOINTS
132132
libc.src.math.exp
133133
libc.src.math.expf
134134
libc.src.math.exp10f
135+
libc.src.math.exp2
135136
libc.src.math.exp2f
136137
libc.src.math.expm1f
137138
libc.src.math.fabs

libc/config/linux/aarch64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ set(TARGET_LIBM_ENTRYPOINTS
246246
libc.src.math.exp
247247
libc.src.math.expf
248248
libc.src.math.exp10f
249+
libc.src.math.exp2
249250
libc.src.math.exp2f
250251
libc.src.math.expm1f
251252
libc.src.math.fabs

libc/config/linux/riscv64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ set(TARGET_LIBM_ENTRYPOINTS
255255
libc.src.math.exp
256256
libc.src.math.expf
257257
libc.src.math.exp10f
258+
libc.src.math.exp2
258259
libc.src.math.exp2f
259260
libc.src.math.expm1f
260261
libc.src.math.fabs

libc/config/linux/x86_64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ set(TARGET_LIBM_ENTRYPOINTS
259259
libc.src.math.exp
260260
libc.src.math.expf
261261
libc.src.math.exp10f
262+
libc.src.math.exp2
262263
libc.src.math.exp2f
263264
libc.src.math.expm1f
264265
libc.src.math.fabs

libc/config/windows/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ set(TARGET_LIBM_ENTRYPOINTS
131131
libc.src.math.exp
132132
libc.src.math.expf
133133
libc.src.math.exp10f
134+
libc.src.math.exp2
134135
libc.src.math.exp2f
135136
libc.src.math.expm1f
136137
libc.src.math.fabs

libc/docs/math/index.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ Higher Math Functions
364364
+------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
365365
| exp10l | | | | | | | | | | | | |
366366
+------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
367-
| exp2 | | | | | | | | | | | | |
367+
| exp2 | |check| | |check| | | |check| | |check| | | | |check| | | | | |
368368
+------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
369369
| exp2f | |check| | |check| | | |check| | |check| | | | |check| | | | | |
370370
+------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
@@ -485,7 +485,7 @@ cosh |check|
485485
erf |check|
486486
exp |check| |check|
487487
exp10 |check|
488-
exp2 |check|
488+
exp2 |check| |check|
489489
expm1 |check|
490490
fma |check| |check|
491491
hypot |check| |check|

libc/spec/stdc.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ def StdC : StandardSpec<"stdc"> {
437437
FunctionSpec<"exp", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
438438
FunctionSpec<"expf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
439439

440+
FunctionSpec<"exp2", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
440441
FunctionSpec<"exp2f", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
441442
FunctionSpec<"expm1f", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
442443

libc/src/__support/FPUtil/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,12 @@ add_header_library(
227227
.multiply_add
228228
)
229229

230+
add_header_library(
231+
triple_double
232+
HDRS
233+
triple_double.h
234+
)
235+
230236
add_header_library(
231237
dyadic_float
232238
HDRS
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//===-- Utilities for triple-double data type. ------------------*- 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_FPUTIL_TRIPLEDOUBLE_H
10+
#define LLVM_LIBC_SRC_SUPPORT_FPUTIL_TRIPLEDOUBLE_H
11+
12+
namespace __llvm_libc::fputil {
13+
14+
struct TripleDouble {
15+
double lo = 0.0;
16+
double mid = 0.0;
17+
double hi = 0.0;
18+
};
19+
20+
} // namespace __llvm_libc::fputil
21+
22+
#endif // LLVM_LIBC_SRC_SUPPORT_FPUTIL_TRIPLEDOUBLE_H

libc/src/math/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ add_math_entrypoint_object(erff)
8282
add_math_entrypoint_object(exp)
8383
add_math_entrypoint_object(expf)
8484

85+
add_math_entrypoint_object(exp2)
8586
add_math_entrypoint_object(exp2f)
8687

8788
add_math_entrypoint_object(exp10f)

libc/src/math/exp2.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//===-- Implementation header for exp2 --------------------------*- 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_MATH_EXP2_H
10+
#define LLVM_LIBC_SRC_MATH_EXP2_H
11+
12+
namespace __llvm_libc {
13+
14+
double exp2(double x);
15+
16+
} // namespace __llvm_libc
17+
18+
#endif // LLVM_LIBC_SRC_MATH_EXP2_H

libc/src/math/generic/CMakeLists.txt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,7 @@ add_entrypoint_object(
556556
../exp.h
557557
DEPENDS
558558
.common_constants
559+
.explogxf
559560
libc.src.__support.CPP.bit
560561
libc.src.__support.CPP.optional
561562
libc.src.__support.FPUtil.dyadic_float
@@ -565,6 +566,7 @@ add_entrypoint_object(
565566
libc.src.__support.FPUtil.nearest_integer
566567
libc.src.__support.FPUtil.polyeval
567568
libc.src.__support.FPUtil.rounding_mode
569+
libc.src.__support.FPUtil.triple_double
568570
libc.src.__support.macros.optimization
569571
libc.include.errno
570572
libc.src.errno.errno
@@ -596,6 +598,33 @@ add_entrypoint_object(
596598
-O3
597599
)
598600

601+
add_entrypoint_object(
602+
exp2
603+
SRCS
604+
exp2.cpp
605+
HDRS
606+
../exp2.h
607+
DEPENDS
608+
.common_constants
609+
.explogxf
610+
libc.src.__support.CPP.bit
611+
libc.src.__support.CPP.optional
612+
libc.src.__support.FPUtil.dyadic_float
613+
libc.src.__support.FPUtil.fenv_impl
614+
libc.src.__support.FPUtil.fp_bits
615+
libc.src.__support.FPUtil.multiply_add
616+
libc.src.__support.FPUtil.nearest_integer
617+
libc.src.__support.FPUtil.polyeval
618+
libc.src.__support.FPUtil.rounding_mode
619+
libc.src.__support.FPUtil.triple_double
620+
libc.src.__support.macros.optimization
621+
libc.include.errno
622+
libc.src.errno.errno
623+
libc.include.math
624+
COMPILE_OPTIONS
625+
-O3
626+
)
627+
599628
add_entrypoint_object(
600629
exp2f
601630
SRCS
@@ -816,6 +845,7 @@ add_object_library(
816845
common_constants.cpp
817846
DEPENDS
818847
libc.src.__support.number_pair
848+
libc.src.__support.FPUtil.triple_double
819849
)
820850

821851
add_header_library(
@@ -1363,6 +1393,9 @@ add_object_library(
13631393
explogxf.cpp
13641394
DEPENDS
13651395
.common_constants
1396+
libc.src.__support.CPP.bit
1397+
libc.src.__support.CPP.optional
1398+
libc.src.__support.FPUtil.basic_operations
13661399
libc.src.__support.FPUtil.basic_operations
13671400
libc.src.__support.FPUtil.fenv_impl
13681401
libc.src.__support.FPUtil.fp_bits

libc/src/math/generic/common_constants.cpp

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "common_constants.h"
10+
#include "src/__support/FPUtil/triple_double.h"
1011
#include "src/__support/number_pair.h"
1112

1213
namespace __llvm_libc {
@@ -561,4 +562,160 @@ const double EXP_M2[128] = {
561562
0x1.568bb722dd593p1, 0x1.593b7d72305bbp1,
562563
};
563564

565+
// Lookup table for 2^(k * 2^-6) with k = 0..63.
566+
// Generated by Sollya with:
567+
// > display=hexadecimal;
568+
// > prec = 500;
569+
// > for i from 0 to 63 do {
570+
// a = 2^(i * 2^-6);
571+
// b = round(a, D, RN);
572+
// c = round(a - b, D, RN);
573+
// d = round(a - b - c, D, RN);
574+
// print("{", d, ",", c, ",", b, "},");
575+
// };
576+
const fputil::TripleDouble EXP2_MID1[64] = {
577+
{0, 0, 0x1p0},
578+
{-0x1.9085b0a3d74d5p-110, -0x1.19083535b085dp-56, 0x1.02c9a3e778061p0},
579+
{0x1.05ff94f8d257ep-110, 0x1.d73e2a475b465p-55, 0x1.059b0d3158574p0},
580+
{0x1.15820d96b414fp-111, 0x1.186be4bb284ffp-57, 0x1.0874518759bc8p0},
581+
{-0x1.67c9bd6ebf74cp-108, 0x1.8a62e4adc610bp-54, 0x1.0b5586cf9890fp0},
582+
{-0x1.5aa76994e9ddbp-113, 0x1.03a1727c57b53p-59, 0x1.0e3ec32d3d1a2p0},
583+
{0x1.9d58b988f562dp-109, -0x1.6c51039449b3ap-54, 0x1.11301d0125b51p0},
584+
{-0x1.2fe7bb4c76416p-108, -0x1.32fbf9af1369ep-54, 0x1.1429aaea92dep0},
585+
{0x1.4f2406aa13ffp-109, -0x1.19041b9d78a76p-55, 0x1.172b83c7d517bp0},
586+
{0x1.ad36183926ae8p-111, 0x1.e5b4c7b4968e4p-55, 0x1.1a35beb6fcb75p0},
587+
{0x1.ea62d0881b918p-110, 0x1.e016e00a2643cp-54, 0x1.1d4873168b9aap0},
588+
{-0x1.781dbc16f1ea4p-111, 0x1.dc775814a8495p-55, 0x1.2063b88628cd6p0},
589+
{-0x1.4d89f9af532ep-109, 0x1.9b07eb6c70573p-54, 0x1.2387a6e756238p0},
590+
{0x1.277393a461b77p-110, 0x1.2bd339940e9d9p-55, 0x1.26b4565e27cddp0},
591+
{0x1.de5448560469p-111, 0x1.612e8afad1255p-55, 0x1.29e9df51fdee1p0},
592+
{-0x1.ee9d8f8cb9307p-110, 0x1.0024754db41d5p-54, 0x1.2d285a6e4030bp0},
593+
{0x1.7b7b2f09cd0d9p-110, 0x1.6f46ad23182e4p-55, 0x1.306fe0a31b715p0},
594+
{-0x1.406a2ea6cfc6bp-108, 0x1.32721843659a6p-54, 0x1.33c08b26416ffp0},
595+
{0x1.87e3e12516bfap-108, -0x1.63aeabf42eae2p-54, 0x1.371a7373aa9cbp0},
596+
{0x1.9b0b1ff17c296p-111, -0x1.5e436d661f5e3p-56, 0x1.3a7db34e59ff7p0},
597+
{-0x1.808ba68fa8fb7p-109, 0x1.ada0911f09ebcp-55, 0x1.3dea64c123422p0},
598+
{-0x1.32b43eafc6518p-114, -0x1.ef3691c309278p-58, 0x1.4160a21f72e2ap0},
599+
{-0x1.0ac312de3d922p-114, 0x1.89b7a04ef80dp-59, 0x1.44e086061892dp0},
600+
{0x1.e1eebae743acp-111, 0x1.3c1a3b69062fp-56, 0x1.486a2b5c13cdp0},
601+
{0x1.c06c7745c2b39p-113, 0x1.d4397afec42e2p-56, 0x1.4bfdad5362a27p0},
602+
{-0x1.1aa1fd7b685cdp-112, -0x1.4b309d25957e3p-54, 0x1.4f9b2769d2ca7p0},
603+
{0x1.fa733951f214cp-111, -0x1.07abe1db13cadp-55, 0x1.5342b569d4f82p0},
604+
{-0x1.ff86852a613ffp-111, 0x1.9bb2c011d93adp-54, 0x1.56f4736b527dap0},
605+
{-0x1.744ee506fdafep-109, 0x1.6324c054647adp-54, 0x1.5ab07dd485429p0},
606+
{-0x1.95f9ab75fa7d6p-108, 0x1.ba6f93080e65ep-54, 0x1.5e76f15ad2148p0},
607+
{0x1.5d8e757cfb991p-111, -0x1.383c17e40b497p-54, 0x1.6247eb03a5585p0},
608+
{0x1.4a337f4dc0a3bp-108, -0x1.bb60987591c34p-54, 0x1.6623882552225p0},
609+
{0x1.57d3e3adec175p-108, -0x1.bdd3413b26456p-54, 0x1.6a09e667f3bcdp0},
610+
{0x1.a59f88abbe778p-115, -0x1.bbe3a683c88abp-57, 0x1.6dfb23c651a2fp0},
611+
{-0x1.269796953a4c3p-109, -0x1.16e4786887a99p-55, 0x1.71f75e8ec5f74p0},
612+
{-0x1.8f8e7fa19e5e8p-108, -0x1.0245957316dd3p-54, 0x1.75feb564267c9p0},
613+
{-0x1.4217a932d10d4p-113, -0x1.41577ee04992fp-55, 0x1.7a11473eb0187p0},
614+
{0x1.70a1427f8fcdfp-112, 0x1.05d02ba15797ep-56, 0x1.7e2f336cf4e62p0},
615+
{0x1.0f6ad65cbbac1p-112, -0x1.d4c1dd41532d8p-54, 0x1.82589994cce13p0},
616+
{-0x1.f16f65181d921p-109, -0x1.fc6f89bd4f6bap-54, 0x1.868d99b4492edp0},
617+
{-0x1.30644a7836333p-110, 0x1.6e9f156864b27p-54, 0x1.8ace5422aa0dbp0},
618+
{0x1.3bf26d2b85163p-114, 0x1.5cc13a2e3976cp-55, 0x1.8f1ae99157736p0},
619+
{0x1.697e257ac0db2p-111, -0x1.75fc781b57ebcp-57, 0x1.93737b0cdc5e5p0},
620+
{0x1.7edb9d7144b6fp-108, -0x1.d185b7c1b85d1p-54, 0x1.97d829fde4e5p0},
621+
{0x1.6376b7943085cp-110, 0x1.c7c46b071f2bep-56, 0x1.9c49182a3f09p0},
622+
{0x1.354084551b4fbp-109, -0x1.359495d1cd533p-54, 0x1.a0c667b5de565p0},
623+
{-0x1.bfd7adfd63f48p-111, -0x1.d2f6edb8d41e1p-54, 0x1.a5503b23e255dp0},
624+
{0x1.8b16ae39e8cb9p-109, 0x1.0fac90ef7fd31p-54, 0x1.a9e6b5579fdbfp0},
625+
{0x1.a7fbc3ae675eap-108, 0x1.7a1cd345dcc81p-54, 0x1.ae89f995ad3adp0},
626+
{0x1.2babc0edda4d9p-111, -0x1.2805e3084d708p-57, 0x1.b33a2b84f15fbp0},
627+
{0x1.aa64481e1ab72p-111, -0x1.5584f7e54ac3bp-56, 0x1.b7f76f2fb5e47p0},
628+
{0x1.9a164050e1258p-109, 0x1.23dd07a2d9e84p-55, 0x1.bcc1e904bc1d2p0},
629+
{0x1.99e51125928dap-110, 0x1.11065895048ddp-55, 0x1.c199bdd85529cp0},
630+
{-0x1.fc44c329d5cb2p-109, 0x1.2884dff483cadp-54, 0x1.c67f12e57d14bp0},
631+
{0x1.d8765566b032ep-110, 0x1.503cbd1e949dbp-56, 0x1.cb720dcef9069p0},
632+
{-0x1.e7044039da0f6p-108, -0x1.cbc3743797a9cp-54, 0x1.d072d4a07897cp0},
633+
{-0x1.ab053b05531fcp-111, 0x1.2ed02d75b3707p-55, 0x1.d5818dcfba487p0},
634+
{0x1.7f6246f0ec615p-108, 0x1.c2300696db532p-54, 0x1.da9e603db3285p0},
635+
{0x1.b7225a944efd6p-108, -0x1.1a5cd4f184b5cp-54, 0x1.dfc97337b9b5fp0},
636+
{0x1.1e92cb3c2d278p-109, 0x1.39e8980a9cc8fp-55, 0x1.e502ee78b3ff6p0},
637+
{-0x1.fc0f242bbf3dep-109, -0x1.e9c23179c2893p-54, 0x1.ea4afa2a490dap0},
638+
{0x1.f6dd5d229ff69p-108, 0x1.dc7f486a4b6bp-54, 0x1.efa1bee615a27p0},
639+
{-0x1.4019bffc80ef3p-110, 0x1.9d3e12dd8a18bp-54, 0x1.f50765b6e454p0},
640+
{0x1.dc060c36f7651p-112, 0x1.74853f3a5931ep-55, 0x1.fa7c1819e90d8p0},
641+
};
642+
643+
// Lookup table for 2^(k * 2^-12) with k = 0..63.
644+
// Generated by Sollya with:
645+
// > display=hexadecimal;
646+
// > prec = 500;
647+
// > for i from 0 to 63 do {
648+
// a = 2^(i * 2^-12);
649+
// b = round(a, D, RN);
650+
// c = round(a - b, D, RN);
651+
// d = round(a - b - c, D, RN);
652+
// print("{", d, ",", c, ",", b, "},");
653+
// };
654+
const fputil::TripleDouble EXP2_MID2[64] = {
655+
{0, 0, 0x1p0},
656+
{0x1.39726694630e3p-108, 0x1.ae8e38c59c72ap-54, 0x1.000b175effdc7p0},
657+
{0x1.e5e06ddd31156p-112, -0x1.7b5d0d58ea8f4p-58, 0x1.00162f3904052p0},
658+
{0x1.5a0768b51f609p-111, 0x1.4115cb6b16a8ep-54, 0x1.0021478e11ce6p0},
659+
{0x1.d008403605217p-111, -0x1.d7c96f201bb2fp-55, 0x1.002c605e2e8cfp0},
660+
{0x1.89bc16f765708p-109, 0x1.84711d4c35e9fp-54, 0x1.003779a95f959p0},
661+
{-0x1.4535b7f8c1e2dp-109, -0x1.0484245243777p-55, 0x1.0042936faa3d8p0},
662+
{-0x1.8ba92f6b25456p-108, -0x1.4b237da2025f9p-54, 0x1.004dadb113dap0},
663+
{-0x1.30c72e81f4294p-113, -0x1.5e00e62d6b30dp-56, 0x1.0058c86da1c0ap0},
664+
{-0x1.34a5384e6f0b9p-110, 0x1.a1d6cedbb9481p-54, 0x1.0063e3a559473p0},
665+
{0x1.f8d0580865d2ep-108, -0x1.4acf197a00142p-54, 0x1.006eff583fc3dp0},
666+
{-0x1.002bcb3ae9a99p-111, -0x1.eaf2ea42391a5p-57, 0x1.007a1b865a8cap0},
667+
{0x1.c3c5aedee9851p-111, 0x1.da93f90835f75p-56, 0x1.0085382faef83p0},
668+
{0x1.7217851d1ec6ep-109, -0x1.6a79084ab093cp-55, 0x1.00905554425d4p0},
669+
{-0x1.80cbca335a7c3p-110, 0x1.86364f8fbe8f8p-54, 0x1.009b72f41a12bp0},
670+
{-0x1.706bd4eb22595p-110, -0x1.82e8e14e3110ep-55, 0x1.00a6910f3b6fdp0},
671+
{-0x1.b55dd523f3c08p-111, -0x1.4f6b2a7609f71p-55, 0x1.00b1afa5abcbfp0},
672+
{0x1.90a1e207cced1p-110, -0x1.e1a258ea8f71bp-56, 0x1.00bcceb7707ecp0},
673+
{0x1.78d0472db37c5p-110, 0x1.4362ca5bc26f1p-56, 0x1.00c7ee448ee02p0},
674+
{-0x1.bcd4db3cb52fep-109, 0x1.095a56c919d02p-54, 0x1.00d30e4d0c483p0},
675+
{-0x1.cf1b131575ec2p-112, -0x1.406ac4e81a645p-57, 0x1.00de2ed0ee0f5p0},
676+
{-0x1.6aaa1fa7ff913p-112, 0x1.b5a6902767e09p-54, 0x1.00e94fd0398ep0},
677+
{0x1.68f236dff3218p-110, -0x1.91b2060859321p-54, 0x1.00f4714af41d3p0},
678+
{-0x1.e8bb58067e60ap-109, 0x1.427068ab22306p-55, 0x1.00ff93412315cp0},
679+
{0x1.d4cd5e1d71fdfp-108, 0x1.c1d0660524e08p-54, 0x1.010ab5b2cbd11p0},
680+
{0x1.e4ecf350ebe88p-108, -0x1.e7bdfb3204be8p-54, 0x1.0115d89ff3a8bp0},
681+
{0x1.6a2aa2c89c4f8p-109, 0x1.843aa8b9cbbc6p-55, 0x1.0120fc089ff63p0},
682+
{0x1.1ca368a20ed05p-110, -0x1.34104ee7edae9p-56, 0x1.012c1fecd613bp0},
683+
{0x1.edb1095d925cfp-114, -0x1.2b6aeb6176892p-56, 0x1.0137444c9b5b5p0},
684+
{-0x1.488c78eded75fp-111, 0x1.a8cd33b8a1bb3p-56, 0x1.01426927f5278p0},
685+
{-0x1.7480f5ea1b3c9p-113, 0x1.2edc08e5da99ap-56, 0x1.014d8e7ee8d2fp0},
686+
{-0x1.ae45989a04dd5p-111, 0x1.57ba2dc7e0c73p-55, 0x1.0158b4517bb88p0},
687+
{0x1.bf48007d80987p-109, 0x1.b61299ab8cdb7p-54, 0x1.0163da9fb3335p0},
688+
{0x1.1aa91a059292cp-109, -0x1.90565902c5f44p-54, 0x1.016f0169949edp0},
689+
{0x1.b6663292855f5p-110, 0x1.70fc41c5c2d53p-55, 0x1.017a28af25567p0},
690+
{0x1.e7fbca6793d94p-108, 0x1.4b9a6e145d76cp-54, 0x1.018550706ab62p0},
691+
{-0x1.5b9f5c7de3b93p-110, -0x1.008eff5142bf9p-56, 0x1.019078ad6a19fp0},
692+
{0x1.4638bf2f6acabp-110, -0x1.77669f033c7dep-54, 0x1.019ba16628de2p0},
693+
{-0x1.ab237b9a069c5p-109, -0x1.09bb78eeead0ap-54, 0x1.01a6ca9aac5f3p0},
694+
{0x1.3ab358be97cefp-108, 0x1.371231477ece5p-54, 0x1.01b1f44af9f9ep0},
695+
{-0x1.4027b2294bb64p-110, 0x1.5e7626621eb5bp-56, 0x1.01bd1e77170b4p0},
696+
{0x1.656394426c99p-111, -0x1.bc72b100828a5p-54, 0x1.01c8491f08f08p0},
697+
{0x1.bf9785189bdd8p-111, -0x1.ce39cbbab8bbep-57, 0x1.01d37442d507p0},
698+
{0x1.7c12f86114fe3p-109, 0x1.16996709da2e2p-55, 0x1.01de9fe280ac8p0},
699+
{-0x1.653d5d24b5d28p-109, -0x1.c11f5239bf535p-55, 0x1.01e9cbfe113efp0},
700+
{0x1.04a0cdc1d86d7p-109, 0x1.e1d4eb5edc6b3p-55, 0x1.01f4f8958c1c6p0},
701+
{0x1.c678c46149782p-109, -0x1.afb99946ee3fp-54, 0x1.020025a8f6a35p0},
702+
{0x1.48524e1e9df7p-108, -0x1.8f06d8a148a32p-54, 0x1.020b533856324p0},
703+
{0x1.9953ea727ff0bp-109, -0x1.2bf310fc54eb6p-55, 0x1.02168143b0281p0},
704+
{-0x1.ccfbbec22d28ep-108, -0x1.c95a035eb4175p-54, 0x1.0221afcb09e3ep0},
705+
{0x1.9e2bb6e181de1p-108, -0x1.491793e46834dp-54, 0x1.022cdece68c4fp0},
706+
{0x1.f17609ae29308p-110, -0x1.3e8d0d9c49091p-56, 0x1.02380e4dd22adp0},
707+
{-0x1.c7dc2c476bfb8p-110, -0x1.314aa16278aa3p-54, 0x1.02433e494b755p0},
708+
{-0x1.fab994971d4a3p-109, 0x1.48daf888e9651p-55, 0x1.024e6ec0da046p0},
709+
{0x1.848b62cbdd0afp-109, 0x1.56dc8046821f4p-55, 0x1.02599fb483385p0},
710+
{-0x1.bf603ba715d0cp-109, 0x1.45b42356b9d47p-54, 0x1.0264d1244c719p0},
711+
{0x1.89434e751e1aap-110, -0x1.082ef51b61d7ep-56, 0x1.027003103b10ep0},
712+
{-0x1.03b54fd64e8acp-110, 0x1.2106ed0920a34p-56, 0x1.027b357854772p0},
713+
{0x1.7785ea0acc486p-109, -0x1.fd4cf26ea5d0fp-54, 0x1.0286685c9e059p0},
714+
{-0x1.ce447fdb35ff9p-109, -0x1.09f8775e78084p-54, 0x1.02919bbd1d1d8p0},
715+
{0x1.5b884aab5642ap-112, 0x1.64cbba902ca27p-58, 0x1.029ccf99d720ap0},
716+
{-0x1.cfb3e46d7c1cp-108, 0x1.4383ef231d207p-54, 0x1.02a803f2d170dp0},
717+
{-0x1.0d40cee4b81afp-112, 0x1.4a47a505b3a47p-54, 0x1.02b338c811703p0},
718+
{0x1.6ae7d36d7c1f7p-109, 0x1.e47120223467fp-54, 0x1.02be6e199c811p0},
719+
};
720+
564721
} // namespace __llvm_libc

libc/src/math/generic/common_constants.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef LLVM_LIBC_SRC_MATH_GENERIC_COMMON_CONSTANTS_H
1010
#define LLVM_LIBC_SRC_MATH_GENERIC_COMMON_CONSTANTS_H
1111

12+
#include "src/__support/FPUtil/triple_double.h"
1213
#include "src/__support/number_pair.h"
1314

1415
namespace __llvm_libc {
@@ -65,6 +66,12 @@ extern const double EXP_M1[195];
6566
// > for i from 0 to 127 do { D(exp(i / 128)); };
6667
extern const double EXP_M2[128];
6768

69+
// Lookup table for 2^(k * 2^-6) with k = 0..63.
70+
extern const fputil::TripleDouble EXP2_MID1[64];
71+
72+
// Lookup table for 2^(k * 2^-12) with k = 0..63.
73+
extern const fputil::TripleDouble EXP2_MID2[64];
74+
6875
} // namespace __llvm_libc
6976

7077
#endif // LLVM_LIBC_SRC_MATH_GENERIC_COMMON_CONSTANTS_H

0 commit comments

Comments
 (0)