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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H
10#define LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H
11
12#include "hdr/math_macros.h"
13#include "src/__support/FPUtil/BasicOperations.h"
14#include "src/__support/FPUtil/FPBits.h"
15#include "test/UnitTest/FEnvSafeTest.h"
16#include "test/UnitTest/FPMatcher.h"
17#include "test/UnitTest/Test.h"
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 to
80 // 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_H
104

source code of libc/test/src/math/smoke/RemQuoTest.h