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 16 using LIBC_NAMESPACE::Sign; 17 18 template <typename T> 19 class GetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { 20 21 DECLARE_SPECIAL_CONSTANTS(T) 22 23 public: 24 typedef T (*GetPayloadFunc)(const T *); 25 funcWrapper(GetPayloadFunc func,T x)26 T funcWrapper(GetPayloadFunc func, T x) { return func(&x); } 27 testNonNaNs(GetPayloadFunc func)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 testNaNs(GetPayloadFunc func)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