1*b8e8012aSKirill Okhotnikov //===-- Utility class to test fmod special numbers ------------------------===// 2*b8e8012aSKirill Okhotnikov // 3*b8e8012aSKirill Okhotnikov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*b8e8012aSKirill Okhotnikov // See https://llvm.org/LICENSE.txt for license information. 5*b8e8012aSKirill Okhotnikov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*b8e8012aSKirill Okhotnikov // 7*b8e8012aSKirill Okhotnikov //===----------------------------------------------------------------------===// 8*b8e8012aSKirill Okhotnikov 9*b8e8012aSKirill Okhotnikov #ifndef LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H 10*b8e8012aSKirill Okhotnikov #define LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H 11*b8e8012aSKirill Okhotnikov 12*b8e8012aSKirill Okhotnikov #include "src/__support/FPUtil/BasicOperations.h" 13*b8e8012aSKirill Okhotnikov #include "src/__support/FPUtil/NearestIntegerOperations.h" 14*b8e8012aSKirill Okhotnikov #include "utils/UnitTest/FPMatcher.h" 15*b8e8012aSKirill Okhotnikov #include "utils/UnitTest/Test.h" 16*b8e8012aSKirill Okhotnikov 17*b8e8012aSKirill Okhotnikov #include <limits> 18*b8e8012aSKirill Okhotnikov #include <math.h> 19*b8e8012aSKirill Okhotnikov 20*b8e8012aSKirill Okhotnikov #define TEST_SPECIAL(x, y, expected, dom_err, expected_exception) \ 21*b8e8012aSKirill Okhotnikov EXPECT_FP_EQ(expected, f(x, y)); \ 22*b8e8012aSKirill Okhotnikov EXPECT_MATH_ERRNO((dom_err) ? EDOM : 0); \ 23*b8e8012aSKirill Okhotnikov EXPECT_FP_EXCEPTION(expected_exception); \ 24*b8e8012aSKirill Okhotnikov __llvm_libc::fputil::clear_except(FE_ALL_EXCEPT) 25*b8e8012aSKirill Okhotnikov 26*b8e8012aSKirill Okhotnikov #define TEST_REGULAR(x, y, expected) TEST_SPECIAL(x, y, expected, false, 0) 27*b8e8012aSKirill Okhotnikov 28*b8e8012aSKirill Okhotnikov template <typename T> class FmodTest : public __llvm_libc::testing::Test { 29*b8e8012aSKirill Okhotnikov 30*b8e8012aSKirill Okhotnikov DECLARE_SPECIAL_CONSTANTS(T) 31*b8e8012aSKirill Okhotnikov 32*b8e8012aSKirill Okhotnikov public: 33*b8e8012aSKirill Okhotnikov typedef T (*FModFunc)(T, T); 34*b8e8012aSKirill Okhotnikov testSpecialNumbers(FModFunc f)35*b8e8012aSKirill Okhotnikov void testSpecialNumbers(FModFunc f) { 36*b8e8012aSKirill Okhotnikov using nl = std::numeric_limits<T>; 37*b8e8012aSKirill Okhotnikov 38*b8e8012aSKirill Okhotnikov // fmod (+0, y) == +0 for y != 0. 39*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, 3.0, 0.0, false, 0); 40*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, nl::denorm_min(), 0.0, false, 0); 41*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, -nl::denorm_min(), 0.0, false, 0); 42*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, nl::min(), 0.0, false, 0); 43*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, -nl::min(), 0.0, false, 0); 44*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, nl::max(), 0.0, false, 0); 45*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, -nl::max(), 0.0, false, 0); 46*b8e8012aSKirill Okhotnikov 47*b8e8012aSKirill Okhotnikov // fmod (-0, y) == -0 for y != 0. 48*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, 3.0, neg_zero, false, 0); 49*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, nl::denorm_min(), neg_zero, false, 0); 50*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, -nl::denorm_min(), neg_zero, false, 0); 51*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, nl::min(), neg_zero, false, 0); 52*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, -nl::min(), neg_zero, false, 0); 53*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, nl::max(), neg_zero, false, 0); 54*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, -nl::max(), neg_zero, false, 0); 55*b8e8012aSKirill Okhotnikov 56*b8e8012aSKirill Okhotnikov // fmod (+inf, y) == nl::quiet_NaN() plus invalid exception. 57*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, 3.0, nl::quiet_NaN(), true, FE_INVALID); 58*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, -1.1L, nl::quiet_NaN(), true, FE_INVALID); 59*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, 0.0, nl::quiet_NaN(), true, FE_INVALID); 60*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, neg_zero, nl::quiet_NaN(), true, FE_INVALID); 61*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, nl::denorm_min(), nl::quiet_NaN(), true, FE_INVALID); 62*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, nl::min(), nl::quiet_NaN(), true, FE_INVALID); 63*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, nl::max(), nl::quiet_NaN(), true, FE_INVALID); 64*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, inf, nl::quiet_NaN(), true, FE_INVALID); 65*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, neg_inf, nl::quiet_NaN(), true, FE_INVALID); 66*b8e8012aSKirill Okhotnikov 67*b8e8012aSKirill Okhotnikov // fmod (-inf, y) == nl::quiet_NaN() plus invalid exception. 68*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, 3.0, nl::quiet_NaN(), true, FE_INVALID); 69*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, -1.1L, nl::quiet_NaN(), true, FE_INVALID); 70*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, 0.0, nl::quiet_NaN(), true, FE_INVALID); 71*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, neg_zero, nl::quiet_NaN(), true, FE_INVALID); 72*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, nl::denorm_min(), nl::quiet_NaN(), true, FE_INVALID); 73*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, nl::min(), nl::quiet_NaN(), true, FE_INVALID); 74*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, nl::max(), nl::quiet_NaN(), true, FE_INVALID); 75*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, inf, nl::quiet_NaN(), true, FE_INVALID); 76*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, neg_inf, nl::quiet_NaN(), true, FE_INVALID); 77*b8e8012aSKirill Okhotnikov 78*b8e8012aSKirill Okhotnikov // fmod (x, +0) == nl::quiet_NaN() plus invalid exception. 79*b8e8012aSKirill Okhotnikov TEST_SPECIAL(3.0, 0.0, nl::quiet_NaN(), true, FE_INVALID); 80*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-1.1L, 0.0, nl::quiet_NaN(), true, FE_INVALID); 81*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, 0.0, nl::quiet_NaN(), true, FE_INVALID); 82*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, 0.0, nl::quiet_NaN(), true, FE_INVALID); 83*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), 0.0, nl::quiet_NaN(), true, FE_INVALID); 84*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), 0.0, nl::quiet_NaN(), true, FE_INVALID); 85*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), 0.0, nl::quiet_NaN(), true, FE_INVALID); 86*b8e8012aSKirill Okhotnikov 87*b8e8012aSKirill Okhotnikov // fmod (x, -0) == nl::quiet_NaN() plus invalid exception. 88*b8e8012aSKirill Okhotnikov TEST_SPECIAL(3.0, neg_zero, nl::quiet_NaN(), true, FE_INVALID); 89*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-1.1L, neg_zero, nl::quiet_NaN(), true, FE_INVALID); 90*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, neg_zero, nl::quiet_NaN(), true, FE_INVALID); 91*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, neg_zero, nl::quiet_NaN(), true, FE_INVALID); 92*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), neg_zero, nl::quiet_NaN(), true, FE_INVALID); 93*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), neg_zero, nl::quiet_NaN(), true, FE_INVALID); 94*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), neg_zero, nl::quiet_NaN(), true, FE_INVALID); 95*b8e8012aSKirill Okhotnikov 96*b8e8012aSKirill Okhotnikov // fmod (x, +inf) == x for x not infinite. 97*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, inf, 0.0, false, 0); 98*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, inf, neg_zero, false, 0); 99*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), inf, nl::denorm_min(), false, 0); 100*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), inf, nl::min(), false, 0); 101*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), inf, nl::max(), false, 0); 102*b8e8012aSKirill Okhotnikov TEST_SPECIAL(3.0, inf, 3.0, false, 0); 103*b8e8012aSKirill Okhotnikov // fmod (x, -inf) == x for x not infinite. 104*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, neg_inf, 0.0, false, 0); 105*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, neg_inf, neg_zero, false, 0); 106*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), neg_inf, nl::denorm_min(), false, 0); 107*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), neg_inf, nl::min(), false, 0); 108*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), neg_inf, nl::max(), false, 0); 109*b8e8012aSKirill Okhotnikov TEST_SPECIAL(3.0, neg_inf, 3.0, false, 0); 110*b8e8012aSKirill Okhotnikov 111*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 112*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 113*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 114*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 115*b8e8012aSKirill Okhotnikov TEST_SPECIAL(1.0, nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 116*b8e8012aSKirill Okhotnikov TEST_SPECIAL(1.0, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 117*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 118*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 119*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 120*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 121*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID); 122*b8e8012aSKirill Okhotnikov TEST_SPECIAL(0.0, -nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID); 123*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, nl::signaling_NaN(), nl::quiet_NaN(), false, 124*b8e8012aSKirill Okhotnikov FE_INVALID); 125*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_zero, -nl::signaling_NaN(), nl::quiet_NaN(), false, 126*b8e8012aSKirill Okhotnikov FE_INVALID); 127*b8e8012aSKirill Okhotnikov TEST_SPECIAL(1.0, nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID); 128*b8e8012aSKirill Okhotnikov TEST_SPECIAL(1.0, -nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID); 129*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID); 130*b8e8012aSKirill Okhotnikov TEST_SPECIAL(inf, -nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID); 131*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, nl::signaling_NaN(), nl::quiet_NaN(), false, 132*b8e8012aSKirill Okhotnikov FE_INVALID); 133*b8e8012aSKirill Okhotnikov TEST_SPECIAL(neg_inf, -nl::signaling_NaN(), nl::quiet_NaN(), false, 134*b8e8012aSKirill Okhotnikov FE_INVALID); 135*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), 0.0, nl::quiet_NaN(), false, 0); 136*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), 0.0, nl::quiet_NaN(), false, 0); 137*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), neg_zero, nl::quiet_NaN(), false, 0); 138*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), neg_zero, nl::quiet_NaN(), false, 0); 139*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), 1.0, nl::quiet_NaN(), false, 0); 140*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), 1.0, nl::quiet_NaN(), false, 0); 141*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), inf, nl::quiet_NaN(), false, 0); 142*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), inf, nl::quiet_NaN(), false, 0); 143*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), neg_inf, nl::quiet_NaN(), false, 0); 144*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), neg_inf, nl::quiet_NaN(), false, 0); 145*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), 0.0, nl::quiet_NaN(), false, FE_INVALID); 146*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), 0.0, nl::quiet_NaN(), false, FE_INVALID); 147*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), neg_zero, nl::quiet_NaN(), false, 148*b8e8012aSKirill Okhotnikov FE_INVALID); 149*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), neg_zero, nl::quiet_NaN(), false, 150*b8e8012aSKirill Okhotnikov FE_INVALID); 151*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), 1.0, nl::quiet_NaN(), false, FE_INVALID); 152*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), 1.0, nl::quiet_NaN(), false, FE_INVALID); 153*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), inf, nl::quiet_NaN(), false, FE_INVALID); 154*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), inf, nl::quiet_NaN(), false, FE_INVALID); 155*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), neg_inf, nl::quiet_NaN(), false, 156*b8e8012aSKirill Okhotnikov FE_INVALID); 157*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), neg_inf, nl::quiet_NaN(), false, 158*b8e8012aSKirill Okhotnikov FE_INVALID); 159*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 160*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 161*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 162*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false, 0); 163*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), nl::signaling_NaN(), nl::quiet_NaN(), false, 164*b8e8012aSKirill Okhotnikov FE_INVALID); 165*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::quiet_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(), false, 166*b8e8012aSKirill Okhotnikov FE_INVALID); 167*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), nl::signaling_NaN(), nl::quiet_NaN(), false, 168*b8e8012aSKirill Okhotnikov FE_INVALID); 169*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::quiet_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(), false, 170*b8e8012aSKirill Okhotnikov FE_INVALID); 171*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false, 172*b8e8012aSKirill Okhotnikov FE_INVALID); 173*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false, 174*b8e8012aSKirill Okhotnikov FE_INVALID); 175*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false, 176*b8e8012aSKirill Okhotnikov FE_INVALID); 177*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false, 178*b8e8012aSKirill Okhotnikov FE_INVALID); 179*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), nl::signaling_NaN(), nl::quiet_NaN(), 180*b8e8012aSKirill Okhotnikov false, FE_INVALID); 181*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::signaling_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(), 182*b8e8012aSKirill Okhotnikov false, FE_INVALID); 183*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), nl::signaling_NaN(), nl::quiet_NaN(), 184*b8e8012aSKirill Okhotnikov false, FE_INVALID); 185*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::signaling_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(), 186*b8e8012aSKirill Okhotnikov false, FE_INVALID); 187*b8e8012aSKirill Okhotnikov 188*b8e8012aSKirill Okhotnikov TEST_SPECIAL(6.5, 2.25L, 2.0L, false, 0); 189*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-6.5, 2.25L, -2.0L, false, 0); 190*b8e8012aSKirill Okhotnikov TEST_SPECIAL(6.5, -2.25L, 2.0L, false, 0); 191*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-6.5, -2.25L, -2.0L, false, 0); 192*b8e8012aSKirill Okhotnikov 193*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), nl::max(), 0.0, false, 0); 194*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), -nl::max(), 0.0, false, 0); 195*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), nl::min(), 0.0, false, 0); 196*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), -nl::min(), 0.0, false, 0); 197*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), nl::denorm_min(), 0.0, false, 0); 198*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::max(), -nl::denorm_min(), 0.0, false, 0); 199*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::max(), nl::max(), neg_zero, false, 0); 200*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::max(), -nl::max(), neg_zero, false, 0); 201*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::max(), nl::min(), neg_zero, false, 0); 202*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::max(), -nl::min(), neg_zero, false, 0); 203*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::max(), nl::denorm_min(), neg_zero, false, 0); 204*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::max(), -nl::denorm_min(), neg_zero, false, 0); 205*b8e8012aSKirill Okhotnikov 206*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), nl::max(), nl::min(), false, 0); 207*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), -nl::max(), nl::min(), false, 0); 208*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), nl::min(), 0.0, false, 0); 209*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), -nl::min(), 0.0, false, 0); 210*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), nl::denorm_min(), 0.0, false, 0); 211*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::min(), -nl::denorm_min(), 0.0, false, 0); 212*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::min(), nl::max(), -nl::min(), false, 0); 213*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::min(), -nl::max(), -nl::min(), false, 0); 214*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::min(), nl::min(), neg_zero, false, 0); 215*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::min(), -nl::min(), neg_zero, false, 0); 216*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::min(), nl::denorm_min(), neg_zero, false, 0); 217*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::min(), -nl::denorm_min(), neg_zero, false, 0); 218*b8e8012aSKirill Okhotnikov 219*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), nl::max(), nl::denorm_min(), false, 0); 220*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), -nl::max(), nl::denorm_min(), false, 0); 221*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), nl::min(), nl::denorm_min(), false, 0); 222*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), -nl::min(), nl::denorm_min(), false, 0); 223*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), nl::denorm_min(), 0.0, false, 0); 224*b8e8012aSKirill Okhotnikov TEST_SPECIAL(nl::denorm_min(), -nl::denorm_min(), 0.0, false, 0); 225*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::denorm_min(), nl::max(), -nl::denorm_min(), false, 0); 226*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::denorm_min(), -nl::max(), -nl::denorm_min(), false, 0); 227*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::denorm_min(), nl::min(), -nl::denorm_min(), false, 0); 228*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::denorm_min(), -nl::min(), -nl::denorm_min(), false, 0); 229*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::denorm_min(), nl::denorm_min(), neg_zero, false, 0); 230*b8e8012aSKirill Okhotnikov TEST_SPECIAL(-nl::denorm_min(), -nl::denorm_min(), neg_zero, false, 0); 231*b8e8012aSKirill Okhotnikov } 232*b8e8012aSKirill Okhotnikov testRegularExtreme(FModFunc f)233*b8e8012aSKirill Okhotnikov void testRegularExtreme(FModFunc f) { 234*b8e8012aSKirill Okhotnikov 235*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p127L, 0x3p-149L, 0x1p-149L); 236*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p127L, -0x3p-149L, 0x1p-149L); 237*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p127L, 0x3p-148L, 0x1p-147L); 238*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p127L, -0x3p-148L, 0x1p-147L); 239*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p127L, 0x3p-126L, 0x1p-125L); 240*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p127L, -0x3p-126L, 0x1p-125L); 241*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p127L, 0x3p-149L, -0x1p-149L); 242*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p127L, -0x3p-149L, -0x1p-149L); 243*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p127L, 0x3p-148L, -0x1p-147L); 244*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p127L, -0x3p-148L, -0x1p-147L); 245*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p127L, 0x3p-126L, -0x1p-125L); 246*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p127L, -0x3p-126L, -0x1p-125L); 247*b8e8012aSKirill Okhotnikov 248*b8e8012aSKirill Okhotnikov if constexpr (sizeof(T) >= sizeof(double)) { 249*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p1023L, 0x3p-1074L, 0x1p-1073L); 250*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p1023L, -0x3p-1074L, 0x1p-1073L); 251*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p1023L, 0x3p-1073L, 0x1p-1073L); 252*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p1023L, -0x3p-1073L, 0x1p-1073L); 253*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p1023L, 0x3p-1022L, 0x1p-1021L); 254*b8e8012aSKirill Okhotnikov TEST_REGULAR(0x1p1023L, -0x3p-1022L, 0x1p-1021L); 255*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p1023L, 0x3p-1074L, -0x1p-1073L); 256*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p1023L, -0x3p-1074L, -0x1p-1073L); 257*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p1023L, 0x3p-1073L, -0x1p-1073L); 258*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p1023L, -0x3p-1073L, -0x1p-1073L); 259*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p1023L, 0x3p-1022L, -0x1p-1021L); 260*b8e8012aSKirill Okhotnikov TEST_REGULAR(-0x1p1023L, -0x3p-1022L, -0x1p-1021L); 261*b8e8012aSKirill Okhotnikov } 262*b8e8012aSKirill Okhotnikov } 263*b8e8012aSKirill Okhotnikov }; 264*b8e8012aSKirill Okhotnikov 265*b8e8012aSKirill Okhotnikov #define LIST_FMOD_TESTS(T, func) \ 266*b8e8012aSKirill Okhotnikov using LlvmLibcFmodTest = FmodTest<T>; \ 267*b8e8012aSKirill Okhotnikov TEST_F(LlvmLibcFmodTest, SpecialNumbers) { testSpecialNumbers(&func); } \ 268*b8e8012aSKirill Okhotnikov TEST_F(LlvmLibcFmodTest, RegularExtreme) { testRegularExtreme(&func); } 269*b8e8012aSKirill Okhotnikov 270*b8e8012aSKirill Okhotnikov #endif // LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H 271