[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