107 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H10#define LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H11 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 if constexpr (FPBits::FRACTION_LEN - 1 >= 6) {55 // [S] [E..E] [QM..M] -> number of M bits should be at least 656 // 0x31 = 0b110001 = 6 bits57 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 bits67 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 }98 }99};100 101#define LIST_GETPAYLOAD_TESTS(T, func) \102 using LlvmLibcGetPayloadTest = GetPayloadTestTemplate<T>; \103 TEST_F(LlvmLibcGetPayloadTest, NonNaNs) { testNonNaNs(&func); } \104 TEST_F(LlvmLibcGetPayloadTest, NaNs) { testNaNs(&func); }105 106#endif // LIBC_TEST_SRC_MATH_SMOKE_GETPAYLOADTEST_H107