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