[libc-commits] [libc] [llvm] [libc] Make ldexpf128/scalbnf128/scalblnf128 use emulated Float128 (PR #220295)

Parth Patel via libc-commits libc-commits at lists.llvm.org
Wed Sep 2 10:10:07 PDT 2026


https://github.com/rigalis updated https://github.com/llvm/llvm-project/pull/220295

>From 061087cffd462aef49c526500322a444c96ad7ee Mon Sep 17 00:00:00 2001
From: rigalis <patelpparth15 at gmail.com>
Date: Tue, 1 Sep 2026 21:12:30 +0530
Subject: [PATCH 1/4] ldexpf128

---
 libc/config/baremetal/aarch64/entrypoints.txt   |  2 +-
 libc/config/baremetal/arm/entrypoints.txt       |  2 +-
 libc/config/baremetal/riscv/entrypoints.txt     |  2 +-
 libc/config/darwin/aarch64/entrypoints.txt      |  2 +-
 libc/config/freebsd/x86_64/entrypoints.txt      |  2 +-
 libc/config/linux/aarch64/entrypoints.txt       |  2 +-
 libc/config/linux/riscv/entrypoints.txt         |  2 +-
 libc/config/linux/x86_64/entrypoints.txt        |  2 +-
 libc/shared/math/ldexpf128.h                    |  6 ------
 libc/src/__support/math/CMakeLists.txt          |  4 ++--
 libc/src/__support/math/ldexpf128.h             | 16 +++++-----------
 libc/src/math/generic/CMakeLists.txt            |  1 +
 libc/src/math/generic/ldexpf128.cpp             |  6 ++++--
 libc/src/math/ldexpf128.h                       |  5 +++++
 libc/test/shared/shared_math_constexpr_test.cpp |  2 ++
 libc/test/shared/shared_math_test.cpp           |  6 ++----
 16 files changed, 29 insertions(+), 33 deletions(-)

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index 9a296693e22eb..b0a28afad3f7c 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -412,6 +412,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -779,7 +780,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 7ac1a9ce0d35f..1a0a155c16e44 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -424,6 +424,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -790,7 +791,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 9dbaf71d285ee..fb2d27d98695a 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -420,6 +420,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -787,7 +788,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index ba397e2958cae..26836cffd8a58 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -231,6 +231,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -599,7 +600,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/config/freebsd/x86_64/entrypoints.txt b/libc/config/freebsd/x86_64/entrypoints.txt
index 2bb022667dd09..f9385e9297a93 100644
--- a/libc/config/freebsd/x86_64/entrypoints.txt
+++ b/libc/config/freebsd/x86_64/entrypoints.txt
@@ -166,6 +166,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -539,7 +540,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 8ad5d27352e0c..5381dd72784d3 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -589,6 +589,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.fdimf
     libc.src.math.fdiml
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -950,7 +951,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 01df716929a57..3ba864d436311 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -658,6 +658,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -1036,7 +1037,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 5f93ab1176ff0..e5d7b106f8004 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -667,6 +667,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
+    libc.src.math.ldexpf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -1045,7 +1046,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.fsubf128
     libc.src.math.getpayloadf128
     libc.src.math.ilogbf128
-    libc.src.math.ldexpf128
     libc.src.math.llogbf128
     libc.src.math.logbf128
     libc.src.math.modff128
diff --git a/libc/shared/math/ldexpf128.h b/libc/shared/math/ldexpf128.h
index d221d71665516..91bd7bf3c321f 100644
--- a/libc/shared/math/ldexpf128.h
+++ b/libc/shared/math/ldexpf128.h
@@ -9,10 +9,6 @@
 #ifndef LLVM_LIBC_SHARED_MATH_LDEXPF128_H
 #define LLVM_LIBC_SHARED_MATH_LDEXPF128_H
 
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #include "shared/libc_common.h"
 #include "src/__support/math/ldexpf128.h"
 
@@ -24,6 +20,4 @@ using math::ldexpf128;
 } // namespace shared
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #endif // LLVM_LIBC_SHARED_MATH_LDEXPF128_H
diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt
index 272e9425a4e1e..d42d095bb457f 100644
--- a/libc/src/__support/math/CMakeLists.txt
+++ b/libc/src/__support/math/CMakeLists.txt
@@ -4039,9 +4039,9 @@ add_header_library(
   HDRS
     ldexpf128.h
   DEPENDS
-    libc.src.__support.macros.properties.types
+    libc.src.__support.FPUtil.float128
     libc.src.__support.FPUtil.manipulation_functions
-    libc.include.llvm-libc-types.float128
+    libc.src.__support.macros.config
 )
 
 add_header_library(
diff --git a/libc/src/__support/math/ldexpf128.h b/libc/src/__support/math/ldexpf128.h
index 74e4c354ff8fe..e543d2870f2f7 100644
--- a/libc/src/__support/math/ldexpf128.h
+++ b/libc/src/__support/math/ldexpf128.h
@@ -1,4 +1,4 @@
-//===-- Implementation header for ldexpf ------------------------*- C++ -*-===//
+//===-- Implementation header for ldexpf128 ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,26 +9,20 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF128_H
 #define LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF128_H
 
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #include "src/__support/FPUtil/ManipulationFunctions.h"
-#include "src/__support/common.h"
+#include "src/__support/FPUtil/float128.h"
 #include "src/__support/macros/config.h"
 
 namespace LIBC_NAMESPACE_DECL {
-
 namespace math {
 
-LIBC_INLINE constexpr float128 ldexpf128(float128 x, int exp) {
+using LIBC_NAMESPACE::fputil::Float128;
+
+LIBC_INLINE constexpr Float128 ldexpf128(Float128 x, int exp) {
   return fputil::ldexp(x, exp);
 }
 
 } // namespace math
-
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #endif // LLVM_LIBC_SRC___SUPPORT_MATH_LDEXPF128_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 71f610d9f8281..2f78f8cca4074 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -1733,6 +1733,7 @@ add_entrypoint_object(
   HDRS
     ../ldexpf128.h
   DEPENDS
+    libc.src.__support.CPP.bit
     libc.src.__support.math.ldexpf128
 )
 
diff --git a/libc/src/math/generic/ldexpf128.cpp b/libc/src/math/generic/ldexpf128.cpp
index 40afa5b285bcd..13c64041b7eda 100644
--- a/libc/src/math/generic/ldexpf128.cpp
+++ b/libc/src/math/generic/ldexpf128.cpp
@@ -7,13 +7,15 @@
 //===----------------------------------------------------------------------===//
 
 #include "src/math/ldexpf128.h"
-
+#include "src/__support/CPP/bit.h"
 #include "src/__support/math/ldexpf128.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
+using LIBC_NAMESPACE::fputil::Float128;
+
 LLVM_LIBC_FUNCTION(float128, ldexpf128, (float128 x, int exp)) {
-  return math::ldexpf128(x, exp);
+  return cpp::bit_cast<float128>(math::ldexpf128(cpp::bit_cast<Float128>(x), exp));
 }
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/ldexpf128.h b/libc/src/math/ldexpf128.h
index 74c3ef612166e..64e1e07ed80b3 100644
--- a/libc/src/math/ldexpf128.h
+++ b/libc/src/math/ldexpf128.h
@@ -9,11 +9,16 @@
 #ifndef LLVM_LIBC_SRC_MATH_LDEXPF128_H
 #define LLVM_LIBC_SRC_MATH_LDEXPF128_H
 
+#include "src/__support/FPUtil/float128.h"
 #include "src/__support/macros/config.h"
 #include "src/__support/macros/properties/types.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
 float128 ldexpf128(float128 x, int exp);
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index c04f1a361395a..fcf5de3b2f1db 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -403,6 +403,8 @@ static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::roundf128(Float128(0.0)));
 static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
+static_assert(Float128(0.0) ==
+              LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
 
 //===----------------------------------------------------------------------===//
 //                       Native Float128 Tests
diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp
index 737efdb09d8c5..74e336070ff82 100644
--- a/libc/test/shared/shared_math_test.cpp
+++ b/libc/test/shared/shared_math_test.cpp
@@ -604,6 +604,8 @@ TEST(LlvmLibcSharedMathTest, AllEmuFloat128) {
   EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::roundf128(Float128(0.0)));
   EXPECT_FP_EQ(Float128(1.0), LIBC_NAMESPACE::shared::sqrtf128(Float128(1.0)));
   EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
+  EXPECT_FP_EQ(Float128(0.0),
+               LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
 }
 
 #ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
@@ -620,10 +622,6 @@ TEST(LlvmLibcSharedMathTest, AllFloat128) {
   EXPECT_EQ(exponent, 5);
 
   EXPECT_EQ(3, LIBC_NAMESPACE::shared::ilogbf128(float128(8.0)));
-  ASSERT_FP_EQ(float128(8 << 5),
-               LIBC_NAMESPACE::shared::ldexpf128(float128(8), 5));
-  ASSERT_FP_EQ(float128(-1 * (8 << 5)),
-               LIBC_NAMESPACE::shared::ldexpf128(float128(-8), 5));
   EXPECT_FP_EQ(float128(0.0), LIBC_NAMESPACE::shared::logbf128(float128(1.0)));
   EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::shared::dfmaf128(
                         float128(0.0), float128(0.0), float128(0.0)));

>From a3b7b3766a73ef9a44f8ff34563910fbcfe41b58 Mon Sep 17 00:00:00 2001
From: rigalis <patelpparth15 at gmail.com>
Date: Tue, 1 Sep 2026 21:18:27 +0530
Subject: [PATCH 2/4] scalbnf128

---
 libc/config/baremetal/aarch64/entrypoints.txt   |  2 +-
 libc/config/baremetal/arm/entrypoints.txt       |  2 +-
 libc/config/baremetal/riscv/entrypoints.txt     |  2 +-
 libc/config/darwin/aarch64/entrypoints.txt      |  2 +-
 libc/config/freebsd/x86_64/entrypoints.txt      |  2 +-
 libc/config/linux/aarch64/entrypoints.txt       |  2 +-
 libc/config/linux/riscv/entrypoints.txt         |  2 +-
 libc/config/linux/x86_64/entrypoints.txt        |  2 +-
 libc/shared/math/scalbnf128.h                   |  8 +-------
 libc/src/__support/math/CMakeLists.txt          |  2 +-
 libc/src/__support/math/scalbnf128.h            | 11 ++++-------
 libc/src/math/generic/CMakeLists.txt            |  1 +
 libc/src/math/generic/scalbnf128.cpp            |  5 ++++-
 libc/src/math/scalbnf128.h                      |  7 ++++++-
 libc/test/shared/shared_math_constexpr_test.cpp |  5 +++--
 libc/test/shared/shared_math_test.cpp           |  5 +++--
 16 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index b0a28afad3f7c..a0597c1c54f08 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -413,6 +413,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -790,7 +791,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 1a0a155c16e44..2cb544b947611 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -425,6 +425,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -801,7 +802,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index fb2d27d98695a..af0a31784985d 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -421,6 +421,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -798,7 +799,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index 26836cffd8a58..d5ade421f2a8d 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -232,6 +232,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -610,7 +611,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/freebsd/x86_64/entrypoints.txt b/libc/config/freebsd/x86_64/entrypoints.txt
index f9385e9297a93..ca25f637addcb 100644
--- a/libc/config/freebsd/x86_64/entrypoints.txt
+++ b/libc/config/freebsd/x86_64/entrypoints.txt
@@ -167,6 +167,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -550,7 +551,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 5381dd72784d3..8f20d7a9d32d9 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -590,6 +590,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.fdiml
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -961,7 +962,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 3ba864d436311..803b33e8932f6 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -659,6 +659,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -1047,7 +1048,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index e5d7b106f8004..6b80735e4e3b1 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -668,6 +668,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -1056,7 +1057,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.remainderf128
     libc.src.math.remquof128
     libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/shared/math/scalbnf128.h b/libc/shared/math/scalbnf128.h
index 74c8defc0e6d3..a870b276a6dac 100644
--- a/libc/shared/math/scalbnf128.h
+++ b/libc/shared/math/scalbnf128.h
@@ -1,4 +1,4 @@
-//===-- Shared scalbnf128 function ------------------------------*- C++ -*-===//
+//===-- Shared scalbnf128 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.
@@ -9,10 +9,6 @@
 #ifndef LLVM_LIBC_SHARED_MATH_SCALBNF128_H
 #define LLVM_LIBC_SHARED_MATH_SCALBNF128_H
 
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #include "shared/libc_common.h"
 #include "src/__support/math/scalbnf128.h"
 
@@ -24,6 +20,4 @@ using math::scalbnf128;
 } // namespace shared
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #endif // LLVM_LIBC_SHARED_MATH_SCALBNF128_H
diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt
index d42d095bb457f..a07cc81dd1839 100644
--- a/libc/src/__support/math/CMakeLists.txt
+++ b/libc/src/__support/math/CMakeLists.txt
@@ -2684,7 +2684,7 @@ add_header_library(
     scalbnf128.h
   DEPENDS
     libc.hdr.float_macros
-    libc.include.llvm-libc-types.float128
+    libc.src.__support.FPUtil.float128
     libc.src.__support.FPUtil.manipulation_functions
     libc.src.__support.macros.config
 )
diff --git a/libc/src/__support/math/scalbnf128.h b/libc/src/__support/math/scalbnf128.h
index bb9b3ecfa4024..98aadb1f6165b 100644
--- a/libc/src/__support/math/scalbnf128.h
+++ b/libc/src/__support/math/scalbnf128.h
@@ -9,12 +9,9 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_MATH_SCALBNF128_H
 #define LLVM_LIBC_SRC___SUPPORT_MATH_SCALBNF128_H
 
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #include "hdr/float_macros.h"
 #include "src/__support/FPUtil/ManipulationFunctions.h"
+#include "src/__support/FPUtil/float128.h"
 #include "src/__support/macros/config.h"
 
 #if FLT_RADIX != 2
@@ -24,13 +21,13 @@
 namespace LIBC_NAMESPACE_DECL {
 namespace math {
 
-LIBC_INLINE constexpr float128 scalbnf128(float128 x, int n) {
+using LIBC_NAMESPACE::fputil::Float128;
+
+LIBC_INLINE constexpr Float128 scalbnf128(Float128 x, int n) {
   return fputil::ldexp(x, n);
 }
 
 } // namespace math
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #endif // LLVM_LIBC_SRC___SUPPORT_MATH_SCALBNF128_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 2f78f8cca4074..79a65e07b8e44 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -4179,6 +4179,7 @@ add_entrypoint_object(
   HDRS
     ../scalbnf128.h
   DEPENDS
+    libc.src.__support.CPP.bit
     libc.src.__support.math.scalbnf128
 )
 
diff --git a/libc/src/math/generic/scalbnf128.cpp b/libc/src/math/generic/scalbnf128.cpp
index f2655a3782f33..0923372dc6c53 100644
--- a/libc/src/math/generic/scalbnf128.cpp
+++ b/libc/src/math/generic/scalbnf128.cpp
@@ -7,12 +7,15 @@
 //===----------------------------------------------------------------------===//
 
 #include "src/math/scalbnf128.h"
+#include "src/__support/CPP/bit.h"
 #include "src/__support/math/scalbnf128.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
+using LIBC_NAMESPACE::fputil::Float128;
+
 LLVM_LIBC_FUNCTION(float128, scalbnf128, (float128 x, int n)) {
-  return math::scalbnf128(x, n);
+  return cpp::bit_cast<float128>(math::scalbnf128(cpp::bit_cast<Float128>(x), n));
 }
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/scalbnf128.h b/libc/src/math/scalbnf128.h
index b96d954c69e30..35771da381c58 100644
--- a/libc/src/math/scalbnf128.h
+++ b/libc/src/math/scalbnf128.h
@@ -1,4 +1,4 @@
-//===-- Implementation header for scalbnf128 --------------------*- C++ -*-===//
+//===-- Implementation header for scalbnf128 ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,11 +9,16 @@
 #ifndef LLVM_LIBC_SRC_MATH_SCALBNF128_H
 #define LLVM_LIBC_SRC_MATH_SCALBNF128_H
 
+#include "src/__support/FPUtil/float128.h"
 #include "src/__support/macros/config.h"
 #include "src/__support/macros/properties/types.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
 float128 scalbnf128(float128 x, int n);
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index fcf5de3b2f1db..6bfb8f5287081 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -405,6 +405,8 @@ static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
 static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
+static_assert(Float128(0.0) ==
+              LIBC_NAMESPACE::shared::scalbnf128(Float128(0.0), 0));
 
 //===----------------------------------------------------------------------===//
 //                       Native Float128 Tests
@@ -494,8 +496,7 @@ static_assert(float128(0.0) == [] {
 }());
 static_assert(float128(0.0) ==
               LIBC_NAMESPACE::shared::scalblnf128(float128(0.0), 0.0));
-static_assert(float128(0.0) ==
-              LIBC_NAMESPACE::shared::scalbnf128(float128(0.0), 0.0));
+
 static_assert(0 == [] {
   float128 setpayload_x = float128(0.0);
   return LIBC_NAMESPACE::shared::setpayloadf128(&setpayload_x, float128(0.0));
diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp
index 74e336070ff82..9c868309e302b 100644
--- a/libc/test/shared/shared_math_test.cpp
+++ b/libc/test/shared/shared_math_test.cpp
@@ -606,6 +606,8 @@ TEST(LlvmLibcSharedMathTest, AllEmuFloat128) {
   EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
   EXPECT_FP_EQ(Float128(0.0),
                LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
+  EXPECT_FP_EQ(Float128(0.0),
+               LIBC_NAMESPACE::shared::scalbnf128(Float128(0.0), 0));
 }
 
 #ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
@@ -747,8 +749,7 @@ TEST(LlvmLibcSharedMathTest, AllFloat128) {
   EXPECT_EQ(1, remquof128_exp);
   EXPECT_FP_EQ(float128(0.0),
                LIBC_NAMESPACE::shared::scalblnf128(float128(0.0), 0L));
-  EXPECT_FP_EQ(float128(0.0),
-               LIBC_NAMESPACE::shared::scalbnf128(float128(0.0), 0));
+
   EXPECT_FP_EQ(0x0p+0f,
                LIBC_NAMESPACE::shared::fsubf128(float128(0.0), float128(0.0)));
   EXPECT_FP_EQ(0x0p+0f,

>From 83e2e32f5359c01b6d1f65cce31a8ece7eaa94cc Mon Sep 17 00:00:00 2001
From: rigalis <patelpparth15 at gmail.com>
Date: Tue, 1 Sep 2026 21:23:39 +0530
Subject: [PATCH 3/4] scalblnf128

---
 libc/config/baremetal/aarch64/entrypoints.txt   |  2 +-
 libc/config/baremetal/arm/entrypoints.txt       |  2 +-
 libc/config/baremetal/riscv/entrypoints.txt     |  2 +-
 libc/config/darwin/aarch64/entrypoints.txt      |  2 +-
 libc/config/freebsd/x86_64/entrypoints.txt      |  2 +-
 libc/config/linux/aarch64/entrypoints.txt       |  2 +-
 libc/config/linux/riscv/entrypoints.txt         |  2 +-
 libc/config/linux/x86_64/entrypoints.txt        |  2 +-
 libc/shared/math/scalblnf128.h                  |  8 +-------
 libc/src/__support/math/CMakeLists.txt          |  2 +-
 libc/src/__support/math/scalblnf128.h           | 11 ++++-------
 libc/src/math/generic/CMakeLists.txt            |  1 +
 libc/src/math/generic/scalblnf128.cpp           |  5 ++++-
 libc/src/math/scalblnf128.h                     |  7 ++++++-
 libc/test/shared/shared_math_constexpr_test.cpp |  5 ++---
 libc/test/shared/shared_math_test.cpp           |  5 +++--
 16 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index a0597c1c54f08..fad95af15ae81 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -413,6 +413,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -790,7 +791,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 2cb544b947611..24a39419fedbb 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -425,6 +425,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -801,7 +802,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index af0a31784985d..4b4690f433ebc 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -421,6 +421,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -798,7 +799,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index d5ade421f2a8d..801dda0f51b5f 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -232,6 +232,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -610,7 +611,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/freebsd/x86_64/entrypoints.txt b/libc/config/freebsd/x86_64/entrypoints.txt
index ca25f637addcb..f2320521e4ab4 100644
--- a/libc/config/freebsd/x86_64/entrypoints.txt
+++ b/libc/config/freebsd/x86_64/entrypoints.txt
@@ -167,6 +167,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -550,7 +551,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 8f20d7a9d32d9..b1fa7fd91ae4d 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -590,6 +590,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.fdiml
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -961,7 +962,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 803b33e8932f6..12a3b215f6f0e 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -659,6 +659,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -1047,7 +1048,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 6b80735e4e3b1..2f28b2790846c 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -668,6 +668,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffmal
     libc.src.math.floor
     libc.src.math.ldexpf128
+    libc.src.math.scalblnf128
     libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
@@ -1056,7 +1057,6 @@ if(LIBC_TYPES_HAS_NATIVE_FLOAT128)
     libc.src.math.nextupf128
     libc.src.math.remainderf128
     libc.src.math.remquof128
-    libc.src.math.scalblnf128
     libc.src.math.setpayloadf128
     libc.src.math.setpayloadsigf128
     libc.src.math.totalorderf128
diff --git a/libc/shared/math/scalblnf128.h b/libc/shared/math/scalblnf128.h
index dfb15bed117cf..3953ea59401eb 100644
--- a/libc/shared/math/scalblnf128.h
+++ b/libc/shared/math/scalblnf128.h
@@ -1,4 +1,4 @@
-//===-- Shared scalblnf128 function -----------------------------*- C++ -*-===//
+//===-- Shared scalblnf128 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.
@@ -9,10 +9,6 @@
 #ifndef LLVM_LIBC_SHARED_MATH_SCALBLNF128_H
 #define LLVM_LIBC_SHARED_MATH_SCALBLNF128_H
 
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #include "shared/libc_common.h"
 #include "src/__support/math/scalblnf128.h"
 
@@ -24,6 +20,4 @@ using math::scalblnf128;
 } // namespace shared
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #endif // LLVM_LIBC_SHARED_MATH_SCALBLNF128_H
diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt
index a07cc81dd1839..809d90fe3df69 100644
--- a/libc/src/__support/math/CMakeLists.txt
+++ b/libc/src/__support/math/CMakeLists.txt
@@ -2621,7 +2621,7 @@ add_header_library(
     scalblnf128.h
   DEPENDS
     libc.hdr.float_macros
-    libc.include.llvm-libc-types.float128
+    libc.src.__support.FPUtil.float128
     libc.src.__support.FPUtil.manipulation_functions
     libc.src.__support.macros.config
 )
diff --git a/libc/src/__support/math/scalblnf128.h b/libc/src/__support/math/scalblnf128.h
index 6bd6dd92b7eb1..d0947e1e168b1 100644
--- a/libc/src/__support/math/scalblnf128.h
+++ b/libc/src/__support/math/scalblnf128.h
@@ -9,12 +9,9 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_MATH_SCALBLNF128_H
 #define LLVM_LIBC_SRC___SUPPORT_MATH_SCALBLNF128_H
 
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #include "hdr/float_macros.h"
 #include "src/__support/FPUtil/ManipulationFunctions.h"
+#include "src/__support/FPUtil/float128.h"
 #include "src/__support/macros/config.h"
 
 #if FLT_RADIX != 2
@@ -24,13 +21,13 @@
 namespace LIBC_NAMESPACE_DECL {
 namespace math {
 
-LIBC_INLINE constexpr float128 scalblnf128(float128 x, long n) {
+using LIBC_NAMESPACE::fputil::Float128;
+
+LIBC_INLINE constexpr Float128 scalblnf128(Float128 x, long n) {
   return fputil::ldexp(x, n);
 }
 
 } // namespace math
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
 #endif // LLVM_LIBC_SRC___SUPPORT_MATH_SCALBLNF128_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 79a65e07b8e44..274d679bb8593 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -4119,6 +4119,7 @@ add_entrypoint_object(
   HDRS
     ../scalblnf128.h
   DEPENDS
+    libc.src.__support.CPP.bit
     libc.src.__support.math.scalblnf128
 )
 
diff --git a/libc/src/math/generic/scalblnf128.cpp b/libc/src/math/generic/scalblnf128.cpp
index 151b75a913dac..31428084a5951 100644
--- a/libc/src/math/generic/scalblnf128.cpp
+++ b/libc/src/math/generic/scalblnf128.cpp
@@ -7,12 +7,15 @@
 //===----------------------------------------------------------------------===//
 
 #include "src/math/scalblnf128.h"
+#include "src/__support/CPP/bit.h"
 #include "src/__support/math/scalblnf128.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
+using LIBC_NAMESPACE::fputil::Float128;
+
 LLVM_LIBC_FUNCTION(float128, scalblnf128, (float128 x, long n)) {
-  return math::scalblnf128(x, n);
+  return cpp::bit_cast<float128>(math::scalblnf128(cpp::bit_cast<Float128>(x), n));
 }
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/scalblnf128.h b/libc/src/math/scalblnf128.h
index b9b7a862f66f6..35ba8ae5f0095 100644
--- a/libc/src/math/scalblnf128.h
+++ b/libc/src/math/scalblnf128.h
@@ -1,4 +1,4 @@
-//===-- Implementation header for scalblnf128 -------------------*- C++ -*-===//
+//===-- Implementation header for scalblnf128 ---------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,11 +9,16 @@
 #ifndef LLVM_LIBC_SRC_MATH_SCALBLNF128_H
 #define LLVM_LIBC_SRC_MATH_SCALBLNF128_H
 
+#include "src/__support/FPUtil/float128.h"
 #include "src/__support/macros/config.h"
 #include "src/__support/macros/properties/types.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
 float128 scalblnf128(float128 x, long n);
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index 6bfb8f5287081..39bb4406b14e6 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -407,6 +407,8 @@ static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
 static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::scalbnf128(Float128(0.0), 0));
+static_assert(Float128(0.0) ==
+              LIBC_NAMESPACE::shared::scalblnf128(Float128(0.0), 0L));
 
 //===----------------------------------------------------------------------===//
 //                       Native Float128 Tests
@@ -494,9 +496,6 @@ static_assert(float128(0.0) == [] {
   int exp{};
   return LIBC_NAMESPACE::shared::remquof128(float128(1.0), float128(1.0), &exp);
 }());
-static_assert(float128(0.0) ==
-              LIBC_NAMESPACE::shared::scalblnf128(float128(0.0), 0.0));
-
 static_assert(0 == [] {
   float128 setpayload_x = float128(0.0);
   return LIBC_NAMESPACE::shared::setpayloadf128(&setpayload_x, float128(0.0));
diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp
index 9c868309e302b..05155bc2dff70 100644
--- a/libc/test/shared/shared_math_test.cpp
+++ b/libc/test/shared/shared_math_test.cpp
@@ -608,6 +608,8 @@ TEST(LlvmLibcSharedMathTest, AllEmuFloat128) {
                LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
   EXPECT_FP_EQ(Float128(0.0),
                LIBC_NAMESPACE::shared::scalbnf128(Float128(0.0), 0));
+  EXPECT_FP_EQ(Float128(0.0),
+               LIBC_NAMESPACE::shared::scalblnf128(Float128(0.0), 0L));
 }
 
 #ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
@@ -747,8 +749,7 @@ TEST(LlvmLibcSharedMathTest, AllFloat128) {
                LIBC_NAMESPACE::shared::remquof128(float128(1.0), float128(1.0),
                                                   &remquof128_exp));
   EXPECT_EQ(1, remquof128_exp);
-  EXPECT_FP_EQ(float128(0.0),
-               LIBC_NAMESPACE::shared::scalblnf128(float128(0.0), 0L));
+
 
   EXPECT_FP_EQ(0x0p+0f,
                LIBC_NAMESPACE::shared::fsubf128(float128(0.0), float128(0.0)));

>From a1e258342c2b66de89761e9eede0d4518ffcbf2c Mon Sep 17 00:00:00 2001
From: rigalis <patelpparth15 at gmail.com>
Date: Wed, 2 Sep 2026 21:39:12 +0530
Subject: [PATCH 4/4] nits and tests

---
 libc/config/baremetal/aarch64/entrypoints.txt  |  6 +++---
 libc/config/baremetal/arm/entrypoints.txt      |  6 +++---
 libc/config/baremetal/riscv/entrypoints.txt    |  6 +++---
 libc/config/darwin/aarch64/entrypoints.txt     |  6 +++---
 libc/config/freebsd/x86_64/entrypoints.txt     |  6 +++---
 libc/config/gpu/amdgpu/entrypoints.txt         |  3 +++
 libc/config/gpu/nvptx/entrypoints.txt          |  3 +++
 libc/config/linux/aarch64/entrypoints.txt      |  6 +++---
 libc/config/linux/arm/entrypoints.txt          |  3 +++
 libc/config/linux/riscv/entrypoints.txt        |  6 +++---
 libc/config/linux/x86_64/entrypoints.txt       |  6 +++---
 libc/config/windows/entrypoints.txt            |  3 +++
 libc/shared/math/scalblnf128.h                 |  2 +-
 libc/shared/math/scalbnf128.h                  |  2 +-
 libc/src/math/scalblnf128.h                    |  2 +-
 libc/src/math/scalbnf128.h                     |  2 +-
 .../test/shared/shared_math_constexpr_test.cpp |  8 ++++----
 libc/test/shared/shared_math_test.cpp          | 10 +++++-----
 libc/test/src/math/CMakeLists.txt              | 15 +++++++++++++++
 libc/test/src/math/ldexpf128_test.cpp          | 18 ++++++++++++++++++
 libc/test/src/math/scalbnf128_test.cpp         |  5 +++++
 libc/test/src/math/smoke/ldexpf128_test.cpp    |  5 +++++
 libc/test/src/math/smoke/scalblnf128_test.cpp  |  5 +++++
 libc/test/src/math/smoke/scalbnf128_test.cpp   |  5 +++++
 .../llvm-project-overlay/libc/BUILD.bazel      |  4 +---
 25 files changed, 103 insertions(+), 40 deletions(-)
 create mode 100644 libc/test/src/math/ldexpf128_test.cpp

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index fad95af15ae81..b0f0dc7310f32 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -412,9 +412,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -493,6 +490,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingl
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -569,9 +567,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 24a39419fedbb..710fb0444109a 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -424,9 +424,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -505,6 +502,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingl
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -581,9 +579,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 4b4690f433ebc..8f57054e756a5 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -420,9 +420,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -501,6 +498,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingl
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -577,9 +575,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index 801dda0f51b5f..8ec8e20e02863 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -231,9 +231,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -312,6 +309,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingl
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -388,9 +386,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/freebsd/x86_64/entrypoints.txt b/libc/config/freebsd/x86_64/entrypoints.txt
index f2320521e4ab4..4dfbe5baf64d0 100644
--- a/libc/config/freebsd/x86_64/entrypoints.txt
+++ b/libc/config/freebsd/x86_64/entrypoints.txt
@@ -166,9 +166,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -225,6 +222,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingf128
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llrint
@@ -289,9 +287,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.sin
     libc.src.math.sincosf
diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt
index 9ea64323f5700..f40fde4b23e4e 100644
--- a/libc/config/gpu/amdgpu/entrypoints.txt
+++ b/libc/config/gpu/amdgpu/entrypoints.txt
@@ -431,6 +431,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingf128
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgamma
     libc.src.math.lgamma_r
@@ -509,9 +510,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt
index 3a5ddb8fa21a3..e157c61620b1d 100644
--- a/libc/config/gpu/nvptx/entrypoints.txt
+++ b/libc/config/gpu/nvptx/entrypoints.txt
@@ -428,6 +428,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingf128
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgamma
     libc.src.math.lgamma_r
@@ -506,9 +507,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index b1fa7fd91ae4d..cac532959dfcb 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -589,9 +589,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.fdimf
     libc.src.math.fdiml
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -670,6 +667,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingl
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -746,9 +744,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index 441ad68589b6f..85e54f115faf2 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -479,6 +479,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingf128
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -552,9 +553,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 12a3b215f6f0e..242ae49a971f2 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -658,9 +658,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -739,6 +736,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingl
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -815,9 +813,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 2f28b2790846c..01ca24aab8953 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -667,9 +667,6 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.ffma
     libc.src.math.ffmal
     libc.src.math.floor
-    libc.src.math.ldexpf128
-    libc.src.math.scalblnf128
-    libc.src.math.scalbnf128
     libc.src.math.floorf
     libc.src.math.floorf128
     libc.src.math.floorl
@@ -748,6 +745,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingl
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llogb
@@ -824,9 +822,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.setpayload
     libc.src.math.setpayloadf
diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt
index 2a9d0a81b82f8..72362f50b8d24 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -255,6 +255,7 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.issignalingf128
     libc.src.math.ldexp
     libc.src.math.ldexpf
+    libc.src.math.ldexpf128
     libc.src.math.ldexpl
     libc.src.math.lgammaf
     libc.src.math.llrint
@@ -319,9 +320,11 @@ set(TARGET_LIBM_ENTRYPOINTS
     libc.src.math.roundl
     libc.src.math.scalbln
     libc.src.math.scalblnf
+    libc.src.math.scalblnf128
     libc.src.math.scalblnl
     libc.src.math.scalbn
     libc.src.math.scalbnf
+    libc.src.math.scalbnf128
     libc.src.math.scalbnl
     libc.src.math.sin
     libc.src.math.sincosf
diff --git a/libc/shared/math/scalblnf128.h b/libc/shared/math/scalblnf128.h
index 3953ea59401eb..1b929558a2651 100644
--- a/libc/shared/math/scalblnf128.h
+++ b/libc/shared/math/scalblnf128.h
@@ -1,4 +1,4 @@
-//===-- Shared scalblnf128 function -------------------------------*- C++ -*-===//
+//===-- Shared scalblnf128 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.
diff --git a/libc/shared/math/scalbnf128.h b/libc/shared/math/scalbnf128.h
index a870b276a6dac..8c96fab5fa151 100644
--- a/libc/shared/math/scalbnf128.h
+++ b/libc/shared/math/scalbnf128.h
@@ -1,4 +1,4 @@
-//===-- Shared scalbnf128 function -------------------------------*- C++ -*-===//
+//===-- Shared scalbnf128 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.
diff --git a/libc/src/math/scalblnf128.h b/libc/src/math/scalblnf128.h
index 35ba8ae5f0095..443f01e0050a8 100644
--- a/libc/src/math/scalblnf128.h
+++ b/libc/src/math/scalblnf128.h
@@ -1,4 +1,4 @@
-//===-- Implementation header for scalblnf128 ---------------------*- C++ -*-===//
+//===-- Implementation header for scalblnf128 -------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/libc/src/math/scalbnf128.h b/libc/src/math/scalbnf128.h
index 35771da381c58..1a3ec79e5a1ee 100644
--- a/libc/src/math/scalbnf128.h
+++ b/libc/src/math/scalbnf128.h
@@ -1,4 +1,4 @@
-//===-- Implementation header for scalbnf128 ---------------------*- C++ -*-===//
+//===-- Implementation header for scalbnf128 --------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index 39bb4406b14e6..a48d4efb6e760 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -390,6 +390,8 @@ static_assert(Float128(0.0) ==
 static_assert(1 == LIBC_NAMESPACE::shared::iscanonicalf128(Float128(0.0)));
 static_assert(0 == LIBC_NAMESPACE::shared::isnanf128(Float128(0.0)));
 static_assert(0.0 == LIBC_NAMESPACE::shared::issignalingf128(Float128(0.0)));
+static_assert(Float128(0.0) ==
+              LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
 static_assert(0LL == LIBC_NAMESPACE::shared::llrintf128(Float128(0.0)));
 static_assert(0LL == LIBC_NAMESPACE::shared::llroundf128(Float128(0.0)));
 static_assert(0L == LIBC_NAMESPACE::shared::lrintf128(Float128(0.0)));
@@ -402,13 +404,11 @@ static_assert(Float128(0.0) ==
 static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::roundf128(Float128(0.0)));
 static_assert(Float128(0.0) ==
-              LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
-static_assert(Float128(0.0) ==
-              LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
+              LIBC_NAMESPACE::shared::scalblnf128(Float128(0.0), 0L));
 static_assert(Float128(0.0) ==
               LIBC_NAMESPACE::shared::scalbnf128(Float128(0.0), 0));
 static_assert(Float128(0.0) ==
-              LIBC_NAMESPACE::shared::scalblnf128(Float128(0.0), 0L));
+              LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
 
 //===----------------------------------------------------------------------===//
 //                       Native Float128 Tests
diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp
index 05155bc2dff70..96d51ce798d59 100644
--- a/libc/test/shared/shared_math_test.cpp
+++ b/libc/test/shared/shared_math_test.cpp
@@ -592,6 +592,8 @@ TEST(LlvmLibcSharedMathTest, AllEmuFloat128) {
   EXPECT_EQ(1, LIBC_NAMESPACE::shared::iscanonicalf128(Float128(0.0)));
   EXPECT_EQ(0, LIBC_NAMESPACE::shared::isnanf128(Float128(0.0)));
   EXPECT_EQ(0, LIBC_NAMESPACE::shared::issignalingf128(Float128(0.0)));
+  EXPECT_FP_EQ(Float128(0.0),
+               LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
   EXPECT_EQ(0LL, LIBC_NAMESPACE::shared::llrintf128(Float128(0.0)));
   EXPECT_EQ(0LL, LIBC_NAMESPACE::shared::llroundf128(Float128(0.0)));
   EXPECT_EQ(0L, LIBC_NAMESPACE::shared::lrintf128(Float128(0.0)));
@@ -602,14 +604,12 @@ TEST(LlvmLibcSharedMathTest, AllEmuFloat128) {
   EXPECT_FP_EQ(Float128(0.0),
                LIBC_NAMESPACE::shared::roundevenf128(Float128(0.0)));
   EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::roundf128(Float128(0.0)));
-  EXPECT_FP_EQ(Float128(1.0), LIBC_NAMESPACE::shared::sqrtf128(Float128(1.0)));
-  EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
   EXPECT_FP_EQ(Float128(0.0),
-               LIBC_NAMESPACE::shared::ldexpf128(Float128(0.0), 0));
+               LIBC_NAMESPACE::shared::scalblnf128(Float128(0.0), 0L));
   EXPECT_FP_EQ(Float128(0.0),
                LIBC_NAMESPACE::shared::scalbnf128(Float128(0.0), 0));
-  EXPECT_FP_EQ(Float128(0.0),
-               LIBC_NAMESPACE::shared::scalblnf128(Float128(0.0), 0L));
+  EXPECT_FP_EQ(Float128(1.0), LIBC_NAMESPACE::shared::sqrtf128(Float128(1.0)));
+  EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::truncf128(Float128(0.0)));
 }
 
 #ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt
index 8f1a543de0a5e..19294a8149cb9 100644
--- a/libc/test/src/math/CMakeLists.txt
+++ b/libc/test/src/math/CMakeLists.txt
@@ -1720,6 +1720,21 @@ add_fp_unittest(
     libc.src.__support.FPUtil.normal_float
 )
 
+add_fp_unittest(
+  ldexpf128_test
+  NEED_MPFR_F128
+  SUITE
+    libc-math-unittests
+  SRCS
+    ldexpf128_test.cpp
+  HDRS
+    LdExpTest.h
+  DEPENDS
+    libc.src.math.ldexpf128
+    libc.src.__support.FPUtil.fp_bits
+    libc.src.__support.FPUtil.normal_float
+)
+
 add_fp_unittest(
   logb_test
   SUITE
diff --git a/libc/test/src/math/ldexpf128_test.cpp b/libc/test/src/math/ldexpf128_test.cpp
new file mode 100644
index 0000000000000..adfde37c8135c
--- /dev/null
+++ b/libc/test/src/math/ldexpf128_test.cpp
@@ -0,0 +1,18 @@
+//===-- Unittests for ldexpf128 -------------------------------------------===//
+//
+// 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 "LdExpTest.h"
+
+#include "src/__support/FPUtil/float128.h"
+#include "src/math/ldexpf128.h"
+
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
+LIST_LDEXP_TESTS(float128, LIBC_NAMESPACE::ldexpf128);
diff --git a/libc/test/src/math/scalbnf128_test.cpp b/libc/test/src/math/scalbnf128_test.cpp
index dc259de211489..43eca41c2dfb4 100644
--- a/libc/test/src/math/scalbnf128_test.cpp
+++ b/libc/test/src/math/scalbnf128_test.cpp
@@ -8,6 +8,11 @@
 
 #include "ScalbnTest.h"
 
+#include "src/__support/FPUtil/float128.h"
 #include "src/math/scalbnf128.h"
 
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
 LIST_SCALBN_TESTS(float128, LIBC_NAMESPACE::scalbnf128)
diff --git a/libc/test/src/math/smoke/ldexpf128_test.cpp b/libc/test/src/math/smoke/ldexpf128_test.cpp
index 7ab34a4ce15de..adfde37c8135c 100644
--- a/libc/test/src/math/smoke/ldexpf128_test.cpp
+++ b/libc/test/src/math/smoke/ldexpf128_test.cpp
@@ -8,6 +8,11 @@
 
 #include "LdExpTest.h"
 
+#include "src/__support/FPUtil/float128.h"
 #include "src/math/ldexpf128.h"
 
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
 LIST_LDEXP_TESTS(float128, LIBC_NAMESPACE::ldexpf128);
diff --git a/libc/test/src/math/smoke/scalblnf128_test.cpp b/libc/test/src/math/smoke/scalblnf128_test.cpp
index 9ee1b3816511e..4b2ce82c35b85 100644
--- a/libc/test/src/math/smoke/scalblnf128_test.cpp
+++ b/libc/test/src/math/smoke/scalblnf128_test.cpp
@@ -8,6 +8,11 @@
 
 #include "ScalbnTest.h"
 
+#include "src/__support/FPUtil/float128.h"
 #include "src/math/scalblnf128.h"
 
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
 LIST_SCALBN_TESTS(float128, long, LIBC_NAMESPACE::scalblnf128)
diff --git a/libc/test/src/math/smoke/scalbnf128_test.cpp b/libc/test/src/math/smoke/scalbnf128_test.cpp
index b42902a76a228..a60b8f1035cfc 100644
--- a/libc/test/src/math/smoke/scalbnf128_test.cpp
+++ b/libc/test/src/math/smoke/scalbnf128_test.cpp
@@ -8,6 +8,11 @@
 
 #include "ScalbnTest.h"
 
+#include "src/__support/FPUtil/float128.h"
 #include "src/math/scalbnf128.h"
 
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
 LIST_SCALBN_TESTS(float128, int, LIBC_NAMESPACE::scalbnf128)
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index 6258f7987497c..a9fc23750cff3 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -8677,11 +8677,9 @@ libc_support_library(
     name = "__support_math_ldexpf128",
     hdrs = ["src/__support/math/ldexpf128.h"],
     deps = [
-        ":__support_common",
+        ":__support_fputil_float128",
         ":__support_fputil_manipulation_functions",
         ":__support_macros_config",
-        ":__support_macros_properties_types",
-        ":llvm_libc_types_float128",
     ],
 )
 



More information about the libc-commits mailing list