Skip to content

Commit c8f4380

Browse files
committed
chore: implement smoke tests for {get,set}payloadbf16 and setpayloadsigbf16 math functions
Signed-off-by: Krishna Pandey <[email protected]>
1 parent 6f8d84d commit c8f4380

File tree

7 files changed

+174
-35
lines changed

7 files changed

+174
-35
lines changed

libc/test/src/math/smoke/CMakeLists.txt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4853,6 +4853,19 @@ add_fp_unittest(
48534853
libc.src.math.getpayloadf128
48544854
)
48554855

4856+
add_fp_unittest(
4857+
getpayloadbf16_test
4858+
SUITE
4859+
libc-math-smoke-tests
4860+
SRCS
4861+
getpayloadbf16_test.cpp
4862+
HDRS
4863+
GetPayloadTest.h
4864+
DEPENDS
4865+
libc.src.math.getpayloadbf16
4866+
libc.src.__support.FPUtil.bfloat16
4867+
)
4868+
48564869
add_fp_unittest(
48574870
setpayload_test
48584871
SUITE
@@ -4913,6 +4926,19 @@ add_fp_unittest(
49134926
libc.src.math.setpayloadf128
49144927
)
49154928

4929+
add_fp_unittest(
4930+
setpayloadbf16_test
4931+
SUITE
4932+
libc-math-smoke-tests
4933+
SRCS
4934+
setpayloadbf16_test.cpp
4935+
HDRS
4936+
SetPayloadTest.h
4937+
DEPENDS
4938+
libc.src.math.setpayloadbf16
4939+
libc.src.__support.FPUtil.bfloat16
4940+
)
4941+
49164942
add_fp_unittest(
49174943
setpayloadsig_test
49184944
SUITE
@@ -4973,6 +4999,18 @@ add_fp_unittest(
49734999
libc.src.math.setpayloadsigf128
49745000
)
49755001

5002+
add_fp_unittest(
5003+
setpayloadsigbf16_test
5004+
SUITE
5005+
libc-math-smoke-tests
5006+
SRCS
5007+
setpayloadsigbf16_test.cpp
5008+
HDRS
5009+
SetPayloadTest.h
5010+
DEPENDS
5011+
libc.src.math.setpayloadsigbf16
5012+
libc.src.__support.FPUtil.bfloat16
5013+
)
49765014

49775015
add_fp_unittest(
49785016
f16add_test

libc/test/src/math/smoke/GetPayloadTest.h

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,50 @@ class GetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
5151
EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, sNaN));
5252
EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, neg_sNaN));
5353

54-
T qnan_42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val();
55-
T neg_qnan_42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val();
56-
T snan_42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
57-
T neg_snan_42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();
58-
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, qnan_42));
59-
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_qnan_42));
60-
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, snan_42));
61-
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_snan_42));
62-
63-
T qnan_123 = FPBits::quiet_nan(Sign::POS, 0x123).get_val();
64-
T neg_qnan_123 = FPBits::quiet_nan(Sign::NEG, 0x123).get_val();
65-
T snan_123 = FPBits::signaling_nan(Sign::POS, 0x123).get_val();
66-
T neg_snan_123 = FPBits::signaling_nan(Sign::NEG, 0x123).get_val();
67-
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, qnan_123));
68-
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_qnan_123));
69-
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, snan_123));
70-
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_snan_123));
54+
if constexpr (FPBits::FRACTION_LEN - 1 >= 6) {
55+
// [S] [E..E] [QM..M] -> number of M bits should be at least 6
56+
// 0x31 = 0b110001 = 6 bits
57+
T qnan_31 = FPBits::quiet_nan(Sign::POS, 0x31).get_val();
58+
T neg_qnan_31 = FPBits::quiet_nan(Sign::NEG, 0x31).get_val();
59+
T snan_31 = FPBits::signaling_nan(Sign::POS, 0x31).get_val();
60+
T neg_snan_31 = FPBits::signaling_nan(Sign::NEG, 0x31).get_val();
61+
EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, qnan_31));
62+
EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, neg_qnan_31));
63+
EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, snan_31));
64+
EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, neg_snan_31));
65+
66+
// 0x15 = 0b10101 = 5 bits
67+
T qnan_15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val();
68+
T neg_qnan_15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val();
69+
T snan_15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val();
70+
T neg_snan_15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val();
71+
EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, qnan_15));
72+
EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, neg_qnan_15));
73+
EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, snan_15));
74+
EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, neg_snan_15));
75+
}
76+
77+
if constexpr (FPBits::FRACTION_LEN - 1 >= 7) {
78+
T qnan_42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val();
79+
T neg_qnan_42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val();
80+
T snan_42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
81+
T neg_snan_42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();
82+
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, qnan_42));
83+
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_qnan_42));
84+
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, snan_42));
85+
EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_snan_42));
86+
}
87+
88+
if constexpr (FPBits::FRACTION_LEN - 1 >= 9) {
89+
T qnan_123 = FPBits::quiet_nan(Sign::POS, 0x123).get_val();
90+
T neg_qnan_123 = FPBits::quiet_nan(Sign::NEG, 0x123).get_val();
91+
T snan_123 = FPBits::signaling_nan(Sign::POS, 0x123).get_val();
92+
T neg_snan_123 = FPBits::signaling_nan(Sign::NEG, 0x123).get_val();
93+
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, qnan_123));
94+
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_qnan_123));
95+
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, snan_123));
96+
EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_snan_123));
97+
}
7198
}
7299
};
73100

