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