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

Reply via email to