[libc-commits] [libc] [libc][math] Qualify setpayload functions to constexpr (PR #195582)
via libc-commits
libc-commits at lists.llvm.org
Sun May 3 21:50:37 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: Kiriti Ponduri (udaykiriti)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/195582.diff
9 Files Affected:
- (modified) libc/src/__support/FPUtil/BasicOperations.h (+1-1)
- (modified) libc/src/__support/math/setpayload.h (+1-1)
- (modified) libc/src/__support/math/setpayloadbf16.h (+1-1)
- (modified) libc/src/__support/math/setpayloadf.h (+1-1)
- (modified) libc/src/__support/math/setpayloadf128.h (+1-1)
- (modified) libc/src/__support/math/setpayloadf16.h (+1-1)
- (modified) libc/src/__support/math/setpayloadl.h (+1-1)
- (modified) libc/test/shared/CMakeLists.txt (+6)
- (modified) libc/test/shared/shared_math_constexpr_test.cpp (+24)
``````````diff
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);
``````````
</details>
https://github.com/llvm/llvm-project/pull/195582
More information about the libc-commits
mailing list