https://github.com/krishna2803 created https://github.com/llvm/llvm-project/pull/153994
This PR adds the following basic math functions for BFloat16 type along with the tests: - getpayloadbf16 - setpayloadbf16 - setpayloadsigbf16 >From 6f8d84d83beff959e838c70057f2e4bb29f0bc4c Mon Sep 17 00:00:00 2001 From: Krishna Pandey <kpandey81...@gmail.com> Date: Sun, 17 Aug 2025 08:09:15 +0530 Subject: [PATCH 1/5] feat: implement {get,set}payloadbf16 and setpayloadsigbf16 math functions Signed-off-by: Krishna Pandey <kpandey81...@gmail.com> --- libc/src/math/CMakeLists.txt | 3 ++ libc/src/math/generic/CMakeLists.txt | 42 +++++++++++++++++++++ libc/src/math/generic/getpayloadbf16.cpp | 21 +++++++++++ libc/src/math/generic/setpayloadbf16.cpp | 21 +++++++++++ libc/src/math/generic/setpayloadsigbf16.cpp | 21 +++++++++++ libc/src/math/getpayloadbf16.h | 21 +++++++++++ libc/src/math/setpayloadbf16.h | 21 +++++++++++ libc/src/math/setpayloadsigbf16.h | 21 +++++++++++ 8 files changed, 171 insertions(+) create mode 100644 libc/src/math/generic/getpayloadbf16.cpp create mode 100644 libc/src/math/generic/setpayloadbf16.cpp create mode 100644 libc/src/math/generic/setpayloadsigbf16.cpp create mode 100644 libc/src/math/getpayloadbf16.h create mode 100644 libc/src/math/setpayloadbf16.h create mode 100644 libc/src/math/setpayloadsigbf16.h diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 3843247c4fa5b..023829b21996f 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -330,6 +330,7 @@ add_math_entrypoint_object(getpayloadf) add_math_entrypoint_object(getpayloadl) add_math_entrypoint_object(getpayloadf16) add_math_entrypoint_object(getpayloadf128) +add_math_entrypoint_object(getpayloadbf16) add_math_entrypoint_object(hypot) add_math_entrypoint_object(hypotf) @@ -507,12 +508,14 @@ add_math_entrypoint_object(setpayloadf) add_math_entrypoint_object(setpayloadl) add_math_entrypoint_object(setpayloadf16) add_math_entrypoint_object(setpayloadf128) +add_math_entrypoint_object(setpayloadbf16) add_math_entrypoint_object(setpayloadsig) add_math_entrypoint_object(setpayloadsigf) add_math_entrypoint_object(setpayloadsigl) add_math_entrypoint_object(setpayloadsigf16) add_math_entrypoint_object(setpayloadsigf128) +add_math_entrypoint_object(setpayloadsigbf16) add_math_entrypoint_object(sincos) add_math_entrypoint_object(sincosf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 822da74d7597e..38ba34ae521ea 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -4609,6 +4609,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + getpayloadbf16 + SRCS + getpayloadbf16.cpp + HDRS + ../getpayloadbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( setpayload SRCS @@ -4661,6 +4675,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + setpayloadbf16 + SRCS + setpayloadbf16.cpp + HDRS + ../setpayloadbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( setpayloadsig SRCS @@ -4713,6 +4741,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + setpayloadsigbf16 + SRCS + setpayloadsigbf16.cpp + HDRS + ../setpayloadsigbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( f16add SRCS diff --git a/libc/src/math/generic/getpayloadbf16.cpp b/libc/src/math/generic/getpayloadbf16.cpp new file mode 100644 index 0000000000000..544ed0a2f5c9d --- /dev/null +++ b/libc/src/math/generic/getpayloadbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of getpayloadbf16 function -------------------------===// +// +// 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 "src/math/getpayloadbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(bfloat16, getpayloadbf16, (const bfloat16 *x)) { + return fputil::getpayload(*x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/setpayloadbf16.cpp b/libc/src/math/generic/setpayloadbf16.cpp new file mode 100644 index 0000000000000..49f9b9cabd6a2 --- /dev/null +++ b/libc/src/math/generic/setpayloadbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of setpayloadbf16 function -------------------------===// +// +// 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 "src/math/setpayloadbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(int, setpayloadbf16, (bfloat16 * res, bfloat16 pl)) { + return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl)); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/setpayloadsigbf16.cpp b/libc/src/math/generic/setpayloadsigbf16.cpp new file mode 100644 index 0000000000000..7a2b7c7dc66dd --- /dev/null +++ b/libc/src/math/generic/setpayloadsigbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of setpayloadsigbf16 function ----------------------===// +// +// 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 "src/math/setpayloadsigbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(int, setpayloadsigbf16, (bfloat16 * res, bfloat16 pl)) { + return static_cast<int>(fputil::setpayload</*IsSignaling=*/true>(*res, pl)); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/getpayloadbf16.h b/libc/src/math/getpayloadbf16.h new file mode 100644 index 0000000000000..e4767f0728139 --- /dev/null +++ b/libc/src/math/getpayloadbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for getpayloadbf16 ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_GETPAYLOADBF16_H +#define LLVM_LIBC_SRC_MATH_GETPAYLOADBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 getpayloadbf16(const bfloat16 *x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_GETPAYLOADBF16_H diff --git a/libc/src/math/setpayloadbf16.h b/libc/src/math/setpayloadbf16.h new file mode 100644 index 0000000000000..e3a60b2f2e021 --- /dev/null +++ b/libc/src/math/setpayloadbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for setpayloadbf16 ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_SETPAYLOADBF16_H +#define LLVM_LIBC_SRC_MATH_SETPAYLOADBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int setpayloadbf16(bfloat16 *res, bfloat16 pl); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_SETPAYLOADBF16_H diff --git a/libc/src/math/setpayloadsigbf16.h b/libc/src/math/setpayloadsigbf16.h new file mode 100644 index 0000000000000..5baba95b45758 --- /dev/null +++ b/libc/src/math/setpayloadsigbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for setpayloadsigbf16 -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_SETPAYLOADSIGBF16_H +#define LLVM_LIBC_SRC_MATH_SETPAYLOADSIGBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int setpayloadsigbf16(bfloat16 *res, bfloat16 pl); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_SETPAYLOADSIGBF16_H >From c8f43800a59a3777c74545484bb337523b9b2a26 Mon Sep 17 00:00:00 2001 From: Krishna Pandey <kpandey81...@gmail.com> Date: Sun, 17 Aug 2025 08:09:51 +0530 Subject: [PATCH 2/5] chore: implement smoke tests for {get,set}payloadbf16 and setpayloadsigbf16 math functions Signed-off-by: Krishna Pandey <kpandey81...@gmail.com> --- libc/test/src/math/smoke/CMakeLists.txt | 38 ++++++++++++ libc/test/src/math/smoke/GetPayloadTest.h | 61 +++++++++++++------ libc/test/src/math/smoke/SetPayloadSigTest.h | 34 ++++++++--- libc/test/src/math/smoke/SetPayloadTest.h | 34 ++++++++--- .../src/math/smoke/getpayloadbf16_test.cpp | 14 +++++ .../src/math/smoke/setpayloadbf16_test.cpp | 14 +++++ .../src/math/smoke/setpayloadsigbf16_test.cpp | 14 +++++ 7 files changed, 174 insertions(+), 35 deletions(-) create mode 100644 libc/test/src/math/smoke/getpayloadbf16_test.cpp create mode 100644 libc/test/src/math/smoke/setpayloadbf16_test.cpp create mode 100644 libc/test/src/math/smoke/setpayloadsigbf16_test.cpp diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 40481a711bade..8c257664dd8d7 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -4853,6 +4853,19 @@ add_fp_unittest( libc.src.math.getpayloadf128 ) +add_fp_unittest( + getpayloadbf16_test + SUITE + libc-math-smoke-tests + SRCS + getpayloadbf16_test.cpp + HDRS + GetPayloadTest.h + DEPENDS + libc.src.math.getpayloadbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( setpayload_test SUITE @@ -4913,6 +4926,19 @@ add_fp_unittest( libc.src.math.setpayloadf128 ) +add_fp_unittest( + setpayloadbf16_test + SUITE + libc-math-smoke-tests + SRCS + setpayloadbf16_test.cpp + HDRS + SetPayloadTest.h + DEPENDS + libc.src.math.setpayloadbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( setpayloadsig_test SUITE @@ -4973,6 +4999,18 @@ add_fp_unittest( libc.src.math.setpayloadsigf128 ) +add_fp_unittest( + setpayloadsigbf16_test + SUITE + libc-math-smoke-tests + SRCS + setpayloadsigbf16_test.cpp + HDRS + SetPayloadTest.h + DEPENDS + libc.src.math.setpayloadsigbf16 + libc.src.__support.FPUtil.bfloat16 +) add_fp_unittest( f16add_test diff --git a/libc/test/src/math/smoke/GetPayloadTest.h b/libc/test/src/math/smoke/GetPayloadTest.h index 1b1bf4f5d56ff..486ea42bf50c1 100644 --- a/libc/test/src/math/smoke/GetPayloadTest.h +++ b/libc/test/src/math/smoke/GetPayloadTest.h @@ -51,23 +51,50 @@ class GetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, sNaN)); EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, neg_sNaN)); - T qnan_42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); - T neg_qnan_42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); - T snan_42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); - T neg_snan_42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, qnan_42)); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_qnan_42)); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, snan_42)); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_snan_42)); - - T qnan_123 = FPBits::quiet_nan(Sign::POS, 0x123).get_val(); - T neg_qnan_123 = FPBits::quiet_nan(Sign::NEG, 0x123).get_val(); - T snan_123 = FPBits::signaling_nan(Sign::POS, 0x123).get_val(); - T neg_snan_123 = FPBits::signaling_nan(Sign::NEG, 0x123).get_val(); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, qnan_123)); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_qnan_123)); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, snan_123)); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_snan_123)); + if constexpr (FPBits::FRACTION_LEN - 1 >= 6) { + // [S] [E..E] [QM..M] -> number of M bits should be at least 6 + // 0x31 = 0b110001 = 6 bits + T qnan_31 = FPBits::quiet_nan(Sign::POS, 0x31).get_val(); + T neg_qnan_31 = FPBits::quiet_nan(Sign::NEG, 0x31).get_val(); + T snan_31 = FPBits::signaling_nan(Sign::POS, 0x31).get_val(); + T neg_snan_31 = FPBits::signaling_nan(Sign::NEG, 0x31).get_val(); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, qnan_31)); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, neg_qnan_31)); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, snan_31)); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, neg_snan_31)); + + // 0x15 = 0b10101 = 5 bits + T qnan_15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); + T neg_qnan_15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); + T snan_15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); + T neg_snan_15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, qnan_15)); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, neg_qnan_15)); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, snan_15)); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, neg_snan_15)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + T qnan_42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); + T neg_qnan_42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); + T snan_42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); + T neg_snan_42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, qnan_42)); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_qnan_42)); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, snan_42)); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_snan_42)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 9) { + T qnan_123 = FPBits::quiet_nan(Sign::POS, 0x123).get_val(); + T neg_qnan_123 = FPBits::quiet_nan(Sign::NEG, 0x123).get_val(); + T snan_123 = FPBits::signaling_nan(Sign::POS, 0x123).get_val(); + T neg_snan_123 = FPBits::signaling_nan(Sign::NEG, 0x123).get_val(); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, qnan_123)); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_qnan_123)); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, snan_123)); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_snan_123)); + } } }; diff --git a/libc/test/src/math/smoke/SetPayloadSigTest.h b/libc/test/src/math/smoke/SetPayloadSigTest.h index f480479618a08..7b26c98b7ee35 100644 --- a/libc/test/src/math/smoke/SetPayloadSigTest.h +++ b/libc/test/src/math/smoke/SetPayloadSigTest.h @@ -54,15 +54,31 @@ class SetPayloadSigTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 1).uintval(), FPBits(res).uintval()); - EXPECT_EQ(0, func(&res, T(0x42.0p+0))); - EXPECT_TRUE(FPBits(res).is_signaling_nan()); - EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x42).uintval(), - FPBits(res).uintval()); - - EXPECT_EQ(0, func(&res, T(0x123.0p+0))); - EXPECT_TRUE(FPBits(res).is_signaling_nan()); - EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x123).uintval(), - FPBits(res).uintval()); + if constexpr (FPBits::FRACTION_LEN - 1 >= 6) { + EXPECT_EQ(0, func(&res, T(0x31.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x31).uintval(), + FPBits(res).uintval()); + + EXPECT_EQ(0, func(&res, T(0x15.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x15).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_EQ(0, func(&res, T(0x42.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x42).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 9) { + EXPECT_EQ(0, func(&res, T(0x123.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x123).uintval(), + FPBits(res).uintval()); + } FPBits nan_payload_bits = FPBits::one(); nan_payload_bits.set_biased_exponent(FPBits::FRACTION_LEN - 2 + diff --git a/libc/test/src/math/smoke/SetPayloadTest.h b/libc/test/src/math/smoke/SetPayloadTest.h index 9ede5678fef1b..6aff47ab60a99 100644 --- a/libc/test/src/math/smoke/SetPayloadTest.h +++ b/libc/test/src/math/smoke/SetPayloadTest.h @@ -54,15 +54,31 @@ class SetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_TRUE(FPBits(res).is_quiet_nan()); EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 1).uintval(), FPBits(res).uintval()); - EXPECT_EQ(0, func(&res, T(0x42.0p+0))); - EXPECT_TRUE(FPBits(res).is_quiet_nan()); - EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x42).uintval(), - FPBits(res).uintval()); - - EXPECT_EQ(0, func(&res, T(0x123.0p+0))); - EXPECT_TRUE(FPBits(res).is_quiet_nan()); - EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x123).uintval(), - FPBits(res).uintval()); + if constexpr (FPBits::FRACTION_LEN - 1 >= 6) { + EXPECT_EQ(0, func(&res, T(0x31.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x31).uintval(), + FPBits(res).uintval()); + + EXPECT_EQ(0, func(&res, T(0x15.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x15).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_EQ(0, func(&res, T(0x42.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x42).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 9) { + EXPECT_EQ(0, func(&res, T(0x123.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x123).uintval(), + FPBits(res).uintval()); + } // The following code is creating a NaN payload manually to prevent a // conversion from BigInt to float128. diff --git a/libc/test/src/math/smoke/getpayloadbf16_test.cpp b/libc/test/src/math/smoke/getpayloadbf16_test.cpp new file mode 100644 index 0000000000000..51a5fad88cd97 --- /dev/null +++ b/libc/test/src/math/smoke/getpayloadbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for getpayloadbf16 --------------------------------------===// +// +// 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 "GetPayloadTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/getpayloadbf16.h" + +LIST_GETPAYLOAD_TESTS(bfloat16, LIBC_NAMESPACE::getpayloadbf16) diff --git a/libc/test/src/math/smoke/setpayloadbf16_test.cpp b/libc/test/src/math/smoke/setpayloadbf16_test.cpp new file mode 100644 index 0000000000000..198b454ed78b0 --- /dev/null +++ b/libc/test/src/math/smoke/setpayloadbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for setpayloadbf16 --------------------------------------===// +// +// 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 "SetPayloadTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/setpayloadbf16.h" + +LIST_SETPAYLOAD_TESTS(bfloat16, LIBC_NAMESPACE::setpayloadbf16) diff --git a/libc/test/src/math/smoke/setpayloadsigbf16_test.cpp b/libc/test/src/math/smoke/setpayloadsigbf16_test.cpp new file mode 100644 index 0000000000000..aa6a3e9dcbf2f --- /dev/null +++ b/libc/test/src/math/smoke/setpayloadsigbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for setpayloadsigbf16 -----------------------------------===// +// +// 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 "SetPayloadSigTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/setpayloadsigbf16.h" + +LIST_SETPAYLOADSIG_TESTS(bfloat16, LIBC_NAMESPACE::setpayloadsigbf16) >From 8ea93545572ba5a69d468e21d00b2be69d4c857c Mon Sep 17 00:00:00 2001 From: Krishna Pandey <kpandey81...@gmail.com> Date: Sun, 17 Aug 2025 08:11:23 +0530 Subject: [PATCH 3/5] fix: add correct static_cast for fputil::getpload for bfloat16 Signed-off-by: Krishna Pandey <kpandey81...@gmail.com> --- libc/src/__support/FPUtil/BasicOperations.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libc/src/__support/FPUtil/BasicOperations.h b/libc/src/__support/FPUtil/BasicOperations.h index 2357b053b60b8..994237ba8492e 100644 --- a/libc/src/__support/FPUtil/BasicOperations.h +++ b/libc/src/__support/FPUtil/BasicOperations.h @@ -354,7 +354,10 @@ LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, T> getpayload(T x) { return static_cast<T>(payload_dfloat); } else { - return static_cast<T>(payload); + if constexpr (cpp::is_same_v<T, bfloat16>) + return T(static_cast<int>(payload)); + else + return static_cast<T>(payload); } } >From fc2b6ebb84a27f07541d1922724b06cd9efe09cc Mon Sep 17 00:00:00 2001 From: Krishna Pandey <kpandey81...@gmail.com> Date: Sun, 17 Aug 2025 08:12:28 +0530 Subject: [PATCH 4/5] chore: update entrypoints Signed-off-by: Krishna Pandey <kpandey81...@gmail.com> --- libc/config/baremetal/aarch64/entrypoints.txt | 3 +++ libc/config/baremetal/arm/entrypoints.txt | 3 +++ libc/config/baremetal/riscv/entrypoints.txt | 3 +++ libc/config/darwin/aarch64/entrypoints.txt | 3 +++ libc/config/darwin/x86_64/entrypoints.txt | 3 +++ libc/config/gpu/amdgpu/entrypoints.txt | 3 +++ libc/config/gpu/nvptx/entrypoints.txt | 3 +++ libc/config/linux/aarch64/entrypoints.txt | 3 +++ libc/config/linux/arm/entrypoints.txt | 3 +++ libc/config/linux/riscv/entrypoints.txt | 3 +++ libc/config/linux/x86_64/entrypoints.txt | 3 +++ libc/config/windows/entrypoints.txt | 3 +++ 12 files changed, 36 insertions(+) diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt index 26ee82d99192f..5f72793beecb4 100644 --- a/libc/config/baremetal/aarch64/entrypoints.txt +++ b/libc/config/baremetal/aarch64/entrypoints.txt @@ -787,12 +787,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt index 00025d324fc2c..244dd2e87b1fd 100644 --- a/libc/config/baremetal/arm/entrypoints.txt +++ b/libc/config/baremetal/arm/entrypoints.txt @@ -790,12 +790,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt index c0ab0cf903c41..32980c4a1d222 100644 --- a/libc/config/baremetal/riscv/entrypoints.txt +++ b/libc/config/baremetal/riscv/entrypoints.txt @@ -790,12 +790,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt index cd81756770ed4..3684713474cbc 100644 --- a/libc/config/darwin/aarch64/entrypoints.txt +++ b/libc/config/darwin/aarch64/entrypoints.txt @@ -620,12 +620,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt index 3aa54e027a42d..7482a80c37d33 100644 --- a/libc/config/darwin/x86_64/entrypoints.txt +++ b/libc/config/darwin/x86_64/entrypoints.txt @@ -263,12 +263,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt index 3b42c0fd71547..a88c74be2997a 100644 --- a/libc/config/gpu/amdgpu/entrypoints.txt +++ b/libc/config/gpu/amdgpu/entrypoints.txt @@ -646,12 +646,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt index b569327409849..08e6c7dc34b07 100644 --- a/libc/config/gpu/nvptx/entrypoints.txt +++ b/libc/config/gpu/nvptx/entrypoints.txt @@ -647,12 +647,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 4058e7155f34a..ea7e2065b2216 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -874,12 +874,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt index 9002bd12d6733..8f21976e9e88e 100644 --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -490,12 +490,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 77d5bae188a3c..69d7519118198 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -893,12 +893,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index b811fe79c174d..75dcfd6382f1b 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -925,12 +925,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt index ec2fde253e898..541d9fee1adf5 100644 --- a/libc/config/windows/entrypoints.txt +++ b/libc/config/windows/entrypoints.txt @@ -336,12 +336,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 libc.src.math.nextafterbf16 libc.src.math.nextdownbf16 libc.src.math.nexttowardbf16 libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 + libc.src.math.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 >From 70e4463400df96054520b1dd53a52860d96be929 Mon Sep 17 00:00:00 2001 From: Krishna Pandey <kpandey81...@gmail.com> Date: Sun, 17 Aug 2025 08:12:59 +0530 Subject: [PATCH 5/5] docs: add {get,set}payloadbf16 and setpayloadsigbf16 math functions Signed-off-by: Krishna Pandey <kpandey81...@gmail.com> --- libc/docs/headers/math/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst index 591295659c3d4..d8921b985b1f2 100644 --- a/libc/docs/headers/math/index.rst +++ b/libc/docs/headers/math/index.rst @@ -187,7 +187,7 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | fsub | N/A | |check| | |check| | N/A | |check|\* | N/A | 7.12.14.2 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| getpayload | |check| | |check| | |check| | |check| | |check| | | F.10.13.1 | N/A | +| getpayload | |check| | |check| | |check| | |check| | |check| | |check| | F.10.13.1 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | ilogb | |check| | |check| | |check| | |check| | |check| | | 7.12.6.8 | F.10.3.8 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ @@ -237,9 +237,9 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | scalbn | |check| | |check| | |check| | |check| | |check| | | 7.12.6.19 | F.10.3.19 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| setpayload | |check| | |check| | |check| | |check| | |check| | | F.10.13.2 | N/A | +| setpayload | |check| | |check| | |check| | |check| | |check| | |check| | F.10.13.2 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| setpayloadsig | |check| | |check| | |check| | |check| | |check| | | F.10.13.3 | N/A | +| setpayloadsig | |check| | |check| | |check| | |check| | |check| | |check| | F.10.13.3 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | totalorder | |check| | |check| | |check| | |check| | |check| | | F.10.12.1 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits