[libc-commits] [libc] [llvm] [libc] Make totalorder functions use the emulated float128 type (PR #221085)
Muhammad Haris Awan via libc-commits
libc-commits at lists.llvm.org
Fri Sep 4 08:16:15 PDT 2026
https://github.com/harisawan-bit updated https://github.com/llvm/llvm-project/pull/221085
>From 81f17bb01edc2d074bcbe86f4de983f8f7095b91 Mon Sep 17 00:00:00 2001
From: Muhammad Haris Awan <an25mbbs026.student at fui.edu.pk>
Date: Fri, 4 Sep 2026 15:16:01 +0000
Subject: [PATCH] [libc] Make totalorder functions use the emulated float128
type
Part of #216576.
Modify `totalorderf128` and `totalordermagf128` to work with emulated
Float128 by removing native float128 guards, updating the implementation
headers, generic wrappers, CMake dependencies, Bazel overlays, and
smoke/shared tests.
---
libc/config/gpu/amdgpu/entrypoints.txt | 2 ++
libc/config/gpu/nvptx/entrypoints.txt | 2 ++
libc/config/linux/arm/entrypoints.txt | 2 ++
libc/shared/math/totalorderf128.h | 6 ------
libc/shared/math/totalordermagf128.h | 6 ------
libc/src/__support/math/CMakeLists.txt | 4 ++--
libc/src/__support/math/totalorderf128.h | 12 +++++-------
libc/src/__support/math/totalordermagf128.h | 13 +++++--------
libc/src/math/generic/CMakeLists.txt | 2 ++
libc/src/math/generic/totalorderf128.cpp | 9 +++++++++
libc/src/math/generic/totalordermagf128.cpp | 9 +++++++++
libc/src/math/totalorderf128.h | 5 +++++
libc/src/math/totalordermagf128.h | 5 +++++
.../test/shared/shared_math_constexpr_test.cpp | 18 +++++++++---------
libc/test/shared/shared_math_test.cpp | 16 ++++++++--------
libc/test/src/math/smoke/CMakeLists.txt | 4 ++++
.../src/math/smoke/totalorderf128_test.cpp | 5 +++++
.../src/math/smoke/totalordermagf128_test.cpp | 5 +++++
.../llvm-project-overlay/libc/BUILD.bazel | 6 ++++--
19 files changed, 83 insertions(+), 48 deletions(-)
diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt
index 5c5e5891da822..182adb81a7a6c 100644
--- a/libc/config/gpu/amdgpu/entrypoints.txt
+++ b/libc/config/gpu/amdgpu/entrypoints.txt
@@ -548,9 +548,11 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.math.tgammaf
libc.src.math.totalorder
libc.src.math.totalorderf
+ libc.src.math.totalorderf128
libc.src.math.totalorderl
libc.src.math.totalordermag
libc.src.math.totalordermagf
+ libc.src.math.totalordermagf128
libc.src.math.totalordermagl
libc.src.math.trunc
libc.src.math.truncf
diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt
index afae725484a89..76c98deb60e14 100644
--- a/libc/config/gpu/nvptx/entrypoints.txt
+++ b/libc/config/gpu/nvptx/entrypoints.txt
@@ -545,9 +545,11 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.math.tgammaf
libc.src.math.totalorder
libc.src.math.totalorderf
+ libc.src.math.totalorderf128
libc.src.math.totalorderl
libc.src.math.totalordermag
libc.src.math.totalordermagf
+ libc.src.math.totalordermagf128
libc.src.math.totalordermagl
libc.src.math.trunc
libc.src.math.truncf
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index 7d2daae7a89c7..5d39bcee99783 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -593,9 +593,11 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.math.tanpif
libc.src.math.totalorder
libc.src.math.totalorderf
+ libc.src.math.totalorderf128
libc.src.math.totalorderl
libc.src.math.totalordermag
libc.src.math.totalordermagf
+ libc.src.math.totalordermagf128
libc.src.math.totalordermagl
libc.src.math.trunc
libc.src.math.truncf
diff --git a/libc/shared/math/totalorderf128.h b/libc/shared/math/totalorderf128.h
index 8427aa0df9889..6325c93a7216b 100644
--- a/libc/shared/math/totalorderf128.h
+++ b/libc/shared/math/totalorderf128.h
@@ -9,10 +9,6 @@
#ifndef LLVM_LIBC_SHARED_MATH_TOTALORDERF128_H
#define LLVM_LIBC_SHARED_MATH_TOTALORDERF128_H
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#include "shared/libc_common.h"
#include "src/__support/math/totalorderf128.h"
@@ -24,6 +20,4 @@ using math::totalorderf128;
} // namespace shared
} // namespace LIBC_NAMESPACE_DECL
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#endif // LLVM_LIBC_SHARED_MATH_TOTALORDERF128_H
diff --git a/libc/shared/math/totalordermagf128.h b/libc/shared/math/totalordermagf128.h
index 663a3c4dc9fb2..235d060111223 100644
--- a/libc/shared/math/totalordermagf128.h
+++ b/libc/shared/math/totalordermagf128.h
@@ -9,10 +9,6 @@
#ifndef LLVM_LIBC_SHARED_MATH_TOTALORDERMAGF128_H
#define LLVM_LIBC_SHARED_MATH_TOTALORDERMAGF128_H
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#include "shared/libc_common.h"
#include "src/__support/math/totalordermagf128.h"
@@ -24,6 +20,4 @@ using math::totalordermagf128;
} // namespace shared
} // namespace LIBC_NAMESPACE_DECL
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#endif // LLVM_LIBC_SHARED_MATH_TOTALORDERMAGF128_H
diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt
index cf9bc11fce824..2ba4e34b43efd 100644
--- a/libc/src/__support/math/CMakeLists.txt
+++ b/libc/src/__support/math/CMakeLists.txt
@@ -5639,8 +5639,8 @@ add_header_library(
HDRS
totalorderf128.h
DEPENDS
- libc.include.llvm-libc-types.float128
libc.src.__support.FPUtil.basic_operations
+ libc.src.__support.FPUtil.float128
libc.src.__support.macros.config
)
@@ -5696,8 +5696,8 @@ add_header_library(
HDRS
totalordermagf128.h
DEPENDS
- libc.include.llvm-libc-types.float128
libc.src.__support.FPUtil.basic_operations
+ libc.src.__support.FPUtil.float128
libc.src.__support.macros.config
)
diff --git a/libc/src/__support/math/totalorderf128.h b/libc/src/__support/math/totalorderf128.h
index 3af00e711fab9..3efd9049aa199 100644
--- a/libc/src/__support/math/totalorderf128.h
+++ b/libc/src/__support/math/totalorderf128.h
@@ -9,23 +9,21 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_TOTALORDERF128_H
#define LLVM_LIBC_SRC___SUPPORT_MATH_TOTALORDERF128_H
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#include "src/__support/FPUtil/BasicOperations.h"
+#include "src/__support/FPUtil/float128.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE constexpr int totalorderf128(const float128 *x, const float128 *y) {
+using LIBC_NAMESPACE::fputil::Float128;
+
+LIBC_INLINE constexpr int totalorderf128(const Float128 *x,
+ const Float128 *y) {
return static_cast<int>(fputil::totalorder(*x, *y));
}
} // namespace math
} // namespace LIBC_NAMESPACE_DECL
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#endif // LLVM_LIBC_SRC___SUPPORT_MATH_TOTALORDERF128_H
diff --git a/libc/src/__support/math/totalordermagf128.h b/libc/src/__support/math/totalordermagf128.h
index ea79011f8b047..42b5b46f00a0e 100644
--- a/libc/src/__support/math/totalordermagf128.h
+++ b/libc/src/__support/math/totalordermagf128.h
@@ -9,24 +9,21 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_TOTALORDERMAGF128_H
#define LLVM_LIBC_SRC___SUPPORT_MATH_TOTALORDERMAGF128_H
-#include "include/llvm-libc-types/float128.h"
-
-#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#include "src/__support/FPUtil/BasicOperations.h"
+#include "src/__support/FPUtil/float128.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE constexpr int totalordermagf128(const float128 *x,
- const float128 *y) {
+using LIBC_NAMESPACE::fputil::Float128;
+
+LIBC_INLINE constexpr int totalordermagf128(const Float128 *x,
+ const Float128 *y) {
return static_cast<int>(fputil::totalordermag(*x, *y));
}
} // namespace math
} // namespace LIBC_NAMESPACE_DECL
-#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
-
#endif // LLVM_LIBC_SRC___SUPPORT_MATH_TOTALORDERMAGF128_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 28b8e954530dd..d58f4282e6b23 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -4289,6 +4289,7 @@ add_entrypoint_object(
HDRS
../totalorderf128.h
DEPENDS
+ libc.src.__support.CPP.bit
libc.src.__support.math.totalorderf128
)
@@ -4349,6 +4350,7 @@ add_entrypoint_object(
HDRS
../totalordermagf128.h
DEPENDS
+ libc.src.__support.CPP.bit
libc.src.__support.math.totalordermagf128
)
diff --git a/libc/src/math/generic/totalorderf128.cpp b/libc/src/math/generic/totalorderf128.cpp
index ca521291e4924..fa03fd07872fa 100644
--- a/libc/src/math/generic/totalorderf128.cpp
+++ b/libc/src/math/generic/totalorderf128.cpp
@@ -7,13 +7,22 @@
//===----------------------------------------------------------------------===//
#include "src/math/totalorderf128.h"
+#include "src/__support/CPP/bit.h"
#include "src/__support/math/totalorderf128.h"
namespace LIBC_NAMESPACE_DECL {
+using LIBC_NAMESPACE::fputil::Float128;
+
LLVM_LIBC_FUNCTION(int, totalorderf128,
(const float128 *x, const float128 *y)) {
+#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
+ Float128 x_f128 = cpp::bit_cast<Float128>(*x);
+ Float128 y_f128 = cpp::bit_cast<Float128>(*y);
+ return math::totalorderf128(&x_f128, &y_f128);
+#else
return math::totalorderf128(x, y);
+#endif
}
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/generic/totalordermagf128.cpp b/libc/src/math/generic/totalordermagf128.cpp
index dfb6c794b0f1d..a1f53fce15354 100644
--- a/libc/src/math/generic/totalordermagf128.cpp
+++ b/libc/src/math/generic/totalordermagf128.cpp
@@ -7,13 +7,22 @@
//===----------------------------------------------------------------------===//
#include "src/math/totalordermagf128.h"
+#include "src/__support/CPP/bit.h"
#include "src/__support/math/totalordermagf128.h"
namespace LIBC_NAMESPACE_DECL {
+using LIBC_NAMESPACE::fputil::Float128;
+
LLVM_LIBC_FUNCTION(int, totalordermagf128,
(const float128 *x, const float128 *y)) {
+#ifdef LIBC_TYPES_HAS_NATIVE_FLOAT128
+ Float128 x_f128 = cpp::bit_cast<Float128>(*x);
+ Float128 y_f128 = cpp::bit_cast<Float128>(*y);
+ return math::totalordermagf128(&x_f128, &y_f128);
+#else
return math::totalordermagf128(x, y);
+#endif
}
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/totalorderf128.h b/libc/src/math/totalorderf128.h
index 958714849da67..c075f5899afa5 100644
--- a/libc/src/math/totalorderf128.h
+++ b/libc/src/math/totalorderf128.h
@@ -9,11 +9,16 @@
#ifndef LLVM_LIBC_SRC_MATH_TOTALORDERF128_H
#define LLVM_LIBC_SRC_MATH_TOTALORDERF128_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
+
int totalorderf128(const float128 *x, const float128 *y);
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/totalordermagf128.h b/libc/src/math/totalordermagf128.h
index 389d0596b9d4b..07b615ef38951 100644
--- a/libc/src/math/totalordermagf128.h
+++ b/libc/src/math/totalordermagf128.h
@@ -9,11 +9,16 @@
#ifndef LLVM_LIBC_SRC_MATH_TOTALORDERMAGF128_H
#define LLVM_LIBC_SRC_MATH_TOTALORDERMAGF128_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
+
int totalordermagf128(const float128 *x, const float128 *y);
} // 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 862c056411f5c..37018b633b7b9 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -386,6 +386,15 @@ static_assert(Float128(0.0) ==
Float128(0.0)));
static_assert(Float128(1.0) ==
LIBC_NAMESPACE::shared::fabsf128(Float128(-1.0)));
+constexpr Float128 TOTALORDERF128_X = Float128(0.0);
+constexpr Float128 TOTALORDERF128_Y = Float128(0.0);
+static_assert(1 == LIBC_NAMESPACE::shared::totalorderf128(&TOTALORDERF128_X,
+ &TOTALORDERF128_Y));
+constexpr Float128 TOTALORDERMAGF128_X = Float128(0.0);
+constexpr Float128 TOTALORDERMAGF128_Y = Float128(0.0);
+static_assert(1 ==
+ LIBC_NAMESPACE::shared::totalordermagf128(&TOTALORDERMAGF128_X,
+ &TOTALORDERMAGF128_Y));
static_assert(Float128(1.0) ==
LIBC_NAMESPACE::shared::fdimf128(Float128(1.0), Float128(0.0)));
static_assert(Float128(0.0) ==
@@ -469,15 +478,6 @@ static_assert(float128(0.0) ==
LIBC_NAMESPACE::shared::ufromfpf128(float128(0.0), 0, 32));
static_assert(float128(0.0) ==
LIBC_NAMESPACE::shared::ufromfpxf128(float128(0.0), 0, 32));
-constexpr float128 TOTALORDERF128_X = float128(0.0);
-constexpr float128 TOTALORDERF128_Y = float128(0.0);
-static_assert(1 == LIBC_NAMESPACE::shared::totalorderf128(&TOTALORDERF128_X,
- &TOTALORDERF128_Y));
-constexpr float128 TOTALORDERMAGF128_X = float128(0.0);
-constexpr float128 TOTALORDERMAGF128_Y = float128(0.0);
-static_assert(1 ==
- LIBC_NAMESPACE::shared::totalordermagf128(&TOTALORDERMAGF128_X,
- &TOTALORDERMAGF128_Y));
static_assert(0 ==
LIBC_NAMESPACE::shared::fmodf128(float128(4.0), float128(2.0)));
static_assert(float128(0.0) == [] {
diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp
index 7b785331f36c6..b5a432ddaf1d0 100644
--- a/libc/test/shared/shared_math_test.cpp
+++ b/libc/test/shared/shared_math_test.cpp
@@ -587,6 +587,14 @@ TEST(LlvmLibcSharedMathTest, AllEmuFloat128) {
EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::copysignf128(
Float128(0.0), Float128(0.0)));
EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::fabsf128(Float128(0.0)));
+ Float128 totalorderf128_x = Float128(0.0);
+ Float128 totalorderf128_y = Float128(0.0);
+ EXPECT_EQ(1, LIBC_NAMESPACE::shared::totalorderf128(&totalorderf128_x,
+ &totalorderf128_y));
+ Float128 totalordermagf128_x = Float128(0.0);
+ Float128 totalordermagf128_y = Float128(0.0);
+ EXPECT_EQ(1, LIBC_NAMESPACE::shared::totalordermagf128(&totalordermagf128_x,
+ &totalordermagf128_y));
EXPECT_FP_EQ(Float128(0.0),
LIBC_NAMESPACE::shared::fdimf128(Float128(0.0), Float128(0.0)));
EXPECT_FP_EQ(Float128(0.0), LIBC_NAMESPACE::shared::floorf128(Float128(0.0)));
@@ -726,14 +734,6 @@ TEST(LlvmLibcSharedMathTest, AllFloat128) {
LIBC_NAMESPACE::shared::ufromfpf128(float128(0.0), 0, 32));
EXPECT_FP_EQ(float128(0.0),
LIBC_NAMESPACE::shared::ufromfpxf128(float128(0.0), 0, 32));
- float128 totalorderf128_x = float128(0.0);
- float128 totalorderf128_y = float128(0.0);
- EXPECT_EQ(1, LIBC_NAMESPACE::shared::totalorderf128(&totalorderf128_x,
- &totalorderf128_y));
- float128 totalordermagf128_x = float128(0.0);
- float128 totalordermagf128_y = float128(0.0);
- EXPECT_EQ(1, LIBC_NAMESPACE::shared::totalordermagf128(&totalordermagf128_x,
- &totalordermagf128_y));
LIBC_NAMESPACE::shared::fmodf128(float128(1.0), float128(1.0));
float128 modff128_iptr = float128(0.0);
EXPECT_FP_EQ(float128(0.0),
diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt
index a61b854a85fb2..3d2771b1337db 100644
--- a/libc/test/src/math/smoke/CMakeLists.txt
+++ b/libc/test/src/math/smoke/CMakeLists.txt
@@ -5426,6 +5426,8 @@ add_fp_unittest(
TotalOrderTest.h
DEPENDS
libc.src.math.totalorderf128
+ libc.src.__support.FPUtil.float128
+ libc.src.__support.FPUtil.fp_bits
)
add_fp_unittest(
@@ -5499,6 +5501,8 @@ add_fp_unittest(
TotalOrderMagTest.h
DEPENDS
libc.src.math.totalordermagf128
+ libc.src.__support.FPUtil.float128
+ libc.src.__support.FPUtil.fp_bits
)
add_fp_unittest(
diff --git a/libc/test/src/math/smoke/totalorderf128_test.cpp b/libc/test/src/math/smoke/totalorderf128_test.cpp
index 6f7fd6a94fcf9..616ded618e8b8 100644
--- a/libc/test/src/math/smoke/totalorderf128_test.cpp
+++ b/libc/test/src/math/smoke/totalorderf128_test.cpp
@@ -8,6 +8,11 @@
#include "TotalOrderTest.h"
+#include "src/__support/FPUtil/float128.h"
#include "src/math/totalorderf128.h"
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
LIST_TOTALORDER_TESTS(float128, LIBC_NAMESPACE::totalorderf128)
diff --git a/libc/test/src/math/smoke/totalordermagf128_test.cpp b/libc/test/src/math/smoke/totalordermagf128_test.cpp
index 6cbe24ff8778f..c6ceb072a36fc 100644
--- a/libc/test/src/math/smoke/totalordermagf128_test.cpp
+++ b/libc/test/src/math/smoke/totalordermagf128_test.cpp
@@ -8,6 +8,11 @@
#include "TotalOrderMagTest.h"
+#include "src/__support/FPUtil/float128.h"
#include "src/math/totalordermagf128.h"
+#ifndef LIBC_TYPES_HAS_NATIVE_FLOAT128
+using float128 = LIBC_NAMESPACE::fputil::Float128;
+#endif // LIBC_TYPES_HAS_NATIVE_FLOAT128
+
LIST_TOTALORDERMAG_TESTS(float128, LIBC_NAMESPACE::totalordermagf128)
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index fc1164d88d111..47acc9fcd68fb 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -10043,8 +10043,8 @@ libc_support_library(
hdrs = ["src/__support/math/totalorderf128.h"],
deps = [
":__support_fputil_basic_operations",
+ ":__support_fputil_float128",
":__support_macros_config",
- ":llvm_libc_types_float128",
],
)
@@ -10100,8 +10100,8 @@ libc_support_library(
hdrs = ["src/__support/math/totalordermagf128.h"],
deps = [
":__support_fputil_basic_operations",
+ ":__support_fputil_float128",
":__support_macros_config",
- ":llvm_libc_types_float128",
],
)
@@ -13836,6 +13836,7 @@ libc_math_function(
libc_math_function(
name = "totalorderf128",
additional_deps = [
+ ":__support_cpp_bit",
":__support_math_totalorderf128",
],
)
@@ -13878,6 +13879,7 @@ libc_math_function(
libc_math_function(
name = "totalordermagf128",
additional_deps = [
+ ":__support_cpp_bit",
":__support_math_totalordermagf128",
],
)
More information about the libc-commits
mailing list