brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · 50aac20 Raw
162 lines · c
1//===-- Utility class to test different flavors of totalorder ---*- 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_TOTALORDERTEST_H10#define LIBC_TEST_SRC_MATH_SMOKE_TOTALORDERTEST_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 TotalOrderTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {20 21  DECLARE_SPECIAL_CONSTANTS(T)22 23public:24  typedef int (*TotalOrderFunc)(const T *, const T *);25 26  bool funcWrapper(TotalOrderFunc func, T x, T y) { return func(&x, &y) != 0; }27 28  void testXLesserThanY(TotalOrderFunc func) {29    EXPECT_TRUE(funcWrapper(func, neg_inf, inf));30 31    EXPECT_TRUE(funcWrapper(func, T(0.0), T(0.1)));32    EXPECT_TRUE(funcWrapper(func, T(0.0), T(123.38)));33 34    EXPECT_TRUE(funcWrapper(func, T(-0.1), T(0.0)));35    EXPECT_TRUE(funcWrapper(func, T(-123.38), T(0.0)));36 37    EXPECT_TRUE(funcWrapper(func, T(-0.1), T(0.1)));38    EXPECT_TRUE(funcWrapper(func, T(-123.38), T(123.38)));39  }40 41  void testXGreaterThanY(TotalOrderFunc func) {42    EXPECT_FALSE(funcWrapper(func, inf, neg_inf));43 44    EXPECT_FALSE(funcWrapper(func, T(0.0), T(-0.1)));45    EXPECT_FALSE(funcWrapper(func, T(0.0), T(-123.38)));46 47    EXPECT_FALSE(funcWrapper(func, T(0.1), T(0.0)));48    EXPECT_FALSE(funcWrapper(func, T(123.38), T(0.0)));49 50    EXPECT_FALSE(funcWrapper(func, T(0.1), T(-0.1)));51    EXPECT_FALSE(funcWrapper(func, T(123.38), T(-123.38)));52  }53 54  void testXEqualToY(TotalOrderFunc func) {55    EXPECT_TRUE(funcWrapper(func, inf, inf));56    EXPECT_TRUE(funcWrapper(func, neg_inf, neg_inf));57 58    EXPECT_TRUE(funcWrapper(func, T(-0.0), T(0.0)));59    EXPECT_FALSE(funcWrapper(func, T(0.0), T(-0.0)));60 61    EXPECT_TRUE(funcWrapper(func, T(0.0), T(0.0)));62    EXPECT_TRUE(funcWrapper(func, T(-0.0), T(-0.0)));63    EXPECT_TRUE(funcWrapper(func, T(0.1), T(0.1)));64    EXPECT_TRUE(funcWrapper(func, T(-0.1), T(-0.1)));65    EXPECT_TRUE(funcWrapper(func, T(123.38), T(123.38)));66    EXPECT_TRUE(funcWrapper(func, T(-123.38), T(-123.38)));67  }68 69  void testSingleNaN(TotalOrderFunc func) {70    EXPECT_TRUE(funcWrapper(func, neg_aNaN, T(0.0)));71    EXPECT_TRUE(funcWrapper(func, neg_aNaN, T(0.1)));72    EXPECT_TRUE(funcWrapper(func, neg_aNaN, T(123.38)));73 74    EXPECT_FALSE(funcWrapper(func, T(0.0), neg_aNaN));75    EXPECT_FALSE(funcWrapper(func, T(0.1), neg_aNaN));76    EXPECT_FALSE(funcWrapper(func, T(123.38), neg_aNaN));77 78    EXPECT_TRUE(funcWrapper(func, T(0.0), aNaN));79    EXPECT_TRUE(funcWrapper(func, T(0.1), aNaN));80    EXPECT_TRUE(funcWrapper(func, T(123.38), aNaN));81 82    EXPECT_FALSE(funcWrapper(func, aNaN, T(0.0)));83    EXPECT_FALSE(funcWrapper(func, aNaN, T(0.1)));84    EXPECT_FALSE(funcWrapper(func, aNaN, T(123.38)));85  }86 87  void testNaNSigns(TotalOrderFunc func) {88    EXPECT_TRUE(funcWrapper(func, neg_aNaN, aNaN));89    EXPECT_TRUE(funcWrapper(func, neg_aNaN, sNaN));90    EXPECT_TRUE(funcWrapper(func, neg_sNaN, aNaN));91    EXPECT_TRUE(funcWrapper(func, neg_sNaN, sNaN));92 93    EXPECT_FALSE(funcWrapper(func, aNaN, neg_aNaN));94    EXPECT_FALSE(funcWrapper(func, aNaN, neg_sNaN));95    EXPECT_FALSE(funcWrapper(func, sNaN, neg_aNaN));96    EXPECT_FALSE(funcWrapper(func, sNaN, neg_sNaN));97  }98 99  void testQuietVsSignalingNaN(TotalOrderFunc func) {100    EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_sNaN));101    EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_aNaN));102    EXPECT_TRUE(funcWrapper(func, sNaN, aNaN));103    EXPECT_FALSE(funcWrapper(func, aNaN, sNaN));104  }105 106  void testNaNPayloads(TotalOrderFunc func) {107    EXPECT_TRUE(funcWrapper(func, aNaN, aNaN));108    EXPECT_TRUE(funcWrapper(func, sNaN, sNaN));109 110    EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN));111    EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN));112 113    if constexpr (FPBits::FRACTION_LEN - 1 >= 5) {114      T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val();115      T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val();116      T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val();117      T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val();118 119      EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x15));120      EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x15));121      EXPECT_FALSE(funcWrapper(func, qnan_0x15, aNaN));122      EXPECT_TRUE(funcWrapper(func, snan_0x15, sNaN));123 124      EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x15));125      EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x15));126      EXPECT_TRUE(funcWrapper(func, neg_qnan_0x15, neg_aNaN));127      EXPECT_FALSE(funcWrapper(func, neg_snan_0x15, neg_sNaN));128    }129 130    if constexpr (FPBits::FRACTION_LEN - 1 >= 7) {131      T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val();132      T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val();133      T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();134      T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();135 136      EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42));137      EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42));138      EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN));139      EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN));140 141      EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x42));142      EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x42));143      EXPECT_TRUE(funcWrapper(func, neg_qnan_0x42, neg_aNaN));144      EXPECT_FALSE(funcWrapper(func, neg_snan_0x42, neg_sNaN));145    }146  }147};148 149#define LIST_TOTALORDER_TESTS(T, func)                                         \150  using LlvmLibcTotalOrderTest = TotalOrderTestTemplate<T>;                    \151  TEST_F(LlvmLibcTotalOrderTest, XLesserThanY) { testXLesserThanY(&func); }    \152  TEST_F(LlvmLibcTotalOrderTest, XGreaterThanY) { testXGreaterThanY(&func); }  \153  TEST_F(LlvmLibcTotalOrderTest, XEqualToY) { testXEqualToY(&func); }          \154  TEST_F(LlvmLibcTotalOrderTest, SingleNaN) { testSingleNaN(&func); }          \155  TEST_F(LlvmLibcTotalOrderTest, NaNSigns) { testNaNSigns(&func); }            \156  TEST_F(LlvmLibcTotalOrderTest, QuietVsSignalingNaN) {                        \157    testQuietVsSignalingNaN(&func);                                            \158  }                                                                            \159  TEST_F(LlvmLibcTotalOrderTest, NaNPayloads) { testNaNPayloads(&func); }160 161#endif // LIBC_TEST_SRC_MATH_SMOKE_TOTALORDERTEST_H162