chore: implement smoke tests for {get,set}payloadbf16 and setpayloadsigbf16 math functions

Signed-off-by: Krishna Pandey <kpandey81930@gmail.com>
This commit is contained in:
Krishna Pandey 2025-08-17 08:09:51 +05:30
parent 6f8d84d83b
commit c8f43800a5
No known key found for this signature in database
GPG Key ID: 20FD86C0096672D5
7 changed files with 171 additions and 32 deletions

View File

@ -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

View File

@ -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));
}
}
};

View File

@ -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 +

View File

@ -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.

View File

@ -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)

View File

@ -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)

View File

@ -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)