brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 2fdb594 Raw
104 lines · c
1//===-- Utility class to test different flavors of remquo -------*- 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 LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H10#define LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H11 12#include "src/__support/FPUtil/FPBits.h"13#include "test/UnitTest/FEnvSafeTest.h"14#include "test/UnitTest/FPMatcher.h"15#include "test/UnitTest/Test.h"16 17using LIBC_NAMESPACE::Sign;18 19template <typename T>20class RemQuoTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {21  using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;22  using StorageType = typename FPBits::StorageType;23 24  const T inf = FPBits::inf(Sign::POS).get_val();25  const T neg_inf = FPBits::inf(Sign::NEG).get_val();26  const T zero = FPBits::zero(Sign::POS).get_val();27  const T neg_zero = FPBits::zero(Sign::NEG).get_val();28  const T nan = FPBits::quiet_nan().get_val();29 30public:31  typedef T (*RemQuoFunc)(T, T, int *);32 33  void testSpecialNumbers(RemQuoFunc func) {34    int quotient;35    T x, y;36 37    y = T(1.0);38    x = inf;39    EXPECT_FP_EQ(nan, func(x, y, &quotient));40    x = neg_inf;41    EXPECT_FP_EQ(nan, func(x, y, &quotient));42 43    x = T(1.0);44    y = zero;45    EXPECT_FP_EQ(nan, func(x, y, &quotient));46    y = neg_zero;47    EXPECT_FP_EQ(nan, func(x, y, &quotient));48 49    y = nan;50    x = T(1.0);51    EXPECT_FP_EQ(nan, func(x, y, &quotient));52 53    y = T(1.0);54    x = nan;55    EXPECT_FP_EQ(nan, func(x, y, &quotient));56 57    x = nan;58    y = nan;59    EXPECT_FP_EQ(nan, func(x, y, &quotient));60 61    x = zero;62    y = T(1.0);63    EXPECT_FP_EQ(func(x, y, &quotient), zero);64 65    x = neg_zero;66    y = T(1.0);67    EXPECT_FP_EQ(func(x, y, &quotient), neg_zero);68 69    x = T(1.125);70    y = inf;71    EXPECT_FP_EQ(func(x, y, &quotient), x);72    EXPECT_EQ(quotient, 0);73  }74 75  void testEqualNumeratorAndDenominator(RemQuoFunc func) {76    T x = T(1.125), y = T(1.125);77    int q;78 79    // When the remainder is zero, the standard requires it to80    // have the same sign as x.81 82    EXPECT_FP_EQ(func(x, y, &q), zero);83    EXPECT_EQ(q, 1);84 85    EXPECT_FP_EQ(func(x, -y, &q), zero);86    EXPECT_EQ(q, -1);87 88    EXPECT_FP_EQ(func(-x, y, &q), neg_zero);89    EXPECT_EQ(q, -1);90 91    EXPECT_FP_EQ(func(-x, -y, &q), neg_zero);92    EXPECT_EQ(q, 1);93  }94};95 96#define LIST_REMQUO_TESTS(T, func)                                             \97  using LlvmLibcRemQuoTest = RemQuoTestTemplate<T>;                            \98  TEST_F(LlvmLibcRemQuoTest, SpecialNumbers) { testSpecialNumbers(&func); }    \99  TEST_F(LlvmLibcRemQuoTest, EqualNumeratorAndDenominator) {                   \100    testEqualNumeratorAndDenominator(&func);                                   \101  }102 103#endif // LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H104