[libc-commits] [compiler-rt] [libc] [Compiler-rt][builtins] introduce libc math routines (PR #197950)
via libc-commits
libc-commits at lists.llvm.org
Sat May 16 11:58:29 PDT 2026
https://github.com/hulxv updated https://github.com/llvm/llvm-project/pull/197950
>From 0204ca60d26eca10493fc1c786a76bff15170b63 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Fri, 15 May 2026 18:01:46 +0300
Subject: [PATCH] [Compiler-rt][builtins] introduce libc math routines
---
compiler-rt/lib/builtins/CMakeLists.txt | 23 +++++++++++++++----
.../lib/builtins/{addtf3.c => addtf3.cpp} | 20 ++++++++++++----
.../lib/builtins/{divtf3.c => divtf3.cpp} | 15 +++++++++++-
compiler-rt/lib/builtins/fp_libc_config.h | 12 ++++++++++
compiler-rt/lib/builtins/int_lib.h | 14 ++++++++---
.../lib/builtins/{multf3.c => multf3.cpp} | 15 +++++++++++-
.../lib/builtins/{subtf3.c => subtf3.cpp} | 17 +++++++++++++-
libc/src/__support/FPUtil/dyadic_float.h | 3 +++
8 files changed, 105 insertions(+), 14 deletions(-)
rename compiler-rt/lib/builtins/{addtf3.c => addtf3.cpp} (65%)
rename compiler-rt/lib/builtins/{divtf3.c => divtf3.cpp} (71%)
create mode 100644 compiler-rt/lib/builtins/fp_libc_config.h
rename compiler-rt/lib/builtins/{multf3.c => multf3.cpp} (70%)
rename compiler-rt/lib/builtins/{subtf3.c => subtf3.cpp} (70%)
diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index 7ce929657eb82..02319d931168d 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -202,10 +202,10 @@ set(BF16_SOURCES
)
set(GENERIC_TF_SOURCES
- addtf3.c
+ addtf3.cpp
comparetf2.c
divtc3.c
- divtf3.c
+ divtf3.cpp
extenddftf2.c
extendhftf2.c
extendsftf2.c
@@ -222,14 +222,29 @@ set(GENERIC_TF_SOURCES
floatunsitf.c
floatuntitf.c
multc3.c
- multf3.c
+ multf3.cpp
powitf2.c
- subtf3.c
+ subtf3.cpp
trunctfdf2.c
trunctfhf2.c
trunctfsf2.c
)
+option(COMPILER_RT_USE_LIBC_MATH
+ "Use LLVM libc math routines for floating-point builtins" OFF)
+
+if(COMPILER_RT_USE_LIBC_MATH)
+ set(LLVM_LIBC_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../libc"
+ CACHE PATH "Path to LLVM libc source directory")
+
+ if(NOT EXISTS "${LLVM_LIBC_SRC_DIR}/src/__support/FPUtil/FPBits.h")
+ message(FATAL_ERROR "LLVM libc not found at ${LLVM_LIBC_SRC_DIR}")
+ endif()
+
+ include_directories(SYSTEM ${LLVM_LIBC_SRC_DIR})
+ add_definitions(-DCOMPILER_RT_USE_LIBC_MATH)
+endif()
+
option(COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN
"Skip the atomic builtin (these should normally be provided by a shared library)"
On)
diff --git a/compiler-rt/lib/builtins/addtf3.c b/compiler-rt/lib/builtins/addtf3.cpp
similarity index 65%
rename from compiler-rt/lib/builtins/addtf3.c
rename to compiler-rt/lib/builtins/addtf3.cpp
index 2cb3a4d591917..944d8ae9015a2 100644
--- a/compiler-rt/lib/builtins/addtf3.c
+++ b/compiler-rt/lib/builtins/addtf3.cpp
@@ -13,11 +13,23 @@
#define QUAD_PRECISION
#include "fp_lib.h"
-#if defined(CRT_HAS_TF_MODE)
-#include "fp_add_impl.inc"
+#ifdef COMPILER_RT_USE_LIBC_MATH
+
+#include "fp_libc_config.h"
+#include "int_lib.h"
+#include "src/__support/FPUtil/generic/add_sub.h"
COMPILER_RT_ABI fp_t __addtf3(fp_t a, fp_t b) {
- return __addXf3__(a, b);
+ return LIBC_NAMESPACE::fputil::generic::add<fp_t, fp_t>(a, b);
}
-#endif
+#else
+
+#include "fp_add_impl.inc"
+#if defined(CRT_HAS_TF_MODE)
+
+COMPILER_RT_ABI fp_t __addtf3(fp_t a, fp_t b) { return __addXf3__(a, b); }
+
+#endif // defined(CRT_HAS_TF_MODE)
+
+#endif // COMPILER_RT_USE_LIBC_MATH
\ No newline at end of file
diff --git a/compiler-rt/lib/builtins/divtf3.c b/compiler-rt/lib/builtins/divtf3.cpp
similarity index 71%
rename from compiler-rt/lib/builtins/divtf3.c
rename to compiler-rt/lib/builtins/divtf3.cpp
index bd76763b07d3a..94a2cce7ac691 100644
--- a/compiler-rt/lib/builtins/divtf3.c
+++ b/compiler-rt/lib/builtins/divtf3.cpp
@@ -14,6 +14,18 @@
#define QUAD_PRECISION
#include "fp_lib.h"
+#ifdef COMPILER_RT_USE_LIBC_MATH
+
+#include "fp_libc_config.h"
+#include "int_lib.h"
+#include "src/__support/FPUtil/generic/div.h"
+
+COMPILER_RT_ABI fp_t __divtf3(fp_t a, fp_t b) {
+ return LIBC_NAMESPACE::fputil::generic::div<fp_t, fp_t>(a, b);
+}
+
+#else
+
#if defined(CRT_HAS_TF_MODE)
#define NUMBER_OF_HALF_ITERATIONS 4
@@ -23,4 +35,5 @@
COMPILER_RT_ABI fp_t __divtf3(fp_t a, fp_t b) { return __divXf3__(a, b); }
-#endif
+#endif // defined(CRT_HAS_TF_MODE)
+#endif // COMPILER_RT_USE_LIBC_MATH
diff --git a/compiler-rt/lib/builtins/fp_libc_config.h b/compiler-rt/lib/builtins/fp_libc_config.h
new file mode 100644
index 0000000000000..1dc69a9f95167
--- /dev/null
+++ b/compiler-rt/lib/builtins/fp_libc_config.h
@@ -0,0 +1,12 @@
+#ifndef FP_LIBC_CONFIG_H
+#define FP_LIBC_CONFIG_H
+
+#ifndef LIBC_COPT_PUBLIC_PACKAGING
+#define LIBC_COPT_PUBLIC_PACKAGING
+#endif
+
+#ifndef LIBC_NAMESPACE
+#define LIBC_NAMESPACE __llvm_libc_rt
+#endif
+
+#endif
\ No newline at end of file
diff --git a/compiler-rt/lib/builtins/int_lib.h b/compiler-rt/lib/builtins/int_lib.h
index 943430de259d8..53e6640f61e29 100644
--- a/compiler-rt/lib/builtins/int_lib.h
+++ b/compiler-rt/lib/builtins/int_lib.h
@@ -20,14 +20,22 @@
// ABI macro definitions
+// In C++ translation units we must give compiler-rt entry points C linkage so
+// that their symbol names are not mangled. C TUs are unaffected.
+#ifdef __cplusplus
+#define COMPILER_RT_C_LINKAGE extern "C"
+#else
+#define COMPILER_RT_C_LINKAGE
+#endif
+
#if __ARM_EABI__
#ifdef COMPILER_RT_ARMHF_TARGET
-#define COMPILER_RT_ABI
+#define COMPILER_RT_ABI COMPILER_RT_C_LINKAGE
#else
-#define COMPILER_RT_ABI __attribute__((__pcs__("aapcs")))
+#define COMPILER_RT_ABI COMPILER_RT_C_LINKAGE __attribute__((__pcs__("aapcs")))
#endif
#else
-#define COMPILER_RT_ABI
+#define COMPILER_RT_ABI COMPILER_RT_C_LINKAGE
#endif
#define AEABI_RTABI __attribute__((__pcs__("aapcs")))
diff --git a/compiler-rt/lib/builtins/multf3.c b/compiler-rt/lib/builtins/multf3.cpp
similarity index 70%
rename from compiler-rt/lib/builtins/multf3.c
rename to compiler-rt/lib/builtins/multf3.cpp
index 8fd73688712cb..399a8b76ac3b5 100644
--- a/compiler-rt/lib/builtins/multf3.c
+++ b/compiler-rt/lib/builtins/multf3.cpp
@@ -14,9 +14,22 @@
#define QUAD_PRECISION
#include "fp_lib.h"
+#ifdef COMPILER_RT_USE_LIBC_MATH
+
+#include "fp_libc_config.h"
+#include "int_lib.h"
+#include "src/__support/FPUtil/generic/mul.h"
+
+COMPILER_RT_ABI fp_t __multf3(fp_t a, fp_t b) {
+ return LIBC_NAMESPACE::fputil::generic::mul<fp_t, fp_t>(a, b);
+}
+
+#else
+
#if defined(CRT_HAS_TF_MODE)
#include "fp_mul_impl.inc"
COMPILER_RT_ABI fp_t __multf3(fp_t a, fp_t b) { return __mulXf3__(a, b); }
-#endif
+#endif // defined(CRT_HAS_TF_MODE)
+#endif // COMPILER_RT_USE_LIBC_MATH
\ No newline at end of file
diff --git a/compiler-rt/lib/builtins/subtf3.c b/compiler-rt/lib/builtins/subtf3.cpp
similarity index 70%
rename from compiler-rt/lib/builtins/subtf3.c
rename to compiler-rt/lib/builtins/subtf3.cpp
index e1b1022034bf7..01d61bb1aca98 100644
--- a/compiler-rt/lib/builtins/subtf3.c
+++ b/compiler-rt/lib/builtins/subtf3.cpp
@@ -13,7 +13,20 @@
#define QUAD_PRECISION
#include "fp_lib.h"
+#ifdef COMPILER_RT_USE_LIBC_MATH
+
+#include "fp_libc_config.h"
+#include "int_lib.h"
+#include "src/__support/FPUtil/generic/add_sub.h"
+
+COMPILER_RT_ABI fp_t __subtf3(fp_t a, fp_t b) {
+ return LIBC_NAMESPACE::fputil::generic::sub<fp_t, fp_t>(a, b);
+}
+
+#else
+
#if defined(CRT_HAS_TF_MODE)
+
COMPILER_RT_ABI fp_t __addtf3(fp_t a, fp_t b);
// Subtraction; flip the sign bit of b and add.
@@ -21,4 +34,6 @@ COMPILER_RT_ABI fp_t __subtf3(fp_t a, fp_t b) {
return __addtf3(a, fromRep(toRep(b) ^ signBit));
}
-#endif
+#endif // defined(CRT_HAS_TF_MODE)
+
+#endif // COMPILER_RT_USE_LIBC_MATH
diff --git a/libc/src/__support/FPUtil/dyadic_float.h b/libc/src/__support/FPUtil/dyadic_float.h
index cc0710fbf7b02..be7bbd866c13f 100644
--- a/libc/src/__support/FPUtil/dyadic_float.h
+++ b/libc/src/__support/FPUtil/dyadic_float.h
@@ -412,6 +412,9 @@ template <size_t Bits> struct DyadicFloat {
if constexpr (cpp::is_same_v<T, bfloat16>
#if defined(LIBC_TYPES_HAS_FLOAT16) && !defined(__LIBC_USE_FLOAT16_CONVERSION)
|| cpp::is_same_v<T, float16>
+#endif
+#if defined(LIBC_TYPES_HAS_FLOAT128)
+ || cpp::is_same_v<T, float128>
#endif
)
return generic_as<T, ShouldSignalExceptions>();
More information about the libc-commits
mailing list