[libc-commits] [libc] [libc][math] Qualify setpayload functions to constexpr (PR #195582)
Kiriti Ponduri via libc-commits
libc-commits at lists.llvm.org
Sun May 3 21:50:54 PDT 2026
https://github.com/udaykiriti updated https://github.com/llvm/llvm-project/pull/195582
>From 28e60b9c1ff5bc80f12770ea1adf6a3ca18f6e09 Mon Sep 17 00:00:00 2001
From: udaykiriti <udaykiriti624 at gmail.com>
Date: Mon, 4 May 2026 10:16:22 +0530
Subject: [PATCH 1/2] [libc][math] Qualify setpayload functions to constexpr
Signed-off-by: udaykiriti <udaykiriti624 at gmail.com>
---
libc/src/__support/FPUtil/BasicOperations.h | 2 +-
libc/src/__support/math/setpayload.h | 2 +-
libc/src/__support/math/setpayloadbf16.h | 2 +-
libc/src/__support/math/setpayloadf.h | 2 +-
libc/src/__support/math/setpayloadf128.h | 2 +-
libc/src/__support/math/setpayloadf16.h | 2 +-
libc/src/__support/math/setpayloadl.h | 2 +-
libc/test/shared/CMakeLists.txt | 6 +++++
.../shared/shared_math_constexpr_test.cpp | 24 +++++++++++++++++++
9 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/libc/src/__support/FPUtil/BasicOperations.h b/libc/src/__support/FPUtil/BasicOperations.h
index e6f5f29e73726..54295fdb3e52f 100644
--- a/libc/src/__support/FPUtil/BasicOperations.h
+++ b/libc/src/__support/FPUtil/BasicOperations.h
@@ -386,7 +386,7 @@ getpayload(T x) {
}
template <bool IsSignaling, typename T>
-LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, bool>
+LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<T>, bool>
setpayload(T &res, T pl) {
using FPBits = FPBits<T>;
FPBits pl_bits(pl);
diff --git a/libc/src/__support/math/setpayload.h b/libc/src/__support/math/setpayload.h
index f9fa79ce76e1d..d0226107a3447 100644
--- a/libc/src/__support/math/setpayload.h
+++ b/libc/src/__support/math/setpayload.h
@@ -16,7 +16,7 @@ namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE int setpayload(double *res, double pl) {
+LIBC_INLINE constexpr int setpayload(double *res, double pl) {
return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
}
diff --git a/libc/src/__support/math/setpayloadbf16.h b/libc/src/__support/math/setpayloadbf16.h
index 31e02eb4f7ccb..5dcea9894f1e6 100644
--- a/libc/src/__support/math/setpayloadbf16.h
+++ b/libc/src/__support/math/setpayloadbf16.h
@@ -17,7 +17,7 @@ namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE int setpayloadbf16(bfloat16 *res, bfloat16 pl) {
+LIBC_INLINE constexpr int setpayloadbf16(bfloat16 *res, bfloat16 pl) {
return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
}
diff --git a/libc/src/__support/math/setpayloadf.h b/libc/src/__support/math/setpayloadf.h
index 2431f253956a1..1a90207299d3a 100644
--- a/libc/src/__support/math/setpayloadf.h
+++ b/libc/src/__support/math/setpayloadf.h
@@ -16,7 +16,7 @@ namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE int setpayloadf(float *res, float pl) {
+LIBC_INLINE constexpr int setpayloadf(float *res, float pl) {
return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
}
diff --git a/libc/src/__support/math/setpayloadf128.h b/libc/src/__support/math/setpayloadf128.h
index cf301e92c69b3..bacd17af658e0 100644
--- a/libc/src/__support/math/setpayloadf128.h
+++ b/libc/src/__support/math/setpayloadf128.h
@@ -20,7 +20,7 @@ namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE int setpayloadf128(float128 *res, float128 pl) {
+LIBC_INLINE constexpr int setpayloadf128(float128 *res, float128 pl) {
return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
}
diff --git a/libc/src/__support/math/setpayloadf16.h b/libc/src/__support/math/setpayloadf16.h
index 4a417f0c525eb..3595f44b83b0a 100644
--- a/libc/src/__support/math/setpayloadf16.h
+++ b/libc/src/__support/math/setpayloadf16.h
@@ -20,7 +20,7 @@ namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE int setpayloadf16(float16 *res, float16 pl) {
+LIBC_INLINE constexpr int setpayloadf16(float16 *res, float16 pl) {
return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
}
diff --git a/libc/src/__support/math/setpayloadl.h b/libc/src/__support/math/setpayloadl.h
index d5ed051766827..8cc754b044168 100644
--- a/libc/src/__support/math/setpayloadl.h
+++ b/libc/src/__support/math/setpayloadl.h
@@ -16,7 +16,7 @@ namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE int setpayloadl(long double *res, long double pl) {
+LIBC_INLINE constexpr int setpayloadl(long double *res, long double pl) {
return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
}
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index f632843d31284..16235bd4bf1e5 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -678,6 +678,12 @@ add_fp_unittest(
libc.src.__support.math.scalbnf128
libc.src.__support.math.scalbnf16
libc.src.__support.math.scalbnl
+ libc.src.__support.math.setpayload
+ libc.src.__support.math.setpayloadbf16
+ libc.src.__support.math.setpayloadf
+ libc.src.__support.math.setpayloadf128
+ libc.src.__support.math.setpayloadf16
+ libc.src.__support.math.setpayloadl
libc.src.__support.math.sqrtl
libc.src.__support.math.ufromfp
libc.src.__support.math.ufromfpbf16
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index 964c1f9e97f3a..2185540173bd2 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -62,6 +62,10 @@ static_assert(0.0 == [] {
static_assert(0.0 == LIBC_NAMESPACE::shared::ldexp(0.0, 0.0));
static_assert(0.0 == LIBC_NAMESPACE::shared::scalbln(0.0, 0.0));
static_assert(0.0 == LIBC_NAMESPACE::shared::scalbn(0.0, 0.0));
+static_assert(0 == [] {
+ double res = 0.0;
+ return LIBC_NAMESPACE::shared::setpayload(&res, 0.0);
+}());
static_assert(0.0 == [] {
int exp{};
return LIBC_NAMESPACE::shared::frexp(0.0, &exp);
@@ -122,6 +126,10 @@ static_assert(0.0f == [] {
}());
static_assert(0.0f == LIBC_NAMESPACE::shared::scalblnf(0.0f, 0.0));
static_assert(0.0f == LIBC_NAMESPACE::shared::scalbnf(0.0f, 0.0));
+static_assert(0 == [] {
+ float res = 0.0f;
+ return LIBC_NAMESPACE::shared::setpayloadf(&res, 0.0f);
+}());
static_assert(0.0f == LIBC_NAMESPACE::shared::fmul(0.0, 0.0));
static_assert(0.0f == LIBC_NAMESPACE::shared::fsub(0.0, 0.0));
static_assert(0LL == LIBC_NAMESPACE::shared::llrintf(0.0f));
@@ -200,6 +208,10 @@ static_assert(0.0f16 == [] {
}());
static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalblnf16(0.0f16, 0.0));
static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalbnf16(0.0f16, 0.0));
+static_assert(0 == [] {
+ float16 res = 0.0f16;
+ return LIBC_NAMESPACE::shared::setpayloadf16(&res, 0.0f16);
+}());
static_assert(0LL == LIBC_NAMESPACE::shared::llrintf16(0.0));
static_assert(0LL == LIBC_NAMESPACE::shared::llroundf16(0.0f16));
static_assert(0L == LIBC_NAMESPACE::shared::lrintf16(0.0f16));
@@ -267,6 +279,10 @@ static_assert(0.0L == [] {
static_assert(0.0L == LIBC_NAMESPACE::shared::ldexpl(0.0L, 0.0));
static_assert(0.0L == LIBC_NAMESPACE::shared::scalblnl(0.0L, 0.0));
static_assert(0.0L == LIBC_NAMESPACE::shared::scalbnl(0.0L, 0.0));
+static_assert(0 == [] {
+ long double res = 0.0L;
+ return LIBC_NAMESPACE::shared::setpayloadl(&res, 0.0L);
+}());
static_assert(0.0f == LIBC_NAMESPACE::shared::fmull(0.0L, 0.0L));
static_assert(0.0f == LIBC_NAMESPACE::shared::fsubl(0.0L, 0.0L));
static_assert(0.0L == [] {
@@ -375,6 +391,10 @@ 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 res = float128(0.0);
+ return LIBC_NAMESPACE::shared::setpayloadf128(&res, float128(0.0));
+}());
static_assert(0.0f ==
LIBC_NAMESPACE::shared::fmulf128(float128(0.0), float128(0.0)));
static_assert(0.0f ==
@@ -480,6 +500,10 @@ static_assert(bfloat16(0.0) ==
LIBC_NAMESPACE::shared::scalblnbf16(bfloat16(0.0), 0.0));
static_assert(bfloat16(0.0) ==
LIBC_NAMESPACE::shared::scalbnbf16(bfloat16(0.0), 0.0));
+static_assert(0 == [] {
+ bfloat16 res = bfloat16(0.0);
+ return LIBC_NAMESPACE::shared::setpayloadbf16(&res, bfloat16(0.0));
+}());
static_assert(bfloat16(0.0) == [] {
int exp{};
return LIBC_NAMESPACE::shared::frexpbf16(bfloat16(0.0), &exp);
>From 1c8a5d9b5fd07c83503b258e911f2324be8f55ef Mon Sep 17 00:00:00 2001
From: udaykiriti <udaykiriti624 at gmail.com>
Date: Mon, 4 May 2026 10:20:17 +0530
Subject: [PATCH 2/2] forgot to change[-_-]:
Signed-off-by: udaykiriti <udaykiriti624 at gmail.com>
---
.../shared/shared_math_constexpr_test.cpp | 24 +++++++++----------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index 2185540173bd2..1a4c8186d3321 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -63,8 +63,8 @@ static_assert(0.0 == LIBC_NAMESPACE::shared::ldexp(0.0, 0.0));
static_assert(0.0 == LIBC_NAMESPACE::shared::scalbln(0.0, 0.0));
static_assert(0.0 == LIBC_NAMESPACE::shared::scalbn(0.0, 0.0));
static_assert(0 == [] {
- double res = 0.0;
- return LIBC_NAMESPACE::shared::setpayload(&res, 0.0);
+ double setpayload_x = 0.0;
+ return LIBC_NAMESPACE::shared::setpayload(&setpayload_x, 0.0);
}());
static_assert(0.0 == [] {
int exp{};
@@ -127,8 +127,8 @@ static_assert(0.0f == [] {
static_assert(0.0f == LIBC_NAMESPACE::shared::scalblnf(0.0f, 0.0));
static_assert(0.0f == LIBC_NAMESPACE::shared::scalbnf(0.0f, 0.0));
static_assert(0 == [] {
- float res = 0.0f;
- return LIBC_NAMESPACE::shared::setpayloadf(&res, 0.0f);
+ float setpayload_x = 0.0f;
+ return LIBC_NAMESPACE::shared::setpayloadf(&setpayload_x, 0.0f);
}());
static_assert(0.0f == LIBC_NAMESPACE::shared::fmul(0.0, 0.0));
static_assert(0.0f == LIBC_NAMESPACE::shared::fsub(0.0, 0.0));
@@ -209,8 +209,8 @@ static_assert(0.0f16 == [] {
static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalblnf16(0.0f16, 0.0));
static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalbnf16(0.0f16, 0.0));
static_assert(0 == [] {
- float16 res = 0.0f16;
- return LIBC_NAMESPACE::shared::setpayloadf16(&res, 0.0f16);
+ float16 setpayload_x = 0.0f16;
+ return LIBC_NAMESPACE::shared::setpayloadf16(&setpayload_x, 0.0f16);
}());
static_assert(0LL == LIBC_NAMESPACE::shared::llrintf16(0.0));
static_assert(0LL == LIBC_NAMESPACE::shared::llroundf16(0.0f16));
@@ -280,8 +280,8 @@ static_assert(0.0L == LIBC_NAMESPACE::shared::ldexpl(0.0L, 0.0));
static_assert(0.0L == LIBC_NAMESPACE::shared::scalblnl(0.0L, 0.0));
static_assert(0.0L == LIBC_NAMESPACE::shared::scalbnl(0.0L, 0.0));
static_assert(0 == [] {
- long double res = 0.0L;
- return LIBC_NAMESPACE::shared::setpayloadl(&res, 0.0L);
+ long double setpayload_x = 0.0L;
+ return LIBC_NAMESPACE::shared::setpayloadl(&setpayload_x, 0.0L);
}());
static_assert(0.0f == LIBC_NAMESPACE::shared::fmull(0.0L, 0.0L));
static_assert(0.0f == LIBC_NAMESPACE::shared::fsubl(0.0L, 0.0L));
@@ -392,8 +392,8 @@ static_assert(float128(0.0) ==
static_assert(float128(0.0) ==
LIBC_NAMESPACE::shared::scalbnf128(float128(0.0), 0.0));
static_assert(0 == [] {
- float128 res = float128(0.0);
- return LIBC_NAMESPACE::shared::setpayloadf128(&res, float128(0.0));
+ float128 setpayload_x = float128(0.0);
+ return LIBC_NAMESPACE::shared::setpayloadf128(&setpayload_x, float128(0.0));
}());
static_assert(0.0f ==
LIBC_NAMESPACE::shared::fmulf128(float128(0.0), float128(0.0)));
@@ -501,8 +501,8 @@ static_assert(bfloat16(0.0) ==
static_assert(bfloat16(0.0) ==
LIBC_NAMESPACE::shared::scalbnbf16(bfloat16(0.0), 0.0));
static_assert(0 == [] {
- bfloat16 res = bfloat16(0.0);
- return LIBC_NAMESPACE::shared::setpayloadbf16(&res, bfloat16(0.0));
+ bfloat16 setpayload_x = bfloat16(0.0);
+ return LIBC_NAMESPACE::shared::setpayloadbf16(&setpayload_x, bfloat16(0.0));
}());
static_assert(bfloat16(0.0) == [] {
int exp{};
More information about the libc-commits
mailing list