1//===-- Utility class to test different flavors of getpayload ---*- C++ -*-===//
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#ifndef LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H
10#define LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H
11
12#include "test/UnitTest/FEnvSafeTest.h"
13#include "test/UnitTest/FPMatcher.h"
14#include "test/UnitTest/Test.h"
15
16using LIBC_NAMESPACE::Sign;
17
18template <typename T>
19class GetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
20
21 DECLARE_SPECIAL_CONSTANTS(T)
22
23public:
24 typedef T (*GetPayloadFunc)(const T *);
25
26 T funcWrapper(GetPayloadFunc func, T x) { return func(&x); }
27
28 void testNonNaNs(GetPayloadFunc func) {
29 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(0.0)));
30 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(-0.0)));
31 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(0.1)));
32 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(-0.1)));
33 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(123.38)));
34 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(-123.38)));
35 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, inf));
36 EXPECT_FP_EQ(T(-1.0), funcWrapper(func, neg_inf));
37 }
38
39 void testNaNs(GetPayloadFunc func) {
40 EXPECT_FP_EQ(T(0.0), funcWrapper(func, aNaN));
41 EXPECT_FP_EQ(T(0.0), funcWrapper(func, neg_aNaN));
42
43 // Essentially this:
44 // T default_snan_payload = StorageType(1) << (FPBits::FRACTION_LEN - 2);
45 // but supports StorageType being a BigInt.
46 FPBits default_snan_payload_bits = FPBits::one();
47 default_snan_payload_bits.set_biased_exponent(FPBits::FRACTION_LEN - 2 +
48 FPBits::EXP_BIAS);
49 T default_snan_payload = default_snan_payload_bits.get_val();
50
51 EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, sNaN));
52 EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, neg_sNaN));
53
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));
71 }
72};
73
74#define LIST_GETPAYLOAD_TESTS(T, func) \
75 using LlvmLibcGetPayloadTest = GetPayloadTestTemplate<T>; \
76 TEST_F(LlvmLibcGetPayloadTest, NonNaNs) { testNonNaNs(&func); } \
77 TEST_F(LlvmLibcGetPayloadTest, NaNs) { testNaNs(&func); }
78
79#endif // LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H
80

source code of libc/test/src/math/smoke/GetPayloadTest.h