https://github.com/krishna2803 created 
https://github.com/llvm/llvm-project/pull/153993

This PR adds the following basic math functions for BFloat16 type along with 
the tests:
- nextafterbf16
- nextdownbf16
- nexttowardbf16
- nextupbf16

>From 4a80312010e3adaff8873a40831e74d393a1d71c Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81...@gmail.com>
Date: Sun, 17 Aug 2025 05:59:39 +0530
Subject: [PATCH 1/4] feat: implement next{after,down,toward,up}bf16 math
 functions

Signed-off-by: Krishna Pandey <kpandey81...@gmail.com>
---
 libc/src/math/CMakeLists.txt             |  4 ++
 libc/src/math/generic/CMakeLists.txt     | 56 ++++++++++++++++++++++++
 libc/src/math/generic/nextafterbf16.cpp  | 21 +++++++++
 libc/src/math/generic/nextdownbf16.cpp   | 21 +++++++++
 libc/src/math/generic/nexttowardbf16.cpp | 22 ++++++++++
 libc/src/math/generic/nextupbf16.cpp     | 21 +++++++++
 libc/src/math/nextafterbf16.h            | 21 +++++++++
 libc/src/math/nextdownbf16.h             | 21 +++++++++
 libc/src/math/nexttowardbf16.h           | 21 +++++++++
 libc/src/math/nextupbf16.h               | 21 +++++++++
 10 files changed, 229 insertions(+)
 create mode 100644 libc/src/math/generic/nextafterbf16.cpp
 create mode 100644 libc/src/math/generic/nextdownbf16.cpp
 create mode 100644 libc/src/math/generic/nexttowardbf16.cpp
 create mode 100644 libc/src/math/generic/nextupbf16.cpp
 create mode 100644 libc/src/math/nextafterbf16.h
 create mode 100644 libc/src/math/nextdownbf16.h
 create mode 100644 libc/src/math/nexttowardbf16.h
 create mode 100644 libc/src/math/nextupbf16.h

diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index f94120272ce66..3843247c4fa5b 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -431,23 +431,27 @@ add_math_entrypoint_object(nextafterf)
 add_math_entrypoint_object(nextafterl)
 add_math_entrypoint_object(nextafterf16)
 add_math_entrypoint_object(nextafterf128)
+add_math_entrypoint_object(nextafterbf16)
 
 add_math_entrypoint_object(nexttoward)
 add_math_entrypoint_object(nexttowardf)
 add_math_entrypoint_object(nexttowardl)
 add_math_entrypoint_object(nexttowardf16)
+add_math_entrypoint_object(nexttowardbf16)
 
 add_math_entrypoint_object(nextdown)
 add_math_entrypoint_object(nextdownf)
 add_math_entrypoint_object(nextdownl)
 add_math_entrypoint_object(nextdownf16)
 add_math_entrypoint_object(nextdownf128)
+add_math_entrypoint_object(nextdownbf16)
 
 add_math_entrypoint_object(nextup)
 add_math_entrypoint_object(nextupf)
 add_math_entrypoint_object(nextupl)
 add_math_entrypoint_object(nextupf16)
 add_math_entrypoint_object(nextupf128)
+add_math_entrypoint_object(nextupbf16)
 
 add_math_entrypoint_object(pow)
 add_math_entrypoint_object(powf)
diff --git a/libc/src/math/generic/CMakeLists.txt 
b/libc/src/math/generic/CMakeLists.txt
index 1608bed87cb6b..822da74d7597e 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -3496,6 +3496,20 @@ add_entrypoint_object(
     libc.src.__support.FPUtil.manipulation_functions
 )
 
