[libc-commits] [libc] [libc] add shared divdf3 builtin (PR #205675)

via libc-commits libc-commits at lists.llvm.org
Thu Jun 25 09:17:36 PDT 2026


https://github.com/hulxv updated https://github.com/llvm/llvm-project/pull/205675

>From 9a0bb04b42e141693e7b5c6fbfe5623f1beb08b0 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 28 May 2026 03:01:10 +0300
Subject: [PATCH 01/10] [libc] introduce shared compiler-rt builtins

---
 libc/include/llvm-libc-macros/float-macros.h |  6 ++++
 libc/shared/builtins.h                       | 16 +++++++++
 libc/shared/builtins/addtf3.h                | 35 ++++++++++++++++++++
 libc/src/__support/CMakeLists.txt            |  1 +
 libc/src/__support/FPUtil/dyadic_float.h     |  3 ++
 libc/src/__support/builtins/CMakeLists.txt   |  9 +++++
 libc/src/__support/builtins/addtf3.h         | 32 ++++++++++++++++++
 libc/test/shared/CMakeLists.txt              | 10 ++++++
 libc/test/shared/shared_builtins_test.cpp    | 29 ++++++++++++++++
 9 files changed, 141 insertions(+)
 create mode 100644 libc/shared/builtins.h
 create mode 100644 libc/shared/builtins/addtf3.h
 create mode 100644 libc/src/__support/builtins/CMakeLists.txt
 create mode 100644 libc/src/__support/builtins/addtf3.h
 create mode 100644 libc/test/shared/shared_builtins_test.cpp

diff --git a/libc/include/llvm-libc-macros/float-macros.h b/libc/include/llvm-libc-macros/float-macros.h
index a25ef60a293d3..38a3a771cca54 100644
--- a/libc/include/llvm-libc-macros/float-macros.h
+++ b/libc/include/llvm-libc-macros/float-macros.h
@@ -9,6 +9,12 @@
 #ifndef LLVM_LIBC_MACROS_FLOAT_MACROS_H
 #define LLVM_LIBC_MACROS_FLOAT_MACROS_H
 
+// __has_builtin is a Clang extension; GCC < 10 doesn't define it, which
+// turns a bare `#if __has_builtin(...)` into a preprocessor syntax error.
+#ifndef __has_builtin
+#define __has_builtin(x) 0
+#endif
+
 #ifndef FLT_RADIX
 #define FLT_RADIX __FLT_RADIX__
 #endif // FLT_RADIX
diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
new file mode 100644
index 0000000000000..157b6622cbcff
--- /dev/null
+++ b/libc/shared/builtins.h
@@ -0,0 +1,16 @@
+//===-- Compiler-runtime builtin primitives ---------------------*- 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_BUILTINS_H
+#define LLVM_LIBC_SHARED_BUILTINS_H
+
+#include "libc_common.h"
+
+#include "builtins/addtf3.h"
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_H
diff --git a/libc/shared/builtins/addtf3.h b/libc/shared/builtins/addtf3.h
new file mode 100644
index 0000000000000..9c39e6e9a8406
--- /dev/null
+++ b/libc/shared/builtins/addtf3.h
@@ -0,0 +1,35 @@
+//===-- Shared __addtf3 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This header exposes LLVM-libc's __addtf3 implementation as shared::addtf3
+// so that it can be reused by other LLVM projects, such as compiler-rt's
+// builtins library.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_ADDTF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_ADDTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/addtf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::addtf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_ADDTF3_H
diff --git a/libc/src/__support/CMakeLists.txt b/libc/src/__support/CMakeLists.txt
index 9d08b4bcf7303..c09ca012c3594 100644
--- a/libc/src/__support/CMakeLists.txt
+++ b/libc/src/__support/CMakeLists.txt
@@ -472,6 +472,7 @@ add_subdirectory(wchar)
 add_subdirectory(wctype)
 
 add_subdirectory(math)
+add_subdirectory(builtins)
 if(LIBC_COMPILER_HAS_EXT_VECTOR_TYPE)
   add_subdirectory(mathvec)
 endif()
diff --git a/libc/src/__support/FPUtil/dyadic_float.h b/libc/src/__support/FPUtil/dyadic_float.h
index 7e4ea2f1a81be..d99a14f35f38e 100644
--- a/libc/src/__support/FPUtil/dyadic_float.h
+++ b/libc/src/__support/FPUtil/dyadic_float.h
@@ -415,6 +415,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>();
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
new file mode 100644
index 0000000000000..c4982887d0a7c
--- /dev/null
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -0,0 +1,9 @@
+add_header_library(
+  addtf3
+  HDRS
+    addtf3.h
+  DEPENDS
+    libc.include.llvm-libc-types.float128
+    libc.src.__support.FPUtil.generic.add_sub
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/addtf3.h b/libc/src/__support/builtins/addtf3.h
new file mode 100644
index 0000000000000..129ad2a81e827
--- /dev/null
+++ b/libc/src/__support/builtins/addtf3.h
@@ -0,0 +1,32 @@
+//===-- Implementation header for __addtf3 ----------------------*- 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_SRC___SUPPORT_BUILTINS_ADDTF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "src/__support/FPUtil/generic/add_sub.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Mirrors the compiler-rt __addtf3 ABI: a + b at float128 precision.
+LIBC_INLINE float128 addtf3(float128 x, float128 y) {
+  return fputil::generic::add<float128>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDTF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 7a5c3a369c2fc..0f8027e2e0057 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -814,6 +814,16 @@ add_fp_unittest(
 )
 endif() # LIBC_TEST_SKIP_SHARED_MATH_TESTS
 
+add_fp_unittest(
+  shared_builtins_test
+  SUITE
+    libc-shared-tests
+  SRCS
+    shared_builtins_test.cpp
+  DEPENDS
+    libc.src.__support.builtins.addtf3
+)
+
 add_fp_unittest(
   shared_str_to_num_test
   SUITE
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
new file mode 100644
index 0000000000000..67d40b349cef3
--- /dev/null
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -0,0 +1,29 @@
+//===-- Unittests for shared builtins -------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "shared/builtins.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+
+TEST(LlvmLibcSharedBuiltinsTest, AllFloat) {
+  // TODO: assertions for shared::*sf3 builtins.
+}
+
+TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
+  // TODO: assertions for shared::*df3 builtins.
+}
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+TEST(LlvmLibcSharedBuiltinsTest, AllFloat128) {
+  namespace shared = LIBC_NAMESPACE::shared;
+
+  EXPECT_FP_EQ(float128(3.0), shared::addtf3(float128(1.0), float128(2.0)));
+}
+
+#endif // LIBC_TYPES_HAS_FLOAT128

>From 8a3828ae0484b9e8df38518fe12df718c9de5c17 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 11 Jun 2026 15:48:50 +0300
Subject: [PATCH 02/10] correct the header

---
 libc/shared/builtins/addtf3.h | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libc/shared/builtins/addtf3.h b/libc/shared/builtins/addtf3.h
index 9c39e6e9a8406..33534beeb91c7 100644
--- a/libc/shared/builtins/addtf3.h
+++ b/libc/shared/builtins/addtf3.h
@@ -1,15 +1,15 @@
-//===-- Shared __addtf3 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
 //
 //===----------------------------------------------------------------------===//
-//
-// This header exposes LLVM-libc's __addtf3 implementation as shared::addtf3
-// so that it can be reused by other LLVM projects, such as compiler-rt's
-// builtins library.
-//
+///
+/// \file
+/// This header exposes LLVM-libc's __addtf3 implementation as shared::addtf3
+/// so that it can be reused by compiler-rt's builtins.
+///
 //===----------------------------------------------------------------------===//
 
 #ifndef LLVM_LIBC_SHARED_BUILTINS_ADDTF3_H

>From 0fea0cd53236c37ad58f9cc54d440ec0ad102823 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Tue, 23 Jun 2026 22:48:07 +0300
Subject: [PATCH 03/10] header

---
 libc/shared/builtins.h               | 8 +++++++-
 libc/src/__support/builtins/addtf3.h | 8 +++++++-
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index 157b6622cbcff..338755314d309 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -1,10 +1,16 @@
-//===-- Compiler-runtime builtin primitives ---------------------*- 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
 //
 //===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header aggregates LLVM-libc's shared compiler-rt builtins so that
+/// they can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
 
 #ifndef LLVM_LIBC_SHARED_BUILTINS_H
 #define LLVM_LIBC_SHARED_BUILTINS_H
diff --git a/libc/src/__support/builtins/addtf3.h b/libc/src/__support/builtins/addtf3.h
index 129ad2a81e827..f33036f53ec30 100644
--- a/libc/src/__support/builtins/addtf3.h
+++ b/libc/src/__support/builtins/addtf3.h
@@ -1,10 +1,16 @@
-//===-- Implementation header for __addtf3 ----------------------*- 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
 //
 //===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __addtf3 implementation as
+/// builtins::addtf3 so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
 
 #ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDTF3_H
 #define LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDTF3_H

>From 6a867c66114f82732c3ee59929c64a1de5522c6d Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 25 Jun 2026 19:08:18 +0300
Subject: [PATCH 04/10] [libc] add shared subtf3 builtin

---
 libc/shared/builtins.h                     |  1 +
 libc/shared/builtins/subtf3.h              | 35 ++++++++++++++++++++
 libc/src/__support/builtins/CMakeLists.txt | 10 ++++++
 libc/src/__support/builtins/subtf3.h       | 38 ++++++++++++++++++++++
 libc/test/shared/CMakeLists.txt            |  1 +
 libc/test/shared/shared_builtins_test.cpp  |  7 ++--
 6 files changed, 89 insertions(+), 3 deletions(-)
 create mode 100644 libc/shared/builtins/subtf3.h
 create mode 100644 libc/src/__support/builtins/subtf3.h

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index 338755314d309..0bb156131423d 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -18,5 +18,6 @@
 #include "libc_common.h"
 
 #include "builtins/addtf3.h"
+#include "builtins/subtf3.h"
 
 #endif // LLVM_LIBC_SHARED_BUILTINS_H
diff --git a/libc/shared/builtins/subtf3.h b/libc/shared/builtins/subtf3.h
new file mode 100644
index 0000000000000..a7cecef8b0479
--- /dev/null
+++ b/libc/shared/builtins/subtf3.h
@@ -0,0 +1,35 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __subtf3 implementation as shared::subtf3 so
+/// that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_SUBTF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_SUBTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/subtf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::subtf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_SUBTF3_H
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
index c4982887d0a7c..d3d1d65babce8 100644
--- a/libc/src/__support/builtins/CMakeLists.txt
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -7,3 +7,13 @@ add_header_library(
     libc.src.__support.FPUtil.generic.add_sub
     libc.src.__support.macros.config
 )
+
+add_header_library(
+  subtf3
+  HDRS
+    subtf3.h
+  DEPENDS
+    libc.include.llvm-libc-types.float128
+    libc.src.__support.FPUtil.generic.add_sub
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/subtf3.h b/libc/src/__support/builtins/subtf3.h
new file mode 100644
index 0000000000000..bd758cce0f5f6
--- /dev/null
+++ b/libc/src/__support/builtins/subtf3.h
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __subtf3 implementation as builtins::subtf3
+/// so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_SUBTF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_SUBTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "src/__support/FPUtil/generic/add_sub.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Subtraction at float128 precision; mirrors compiler-rt's __subtf3.
+LIBC_INLINE float128 subtf3(float128 x, float128 y) {
+  return fputil::generic::sub<float128>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_SUBTF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 0f8027e2e0057..04f480b340a65 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -822,6 +822,7 @@ add_fp_unittest(
     shared_builtins_test.cpp
   DEPENDS
     libc.src.__support.builtins.addtf3
+    libc.src.__support.builtins.subtf3
 )
 
 add_fp_unittest(
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
index 67d40b349cef3..bf84d2c0866a4 100644
--- a/libc/test/shared/shared_builtins_test.cpp
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -21,9 +21,10 @@ TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
 #ifdef LIBC_TYPES_HAS_FLOAT128
 
 TEST(LlvmLibcSharedBuiltinsTest, AllFloat128) {
-  namespace shared = LIBC_NAMESPACE::shared;
-
-  EXPECT_FP_EQ(float128(3.0), shared::addtf3(float128(1.0), float128(2.0)));
+  EXPECT_FP_EQ(float128(3.0),
+               LIBC_NAMESPACE::shared::addtf3(float128(1.0), float128(2.0)));
+  EXPECT_FP_EQ(float128(2.0),
+               LIBC_NAMESPACE::shared::subtf3(float128(5.0), float128(3.0)));
 }
 
 #endif // LIBC_TYPES_HAS_FLOAT128

>From 8ba5028f549af8ac294cfb0786705d54d8c98f07 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 25 Jun 2026 19:08:20 +0300
Subject: [PATCH 05/10] [libc] add shared multf3 builtin

---
 libc/shared/builtins.h                     |  1 +
 libc/shared/builtins/multf3.h              | 35 ++++++++++++++++++++
 libc/src/__support/builtins/CMakeLists.txt | 10 ++++++
 libc/src/__support/builtins/multf3.h       | 38 ++++++++++++++++++++++
 libc/test/shared/CMakeLists.txt            |  1 +
 libc/test/shared/shared_builtins_test.cpp  |  2 ++
 6 files changed, 87 insertions(+)
 create mode 100644 libc/shared/builtins/multf3.h
 create mode 100644 libc/src/__support/builtins/multf3.h

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index 0bb156131423d..26fed715ba2ad 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -18,6 +18,7 @@
 #include "libc_common.h"
 
 #include "builtins/addtf3.h"
+#include "builtins/multf3.h"
 #include "builtins/subtf3.h"
 
 #endif // LLVM_LIBC_SHARED_BUILTINS_H
diff --git a/libc/shared/builtins/multf3.h b/libc/shared/builtins/multf3.h
new file mode 100644
index 0000000000000..cfc2964fd6a79
--- /dev/null
+++ b/libc/shared/builtins/multf3.h
@@ -0,0 +1,35 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __multf3 implementation as shared::multf3 so
+/// that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_MULTF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_MULTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/multf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::multf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_MULTF3_H
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
index d3d1d65babce8..98274c9a90416 100644
--- a/libc/src/__support/builtins/CMakeLists.txt
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -17,3 +17,13 @@ add_header_library(
     libc.src.__support.FPUtil.generic.add_sub
     libc.src.__support.macros.config
 )
+
+add_header_library(
+  multf3
+  HDRS
+    multf3.h
+  DEPENDS
+    libc.include.llvm-libc-types.float128
+    libc.src.__support.FPUtil.generic.mul
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/multf3.h b/libc/src/__support/builtins/multf3.h
new file mode 100644
index 0000000000000..b6798325ff17d
--- /dev/null
+++ b/libc/src/__support/builtins/multf3.h
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __multf3 implementation as builtins::multf3
+/// so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_MULTF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_MULTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "src/__support/FPUtil/generic/mul.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Multiplication at float128 precision; mirrors compiler-rt's __multf3.
+LIBC_INLINE float128 multf3(float128 x, float128 y) {
+  return fputil::generic::mul<float128>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_MULTF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 04f480b340a65..4111c7a0051bf 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -822,6 +822,7 @@ add_fp_unittest(
     shared_builtins_test.cpp
   DEPENDS
     libc.src.__support.builtins.addtf3
+    libc.src.__support.builtins.multf3
     libc.src.__support.builtins.subtf3
 )
 
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
index bf84d2c0866a4..52130e75c4c31 100644
--- a/libc/test/shared/shared_builtins_test.cpp
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -23,6 +23,8 @@ TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
 TEST(LlvmLibcSharedBuiltinsTest, AllFloat128) {
   EXPECT_FP_EQ(float128(3.0),
                LIBC_NAMESPACE::shared::addtf3(float128(1.0), float128(2.0)));
+  EXPECT_FP_EQ(float128(6.0),
+               LIBC_NAMESPACE::shared::multf3(float128(2.0), float128(3.0)));
   EXPECT_FP_EQ(float128(2.0),
                LIBC_NAMESPACE::shared::subtf3(float128(5.0), float128(3.0)));
 }

>From 0e521644bda50764c955ac28af5b0e067c4d03d4 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 25 Jun 2026 19:08:21 +0300
Subject: [PATCH 06/10] [libc] add shared divtf3 builtin

---
 libc/shared/builtins.h                     |  1 +
 libc/shared/builtins/divtf3.h              | 35 ++++++++++++++++++++
 libc/src/__support/builtins/CMakeLists.txt | 10 ++++++
 libc/src/__support/builtins/divtf3.h       | 38 ++++++++++++++++++++++
 libc/test/shared/CMakeLists.txt            |  1 +
 libc/test/shared/shared_builtins_test.cpp  |  2 ++
 6 files changed, 87 insertions(+)
 create mode 100644 libc/shared/builtins/divtf3.h
 create mode 100644 libc/src/__support/builtins/divtf3.h

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index 26fed715ba2ad..fc4c5aee9a8e4 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -18,6 +18,7 @@
 #include "libc_common.h"
 
 #include "builtins/addtf3.h"
+#include "builtins/divtf3.h"
 #include "builtins/multf3.h"
 #include "builtins/subtf3.h"
 
diff --git a/libc/shared/builtins/divtf3.h b/libc/shared/builtins/divtf3.h
new file mode 100644
index 0000000000000..ca69e6f5fc0e7
--- /dev/null
+++ b/libc/shared/builtins/divtf3.h
@@ -0,0 +1,35 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __divtf3 implementation as shared::divtf3 so
+/// that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_DIVTF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_DIVTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/divtf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::divtf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_DIVTF3_H
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
index 98274c9a90416..1b4f9ddab2a90 100644
--- a/libc/src/__support/builtins/CMakeLists.txt
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -27,3 +27,13 @@ add_header_library(
     libc.src.__support.FPUtil.generic.mul
     libc.src.__support.macros.config
 )
+
+add_header_library(
+  divtf3
+  HDRS
+    divtf3.h
+  DEPENDS
+    libc.include.llvm-libc-types.float128
+    libc.src.__support.FPUtil.generic.div
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/divtf3.h b/libc/src/__support/builtins/divtf3.h
new file mode 100644
index 0000000000000..7f25586cde6c9
--- /dev/null
+++ b/libc/src/__support/builtins/divtf3.h
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __divtf3 implementation as builtins::divtf3
+/// so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_DIVTF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_DIVTF3_H
+
+#include "include/llvm-libc-types/float128.h"
+
+#ifdef LIBC_TYPES_HAS_FLOAT128
+
+#include "src/__support/FPUtil/generic/div.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Division at float128 precision; mirrors compiler-rt's __divtf3.
+LIBC_INLINE float128 divtf3(float128 x, float128 y) {
+  return fputil::generic::div<float128>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LIBC_TYPES_HAS_FLOAT128
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_DIVTF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 4111c7a0051bf..10f742a8e2664 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -822,6 +822,7 @@ add_fp_unittest(
     shared_builtins_test.cpp
   DEPENDS
     libc.src.__support.builtins.addtf3
+    libc.src.__support.builtins.divtf3
     libc.src.__support.builtins.multf3
     libc.src.__support.builtins.subtf3
 )
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
index 52130e75c4c31..b8350829f4f71 100644
--- a/libc/test/shared/shared_builtins_test.cpp
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -23,6 +23,8 @@ TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
 TEST(LlvmLibcSharedBuiltinsTest, AllFloat128) {
   EXPECT_FP_EQ(float128(3.0),
                LIBC_NAMESPACE::shared::addtf3(float128(1.0), float128(2.0)));
+  EXPECT_FP_EQ(float128(3.0),
+               LIBC_NAMESPACE::shared::divtf3(float128(6.0), float128(2.0)));
   EXPECT_FP_EQ(float128(6.0),
                LIBC_NAMESPACE::shared::multf3(float128(2.0), float128(3.0)));
   EXPECT_FP_EQ(float128(2.0),

>From 7dcd8c449e8ab06108d3f0a25538e8a2d646e0ed Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 25 Jun 2026 19:08:22 +0300
Subject: [PATCH 07/10] [libc] add shared adddf3 builtin

---
 libc/shared/builtins.h                     |  1 +
 libc/shared/builtins/adddf3.h              | 29 ++++++++++++++++++++
 libc/src/__support/builtins/CMakeLists.txt |  9 ++++++
 libc/src/__support/builtins/adddf3.h       | 32 ++++++++++++++++++++++
 libc/test/shared/CMakeLists.txt            |  1 +
 libc/test/shared/shared_builtins_test.cpp  |  2 +-
 6 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 libc/shared/builtins/adddf3.h
 create mode 100644 libc/src/__support/builtins/adddf3.h

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index fc4c5aee9a8e4..dca0171c02d18 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -17,6 +17,7 @@
 
 #include "libc_common.h"
 
+#include "builtins/adddf3.h"
 #include "builtins/addtf3.h"
 #include "builtins/divtf3.h"
 #include "builtins/multf3.h"
diff --git a/libc/shared/builtins/adddf3.h b/libc/shared/builtins/adddf3.h
new file mode 100644
index 0000000000000..33936cb8b2486
--- /dev/null
+++ b/libc/shared/builtins/adddf3.h
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __adddf3 implementation as shared::adddf3 so
+/// that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_ADDDF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_ADDDF3_H
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/adddf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::adddf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_ADDDF3_H
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
index 1b4f9ddab2a90..dee5a830b8857 100644
--- a/libc/src/__support/builtins/CMakeLists.txt
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -37,3 +37,12 @@ add_header_library(
     libc.src.__support.FPUtil.generic.div
     libc.src.__support.macros.config
 )
+
+add_header_library(
+  adddf3
+  HDRS
+    adddf3.h
+  DEPENDS
+    libc.src.__support.FPUtil.generic.add_sub
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/adddf3.h b/libc/src/__support/builtins/adddf3.h
new file mode 100644
index 0000000000000..9fa60ca8d1c69
--- /dev/null
+++ b/libc/src/__support/builtins/adddf3.h
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __adddf3 implementation as builtins::adddf3
+/// so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDDF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDDF3_H
+
+#include "src/__support/FPUtil/generic/add_sub.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Addition at double precision; mirrors compiler-rt's __adddf3.
+LIBC_INLINE double adddf3(double x, double y) {
+  return fputil::generic::add<double>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDDF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 10f742a8e2664..7af68afc8c0a2 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -821,6 +821,7 @@ add_fp_unittest(
   SRCS
     shared_builtins_test.cpp
   DEPENDS
+    libc.src.__support.builtins.adddf3
     libc.src.__support.builtins.addtf3
     libc.src.__support.builtins.divtf3
     libc.src.__support.builtins.multf3
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
index b8350829f4f71..4960c7abe6b04 100644
--- a/libc/test/shared/shared_builtins_test.cpp
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -15,7 +15,7 @@ TEST(LlvmLibcSharedBuiltinsTest, AllFloat) {
 }
 
 TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
-  // TODO: assertions for shared::*df3 builtins.
+  EXPECT_FP_EQ(3.0, LIBC_NAMESPACE::shared::adddf3(1.0, 2.0));
 }
 
 #ifdef LIBC_TYPES_HAS_FLOAT128

>From e4afe0181d70554dc66fff1829c54cd06276ffb3 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 25 Jun 2026 19:08:23 +0300
Subject: [PATCH 08/10] [libc] add shared subdf3 builtin

---
 libc/shared/builtins.h                     |  1 +
 libc/shared/builtins/subdf3.h              | 29 ++++++++++++++++++++
 libc/src/__support/builtins/CMakeLists.txt |  9 ++++++
 libc/src/__support/builtins/subdf3.h       | 32 ++++++++++++++++++++++
 libc/test/shared/CMakeLists.txt            |  1 +
 libc/test/shared/shared_builtins_test.cpp  |  1 +
 6 files changed, 73 insertions(+)
 create mode 100644 libc/shared/builtins/subdf3.h
 create mode 100644 libc/src/__support/builtins/subdf3.h

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index dca0171c02d18..867bf6df0d306 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -21,6 +21,7 @@
 #include "builtins/addtf3.h"
 #include "builtins/divtf3.h"
 #include "builtins/multf3.h"
+#include "builtins/subdf3.h"
 #include "builtins/subtf3.h"
 
 #endif // LLVM_LIBC_SHARED_BUILTINS_H
diff --git a/libc/shared/builtins/subdf3.h b/libc/shared/builtins/subdf3.h
new file mode 100644
index 0000000000000..8cff7e3bfa28f
--- /dev/null
+++ b/libc/shared/builtins/subdf3.h
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __subdf3 implementation as shared::subdf3 so
+/// that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_SUBDF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_SUBDF3_H
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/subdf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::subdf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_SUBDF3_H
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
index dee5a830b8857..47dbc6cddbf68 100644
--- a/libc/src/__support/builtins/CMakeLists.txt
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -46,3 +46,12 @@ add_header_library(
     libc.src.__support.FPUtil.generic.add_sub
     libc.src.__support.macros.config
 )
+
+add_header_library(
+  subdf3
+  HDRS
+    subdf3.h
+  DEPENDS
+    libc.src.__support.FPUtil.generic.add_sub
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/subdf3.h b/libc/src/__support/builtins/subdf3.h
new file mode 100644
index 0000000000000..5e704aa714af6
--- /dev/null
+++ b/libc/src/__support/builtins/subdf3.h
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __subdf3 implementation as builtins::subdf3
+/// so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_SUBDF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_SUBDF3_H
+
+#include "src/__support/FPUtil/generic/add_sub.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Subtraction at double precision; mirrors compiler-rt's __subdf3.
+LIBC_INLINE double subdf3(double x, double y) {
+  return fputil::generic::sub<double>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_SUBDF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 7af68afc8c0a2..5a28aea9ff4f3 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -825,6 +825,7 @@ add_fp_unittest(
     libc.src.__support.builtins.addtf3
     libc.src.__support.builtins.divtf3
     libc.src.__support.builtins.multf3
+    libc.src.__support.builtins.subdf3
     libc.src.__support.builtins.subtf3
 )
 
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
index 4960c7abe6b04..1de81ce129c20 100644
--- a/libc/test/shared/shared_builtins_test.cpp
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -16,6 +16,7 @@ TEST(LlvmLibcSharedBuiltinsTest, AllFloat) {
 
 TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
   EXPECT_FP_EQ(3.0, LIBC_NAMESPACE::shared::adddf3(1.0, 2.0));
+  EXPECT_FP_EQ(2.0, LIBC_NAMESPACE::shared::subdf3(5.0, 3.0));
 }
 
 #ifdef LIBC_TYPES_HAS_FLOAT128

>From 96a19239a769927fb695dff94ec83b93de0b4c73 Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 25 Jun 2026 19:08:24 +0300
Subject: [PATCH 09/10] [libc] add shared muldf3 builtin

---
 libc/shared/builtins.h                     |  1 +
 libc/shared/builtins/muldf3.h              | 29 ++++++++++++++++++++
 libc/src/__support/builtins/CMakeLists.txt |  9 ++++++
 libc/src/__support/builtins/muldf3.h       | 32 ++++++++++++++++++++++
 libc/test/shared/CMakeLists.txt            |  1 +
 libc/test/shared/shared_builtins_test.cpp  |  1 +
 6 files changed, 73 insertions(+)
 create mode 100644 libc/shared/builtins/muldf3.h
 create mode 100644 libc/src/__support/builtins/muldf3.h

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index 867bf6df0d306..2540be78519d7 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -20,6 +20,7 @@
 #include "builtins/adddf3.h"
 #include "builtins/addtf3.h"
 #include "builtins/divtf3.h"
+#include "builtins/muldf3.h"
 #include "builtins/multf3.h"
 #include "builtins/subdf3.h"
 #include "builtins/subtf3.h"
diff --git a/libc/shared/builtins/muldf3.h b/libc/shared/builtins/muldf3.h
new file mode 100644
index 0000000000000..702c73428e5f4
--- /dev/null
+++ b/libc/shared/builtins/muldf3.h
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __muldf3 implementation as shared::muldf3 so
+/// that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_MULDF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_MULDF3_H
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/muldf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::muldf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_MULDF3_H
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
index 47dbc6cddbf68..179337c4d6cf0 100644
--- a/libc/src/__support/builtins/CMakeLists.txt
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -55,3 +55,12 @@ add_header_library(
     libc.src.__support.FPUtil.generic.add_sub
     libc.src.__support.macros.config
 )
+
+add_header_library(
+  muldf3
+  HDRS
+    muldf3.h
+  DEPENDS
+    libc.src.__support.FPUtil.generic.mul
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/muldf3.h b/libc/src/__support/builtins/muldf3.h
new file mode 100644
index 0000000000000..b407b96ef90b4
--- /dev/null
+++ b/libc/src/__support/builtins/muldf3.h
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __muldf3 implementation as builtins::muldf3
+/// so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_MULDF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_MULDF3_H
+
+#include "src/__support/FPUtil/generic/mul.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Multiplication at double precision; mirrors compiler-rt's __muldf3.
+LIBC_INLINE double muldf3(double x, double y) {
+  return fputil::generic::mul<double>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_MULDF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 5a28aea9ff4f3..64f3147d746d3 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -824,6 +824,7 @@ add_fp_unittest(
     libc.src.__support.builtins.adddf3
     libc.src.__support.builtins.addtf3
     libc.src.__support.builtins.divtf3
+    libc.src.__support.builtins.muldf3
     libc.src.__support.builtins.multf3
     libc.src.__support.builtins.subdf3
     libc.src.__support.builtins.subtf3
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
index 1de81ce129c20..be89aea684e8e 100644
--- a/libc/test/shared/shared_builtins_test.cpp
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -16,6 +16,7 @@ TEST(LlvmLibcSharedBuiltinsTest, AllFloat) {
 
 TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
   EXPECT_FP_EQ(3.0, LIBC_NAMESPACE::shared::adddf3(1.0, 2.0));
+  EXPECT_FP_EQ(6.0, LIBC_NAMESPACE::shared::muldf3(2.0, 3.0));
   EXPECT_FP_EQ(2.0, LIBC_NAMESPACE::shared::subdf3(5.0, 3.0));
 }
 

>From 0bd814ee4e85612d6733f4da3eee5d2b178bb94b Mon Sep 17 00:00:00 2001
From: hulxv <hulxxv at gmail.com>
Date: Thu, 25 Jun 2026 19:08:26 +0300
Subject: [PATCH 10/10] [libc] add shared divdf3 builtin

---
 libc/shared/builtins.h                     |  1 +
 libc/shared/builtins/divdf3.h              | 29 ++++++++++++++++++++
 libc/src/__support/builtins/CMakeLists.txt |  9 ++++++
 libc/src/__support/builtins/divdf3.h       | 32 ++++++++++++++++++++++
 libc/test/shared/CMakeLists.txt            |  1 +
 libc/test/shared/shared_builtins_test.cpp  |  1 +
 6 files changed, 73 insertions(+)
 create mode 100644 libc/shared/builtins/divdf3.h
 create mode 100644 libc/src/__support/builtins/divdf3.h

diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h
index 2540be78519d7..94ff3fb32ee69 100644
--- a/libc/shared/builtins.h
+++ b/libc/shared/builtins.h
@@ -19,6 +19,7 @@
 
 #include "builtins/adddf3.h"
 #include "builtins/addtf3.h"
+#include "builtins/divdf3.h"
 #include "builtins/divtf3.h"
 #include "builtins/muldf3.h"
 #include "builtins/multf3.h"
diff --git a/libc/shared/builtins/divdf3.h b/libc/shared/builtins/divdf3.h
new file mode 100644
index 0000000000000..4cabc847b7a02
--- /dev/null
+++ b/libc/shared/builtins/divdf3.h
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __divdf3 implementation as shared::divdf3 so
+/// that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_BUILTINS_DIVDF3_H
+#define LLVM_LIBC_SHARED_BUILTINS_DIVDF3_H
+
+#include "shared/libc_common.h"
+#include "src/__support/builtins/divdf3.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using builtins::divdf3;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SHARED_BUILTINS_DIVDF3_H
diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt
index 179337c4d6cf0..69b9de039d465 100644
--- a/libc/src/__support/builtins/CMakeLists.txt
+++ b/libc/src/__support/builtins/CMakeLists.txt
@@ -64,3 +64,12 @@ add_header_library(
     libc.src.__support.FPUtil.generic.mul
     libc.src.__support.macros.config
 )
+
+add_header_library(
+  divdf3
+  HDRS
+    divdf3.h
+  DEPENDS
+    libc.src.__support.FPUtil.generic.div
+    libc.src.__support.macros.config
+)
diff --git a/libc/src/__support/builtins/divdf3.h b/libc/src/__support/builtins/divdf3.h
new file mode 100644
index 0000000000000..b9af2252be389
--- /dev/null
+++ b/libc/src/__support/builtins/divdf3.h
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This header exposes LLVM-libc's __divdf3 implementation as builtins::divdf3
+/// so that it can be reused by compiler-rt's builtins.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_DIVDF3_H
+#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_DIVDF3_H
+
+#include "src/__support/FPUtil/generic/div.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace builtins {
+
+// Division at double precision; mirrors compiler-rt's __divdf3.
+LIBC_INLINE double divdf3(double x, double y) {
+  return fputil::generic::div<double>(x, y);
+}
+
+} // namespace builtins
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_DIVDF3_H
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 64f3147d746d3..6a57dc4f40d5a 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -823,6 +823,7 @@ add_fp_unittest(
   DEPENDS
     libc.src.__support.builtins.adddf3
     libc.src.__support.builtins.addtf3
+    libc.src.__support.builtins.divdf3
     libc.src.__support.builtins.divtf3
     libc.src.__support.builtins.muldf3
     libc.src.__support.builtins.multf3
diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp
index be89aea684e8e..e7e06452da8bc 100644
--- a/libc/test/shared/shared_builtins_test.cpp
+++ b/libc/test/shared/shared_builtins_test.cpp
@@ -16,6 +16,7 @@ TEST(LlvmLibcSharedBuiltinsTest, AllFloat) {
 
 TEST(LlvmLibcSharedBuiltinsTest, AllDouble) {
   EXPECT_FP_EQ(3.0, LIBC_NAMESPACE::shared::adddf3(1.0, 2.0));
+  EXPECT_FP_EQ(3.0, LIBC_NAMESPACE::shared::divdf3(6.0, 2.0));
   EXPECT_FP_EQ(6.0, LIBC_NAMESPACE::shared::muldf3(2.0, 3.0));
   EXPECT_FP_EQ(2.0, LIBC_NAMESPACE::shared::subdf3(5.0, 3.0));
 }



More information about the libc-commits mailing list