-
Notifications
You must be signed in to change notification settings - Fork 15.8k
[libc][math] Refactor log to header-only shared math #175392
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-clang-driver @llvm/pr-subscribers-libc Author: CarvedCoder (CarvedCoder) ChangesRefactors the log implementation to be header-only and available via shared math. This is part of the ongoing effort to make math functions constexpr-capable Fixes #175369 Patch is 110.81 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/175392.diff 12 Files Affected:
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 8692200b40a69..47f2306e2f528 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3783,8 +3783,10 @@ clang::driver::tools::getCXX20NamedModuleOutputPath(const ArgList &Args,
if (Arg *FinalOutput = Args.getLastArg(options::OPT_o);
FinalOutput && Args.hasArg(options::OPT_c))
OutputPath = FinalOutput->getValue();
- else
- OutputPath = BaseInput;
+ else {
+ llvm::sys::fs::current_path(OutputPath);
+ llvm::sys::path::append(OutputPath, llvm::sys::path::filename(BaseInput));
+ }
const char *Extension = types::getTypeTempSuffix(types::TY_ModuleFile);
llvm::sys::path::replace_extension(OutputPath, Extension);
diff --git a/clang/test/Driver/module-fgen-reduced-bmi.cppm b/clang/test/Driver/module-fgen-reduced-bmi.cppm
index 4b893ffbfaae8..0199bf8309bfe 100644
--- a/clang/test/Driver/module-fgen-reduced-bmi.cppm
+++ b/clang/test/Driver/module-fgen-reduced-bmi.cppm
@@ -48,14 +48,10 @@
// RUN: %clang -std=c++20 Hello.cppm --precompile -fmodules-reduced-bmi \
// RUN: -o Hello.full.pcm -### 2>&1 | FileCheck Hello.cppm \
// RUN: --check-prefix=CHECK-EMIT-MODULE-INTERFACE
-
-// RUN: %clang -std=c++20 Hello.cppm --precompile -fmodules-reduced-bmi \
-// RUN: -### 2>&1 | FileCheck Hello.cppm \
+//
+// RUN: %clang -std=c++20 %t/Hello.cppm --precompile -fmodules-reduced-bmi \
+// RUN: -o %t/Hello.pcm -### 2>&1 | FileCheck %t/Hello.cppm \
// RUN: --check-prefix=CHECK-OVERRIDE-WARN
-
-// RUN: %clang -std=c++20 Hello.cppm --precompile -fmodules-reduced-bmi \
-// RUN: -o Hello.pcm -### 2>&1 | FileCheck Hello.cppm \
-// RUN: --check-prefix=CHECK-OVERRIDE-WARN
//
// RUN: %clang -std=c++20 Hello.cc -fmodules-reduced-bmi -Wall -Werror \
// RUN: -c -o Hello.o -### 2>&1 | FileCheck Hello.cc
@@ -74,16 +70,14 @@ export module Hello;
// CHECK-NOT: -emit-module-interface
// CHECK: "-fmodules-reduced-bmi"
-// CHECK-UNSPECIFIED: -fmodule-output=Hello.pcm
-
-// CHECK-NO-O: -fmodule-output=Hello.pcm
-// CHECK-ANOTHER-NAME: -fmodule-output=AnotherName.pcm
+// CHECK-UNSPECIFIED: -fmodule-output={{.*}}Hello.pcm
+// CHECK-NO-O: -fmodule-output={{.*}}Hello.pcm
+// CHECK-ANOTHER-NAME: -fmodule-output={{.*}}AnotherName.pcm
// With `-emit-module-interface` specified, we should still see the `-emit-module-interface`
// flag.
// CHECK-EMIT-MODULE-INTERFACE: -emit-module-interface
-
-// CHECK-OVERRIDE-WARN: warning: the implicit output of reduced BMI may be overrided by the output file specified by '--precompile'. {{.*}}-Wreduced-bmi-output-overrided
+// CHECK-OVERRIDE-WARN: implicit output of reduced BMI{{.*}}-Wreduced-bmi-output-overrided
// NO_WARN-NOT: warning
diff --git a/clang/test/Driver/module-output.cppm b/clang/test/Driver/module-output.cppm
index 197f1d85b0f9c..84f49737b1a6a 100644
--- a/clang/test/Driver/module-output.cppm
+++ b/clang/test/Driver/module-output.cppm
@@ -42,7 +42,7 @@ export module Hello;
// CHECK: "-emit-module-interface" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/output/Hello.pcm" "-x" "c++" "{{.*}}/Hello.cppm"
// CHECK: "-emit-obj" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/output/Hello.o" "-x" "pcm" "{{.*}}/output/Hello.pcm"
-
+// CHECK-CWD: -fmodule-output={{.*}}/build/Hello.pcm
// MULTIPLE-ARCH: option '-fmodule-output' cannot be used with multiple arch options
// CHECK-SPECIFIED: "-emit-module-interface" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/pcm/Hello.pcm" "-x" "c++" "{{.*}}/Hello.cppm"
diff --git a/libc/shared/math.h b/libc/shared/math.h
index 70c6d375c22de..81c1579c127cb 100644
--- a/libc/shared/math.h
+++ b/libc/shared/math.h
@@ -64,5 +64,6 @@
#include "math/ldexpf16.h"
#include "math/rsqrtf.h"
#include "math/rsqrtf16.h"
+#include "math/log.h"
#endif // LLVM_LIBC_SHARED_MATH_H
diff --git a/libc/shared/math/log.h b/libc/shared/math/log.h
new file mode 100644
index 0000000000000..41f8c3cc4a131
--- /dev/null
+++ b/libc/shared/math/log.h
@@ -0,0 +1,22 @@
+//===-- Shared log function -------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_MATH_LOG_H
+#define LLVM_LIBC_SHARED_MATH_LOG_H
+
+#include "shared/libc_common.h"
+#include "src/__support/math/log.h"
+namespace LIBC_NAMESPACE_DECL {
+
+namespace shared {
+using math::log;
+} //namespace shared
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SHARED_MATH_LOG_H
\ No newline at end of file
diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt
index f8622da52d983..736e526b75426 100644
--- a/libc/src/__support/math/CMakeLists.txt
+++ b/libc/src/__support/math/CMakeLists.txt
@@ -1008,3 +1008,20 @@ add_header_library(
.exp10f_utils
libc.src.__support.FPUtil.multiply_add
)
+
+add_header_library(
+ log
+ HDRS
+ log.h
+ DEPENDS
+ libc.src.__support.FPUtil.double_double
+ libc.src.__support.FPUtil.dyadic_float
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+ libc.src.__support.FPUtil.multiply_add
+ libc.src.__support.FPUtil.polyeval
+ libc.src.__support.integer_literals
+ libc.src.__support.macros.optimization
+ libc.src.__support.math.common_constants
+ .log_range_reduction
+)
diff --git a/libc/src/__support/math/log.h b/libc/src/__support/math/log.h
new file mode 100644
index 0000000000000..0f42e522405c2
--- /dev/null
+++ b/libc/src/__support/math/log.h
@@ -0,0 +1,846 @@
+#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_LOG_H
+#define LLVM_LIBC_SRC___SUPPORT_MATH_LOG_H
+
+#include "src/__support/FPUtil/FEnvImpl.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/PolyEval.h"
+#include "src/__support/FPUtil/double_double.h"
+#include "src/__support/FPUtil/dyadic_float.h"
+#include "src/__support/FPUtil/multiply_add.h"
+#include "src/__support/common.h"
+#include "src/__support/integer_literals.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
+#include "log_range_reduction.h"
+#include "src/__support/math/common_constants.h"
+
+
+namespace LIBC_NAMESPACE_DECL {
+
+// 128-bit precision dyadic floating point numbers.
+using Float128 = typename fputil::DyadicFloat<128>;
+
+using LIBC_NAMESPACE::operator""_u128;
+
+namespace math {
+
+using namespace common_constants_internal;
+
+#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
+// A simple upper bound for the error of e_x * log(2) - log(r).
+constexpr double HI_ERR = 0x1.0p-85;
+
+// Extra errors from P is from using x^2 to reduce evaluation latency.
+constexpr double P_ERR = 0x1.0p-50;
+
+// log(2) with 128-bit precision generated by SageMath with:
+// def format_hex(value):
+// l = hex(value)[2:]
+// n = 8
+// x = [l[i:i + n] for i in range(0, len(l), n)]
+// return "0x" + "'".join(x) + "_u128"
+// (s, m, e) = RealField(128)(2).log().sign_mantissa_exponent();
+// print(format_hex(m));
+constexpr Float128 LOG_2(Sign::POS, /*exponent=*/-128, /*mantissa=*/
+ 0xb17217f7'd1cf79ab'c9e3b398'03f2f6af_u128);
+
+alignas(16) constexpr LogRR LOG_TABLE = {
+ // -log(r) with 128-bit precision generated by SageMath with:
+ // for i in range(128):
+ // r = 2^-8 * ceil( 2^8 * (1 - 2^(-8)) / (1 + i*2^(-7)) );
+ // s, m, e = RealField(128)(r).log().sign_mantissa_exponent();
+ // print("{Sign::POS,", e, ", format_hex(m), "},");
+ /* .step_1= */ {
+ {Sign::POS, 0, 0_u128},
+ {Sign::POS, -134, 0x8080abac'46f38946'662d417c'ed007a46_u128},
+ {Sign::POS, -133, 0x8102b2c4'9ac23a4f'91d082dc'e3ddcd38_u128},
+ {Sign::POS, -133, 0xc2492946'4655f45c'da5f3cc0'b3251dbd_u128},
+ {Sign::POS, -132, 0x820aec4f'3a222380'b9e3aea6'c444ef07_u128},
+ {Sign::POS, -132, 0xa33576a1'6f1f4c64'521016bd'904dc968_u128},
+ {Sign::POS, -132, 0xc4a550a4'fd9a19a8'be97660a'23cc540d_u128},
+ {Sign::POS, -132, 0xe65b9e6e'ed965c36'e09f5fe2'058d6006_u128},
+ {Sign::POS, -131, 0x842cc5ac'f1d03445'1fecdfa8'19b96098_u128},
+ {Sign::POS, -131, 0x8cb9de8a'32ab368a'a7c98595'30a45153_u128},
+ {Sign::POS, -131, 0x9defad3e'8f73217a'976d3b5b'45f6ca0b_u128},
+ {Sign::POS, -131, 0xaf4ad26c'bc8e5be7'0e8b8b88'a14ff0ce_u128},
+ {Sign::POS, -131, 0xb8069857'560707a3'6a677b4c'8bec22e1_u128},
+ {Sign::POS, -131, 0xc99af2ea'ca4c4570'eaf51f66'692844ba_u128},
+ {Sign::POS, -131, 0xdb56446d'6ad8deff'a8112e35'a60e6375_u128},
+ {Sign::POS, -131, 0xe442c00d'e2591b47'196ab34c'e0bccd12_u128},
+ {Sign::POS, -131, 0xf639cc18'5088fe5d'4066e87f'2c0f7340_u128},
+ {Sign::POS, -131, 0xff4489ce'deab2ca6'c17bd40d'8d9291ec_u128},
+ {Sign::POS, -130, 0x88bc7411'3f23def1'9c5a0fe3'96f40f1e_u128},
+ {Sign::POS, -130, 0x8d515bf1'1fb94f1c'88713268'840cbcc0_u128},
+ {Sign::POS, -130, 0x968b0864'3409ceb6'65c0da50'6a088484_u128},
+ {Sign::POS, -130, 0x9b2fe580'ac80b17d'411a5b94'4aca8708_u128},
+ {Sign::POS, -130, 0xa489ec19'9dab06f2'a9fb6cf0'ecb411b7_u128},
+ {Sign::POS, -130, 0xa93f2f25'0dac67d1'cad2fb8d'48054ae0_u128},
+ {Sign::POS, -130, 0xb2ba75f4'6099cf8b'2c3c2e77'904afa78_u128},
+ {Sign::POS, -130, 0xb780945b'ab55dce4'34c7bc3d'32750fde_u128},
+ {Sign::POS, -130, 0xc11e0b2a'8d1e0ddb'9a631e83'0fd30904_u128},
+ {Sign::POS, -130, 0xc5f57f59'c7f46155'aa8b6997'a402bf30_u128},
+ {Sign::POS, -130, 0xcad2d6e7'b80bf914'2c507fb7'a3d0bf6a_u128},
+ {Sign::POS, -130, 0xd49f69e4'56cf1b79'5f53bd2e'406e66e7_u128},
+ {Sign::POS, -130, 0xd98ec2ba'de71e539'58a98f2a'd65bee9b_u128},
+ {Sign::POS, -130, 0xde8439c1'dec56877'4d57da94'5b5d0aaa_u128},
+ {Sign::POS, -130, 0xe881bf93'2af3dac0'c524848e'3443e040_u128},
+ {Sign::POS, -130, 0xed89ed86'a44a01aa'11d49f96'cb88317b_u128},
+ {Sign::POS, -130, 0xf29877ff'38809091'3b020fa1'820c9492_u128},
+ {Sign::POS, -130, 0xf7ad6f26'e7ff2ef7'54d2238f'75f969b1_u128},
+ {Sign::POS, -130, 0xfcc8e365'9d9bcbec'ca0cdf30'1431b60f_u128},
+ {Sign::POS, -129, 0x8389c302'6ac3139b'62dda9d2'270fa1f4_u128},
+ {Sign::POS, -129, 0x86216b3b'0b17188b'163ceae8'8f720f1e_u128},
+ {Sign::POS, -129, 0x88bc7411'3f23def1'9c5a0fe3'96f40f1e_u128},
+ {Sign::POS, -129, 0x8b5ae65d'67db9acd'f7a51681'26a58b9a_u128},
+ {Sign::POS, -129, 0x8dfccb1a'd35ca6ed'5147bdb6'ddcaf59c_u128},
+ {Sign::POS, -129, 0x934b1089'a6dc93c1'df5bb3b6'0554e152_u128},
+ {Sign::POS, -129, 0x95f783e6'e49a9cfa'4a5004f3'ef063313_u128},
+ {Sign::POS, -129, 0x98a78f0e'9ae71d85'2cdec347'84707839_u128},
+ {Sign::POS, -129, 0x9b5b3bb5'f088b766'd878bbe3'd392be25_u128},
+ {Sign::POS, -129, 0x9e1293b9'998c1daa'5b035eae'273a855f_u128},
+ {Sign::POS, -129, 0xa0cda11e'af46390d'bb243827'3918db7e_u128},
+ {Sign::POS, -129, 0xa38c6e13'8e20d831'f698298a'dddd7f32_u128},
+ {Sign::POS, -129, 0xa64f04f0'b961df76'e4f5275c'2d15c21f_u128},
+ {Sign::POS, -129, 0xa9157039'c51ebe70'8164c759'686a2209_u128},
+ {Sign::POS, -129, 0xabdfba9e'468fd6f6'f72ea077'49ce6bd3_u128},
+ {Sign::POS, -129, 0xaeadeefa'caf97d35'7dd6e688'ebb13b03_u128},
+ {Sign::POS, -129, 0xb1801859'd56249dc'18ce51ff'f99479cd_u128},
+ {Sign::POS, -129, 0xb45641f4'e350a0d3'2756eba0'0bc33978_u128},
+ {Sign::POS, -129, 0xb7307735'78cb90b2'be1116c3'466beb6d_u128},
+ {Sign::POS, -129, 0xba0ec3b6'33dd8b09'49dc60b2'b059a60b_u128},
+ {Sign::POS, -129, 0xbcf13343'e7d9ec7d'2efd1778'1bb3afec_u128},
+ {Sign::POS, -129, 0xbfd7d1de'c0a8df6f'37eda996'244bccb0_u128},
+ {Sign::POS, -129, 0xc2c2abbb'6e5fd56f'33337789'd592e296_u128},
+ {Sign::POS, -129, 0xc5b1cd44'596fa51e'1a18fb8f'9f9ef280_u128},
+ {Sign::POS, -129, 0xc8a5431a'dfb44ca5'688ce7c1'a75e341a_u128},
+ {Sign::POS, -129, 0xcb9d1a18'9ab56e76'2d7e9307'c70c0668_u128},
+ {Sign::POS, -129, 0xce995f50'af69d861'ef2f3f4f'861ad6a9_u128},
+ {Sign::POS, -129, 0xd19a2011'27d3c645'7f9d79f5'1dcc7301_u128},
+ {Sign::POS, -129, 0xd19a2011'27d3c645'7f9d79f5'1dcc7301_u128},
+ {Sign::POS, -129, 0xd49f69e4'56cf1b79'5f53bd2e'406e66e7_u128},
+ {Sign::POS, -129, 0xd7a94a92'466e833a'ad88bba7'd0cee8e0_u128},
+ {Sign::POS, -129, 0xdab7d022'31484a92'96c20cca'6efe2ac5_u128},
+ {Sign::POS, -129, 0xddcb08dc'0717d85b'f40a666c'87842843_u128},
+ {Sign::POS, -129, 0xe0e30349'fd1cec80'7fe8e180'2aba24d6_u128},
+ {Sign::POS, -129, 0xe0e30349'fd1cec80'7fe8e180'2aba24d6_u128},
+ {Sign::POS, -129, 0xe3ffce3a'2aa64922'3eadb651'b49ac53a_u128},
+ {Sign::POS, -129, 0xe72178c0'323a1a0f'304e1653'e71d9973_u128},
+ {Sign::POS, -129, 0xea481236'f7d35baf'e9a767a8'0d6d97e8_u128},
+ {Sign::POS, -129, 0xed73aa42'64b0ade9'4f91cf4b'33e42998_u128},
+ {Sign::POS, -129, 0xf0a450d1'39366ca6'fc66eb64'08ff6433_u128},
+ {Sign::POS, -129, 0xf0a450d1'39366ca6'fc66eb64'08ff6433_u128},
+ {Sign::POS, -129, 0xf3da161e'ed6b9aaf'ac8d42f7'8d3e65d3_u128},
+ {Sign::POS, -129, 0xf7150ab5'a09f27f4'5a470250'd40ebe90_u128},
+ {Sign::POS, -129, 0xfa553f70'18c966f2'b780a545'a1b54dcf_u128},
+ {Sign::POS, -129, 0xfa553f70'18c966f2'b780a545'a1b54dcf_u128},
+ {Sign::POS, -129, 0xfd9ac57b'd244217e'8f05924d'258c14c5_u128},
+ {Sign::POS, -128, 0x8072d72d'903d588b'89d1b09c'70c4010a_u128},
+ {Sign::POS, -128, 0x821b05f3'b01d6774'030d58c3'f7e2ea1f_u128},
+ {Sign::POS, -128, 0x821b05f3'b01d6774'030d58c3'f7e2ea1f_u128},
+ {Sign::POS, -128, 0x83c5f829'9e2b4091'20f6fafe'8fbb68b9_u128},
+ {Sign::POS, -128, 0x8573b716'82a7d21a'e21f9f89'c1ab80b2_u128},
+ {Sign::POS, -128, 0x8573b716'82a7d21a'e21f9f89'c1ab80b2_u128},
+ {Sign::POS, -128, 0x87244c30'8e670a66'01e005d0'6dbfa8f8_u128},
+ {Sign::POS, -128, 0x88d7c11e'3ad53cdc'223111a7'07b6de2c_u128},
+ {Sign::POS, -128, 0x88d7c11e'3ad53cdc'223111a7'07b6de2c_u128},
+ {Sign::POS, -128, 0x8a8e1fb7'94b09134'2eb628db'a173c82d_u128},
+ {Sign::POS, -128, 0x8c477207'91e53313'be2ad194'15fe25a5_u128},
+ {Sign::POS, -128, 0x8c477207'91e53313'be2ad194'15fe25a5_u128},
+ {Sign::POS, -128, 0x8e03c24d'73003959'bddae1cc'ce247838_u128},
+ {Sign::POS, -128, 0x8fc31afe'30b2c6de'9b00bf16'7e95da67_u128},
+ {Sign::POS, -128, 0x8fc31afe'30b2c6de'9b00bf16'7e95da67_u128},
+ {Sign::POS, -128, 0x918586c5'f5e4bf01'9b92199e'd1a4bab1_u128},
+ {Sign::POS, -128, 0x934b1089'a6dc93c1'df5bb3b6'0554e152_u128},
+ {Sign::POS, -128, 0x934b1089'a6dc93c1'df5bb3b6'0554e152_u128},
+ {Sign::POS, -128, 0x9513c368'76083695'f3cbc416'a2418012_u128},
+ {Sign::POS, -128, 0x96dfaabd'86fa1646'be1188fb'c94e2f15_u128},
+ {Sign::POS, -128, 0x96dfaabd'86fa1646'be1188fb'c94e2f15_u128},
+ {Sign::POS, -128, 0x98aed221'a03458b6'1d2f8932'1647b358_u128},
+ {Sign::POS, -128, 0x98aed221'a03458b6'1d2f8932'1647b358_u128},
+ {Sign::POS, -128, 0x9a81456c'ec642e0f'e549f9aa'ea3cb5e1_u128},
+ {Sign::POS, -128, 0x9c5710b8'cbb73a42'a2554b2d'd4619e63_u128},
+ {Sign::POS, -128, 0x9c5710b8'cbb73a42'a2554b2d'd4619e63_u128},
+ {Sign::POS, -128, 0x9e304061'b5fda919'30603d87'b6df81ad_u128},
+ {Sign::POS, -128, 0x9e304061'b5fda919'30603d87'b6df81ad_u128},
+ {Sign::POS, -128, 0xa00ce109'2e5498c3'67879c5a'30cd1242_u128},
+ {Sign::POS, -128, 0xa1ecff97'c91e267b'0b7efae0'8e597e16_u128},
+ {Sign::POS, -128, 0xa1ecff97'c91e267b'0b7efae0'8e597e16_u128},
+ {Sign::POS, -128, 0xa3d0a93f'45169a4a'83594fab'088c0d65_u128},
+ {Sign::POS, -128, 0xa3d0a93f'45169a4a'83594fab'088c0d65_u128},
+ {Sign::POS, -128, 0xa5b7eb7c'b860fb88'af6a62a0'dec6e073_u128},
+ {Sign::POS, -128, 0xa5b7eb7c'b860fb88'af6a62a0'dec6e073_u128},
+ {Sign::POS, -128, 0xa7a2d41a'd270c9d7'49362382'a768847a_u128},
+ {Sign::POS, -128, 0xa7a2d41a'd270c9d7'49362382'a768847a_u128},
+ {Sign::POS, -128, 0xa9917134'33c2b998'8ba4aea6'14d05701_u128},
+ {Sign::POS, -128, 0xa9917134'33c2b998'8ba4aea6'14d05701_u128},
+ {Sign::POS, -128, 0xab83d135'dc633301'7fe6607b'a902ef3c_u128},
+ {Sign::POS, -128, 0xab83d135'dc633301'7fe6607b'a902ef3c_u128},
+ {Sign::POS, -128, 0xad7a02e1'b24efd31'd60864fd'949b4bd3_u128},
+ {Sign::POS, -128, 0xad7a02e1'b24efd31'd60864fd'949b4bd3_u128},
+ {Sign::POS, -128, 0xaf741551'20c9011c'066d235e'e63073dd_u128},
+ {Sign::POS, 0, 0_u128},
+ },
+ // -log(r) for the second step, generated by SageMath with:
+ //
+ // for i in range(-2^6, 2^7 + 1):
+ // r = 2^-16 * round( 2^16 / (1 + i*2^(-14)) );
+ // s, m, e = RealField(128)(r).log().sign_mantissa_exponent();
+ // print("{Sign::POS," if s == -1 else "{Sign::NEG,", e, ",
+ // format_hex(m), "},");
+ /* .step_2 = */
+ {
+ {Sign::NEG, -135, 0x803faaca'c419abf2'a1c6f3fc'242ef8d0_u128},
+ {Sign::NEG, -136, 0xfc834da1'6f0d9f57'a225ebc0'2e6d9dd4_u128},
+ {Sign::NEG, -136, 0xf88735cc'c7433381'c33f6ad3'40ae18a9_u128},
+ {Sign::NEG, -136, 0xf48b0e17'1249b6bc'70b2a4d3'8a242244_u128},
+ {Sign::NEG, -136, 0xf08ed67f'd190e280'1d548190'48b811b0_u128},
+ {Sign::NEG, -136, 0xec928f06'86828706'aee59837'01d2a02b_u128},
+ {Sign::NEG, -136, 0xe89637aa'b2828aed'40abb8ab'72afa2d2_u128},
+ {Sign::NEG, -136, 0xe499d06b'd6eeead5'deb547a0'd4a26ef9_u128},
+ {Sign::NEG, -136, 0xe09d5949'751fb909'39c5bdfb'cf6087a0_u128},
+ {Sign::NEG, -136, 0xdca0d243'0e671d18'53ea9bf1'52de635f_u128},
+ {Sign::NEG, -136, 0xd8a43b58'2411537e'25b82043'6f5f4352_u128},
+ {Sign::NEG, -136, 0xd4a79488'3764ad41'3c2d13ea'1d0be058_u128},
+ {Sign::NEG, -136, 0xd0aaddd2'c9a18f95'4f3cfa62'bcb3ce3a_u128},
+ {Sign::NEG, -136, 0xccae1737'5c02737c'd0fff6cd'f14a86c7_u128},
+ {Sign::NEG, -136, 0xc8b140b5'6fbbe56a'7587b5f0'453ac3d2_u128},
+ {Sign::NEG, -136, 0xc4b45a4c'85fc84e2'b358ad16'dfd0d085_u128},
+ {Sign::NEG, -136, 0xc0b763fc'1fed041d'3c86fdce'5dbe7314_u128},
+ {Sign::NEG, -136, 0xbcba5dc3'beb027a6'70764e46'ac18a96d_u128},
+ {Sign::NEG, -136, 0xb8bd47a2'e362c600'c63be62b'8f285882_u128},
+ {Sign::NEG, -136, 0xb3c0d59a'244325a4'72e7b5a3'86e5e31b_u128},
+ {Sign::NEG, -136, 0xafc39bac'66434f27'c3ea2cd9'3f316b34_u128},
+ {Sign::NEG, -136, 0xabc651d4'91a7b438'1dfb11a7'cc892843_u128},
+ {Sign::NEG, -136, 0xa7c8f812'2773f38d'fc679a28'e9d9f212_u128},
+ {Sign::NEG, -136, 0xa3cb8e64'a8a5bbe6'e7bc977e'eec42254_u128},
+ {Sign::NEG, -136, 0x9fce14cb'9634cba6'b20f215b'd3b58c61_u128},
+ {Sign::NEG, -136, 0x9bd08b46'7112f078'abe28625'08d67a98_u128},
+ {Sign::NEG, -136, 0x97d2f1d4'ba2c06f0'd1aacedc'efe9d377_u128},
+ {Sign::NEG, -136, 0x93d54875'f265fa2c'f1eb25e7'7d05f58d_u128},
+ {Sign::NEG, -136, 0x8fd78f29'9aa0c375'cbef6fac'33691e95_u128},
+ {Sign::NEG, -136, 0x8bd9c5ef'33b669e0'27206404'62a0f8ad_u128},
+ {Sign::NEG, -136, 0x87dbecc6'3e7b01ed'e2f17751'34c8da75_u128},
+ {Sign::NEG, -136, 0x83de03ae'3bbcad2e'ff67e201'c8c50d67_u128},
+ {Sign::NEG, -137, 0xffc0154d'588733c5'3c742a7c'76356396_u128},
+ {Sign::NEG, -137, 0xf7c4035e'21a4052f'f90dd6b2'4aa686ec_u128},
+ {Sign::NEG, -137, 0xefc7d18d'd4485b9e'ca47c52b'7d7ffce2_u128},
+ {Sign::NEG, -137, 0xe7cb7fdb'71e0db36'3703617a'd3d8311f_u128},
+ {Sign::NEG, -137, 0xdfcf0e45'fbce3e80'7e4cfbd8'30393b88_u128},
+ {Sign::NEG, -137, 0xd7d27ccc'736555af'4f7a29cf'0fc2c38e_u128},
+ {Sign::NEG, -137, 0xcfd5cb6d'd9ef05dd'7370ae83'f9e72748_u128},
+ {Sign::NEG, -137, 0xc7d8fa29'30a84850'671486eb'4cd76f65_u128},
+ {Sign::NEG, -137, 0xbfdc08fd'78c229b9'e6dbb624'f9739782_u128},
+ {Sign::NEG, -137, 0xb7def7e9'b361c979'6b866e09'e57d9079_u128},
+ {Sign::NEG, -137, 0xafe1c6ec'e1a058dd'97fa2fd0'c9dc723e_u128},
+ {Sign::NEG, -137, 0xa7e47606'048b1a65'983e8089'7cf1e60f_u128}...
[truncated]
|
Refactors the log implementation to be header-only and available via shared math.
This is part of the ongoing effort to make math functions constexpr-capable
in LLVM libc.
Fixes #175369