xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/GetPayloadTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test different flavors of getpayload ---*- C++ -*-===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #ifndef LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H
10*71db0c75SAndroid Build Coastguard Worker #define LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H
11*71db0c75SAndroid Build Coastguard Worker 
12*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FEnvSafeTest.h"
13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h"
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
15*71db0c75SAndroid Build Coastguard Worker 
16*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::Sign;
17*71db0c75SAndroid Build Coastguard Worker 
18*71db0c75SAndroid Build Coastguard Worker template <typename T>
19*71db0c75SAndroid Build Coastguard Worker class GetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker   DECLARE_SPECIAL_CONSTANTS(T)
22*71db0c75SAndroid Build Coastguard Worker 
23*71db0c75SAndroid Build Coastguard Worker public:
24*71db0c75SAndroid Build Coastguard Worker   typedef T (*GetPayloadFunc)(const T *);
25*71db0c75SAndroid Build Coastguard Worker 
funcWrapper(GetPayloadFunc func,T x)26*71db0c75SAndroid Build Coastguard Worker   T funcWrapper(GetPayloadFunc func, T x) { return func(&x); }
27*71db0c75SAndroid Build Coastguard Worker 
testNonNaNs(GetPayloadFunc func)28*71db0c75SAndroid Build Coastguard Worker   void testNonNaNs(GetPayloadFunc func) {
29*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(0.0)));
30*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(-0.0)));
31*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(0.1)));
32*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(-0.1)));
33*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(123.38)));
34*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, T(-123.38)));
35*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, inf));
36*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(-1.0), funcWrapper(func, neg_inf));
37*71db0c75SAndroid Build Coastguard Worker   }
38*71db0c75SAndroid Build Coastguard Worker 
testNaNs(GetPayloadFunc func)39*71db0c75SAndroid Build Coastguard Worker   void testNaNs(GetPayloadFunc func) {
40*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0.0), funcWrapper(func, aNaN));
41*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0.0), funcWrapper(func, neg_aNaN));
42*71db0c75SAndroid Build Coastguard Worker 
43*71db0c75SAndroid Build Coastguard Worker     // Essentially this:
44*71db0c75SAndroid Build Coastguard Worker     //   T default_snan_payload = StorageType(1) << (FPBits::FRACTION_LEN - 2);
45*71db0c75SAndroid Build Coastguard Worker     // but supports StorageType being a BigInt.
46*71db0c75SAndroid Build Coastguard Worker     FPBits default_snan_payload_bits = FPBits::one();
47*71db0c75SAndroid Build Coastguard Worker     default_snan_payload_bits.set_biased_exponent(FPBits::FRACTION_LEN - 2 +
48*71db0c75SAndroid Build Coastguard Worker                                                   FPBits::EXP_BIAS);
49*71db0c75SAndroid Build Coastguard Worker     T default_snan_payload = default_snan_payload_bits.get_val();
50*71db0c75SAndroid Build Coastguard Worker 
51*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, sNaN));
52*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, neg_sNaN));
53*71db0c75SAndroid Build Coastguard Worker 
54*71db0c75SAndroid Build Coastguard Worker     T qnan_42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val();
55*71db0c75SAndroid Build Coastguard Worker     T neg_qnan_42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val();
56*71db0c75SAndroid Build Coastguard Worker     T snan_42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
57*71db0c75SAndroid Build Coastguard Worker     T neg_snan_42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();
58*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, qnan_42));
59*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_qnan_42));
60*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, snan_42));
61*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_snan_42));
62*71db0c75SAndroid Build Coastguard Worker 
63*71db0c75SAndroid Build Coastguard Worker     T qnan_123 = FPBits::quiet_nan(Sign::POS, 0x123).get_val();
64*71db0c75SAndroid Build Coastguard Worker     T neg_qnan_123 = FPBits::quiet_nan(Sign::NEG, 0x123).get_val();
65*71db0c75SAndroid Build Coastguard Worker     T snan_123 = FPBits::signaling_nan(Sign::POS, 0x123).get_val();
66*71db0c75SAndroid Build Coastguard Worker     T neg_snan_123 = FPBits::signaling_nan(Sign::NEG, 0x123).get_val();
67*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, qnan_123));
68*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_qnan_123));
69*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, snan_123));
70*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_snan_123));
71*71db0c75SAndroid Build Coastguard Worker   }
72*71db0c75SAndroid Build Coastguard Worker };
73*71db0c75SAndroid Build Coastguard Worker 
74*71db0c75SAndroid Build Coastguard Worker #define LIST_GETPAYLOAD_TESTS(T, func)                                         \
75*71db0c75SAndroid Build Coastguard Worker   using LlvmLibcGetPayloadTest = GetPayloadTestTemplate<T>;                    \
76*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcGetPayloadTest, NonNaNs) { testNonNaNs(&func); }              \
77*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcGetPayloadTest, NaNs) { testNaNs(&func); }
78*71db0c75SAndroid Build Coastguard Worker 
79*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H
80