libc/test/src/math/smoke/SetPayloadSigTest.h

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,31 @@ class SetPayloadSigTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
5454
EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 1).uintval(),
5555
FPBits(res).uintval());
5656

57-
EXPECT_EQ(0, func(&res, T(0x42.0p+0)));
58-
EXPECT_TRUE(FPBits(res).is_signaling_nan());
59-
EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x42).uintval(),
60-
FPBits(res).uintval());
61-
62-
EXPECT_EQ(0, func(&res, T(0x123.0p+0)));
63-
EXPECT_TRUE(FPBits(res).is_signaling_nan());
64-
EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x123).uintval(),
65-
FPBits(res).uintval());
57+
if constexpr (FPBits::FRACTION_LEN - 1 >= 6) {
58+
EXPECT_EQ(0, func(&res, T(0x31.0p+0)));
59+
EXPECT_TRUE(FPBits(res).is_signaling_nan());
60+
EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x31).uintval(),
61+
FPBits(res).uintval());
62+
63+
EXPECT_EQ(0, func(&res, T(0x15.0p+0)));
64+
EXPECT_TRUE(FPBits(res).is_signaling_nan());
65+
EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x15).uintval(),
66+
FPBits(res).uintval());
67+
}
68+
69+
if constexpr (FPBits::FRACTION_LEN - 1 >= 7) {
70+
EXPECT_EQ(0, func(&res, T(0x42.0p+0)));
71+
EXPECT_TRUE(FPBits(res).is_signaling_nan());
72+
EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x42).uintval(),
73+
FPBits(res).uintval());
74+
}
75+
76+
if constexpr (FPBits::FRACTION_LEN - 1 >= 9) {
77+
EXPECT_EQ(0, func(&res, T(0x123.0p+0)));
78+
EXPECT_TRUE(FPBits(res).is_signaling_nan());
79+
EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x123).uintval(),
80+
FPBits(res).uintval());
81+
}
6682

6783
FPBits nan_payload_bits = FPBits::one();
6884
nan_payload_bits.set_biased_exponent(FPBits::FRACTION_LEN - 2 +

libc/test/src/math/smoke/SetPayloadTest.h

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,31 @@ class SetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
5454
EXPECT_TRUE(FPBits(res).is_quiet_nan());
5555
EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 1).uintval(), FPBits(res).uintval());
5656

57-
EXPECT_EQ(0, func(&res, T(0x42.0p+0)));
58-
EXPECT_TRUE(FPBits(res).is_quiet_nan());
59-
EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x42).uintval(),
60-
FPBits(res).uintval());
61-
62-
EXPECT_EQ(0, func(&res, T(0x123.0p+0)));
63-
EXPECT_TRUE(FPBits(res).is_quiet_nan());
64-
EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x123).uintval(),
65-
FPBits(res).uintval());
57+
if constexpr (FPBits::FRACTION_LEN - 1 >= 6) {
58+
EXPECT_EQ(0, func(&res, T(0x31.0p+0)));
59+
EXPECT_TRUE(FPBits(res).is_quiet_nan());
60+
EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x31).uintval(),
61+
FPBits(res).uintval());
62+
63+
EXPECT_EQ(0, func(&res, T(0x15.0p+0)));
64+
EXPECT_TRUE(FPBits(res).is_quiet_nan());
65+
EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x15).uintval(),
66+
FPBits(res).uintval());
67+
}
68+
69+
if constexpr (FPBits::FRACTION_LEN - 1 >= 7) {
70+
EXPECT_EQ(0, func(&res, T(0x42.0p+0)));
71+
EXPECT_TRUE(FPBits(res).is_quiet_nan());
72+
EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x42).uintval(),
73+
FPBits(res).uintval());
74+
}
75+
76+
if constexpr (FPBits::FRACTION_LEN - 1 >= 9) {
77+
EXPECT_EQ(0, func(&res, T(0x123.0p+0)));
78+
EXPECT_TRUE(FPBits(res).is_quiet_nan());
79+
EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x123).uintval(),
80+
FPBits(res).uintval());
81+
}
6682

6783
// The following code is creating a NaN payload manually to prevent a
6884
// conversion from BigInt to float128.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//===-- Unittests for getpayloadbf16 --------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "GetPayloadTest.h"
10+
11+
#include "src/__support/FPUtil/bfloat16.h"
12+
#include "src/math/getpayloadbf16.h"
13+
14+
LIST_GETPAYLOAD_TESTS(bfloat16, LIBC_NAMESPACE::getpayloadbf16)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//===-- Unittests for setpayloadbf16 --------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "SetPayloadTest.h"
10+
11+
#include "src/__support/FPUtil/bfloat16.h"
12+
#include "src/math/setpayloadbf16.h"
13+
14+
LIST_SETPAYLOAD_TESTS(bfloat16, LIBC_NAMESPACE::setpayloadbf16)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//===-- Unittests for setpayloadsigbf16 -----------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "SetPayloadSigTest.h"
10+
11+
#include "src/__support/FPUtil/bfloat16.h"
12+
#include "src/math/setpayloadsigbf16.h"
13+
14+
LIST_SETPAYLOADSIG_TESTS(bfloat16, LIBC_NAMESPACE::setpayloadsigbf16)

0 commit comments

Comments
 (0)