+add_entrypoint_object(
+  nextafterbf16
+  SRCS
+    nextafterbf16.cpp
+  HDRS
+    ../nextafterbf16.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.FPUtil.bfloat16
+    libc.src.__support.FPUtil.manipulation_functions
+    libc.src.__support.macros.config
+    libc.src.__support.macros.properties.types
+)
+
 add_entrypoint_object(
   nexttoward
   SRCS
@@ -3537,6 +3551,20 @@ add_entrypoint_object(
     libc.src.__support.FPUtil.manipulation_functions
 )
 
+add_entrypoint_object(
+  nexttowardbf16
+  SRCS
+    nexttowardbf16.cpp
+  HDRS
+    ../nexttowardbf16.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.FPUtil.bfloat16
+    libc.src.__support.FPUtil.manipulation_functions
+    libc.src.__support.macros.config
+    libc.src.__support.macros.properties.types
+)
+
 add_entrypoint_object(
   nextdown
   SRCS
@@ -3589,6 +3617,20 @@ add_entrypoint_object(
     libc.src.__support.FPUtil.manipulation_functions
 )
 
+add_entrypoint_object(
+  nextdownbf16
+  SRCS
+    nextdownbf16.cpp
+  HDRS
+    ../nextdownbf16.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.FPUtil.bfloat16
+    libc.src.__support.FPUtil.manipulation_functions
+    libc.src.__support.macros.config
+    libc.src.__support.macros.properties.types
+)
+
 add_entrypoint_object(
   nextup
   SRCS
@@ -3641,6 +3683,20 @@ add_entrypoint_object(
     libc.src.__support.FPUtil.manipulation_functions
 )
 
+add_entrypoint_object(
+  nextupbf16
+  SRCS
+    nextupbf16.cpp
+  HDRS
+    ../nextupbf16.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.FPUtil.bfloat16
+    libc.src.__support.FPUtil.manipulation_functions
+    libc.src.__support.macros.config
+    libc.src.__support.macros.properties.types
+)
+
 add_entrypoint_object(
   fmod
   SRCS
diff --git a/libc/src/math/generic/nextafterbf16.cpp 
b/libc/src/math/generic/nextafterbf16.cpp
new file mode 100644
index 0000000000000..e21a2dcb3d664
--- /dev/null
+++ b/libc/src/math/generic/nextafterbf16.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation of nextafterbf16 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/nextafterbf16.h"
+#include "src/__support/FPUtil/ManipulationFunctions.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, nextafterbf16, (bfloat16 x, bfloat16 y)) {
+  return fputil::nextafter(x, y);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/generic/nextdownbf16.cpp 
b/libc/src/math/generic/nextdownbf16.cpp
new file mode 100644
index 0000000000000..2115df95ff072
--- /dev/null
+++ b/libc/src/math/generic/nextdownbf16.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation of nextdownbf16 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/nextdownbf16.h"
+#include "src/__support/FPUtil/ManipulationFunctions.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, nextdownbf16, (bfloat16 x)) {
+  return fputil::nextupdown</*IsDown=*/true>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/generic/nexttowardbf16.cpp 
b/libc/src/math/generic/nexttowardbf16.cpp
new file mode 100644
index 0000000000000..3deab87575939
--- /dev/null
+++ b/libc/src/math/generic/nexttowardbf16.cpp
@@ -0,0 +1,22 @@
+//===-- Implementation of nexttowardbf16 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/nexttowardbf16.h"
+#include "src/__support/FPUtil/ManipulationFunctions.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, nexttowardbf16, (bfloat16 x, long double y)) {
+  // nextafter<T, U> where T != U is nexttoward
+  return fputil::nextafter(x, y);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/generic/nextupbf16.cpp 
b/libc/src/math/generic/nextupbf16.cpp
new file mode 100644
index 0000000000000..147ce37477d9f
--- /dev/null
+++ b/libc/src/math/generic/nextupbf16.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation of nextupbf16 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/nextupbf16.h"
+#include "src/__support/FPUtil/ManipulationFunctions.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, nextupbf16, (bfloat16 x)) {
+  return fputil::nextupdown</*IsDown=*/false>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/nextafterbf16.h b/libc/src/math/nextafterbf16.h
new file mode 100644
index 0000000000000..f962c7c51e5cd
--- /dev/null
+++ b/libc/src/math/nextafterbf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for nextafterbf16 -----------------*- 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_NEXTAFTERBF16_H
+#define LLVM_LIBC_SRC_MATH_NEXTAFTERBF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+bfloat16 nextafterbf16(bfloat16 x, bfloat16 y);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_NEXTAFTERBF16_H
diff --git a/libc/src/math/nextdownbf16.h b/libc/src/math/nextdownbf16.h
new file mode 100644
index 0000000000000..36b0cd7cb9626
--- /dev/null
+++ b/libc/src/math/nextdownbf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for nextdownbf16 ------------------*- 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_NEXTDOWNBF16_H
+#define LLVM_LIBC_SRC_MATH_NEXTDOWNBF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+bfloat16 nextdownbf16(bfloat16 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_NEXTDOWNBF16_H
diff --git a/libc/src/math/nexttowardbf16.h b/libc/src/math/nexttowardbf16.h
new file mode 100644
index 0000000000000..930abf858ef51
--- /dev/null
+++ b/libc/src/math/nexttowardbf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for nexttowardbf16 ----------------*- 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_NEXTTOWARDBF16_H
+#define LLVM_LIBC_SRC_MATH_NEXTTOWARDBF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+bfloat16 nexttowardbf16(bfloat16 x, long double y);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_NEXTTOWARDBF16_H
diff --git a/libc/src/math/nextupbf16.h b/libc/src/math/nextupbf16.h
new file mode 100644
index 0000000000000..872de84338d95
--- /dev/null
+++ b/libc/src/math/nextupbf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for nextupbf16 --------------------*- 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_NEXTUPBF16_H
+#define LLVM_LIBC_SRC_MATH_NEXTUPBF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+bfloat16 nextupbf16(bfloat16 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_NEXTUPBF16_H

>From 446e63718e21f90dbfea74dcbc699c1f4c08334c Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81...@gmail.com>
Date: Sun, 17 Aug 2025 06:00:01 +0530
Subject: [PATCH 2/4] chore: add smoke tests for next{after,down,toward,up}bf16
 math functions

Signed-off-by: Krishna Pandey <kpandey81...@gmail.com>
---
 libc/test/src/math/smoke/CMakeLists.txt       | 52 +++++++++++++++++++
 libc/test/src/math/smoke/NextAfterTest.h      | 43 ++++++++-------
 libc/test/src/math/smoke/NextTowardTest.h     |  4 +-
 .../src/math/smoke/nextafterbf16_test.cpp     | 14 +++++
 .../test/src/math/smoke/nextdownbf16_test.cpp | 14 +++++
 .../src/math/smoke/nexttowardbf16_test.cpp    | 14 +++++
 libc/test/src/math/smoke/nextupbf16_test.cpp  | 14 +++++
 7 files changed, 133 insertions(+), 22 deletions(-)
 create mode 100644 libc/test/src/math/smoke/nextafterbf16_test.cpp
 create mode 100644 libc/test/src/math/smoke/nextdownbf16_test.cpp
 create mode 100644 libc/test/src/math/smoke/nexttowardbf16_test.cpp
 create mode 100644 libc/test/src/math/smoke/nextupbf16_test.cpp

diff --git a/libc/test/src/math/smoke/CMakeLists.txt 
b/libc/test/src/math/smoke/CMakeLists.txt
index 694467e19d47c..40481a711bade 100644
--- a/libc/test/src/math/smoke/CMakeLists.txt
+++ b/libc/test/src/math/smoke/CMakeLists.txt
@@ -3660,6 +3660,19 @@ add_fp_unittest(
     libc.src.__support.FPUtil.fp_bits
 )
 
+add_fp_unittest(
+  nextafterbf16_test
+  SUITE
+    libc-math-smoke-tests
+  SRCS
+    nextafterbf16_test.cpp
+  HDRS
+    NextUpTest.h
+  DEPENDS
+    libc.src.math.nextafterbf16
+    libc.src.__support.FPUtil.bfloat16
+)
+
 # FIXME: These tests are currently spurious for the GPU.
 if(NOT LIBC_TARGET_OS_IS_GPU)
   add_fp_unittest(
@@ -3727,6 +3740,19 @@ add_fp_unittest(
     libc.src.__support.FPUtil.fp_bits
 )
 
+add_fp_unittest(
+  nexttowardbf16_test
+  SUITE
+    libc-math-smoke-tests
+  SRCS
+    nexttowardbf16_test.cpp
+  HDRS
+    NextUpTest.h
+  DEPENDS
+    libc.src.math.nexttowardbf16
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_fp_unittest(
   nextdown_test
   SUITE
@@ -3787,6 +3813,19 @@ add_fp_unittest(
     libc.src.math.nextdownf128
 )
 
+add_fp_unittest(
+  nextdownbf16_test
+  SUITE
+    libc-math-smoke-tests
+  SRCS
+    nextdownbf16_test.cpp
+  HDRS
+    NextUpTest.h
+  DEPENDS
+    libc.src.math.nextdownbf16
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_fp_unittest(
   nextup_test
   SUITE
@@ -3847,6 +3886,19 @@ add_fp_unittest(
     libc.src.math.nextupf128
 )
 
+add_fp_unittest(
+  nextupbf16_test
+  SUITE
+    libc-math-smoke-tests
+  SRCS
+    nextupbf16_test.cpp
+  HDRS
+    NextUpTest.h
+  DEPENDS
+    libc.src.math.nextupbf16
+    libc.src.__support.FPUtil.bfloat16
+)
+
 # TODO(lntue): The current implementation of fputil::general::fma<float> is 
only
 # correctly rounded for the default rounding mode round-to-nearest tie-to-even.
 add_fp_unittest(
diff --git a/libc/test/src/math/smoke/NextAfterTest.h 
b/libc/test/src/math/smoke/NextAfterTest.h
index be27c9f188a72..b7e59f7cd8cfd 100644
--- a/libc/test/src/math/smoke/NextAfterTest.h
+++ b/libc/test/src/math/smoke/NextAfterTest.h
@@ -12,6 +12,7 @@
 #include "src/__support/CPP/bit.h"
 #include "src/__support/FPUtil/FEnvImpl.h"
 #include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/sign.h"
 #include "test/UnitTest/FEnvSafeTest.h"
 #include "test/UnitTest/FPMatcher.h"
 #include "test/UnitTest/Test.h"
@@ -42,6 +43,8 @@ class NextAfterTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
   const T neg_inf = FPBits::inf(Sign::NEG).get_val();
   const T zero = FPBits::zero(Sign::POS).get_val();
   const T neg_zero = FPBits::zero(Sign::NEG).get_val();
+  const T one = FPBits::one(Sign::POS).get_val();
+  const T neg_one = FPBits::one(Sign::NEG).get_val();
   const T nan = FPBits::quiet_nan().get_val();
 
   static constexpr StorageType min_subnormal =
@@ -55,8 +58,8 @@ class NextAfterTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
   typedef T (*NextAfterFunc)(T, T);
 
   void testNaN(NextAfterFunc func) {
-    ASSERT_FP_EQ(func(nan, 0), nan);
-    ASSERT_FP_EQ(func(0, nan), nan);
+    ASSERT_FP_EQ(func(nan, zero), nan);
+    ASSERT_FP_EQ(func(zero, nan), nan);
   }
 
   void testBoundaries(NextAfterFunc func) {
@@ -65,68 +68,68 @@ class NextAfterTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
 
     // 'from' is zero|neg_zero.
     T x = zero;
-    T result = func(x, T(1));
+    T result = func(x, one);
     StorageType expected_bits = 1;
     T expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
 
-    result = func(x, T(-1));
+    result = func(x, neg_one);
     expected_bits = FPBits::SIGN_MASK + 1;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
 
     x = neg_zero;
-    result = func(x, 1);
+    result = func(x, one);
     expected_bits = 1;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
 
-    result = func(x, -1);
+    result = func(x, neg_one);
     expected_bits = FPBits::SIGN_MASK + 1;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
 
     // 'from' is max subnormal value.
     x = LIBC_NAMESPACE::cpp::bit_cast<T>(max_subnormal);
-    result = func(x, 1);
+    result = func(x, one);
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(min_normal);
     ASSERT_FP_EQ(result, expected);
 
-    result = func(x, 0);
+    result = func(x, zero);
     expected_bits = max_subnormal - 1;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
 
     x = -x;
 
-    result = func(x, -1);
+    result = func(x, neg_one);
     expected_bits = FPBits::SIGN_MASK + min_normal;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ(result, expected);
 
-    result = func(x, 0);
+    result = func(x, zero);
     expected_bits = FPBits::SIGN_MASK + max_subnormal - 1;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
 
     // 'from' is min subnormal value.
     x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_subnormal);
-    result = func(x, 1);
+    result = func(x, one);
     expected_bits = min_subnormal + 1;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
-    ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, 0), zero);
+    ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, zero), zero);
 
     x = -x;
-    result = func(x, -1);
+    result = func(x, neg_one);
     expected_bits = FPBits::SIGN_MASK + min_subnormal + 1;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
-    ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, 0), T(-0.0));
+    ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, zero), neg_zero);
 
     // 'from' is min normal.
     x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_normal);
-    result = func(x, 0);
+    result = func(x, zero);
     expected_bits = max_subnormal;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
@@ -137,7 +140,7 @@ class NextAfterTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
     ASSERT_FP_EQ(result, expected);
 
     x = -x;
-    result = func(x, 0);
+    result = func(x, zero);
     expected_bits = FPBits::SIGN_MASK + max_subnormal;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
@@ -157,14 +160,14 @@ class NextAfterTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
 
     // 'from' is infinity.
     x = inf;
-    result = func(x, 0);
+    result = func(x, zero);
     expected_bits = max_normal;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ(result, expected);
     ASSERT_FP_EQ(func(x, inf), inf);
 
     x = neg_inf;
-    result = func(x, 0);
+    result = func(x, zero);
     expected_bits = FPBits::SIGN_MASK + max_normal;
     expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
     ASSERT_FP_EQ(result, expected);
@@ -172,7 +175,7 @@ class NextAfterTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
 
     // 'from' is a power of 2.
     x = T(32.0);
-    result = func(x, 0);
+    result = func(x, zero);
     FPBits x_bits = FPBits(x);
     FPBits result_bits = FPBits(result);
     ASSERT_EQ(result_bits.get_biased_exponent(),
@@ -187,7 +190,7 @@ class NextAfterTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
 
     x = -x;
 
-    result = func(x, 0);
+    result = func(x, zero);
     result_bits = FPBits(result);
     ASSERT_EQ(result_bits.get_biased_exponent(),
               uint16_t(x_bits.get_biased_exponent() - 1));
diff --git a/libc/test/src/math/smoke/NextTowardTest.h 
b/libc/test/src/math/smoke/NextTowardTest.h
index d2f352cdcbdf7..43e71c6a2d8f6 100644
--- a/libc/test/src/math/smoke/NextTowardTest.h
+++ b/libc/test/src/math/smoke/NextTowardTest.h
@@ -62,8 +62,8 @@ class NextTowardTestTemplate : public 
LIBC_NAMESPACE::testing::FEnvSafeTest {
   typedef T (*NextTowardFunc)(T, long double);
 
   void testNaN(NextTowardFunc func) {
-    ASSERT_FP_EQ(func(nan, 0), nan);
-    ASSERT_FP_EQ(func(0, to_nan), nan);
+    ASSERT_FP_EQ(func(nan, to_zero), nan);
+    ASSERT_FP_EQ(func(zero, to_nan), nan);
   }
 
   void testBoundaries(NextTowardFunc func) {
diff --git a/libc/test/src/math/smoke/nextafterbf16_test.cpp 
b/libc/test/src/math/smoke/nextafterbf16_test.cpp
new file mode 100644
index 0000000000000..b73a3cbef0b74
--- /dev/null
+++ b/libc/test/src/math/smoke/nextafterbf16_test.cpp
@@ -0,0 +1,14 @@
+//===-- Unittests for nextafterbf16 
---------------------------------------===//
+//
+// 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 "NextAfterTest.h"
+
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/math/nextafterbf16.h"
+
+LIST_NEXTAFTER_TESTS(bfloat16, LIBC_NAMESPACE::nextafterbf16)
diff --git a/libc/test/src/math/smoke/nextdownbf16_test.cpp 
b/libc/test/src/math/smoke/nextdownbf16_test.cpp
new file mode 100644
index 0000000000000..300206461e2de
--- /dev/null
+++ b/libc/test/src/math/smoke/nextdownbf16_test.cpp
@@ -0,0 +1,14 @@
+//===-- Unittests for nextdownbf16 
----------------------------------------===//
+//
+// 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 "NextDownTest.h"
+
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/math/nextdownbf16.h"
+
+LIST_NEXTDOWN_TESTS(bfloat16, LIBC_NAMESPACE::nextdownbf16)
diff --git a/libc/test/src/math/smoke/nexttowardbf16_test.cpp 
b/libc/test/src/math/smoke/nexttowardbf16_test.cpp
new file mode 100644
index 0000000000000..c1f35fcb96ef6
--- /dev/null
+++ b/libc/test/src/math/smoke/nexttowardbf16_test.cpp
@@ -0,0 +1,14 @@
+//===-- Unittests for nexttowardbf16 
--------------------------------------===//
+//
+// 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 "NextTowardTest.h"
+
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/math/nexttowardbf16.h"
+
+LIST_NEXTTOWARD_TESTS(bfloat16, LIBC_NAMESPACE::nexttowardbf16)
diff --git a/libc/test/src/math/smoke/nextupbf16_test.cpp 
b/libc/test/src/math/smoke/nextupbf16_test.cpp
new file mode 100644
index 0000000000000..49ad2f70b12a8
--- /dev/null
+++ b/libc/test/src/math/smoke/nextupbf16_test.cpp
@@ -0,0 +1,14 @@
+//===-- Unittests for nextupbf16 
------------------------------------------===//
+//
+// 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 "NextUpTest.h"
+
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/math/nextupbf16.h"
+
+LIST_NEXTUP_TESTS(bfloat16, LIBC_NAMESPACE::nextupbf16)

>From a98b9281d87906165b1b7ade5591335dcba0efc5 Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81...@gmail.com>
Date: Sun, 17 Aug 2025 06:00:15 +0530
Subject: [PATCH 3/4] chore: update entrypoints

Signed-off-by: Krishna Pandey <kpandey81...@gmail.com>
---
 libc/config/baremetal/aarch64/entrypoints.txt | 4 ++++
 libc/config/baremetal/arm/entrypoints.txt     | 4 ++++
 libc/config/baremetal/riscv/entrypoints.txt   | 4 ++++
 libc/config/darwin/aarch64/entrypoints.txt    | 4 ++++
 libc/config/darwin/x86_64/entrypoints.txt     | 4 ++++
 libc/config/gpu/amdgpu/entrypoints.txt        | 4 ++++
 libc/config/gpu/nvptx/entrypoints.txt         | 4 ++++
 libc/config/linux/aarch64/entrypoints.txt     | 4 ++++
 libc/config/linux/arm/entrypoints.txt         | 4 ++++
 libc/config/linux/riscv/entrypoints.txt       | 4 ++++
 libc/config/linux/x86_64/entrypoints.txt      | 4 ++++
 libc/config/windows/entrypoints.txt           | 4 ++++
 12 files changed, 48 insertions(+)

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt 
b/libc/config/baremetal/aarch64/entrypoints.txt
index c2710429b3cfd..26ee82d99192f 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -787,6 +787,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/baremetal/arm/entrypoints.txt 
b/libc/config/baremetal/arm/entrypoints.txt
index 6e5389d542f80..00025d324fc2c 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -790,6 +790,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/baremetal/riscv/entrypoints.txt 
b/libc/config/baremetal/riscv/entrypoints.txt
index 76da24d2cc876..c0ab0cf903c41 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -790,6 +790,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/darwin/aarch64/entrypoints.txt 
b/libc/config/darwin/aarch64/entrypoints.txt
index 5bfd6c863fabb..cd81756770ed4 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -620,6 +620,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/darwin/x86_64/entrypoints.txt 
b/libc/config/darwin/x86_64/entrypoints.txt
index 27d214d06cd0b..3aa54e027a42d 100644
--- a/libc/config/darwin/x86_64/entrypoints.txt
+++ b/libc/config/darwin/x86_64/entrypoints.txt
@@ -263,6 +263,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/gpu/amdgpu/entrypoints.txt 
b/libc/config/gpu/amdgpu/entrypoints.txt
index bc75956738e5a..3b42c0fd71547 100644
--- a/libc/config/gpu/amdgpu/entrypoints.txt
+++ b/libc/config/gpu/amdgpu/entrypoints.txt
@@ -646,6 +646,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/gpu/nvptx/entrypoints.txt 
b/libc/config/gpu/nvptx/entrypoints.txt
index c9688284df16c..b569327409849 100644
--- a/libc/config/gpu/nvptx/entrypoints.txt
+++ b/libc/config/gpu/nvptx/entrypoints.txt
@@ -647,6 +647,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/linux/aarch64/entrypoints.txt 
b/libc/config/linux/aarch64/entrypoints.txt
index e42bbb14ec119..4058e7155f34a 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -874,6 +874,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/linux/arm/entrypoints.txt 
b/libc/config/linux/arm/entrypoints.txt
index 60fc953c2b9f4..9002bd12d6733 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -490,6 +490,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/linux/riscv/entrypoints.txt 
b/libc/config/linux/riscv/entrypoints.txt
index 1a03683d72e61..77d5bae188a3c 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -893,6 +893,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/linux/x86_64/entrypoints.txt 
b/libc/config/linux/x86_64/entrypoints.txt
index 9b4946b883626..b811fe79c174d 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -925,6 +925,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16
diff --git a/libc/config/windows/entrypoints.txt 
b/libc/config/windows/entrypoints.txt
index b97e893567038..ec2fde253e898 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -336,6 +336,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.fminimum_numbf16
   libc.src.math.fromfpbf16
   libc.src.math.fromfpxbf16
+  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.truncbf16

>From 12f1923f5e1e3681a203f546aeefaaa38ea3fe58 Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81...@gmail.com>
Date: Sun, 17 Aug 2025 06:00:38 +0530
Subject: [PATCH 4/4] docs: add next{after,down,toward,up}bf16 math functions

Signed-off-by: Krishna Pandey <kpandey81...@gmail.com>
---
 libc/docs/headers/math/index.rst | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst
index 754c1a55cf449..591295659c3d4 100644
--- a/libc/docs/headers/math/index.rst
+++ b/libc/docs/headers/math/index.rst
@@ -215,13 +215,13 @@ Basic Operations
 
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
 | nearbyint        | |check|          | |check|         | |check|              
  | |check|              | |check|                |                        | 
7.12.9.3               | F.10.6.3                   |
 
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
-| nextafter        | |check|          | |check|         | |check|              
  | |check|              | |check|                |                        | 
7.12.11.3              | F.10.8.3                   |
+| nextafter        | |check|          | |check|         | |check|              
  | |check|              | |check|                | |check|                | 
7.12.11.3              | F.10.8.3                   |
 
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
-| nextdown         | |check|          | |check|         | |check|              
  | |check|              | |check|                |                        | 
7.12.11.6              | F.10.8.6                   |
+| nextdown         | |check|          | |check|         | |check|              
  | |check|              | |check|                | |check|                | 
7.12.11.6              | F.10.8.6                   |
 
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
-| nexttoward       | |check|          | |check|         | |check|              
  | |check|              | N/A                    |                        | 
7.12.11.4              | F.10.8.4                   |
+| nexttoward       | |check|          | |check|         | |check|              
  | |check|              | N/A                    | |check|                | 
7.12.11.4              | F.10.8.4                   |
 
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
-| nextup           | |check|          | |check|         | |check|              
  | |check|              | |check|                |                        | 
7.12.11.5              | F.10.8.5                   |
+| nextup           | |check|          | |check|         | |check|              
  | |check|              | |check|                | |check|                | 
7.12.11.5              | F.10.8.5                   |
 
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
 | remainder        | |check|          | |check|         | |check|              
  | |check|              | |check|                |                        | 
7.12.10.2              | F.10.7.2                   |
 
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+

_______________________________________________
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