brintos

brintos / llvm-project-archived public Read only

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