From c8f43800a59a3777c74545484bb337523b9b2a26 Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Sun, 17 Aug 2025 08:09:51 +0530 Subject: [PATCH] chore: implement smoke tests for {get,set}payloadbf16 and setpayloadsigbf16 math functions Signed-off-by: Krishna Pandey --- libc/test/src/math/smoke/CMakeLists.txt | 38 ++++++++++++ libc/test/src/math/smoke/GetPayloadTest.h | 59 ++++++++++++++----- libc/test/src/math/smoke/SetPayloadSigTest.h | 32 +++++++--- libc/test/src/math/smoke/SetPayloadTest.h | 32 +++++++--- .../src/math/smoke/getpayloadbf16_test.cpp | 14 +++++ .../src/math/smoke/setpayloadbf16_test.cpp | 14 +++++ .../src/math/smoke/setpayloadsigbf16_test.cpp | 14 +++++ 7 files changed, 171 insertions(+), 32 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 40481a711bad..8c257664dd8d 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 1b1bf4f5d56f..486ea42bf50c 100644 --- a/libc/test/src/math/smoke/GetPayloadTest.h +++ b/libc/test/src/math/smoke/GetPayloadTest.h @@ -51,23 +51,50 @@ public: 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)); + 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)); - 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)); + // 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 f480479618a0..7b26c98b7ee3 100644 --- a/libc/test/src/math/smoke/SetPayloadSigTest.h +++ b/libc/test/src/math/smoke/SetPayloadSigTest.h @@ -54,15 +54,31 @@ public: 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()); + 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(0x123.0p+0))); - EXPECT_TRUE(FPBits(res).is_signaling_nan()); - EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x123).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 9ede5678fef1..6aff47ab60a9 100644 --- a/libc/test/src/math/smoke/SetPayloadTest.h +++ b/libc/test/src/math/smoke/SetPayloadTest.h @@ -54,15 +54,31 @@ public: 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()); + 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(0x123.0p+0))); - EXPECT_TRUE(FPBits(res).is_quiet_nan()); - EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x123).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 000000000000..51a5fad88cd9 --- /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 000000000000..198b454ed78b --- /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 000000000000..aa6a3e9dcbf2 --- /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)