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