17aeb3804SSiva Chandra Reddy //===-- Utility class to test different flavors of [l|ll]round --*- C++ -*-===//
27aeb3804SSiva Chandra Reddy //
37aeb3804SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47aeb3804SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
57aeb3804SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67aeb3804SSiva Chandra Reddy //
77aeb3804SSiva Chandra Reddy //===----------------------------------------------------------------------===//
87aeb3804SSiva Chandra Reddy 
97aeb3804SSiva Chandra Reddy #ifndef LLVM_LIBC_TEST_SRC_MATH_ROUNDTOINTEGERTEST_H
107aeb3804SSiva Chandra Reddy #define LLVM_LIBC_TEST_SRC_MATH_ROUNDTOINTEGERTEST_H
117aeb3804SSiva Chandra Reddy 
12ffb410d3STue Ly #include "src/__support/FPUtil/FEnvImpl.h"
13c120edc7SMichael Jones #include "src/__support/FPUtil/FPBits.h"
147aeb3804SSiva Chandra Reddy #include "utils/MPFRWrapper/MPFRUtils.h"
15ffb410d3STue Ly #include "utils/UnitTest/FPMatcher.h"
167aeb3804SSiva Chandra Reddy #include "utils/UnitTest/Test.h"
177aeb3804SSiva Chandra Reddy 
187aeb3804SSiva Chandra Reddy #include <errno.h>
19ffb410d3STue Ly #include <math.h>
207aeb3804SSiva Chandra Reddy 
217aeb3804SSiva Chandra Reddy namespace mpfr = __llvm_libc::testing::mpfr;
227aeb3804SSiva Chandra Reddy 
2325226f3eSMichael Jones static constexpr int ROUNDING_MODES[4] = {FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO,
24ff6fd385SSiva Chandra Reddy                                           FE_TONEAREST};
25ff6fd385SSiva Chandra Reddy 
26ff6fd385SSiva Chandra Reddy template <typename F, typename I, bool TestModes = false>
277aeb3804SSiva Chandra Reddy class RoundToIntegerTestTemplate : public __llvm_libc::testing::Test {
287aeb3804SSiva Chandra Reddy public:
297aeb3804SSiva Chandra Reddy   typedef I (*RoundToIntegerFunc)(F);
307aeb3804SSiva Chandra Reddy 
317aeb3804SSiva Chandra Reddy private:
327aeb3804SSiva Chandra Reddy   using FPBits = __llvm_libc::fputil::FPBits<F>;
337aeb3804SSiva Chandra Reddy   using UIntType = typename FPBits::UIntType;
347aeb3804SSiva Chandra Reddy 
35fb706e08SSiva Chandra Reddy   const F zero = F(__llvm_libc::fputil::FPBits<F>::zero());
361c92911eSMichael Jones   const F neg_zero = F(__llvm_libc::fputil::FPBits<F>::neg_zero());
37fb706e08SSiva Chandra Reddy   const F inf = F(__llvm_libc::fputil::FPBits<F>::inf());
381c92911eSMichael Jones   const F neg_inf = F(__llvm_libc::fputil::FPBits<F>::neg_inf());
391c92911eSMichael Jones   const F nan = F(__llvm_libc::fputil::FPBits<F>::build_nan(1));
4025226f3eSMichael Jones   static constexpr I INTEGER_MIN = I(1) << (sizeof(I) * 8 - 1);
4125226f3eSMichael Jones   static constexpr I INTEGER_MAX = -(INTEGER_MIN + 1);
427aeb3804SSiva Chandra Reddy 
test_one_input(RoundToIntegerFunc func,F input,I expected,bool expectError)4325226f3eSMichael Jones   void test_one_input(RoundToIntegerFunc func, F input, I expected,
447aeb3804SSiva Chandra Reddy                       bool expectError) {
45dba14814SSiva Chandra Reddy     errno = 0;
461c92911eSMichael Jones     __llvm_libc::fputil::clear_except(FE_ALL_EXCEPT);
477aeb3804SSiva Chandra Reddy 
487aeb3804SSiva Chandra Reddy     ASSERT_EQ(func(input), expected);
497aeb3804SSiva Chandra Reddy 
507aeb3804SSiva Chandra Reddy     if (expectError) {
51ffb410d3STue Ly       ASSERT_FP_EXCEPTION(FE_INVALID);
52ffb410d3STue Ly       ASSERT_MATH_ERRNO(EDOM);
537aeb3804SSiva Chandra Reddy     } else {
54ffb410d3STue Ly       ASSERT_FP_EXCEPTION(0);
55ffb410d3STue Ly       ASSERT_MATH_ERRNO(0);
567aeb3804SSiva Chandra Reddy     }
577aeb3804SSiva Chandra Reddy   }
587aeb3804SSiva Chandra Reddy 
to_mpfr_rounding_mode(int mode)5925226f3eSMichael Jones   static inline mpfr::RoundingMode to_mpfr_rounding_mode(int mode) {
60ff6fd385SSiva Chandra Reddy     switch (mode) {
61ff6fd385SSiva Chandra Reddy     case FE_UPWARD:
62ff6fd385SSiva Chandra Reddy       return mpfr::RoundingMode::Upward;
63ff6fd385SSiva Chandra Reddy     case FE_DOWNWARD:
64ff6fd385SSiva Chandra Reddy       return mpfr::RoundingMode::Downward;
65ff6fd385SSiva Chandra Reddy     case FE_TOWARDZERO:
66ff6fd385SSiva Chandra Reddy       return mpfr::RoundingMode::TowardZero;
67ff6fd385SSiva Chandra Reddy     case FE_TONEAREST:
68ff6fd385SSiva Chandra Reddy       return mpfr::RoundingMode::Nearest;
69ff6fd385SSiva Chandra Reddy     default:
70ff6fd385SSiva Chandra Reddy       __builtin_unreachable();
71ff6fd385SSiva Chandra Reddy     }
72ff6fd385SSiva Chandra Reddy   }
73ff6fd385SSiva Chandra Reddy 
747aeb3804SSiva Chandra Reddy public:
SetUp()757aeb3804SSiva Chandra Reddy   void SetUp() override {
76*0f031daeSTue Ly     if (math_errhandling & MATH_ERREXCEPT) {
777aeb3804SSiva Chandra Reddy       // We will disable all exceptions so that the test will not
787aeb3804SSiva Chandra Reddy       // crash with SIGFPE. We can still use fetestexcept to check
797aeb3804SSiva Chandra Reddy       // if the appropriate flag was raised.
801c92911eSMichael Jones       __llvm_libc::fputil::disable_except(FE_ALL_EXCEPT);
81*0f031daeSTue Ly     }
827aeb3804SSiva Chandra Reddy   }
837aeb3804SSiva Chandra Reddy 
do_infinity_and_na_n_test(RoundToIntegerFunc func)8425226f3eSMichael Jones   void do_infinity_and_na_n_test(RoundToIntegerFunc func) {
8525226f3eSMichael Jones     test_one_input(func, inf, INTEGER_MAX, true);
8625226f3eSMichael Jones     test_one_input(func, neg_inf, INTEGER_MIN, true);
8725226f3eSMichael Jones     test_one_input(func, nan, INTEGER_MAX, true);
887aeb3804SSiva Chandra Reddy   }
897aeb3804SSiva Chandra Reddy 
testInfinityAndNaN(RoundToIntegerFunc func)90ff6fd385SSiva Chandra Reddy   void testInfinityAndNaN(RoundToIntegerFunc func) {
91ff6fd385SSiva Chandra Reddy     if (TestModes) {
9225226f3eSMichael Jones       for (int mode : ROUNDING_MODES) {
931c92911eSMichael Jones         __llvm_libc::fputil::set_round(mode);
9425226f3eSMichael Jones         do_infinity_and_na_n_test(func);
95ff6fd385SSiva Chandra Reddy       }
96ff6fd385SSiva Chandra Reddy     } else {
9725226f3eSMichael Jones       do_infinity_and_na_n_test(func);
98ff6fd385SSiva Chandra Reddy     }
99ff6fd385SSiva Chandra Reddy   }
100ff6fd385SSiva Chandra Reddy 
do_round_numbers_test(RoundToIntegerFunc func)10125226f3eSMichael Jones   void do_round_numbers_test(RoundToIntegerFunc func) {
10225226f3eSMichael Jones     test_one_input(func, zero, I(0), false);
10325226f3eSMichael Jones     test_one_input(func, neg_zero, I(0), false);
10425226f3eSMichael Jones     test_one_input(func, F(1.0), I(1), false);
10525226f3eSMichael Jones     test_one_input(func, F(-1.0), I(-1), false);
10625226f3eSMichael Jones     test_one_input(func, F(10.0), I(10), false);
10725226f3eSMichael Jones     test_one_input(func, F(-10.0), I(-10), false);
10825226f3eSMichael Jones     test_one_input(func, F(1234.0), I(1234), false);
10925226f3eSMichael Jones     test_one_input(func, F(-1234.0), I(-1234), false);
1107aeb3804SSiva Chandra Reddy 
1117aeb3804SSiva Chandra Reddy     // The rest of this this function compares with an equivalent MPFR function
1127aeb3804SSiva Chandra Reddy     // which rounds floating point numbers to long values. There is no MPFR
1137aeb3804SSiva Chandra Reddy     // function to round to long long or wider integer values. So, we will
1147aeb3804SSiva Chandra Reddy     // the remaining tests only if the width of I less than equal to that of
1157aeb3804SSiva Chandra Reddy     // long.
1167aeb3804SSiva Chandra Reddy     if (sizeof(I) > sizeof(long))
1177aeb3804SSiva Chandra Reddy       return;
1187aeb3804SSiva Chandra Reddy 
11925226f3eSMichael Jones     constexpr int EXPONENT_LIMIT = sizeof(I) * 8 - 1;
1207aeb3804SSiva Chandra Reddy     // We start with 1.0 so that the implicit bit for x86 long doubles
1217aeb3804SSiva Chandra Reddy     // is set.
1227aeb3804SSiva Chandra Reddy     FPBits bits(F(1.0));
12325226f3eSMichael Jones     bits.set_unbiased_exponent(EXPONENT_LIMIT + FPBits::EXPONENT_BIAS);
1241c92911eSMichael Jones     bits.set_sign(1);
1251c92911eSMichael Jones     bits.set_mantissa(0);
1267aeb3804SSiva Chandra Reddy 
127fb706e08SSiva Chandra Reddy     F x = F(bits);
12825226f3eSMichael Jones     long mpfr_result;
12960509623SSiva Chandra Reddy     bool erangeflag = mpfr::round_to_long(x, mpfr_result);
1307aeb3804SSiva Chandra Reddy     ASSERT_FALSE(erangeflag);
13125226f3eSMichael Jones     test_one_input(func, x, mpfr_result, false);
1327aeb3804SSiva Chandra Reddy   }
1337aeb3804SSiva Chandra Reddy 
testRoundNumbers(RoundToIntegerFunc func)134ff6fd385SSiva Chandra Reddy   void testRoundNumbers(RoundToIntegerFunc func) {
135ff6fd385SSiva Chandra Reddy     if (TestModes) {
13625226f3eSMichael Jones       for (int mode : ROUNDING_MODES) {
1371c92911eSMichael Jones         __llvm_libc::fputil::set_round(mode);
13825226f3eSMichael Jones         do_round_numbers_test(func);
139ff6fd385SSiva Chandra Reddy       }
140ff6fd385SSiva Chandra Reddy     } else {
14125226f3eSMichael Jones       do_round_numbers_test(func);
142ff6fd385SSiva Chandra Reddy     }
143ff6fd385SSiva Chandra Reddy   }
144ff6fd385SSiva Chandra Reddy 
do_fractions_test(RoundToIntegerFunc func,int mode)14525226f3eSMichael Jones   void do_fractions_test(RoundToIntegerFunc func, int mode) {
14625226f3eSMichael Jones     constexpr F FRACTIONS[] = {0.5, -0.5, 0.115, -0.115, 0.715, -0.715};
14725226f3eSMichael Jones     for (F x : FRACTIONS) {
14825226f3eSMichael Jones       long mpfr_long_result;
149ff6fd385SSiva Chandra Reddy       bool erangeflag;
150ff6fd385SSiva Chandra Reddy       if (TestModes)
15160509623SSiva Chandra Reddy         erangeflag = mpfr::round_to_long(x, to_mpfr_rounding_mode(mode),
15260509623SSiva Chandra Reddy                                          mpfr_long_result);
153ff6fd385SSiva Chandra Reddy       else
15460509623SSiva Chandra Reddy         erangeflag = mpfr::round_to_long(x, mpfr_long_result);
155ff6fd385SSiva Chandra Reddy       ASSERT_FALSE(erangeflag);
15625226f3eSMichael Jones       I mpfr_result = mpfr_long_result;
15725226f3eSMichael Jones       test_one_input(func, x, mpfr_result, false);
158ff6fd385SSiva Chandra Reddy     }
159ff6fd385SSiva Chandra Reddy   }
160ff6fd385SSiva Chandra Reddy 
testFractions(RoundToIntegerFunc func)1617aeb3804SSiva Chandra Reddy   void testFractions(RoundToIntegerFunc func) {
162ff6fd385SSiva Chandra Reddy     if (TestModes) {
16325226f3eSMichael Jones       for (int mode : ROUNDING_MODES) {
1641c92911eSMichael Jones         __llvm_libc::fputil::set_round(mode);
16525226f3eSMichael Jones         do_fractions_test(func, mode);
166ff6fd385SSiva Chandra Reddy       }
167ff6fd385SSiva Chandra Reddy     } else {
168ff6fd385SSiva Chandra Reddy       // Passing 0 for mode has no effect as it is not used in doFractionsTest
169ff6fd385SSiva Chandra Reddy       // when `TestModes` is false;
17025226f3eSMichael Jones       do_fractions_test(func, 0);
171ff6fd385SSiva Chandra Reddy     }
1727aeb3804SSiva Chandra Reddy   }
1737aeb3804SSiva Chandra Reddy 
testIntegerOverflow(RoundToIntegerFunc func)1747aeb3804SSiva Chandra Reddy   void testIntegerOverflow(RoundToIntegerFunc func) {
1757aeb3804SSiva Chandra Reddy     // This function compares with an equivalent MPFR function which rounds
1767aeb3804SSiva Chandra Reddy     // floating point numbers to long values. There is no MPFR function to
1777aeb3804SSiva Chandra Reddy     // round to long long or wider integer values. So, we will peform the
1787aeb3804SSiva Chandra Reddy     // comparisons in this function only if the width of I less than equal to
1797aeb3804SSiva Chandra Reddy     // that of long.
1807aeb3804SSiva Chandra Reddy     if (sizeof(I) > sizeof(long))
1817aeb3804SSiva Chandra Reddy       return;
1827aeb3804SSiva Chandra Reddy 
18325226f3eSMichael Jones     constexpr int EXPONENT_LIMIT = sizeof(I) * 8 - 1;
1847aeb3804SSiva Chandra Reddy     // We start with 1.0 so that the implicit bit for x86 long doubles
1857aeb3804SSiva Chandra Reddy     // is set.
1867aeb3804SSiva Chandra Reddy     FPBits bits(F(1.0));
18725226f3eSMichael Jones     bits.set_unbiased_exponent(EXPONENT_LIMIT + FPBits::EXPONENT_BIAS);
1881c92911eSMichael Jones     bits.set_sign(1);
1891c92911eSMichael Jones     bits.set_mantissa(UIntType(0x1)
1901c92911eSMichael Jones                       << (__llvm_libc::fputil::MantissaWidth<F>::VALUE - 1));
1917aeb3804SSiva Chandra Reddy 
192fb706e08SSiva Chandra Reddy     F x = F(bits);
193ff6fd385SSiva Chandra Reddy     if (TestModes) {
19425226f3eSMichael Jones       for (int m : ROUNDING_MODES) {
1951c92911eSMichael Jones         __llvm_libc::fputil::set_round(m);
19625226f3eSMichael Jones         long mpfr_long_result;
197ff6fd385SSiva Chandra Reddy         bool erangeflag =
19860509623SSiva Chandra Reddy             mpfr::round_to_long(x, to_mpfr_rounding_mode(m), mpfr_long_result);
1997aeb3804SSiva Chandra Reddy         ASSERT_TRUE(erangeflag);
20025226f3eSMichael Jones         test_one_input(func, x, INTEGER_MIN, true);
2017aeb3804SSiva Chandra Reddy       }
202ff6fd385SSiva Chandra Reddy     } else {
20325226f3eSMichael Jones       long mpfr_long_result;
20460509623SSiva Chandra Reddy       bool erangeflag = mpfr::round_to_long(x, mpfr_long_result);
205ff6fd385SSiva Chandra Reddy       ASSERT_TRUE(erangeflag);
20625226f3eSMichael Jones       test_one_input(func, x, INTEGER_MIN, true);
207ff6fd385SSiva Chandra Reddy     }
208ff6fd385SSiva Chandra Reddy   }
2097aeb3804SSiva Chandra Reddy 
testSubnormalRange(RoundToIntegerFunc func)2107aeb3804SSiva Chandra Reddy   void testSubnormalRange(RoundToIntegerFunc func) {
21125226f3eSMichael Jones     constexpr UIntType COUNT = 1000001;
21225226f3eSMichael Jones     constexpr UIntType STEP =
21325226f3eSMichael Jones         (FPBits::MAX_SUBNORMAL - FPBits::MIN_SUBNORMAL) / COUNT;
2141c92911eSMichael Jones     for (UIntType i = FPBits::MIN_SUBNORMAL; i <= FPBits::MAX_SUBNORMAL;
21525226f3eSMichael Jones          i += STEP) {
216fb706e08SSiva Chandra Reddy       F x = F(FPBits(i));
217ff6fd385SSiva Chandra Reddy       if (x == F(0.0))
218ff6fd385SSiva Chandra Reddy         continue;
2197aeb3804SSiva Chandra Reddy       // All subnormal numbers should round to zero.
220ff6fd385SSiva Chandra Reddy       if (TestModes) {
221ff6fd385SSiva Chandra Reddy         if (x > 0) {
2221c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_UPWARD);
22325226f3eSMichael Jones           test_one_input(func, x, I(1), false);
2241c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_DOWNWARD);
22525226f3eSMichael Jones           test_one_input(func, x, I(0), false);
2261c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_TOWARDZERO);
22725226f3eSMichael Jones           test_one_input(func, x, I(0), false);
2281c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_TONEAREST);
22925226f3eSMichael Jones           test_one_input(func, x, I(0), false);
230ff6fd385SSiva Chandra Reddy         } else {
2311c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_UPWARD);
23225226f3eSMichael Jones           test_one_input(func, x, I(0), false);
2331c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_DOWNWARD);
23425226f3eSMichael Jones           test_one_input(func, x, I(-1), false);
2351c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_TOWARDZERO);
23625226f3eSMichael Jones           test_one_input(func, x, I(0), false);
2371c92911eSMichael Jones           __llvm_libc::fputil::set_round(FE_TONEAREST);
23825226f3eSMichael Jones           test_one_input(func, x, I(0), false);
239ff6fd385SSiva Chandra Reddy         }
240ff6fd385SSiva Chandra Reddy       } else {
24125226f3eSMichael Jones         test_one_input(func, x, 0L, false);
2427aeb3804SSiva Chandra Reddy       }
2437aeb3804SSiva Chandra Reddy     }
244ff6fd385SSiva Chandra Reddy   }
2457aeb3804SSiva Chandra Reddy 
testNormalRange(RoundToIntegerFunc func)2467aeb3804SSiva Chandra Reddy   void testNormalRange(RoundToIntegerFunc func) {
2477aeb3804SSiva Chandra Reddy     // This function compares with an equivalent MPFR function which rounds
2487aeb3804SSiva Chandra Reddy     // floating point numbers to long values. There is no MPFR function to
2497aeb3804SSiva Chandra Reddy     // round to long long or wider integer values. So, we will peform the
2507aeb3804SSiva Chandra Reddy     // comparisons in this function only if the width of I less than equal to
2517aeb3804SSiva Chandra Reddy     // that of long.
2527aeb3804SSiva Chandra Reddy     if (sizeof(I) > sizeof(long))
2537aeb3804SSiva Chandra Reddy       return;
2547aeb3804SSiva Chandra Reddy 
25525226f3eSMichael Jones     constexpr UIntType COUNT = 1000001;
25625226f3eSMichael Jones     constexpr UIntType STEP = (FPBits::MAX_NORMAL - FPBits::MIN_NORMAL) / COUNT;
25725226f3eSMichael Jones     for (UIntType i = FPBits::MIN_NORMAL; i <= FPBits::MAX_NORMAL; i += STEP) {
258fb706e08SSiva Chandra Reddy       F x = F(FPBits(i));
2597aeb3804SSiva Chandra Reddy       // In normal range on x86 platforms, the long double implicit 1 bit can be
2607aeb3804SSiva Chandra Reddy       // zero making the numbers NaN. We will skip them.
2617aeb3804SSiva Chandra Reddy       if (isnan(x)) {
2627aeb3804SSiva Chandra Reddy         continue;
2637aeb3804SSiva Chandra Reddy       }
2647aeb3804SSiva Chandra Reddy 
265ff6fd385SSiva Chandra Reddy       if (TestModes) {
26625226f3eSMichael Jones         for (int m : ROUNDING_MODES) {
26725226f3eSMichael Jones           long mpfr_long_result;
26860509623SSiva Chandra Reddy           bool erangeflag = mpfr::round_to_long(x, to_mpfr_rounding_mode(m),
26960509623SSiva Chandra Reddy                                                 mpfr_long_result);
27025226f3eSMichael Jones           I mpfr_result = mpfr_long_result;
2711c92911eSMichael Jones           __llvm_libc::fputil::set_round(m);
272ff6fd385SSiva Chandra Reddy           if (erangeflag)
27325226f3eSMichael Jones             test_one_input(func, x, x > 0 ? INTEGER_MAX : INTEGER_MIN, true);
274ff6fd385SSiva Chandra Reddy           else
27525226f3eSMichael Jones             test_one_input(func, x, mpfr_result, false);
276ff6fd385SSiva Chandra Reddy         }
277ff6fd385SSiva Chandra Reddy       } else {
27825226f3eSMichael Jones         long mpfr_long_result;
27960509623SSiva Chandra Reddy         bool erangeflag = mpfr::round_to_long(x, mpfr_long_result);
28025226f3eSMichael Jones         I mpfr_result = mpfr_long_result;
2817aeb3804SSiva Chandra Reddy         if (erangeflag)
28225226f3eSMichael Jones           test_one_input(func, x, x > 0 ? INTEGER_MAX : INTEGER_MIN, true);
2837aeb3804SSiva Chandra Reddy         else
28425226f3eSMichael Jones           test_one_input(func, x, mpfr_result, false);
2857aeb3804SSiva Chandra Reddy       }
2867aeb3804SSiva Chandra Reddy     }
287ff6fd385SSiva Chandra Reddy   }
2887aeb3804SSiva Chandra Reddy };
2897aeb3804SSiva Chandra Reddy 
290ff6fd385SSiva Chandra Reddy #define LIST_ROUND_TO_INTEGER_TESTS_HELPER(F, I, func, TestModes)              \
291689de584SMichael Jones   using LlvmLibcRoundToIntegerTest =                                           \
292689de584SMichael Jones       RoundToIntegerTestTemplate<F, I, TestModes>;                             \
293689de584SMichael Jones   TEST_F(LlvmLibcRoundToIntegerTest, InfinityAndNaN) {                         \
294689de584SMichael Jones     testInfinityAndNaN(&func);                                                 \
295689de584SMichael Jones   }                                                                            \
296689de584SMichael Jones   TEST_F(LlvmLibcRoundToIntegerTest, RoundNumbers) {                           \
297689de584SMichael Jones     testRoundNumbers(&func);                                                   \
298689de584SMichael Jones   }                                                                            \
299689de584SMichael Jones   TEST_F(LlvmLibcRoundToIntegerTest, Fractions) { testFractions(&func); }      \
300689de584SMichael Jones   TEST_F(LlvmLibcRoundToIntegerTest, IntegerOverflow) {                        \
301689de584SMichael Jones     testIntegerOverflow(&func);                                                \
302689de584SMichael Jones   }                                                                            \
303689de584SMichael Jones   TEST_F(LlvmLibcRoundToIntegerTest, SubnormalRange) {                         \
304689de584SMichael Jones     testSubnormalRange(&func);                                                 \
305689de584SMichael Jones   }                                                                            \
306689de584SMichael Jones   TEST_F(LlvmLibcRoundToIntegerTest, NormalRange) { testNormalRange(&func); }
3077aeb3804SSiva Chandra Reddy 
308ff6fd385SSiva Chandra Reddy #define LIST_ROUND_TO_INTEGER_TESTS(F, I, func)                                \
309ff6fd385SSiva Chandra Reddy   LIST_ROUND_TO_INTEGER_TESTS_HELPER(F, I, func, false)
310ff6fd385SSiva Chandra Reddy 
311ff6fd385SSiva Chandra Reddy #define LIST_ROUND_TO_INTEGER_TESTS_WITH_MODES(F, I, func)                     \
312ff6fd385SSiva Chandra Reddy   LIST_ROUND_TO_INTEGER_TESTS_HELPER(F, I, func, true)
313ff6fd385SSiva Chandra Reddy 
3147aeb3804SSiva Chandra Reddy #endif // LLVM_LIBC_TEST_SRC_MATH_ROUNDTOINTEGERTEST_H
315