1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test different flavors of ufromfpx -----*- C++ -*-===// 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 LIBC_TEST_SRC_MATH_SMOKE_UFROMFPXTEST_H 10*71db0c75SAndroid Build Coastguard Worker #define LIBC_TEST_SRC_MATH_SMOKE_UFROMFPXTEST_H 11*71db0c75SAndroid Build Coastguard Worker 12*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FEnvSafeTest.h" 13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h" 14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h" 15*71db0c75SAndroid Build Coastguard Worker 16*71db0c75SAndroid Build Coastguard Worker template <typename T> 17*71db0c75SAndroid Build Coastguard Worker class UfromfpxTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { 18*71db0c75SAndroid Build Coastguard Worker 19*71db0c75SAndroid Build Coastguard Worker DECLARE_SPECIAL_CONSTANTS(T) 20*71db0c75SAndroid Build Coastguard Worker 21*71db0c75SAndroid Build Coastguard Worker public: 22*71db0c75SAndroid Build Coastguard Worker typedef T (*UfromfpxFunc)(T, int, unsigned int); 23*71db0c75SAndroid Build Coastguard Worker testSpecialNumbersNonzeroWidth(UfromfpxFunc func)24*71db0c75SAndroid Build Coastguard Worker void testSpecialNumbersNonzeroWidth(UfromfpxFunc func) { 25*71db0c75SAndroid Build Coastguard Worker for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { 26*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(zero, func(zero, rnd, 32U)); 27*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U)); 28*71db0c75SAndroid Build Coastguard Worker 29*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 32U), FE_INVALID); 30*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 32U), FE_INVALID); 31*71db0c75SAndroid Build Coastguard Worker 32*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 32U), FE_INVALID); 33*71db0c75SAndroid Build Coastguard Worker } 34*71db0c75SAndroid Build Coastguard Worker } 35*71db0c75SAndroid Build Coastguard Worker testSpecialNumbersZeroWidth(UfromfpxFunc func)36*71db0c75SAndroid Build Coastguard Worker void testSpecialNumbersZeroWidth(UfromfpxFunc func) { 37*71db0c75SAndroid Build Coastguard Worker for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { 38*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(zero, rnd, 0U), FE_INVALID); 39*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_zero, rnd, 0U), FE_INVALID); 40*71db0c75SAndroid Build Coastguard Worker 41*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 0U), FE_INVALID); 42*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 0U), FE_INVALID); 43*71db0c75SAndroid Build Coastguard Worker 44*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 0U), FE_INVALID); 45*71db0c75SAndroid Build Coastguard Worker } 46*71db0c75SAndroid Build Coastguard Worker } 47*71db0c75SAndroid Build Coastguard Worker testRoundedNumbersWithinRange(UfromfpxFunc func)48*71db0c75SAndroid Build Coastguard Worker void testRoundedNumbersWithinRange(UfromfpxFunc func) { 49*71db0c75SAndroid Build Coastguard Worker for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { 50*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(T(1.0), func(T(1.0), rnd, 1U)); 51*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(T(10.0), func(T(10.0), rnd, 4U)); 52*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 11U)); 53*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 64U)); 54*71db0c75SAndroid Build Coastguard Worker } 55*71db0c75SAndroid Build Coastguard Worker } 56*71db0c75SAndroid Build Coastguard Worker testRoundedNumbersOutsideRange(UfromfpxFunc func)57*71db0c75SAndroid Build Coastguard Worker void testRoundedNumbersOutsideRange(UfromfpxFunc func) { 58*71db0c75SAndroid Build Coastguard Worker for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { 59*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.0), rnd, 32U), FE_INVALID); 60*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.0), rnd, 3U), FE_INVALID); 61*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.0), rnd, 32U), FE_INVALID); 62*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.0), rnd, 10U), FE_INVALID); 63*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.0), rnd, 32U), FE_INVALID); 64*71db0c75SAndroid Build Coastguard Worker } 65*71db0c75SAndroid Build Coastguard Worker } 66*71db0c75SAndroid Build Coastguard Worker testFractionsUpwardWithinRange(UfromfpxFunc func)67*71db0c75SAndroid Build Coastguard Worker void testFractionsUpwardWithinRange(UfromfpxFunc func) { 68*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.5), FP_INT_UPWARD, 1U), 69*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 70*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_UPWARD, 1U), 71*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 72*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.115), FP_INT_UPWARD, 1U), 73*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 74*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_UPWARD, 1U), 75*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 76*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.715), FP_INT_UPWARD, 1U), 77*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 78*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.715), FP_INT_UPWARD, 1U), 79*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 80*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.3), FP_INT_UPWARD, 2U), 81*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 82*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.5), FP_INT_UPWARD, 2U), 83*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 84*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.75), FP_INT_UPWARD, 2U), 85*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 86*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.32), FP_INT_UPWARD, 4U), 87*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 88*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.65), FP_INT_UPWARD, 4U), 89*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 90*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.38), FP_INT_UPWARD, 7U), 91*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 92*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.96), FP_INT_UPWARD, 7U), 93*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 94*71db0c75SAndroid Build Coastguard Worker } 95*71db0c75SAndroid Build Coastguard Worker testFractionsUpwardOutsideRange(UfromfpxFunc func)96*71db0c75SAndroid Build Coastguard Worker void testFractionsUpwardOutsideRange(UfromfpxFunc func) { 97*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 1U), 98*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 99*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U), 100*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 101*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 1U), 102*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 103*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U), 104*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 105*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 1U), 106*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 107*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U), 108*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 109*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 3U), 110*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 111*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U), 112*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 113*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 3U), 114*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 115*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U), 116*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 117*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_UPWARD, 6U), 118*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 119*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_UPWARD, 32U), 120*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 121*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_UPWARD, 6U), 122*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 123*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_UPWARD, 32U), 124*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 125*71db0c75SAndroid Build Coastguard Worker } 126*71db0c75SAndroid Build Coastguard Worker testFractionsDownwardWithinRange(UfromfpxFunc func)127*71db0c75SAndroid Build Coastguard Worker void testFractionsDownwardWithinRange(UfromfpxFunc func) { 128*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_DOWNWARD, 1U), 129*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 130*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_DOWNWARD, 1U), 131*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 132*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.715), FP_INT_DOWNWARD, 1U), 133*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 134*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_DOWNWARD, 1U), 135*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 136*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.5), FP_INT_DOWNWARD, 1U), 137*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 138*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.75), FP_INT_DOWNWARD, 1U), 139*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 140*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_DOWNWARD, 4U), 141*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 142*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.65), FP_INT_DOWNWARD, 4U), 143*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 144*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.38), FP_INT_DOWNWARD, 7U), 145*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 146*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.96), FP_INT_DOWNWARD, 7U), 147*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 148*71db0c75SAndroid Build Coastguard Worker } 149*71db0c75SAndroid Build Coastguard Worker testFractionsDownwardOutsideRange(UfromfpxFunc func)150*71db0c75SAndroid Build Coastguard Worker void testFractionsDownwardOutsideRange(UfromfpxFunc func) { 151*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U), 152*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 153*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U), 154*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 155*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U), 156*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 157*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U), 158*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 159*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U), 160*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 161*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U), 162*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 163*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U), 164*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 165*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U), 166*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 167*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U), 168*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 169*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U), 170*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 171*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_DOWNWARD, 6U), 172*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 173*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_DOWNWARD, 32U), 174*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 175*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_DOWNWARD, 6U), 176*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 177*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_DOWNWARD, 32U), 178*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 179*71db0c75SAndroid Build Coastguard Worker } 180*71db0c75SAndroid Build Coastguard Worker testFractionsTowardZeroWithinRange(UfromfpxFunc func)181*71db0c75SAndroid Build Coastguard Worker void testFractionsTowardZeroWithinRange(UfromfpxFunc func) { 182*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_TOWARDZERO, 1U), 183*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 184*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_TOWARDZERO, 1U), 185*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 186*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_TOWARDZERO, 1U), 187*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 188*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_TOWARDZERO, 1U), 189*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 190*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.715), FP_INT_TOWARDZERO, 1U), 191*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 192*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.715), FP_INT_TOWARDZERO, 1U), 193*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 194*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_TOWARDZERO, 1U), 195*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 196*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.5), FP_INT_TOWARDZERO, 1U), 197*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 198*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.75), FP_INT_TOWARDZERO, 1U), 199*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 200*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_TOWARDZERO, 4U), 201*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 202*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.65), FP_INT_TOWARDZERO, 4U), 203*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 204*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 205*71db0c75SAndroid Build Coastguard Worker T(123.0), func(T(123.38), FP_INT_TOWARDZERO, 7U), FE_INEXACT); 206*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 207*71db0c75SAndroid Build Coastguard Worker T(123.0), func(T(123.96), FP_INT_TOWARDZERO, 7U), FE_INEXACT); 208*71db0c75SAndroid Build Coastguard Worker } 209*71db0c75SAndroid Build Coastguard Worker testFractionsTowardZeroOutsideRange(UfromfpxFunc func)210*71db0c75SAndroid Build Coastguard Worker void testFractionsTowardZeroOutsideRange(UfromfpxFunc func) { 211*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U), 212*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 213*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U), 214*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 215*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U), 216*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 217*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U), 218*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 219*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U), 220*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 221*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U), 222*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 223*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U), 224*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 225*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TOWARDZERO, 6U), 226*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 227*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TOWARDZERO, 32U), 228*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 229*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TOWARDZERO, 6U), 230*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 231*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TOWARDZERO, 32U), 232*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 233*71db0c75SAndroid Build Coastguard Worker } 234*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFromZeroWithinRange(UfromfpxFunc func)235*71db0c75SAndroid Build Coastguard Worker void testFractionsToNearestFromZeroWithinRange(UfromfpxFunc func) { 236*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 237*71db0c75SAndroid Build Coastguard Worker T(1.0), func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT); 238*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 239*71db0c75SAndroid Build Coastguard Worker T(0.0), func(T(0.115), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT); 240*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 241*71db0c75SAndroid Build Coastguard Worker T(-0.0), func(T(-0.115), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT); 242*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 243*71db0c75SAndroid Build Coastguard Worker T(1.0), func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT); 244*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 245*71db0c75SAndroid Build Coastguard Worker T(1.0), func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT); 246*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 247*71db0c75SAndroid Build Coastguard Worker T(2.0), func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT); 248*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 249*71db0c75SAndroid Build Coastguard Worker T(2.0), func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT); 250*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 251*71db0c75SAndroid Build Coastguard Worker T(10.0), func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INEXACT); 252*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 253*71db0c75SAndroid Build Coastguard Worker T(11.0), func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INEXACT); 254*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 255*71db0c75SAndroid Build Coastguard Worker T(123.0), func(T(123.38), FP_INT_TONEARESTFROMZERO, 7U), FE_INEXACT); 256*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 257*71db0c75SAndroid Build Coastguard Worker T(124.0), func(T(123.96), FP_INT_TONEARESTFROMZERO, 7U), FE_INEXACT); 258*71db0c75SAndroid Build Coastguard Worker } 259*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFromZeroOutsideRange(UfromfpxFunc func)260*71db0c75SAndroid Build Coastguard Worker void testFractionsToNearestFromZeroOutsideRange(UfromfpxFunc func) { 261*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 262*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 263*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 264*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 265*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 266*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 267*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 268*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); 269*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 270*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 271*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 272*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); 273*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 274*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 275*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 276*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID); 277*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 278*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 279*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 280*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID); 281*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 282*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 283*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 284*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(123.38), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID); 285*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 286*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-123.38), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 287*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 288*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(123.96), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID); 289*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 290*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-123.96), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); 291*71db0c75SAndroid Build Coastguard Worker } 292*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestWithinRange(UfromfpxFunc func)293*71db0c75SAndroid Build Coastguard Worker void testFractionsToNearestWithinRange(UfromfpxFunc func) { 294*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_TONEAREST, 1U), 295*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 296*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_TONEAREST, 1U), 297*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 298*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_TONEAREST, 1U), 299*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 300*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_TONEAREST, 1U), 301*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 302*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.715), FP_INT_TONEAREST, 1U), 303*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 304*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_TONEAREST, 1U), 305*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 306*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.5), FP_INT_TONEAREST, 2U), 307*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 308*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.75), FP_INT_TONEAREST, 2U), 309*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 310*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_TONEAREST, 4U), 311*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 312*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.65), FP_INT_TONEAREST, 4U), 313*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 314*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.38), FP_INT_TONEAREST, 7U), 315*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 316*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.96), FP_INT_TONEAREST, 7U), 317*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 318*71db0c75SAndroid Build Coastguard Worker 319*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(2.3), FP_INT_TONEAREST, 2U), 320*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 321*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(2.5), FP_INT_TONEAREST, 2U), 322*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 323*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(3.0), func(T(2.75), FP_INT_TONEAREST, 2U), 324*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 325*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(5.0), func(T(5.3), FP_INT_TONEAREST, 3U), 326*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 327*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(6.0), func(T(5.5), FP_INT_TONEAREST, 3U), 328*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 329*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(T(6.0), func(T(5.75), FP_INT_TONEAREST, 3U), 330*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 331*71db0c75SAndroid Build Coastguard Worker } 332*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestOutsideRange(UfromfpxFunc func)333*71db0c75SAndroid Build Coastguard Worker void testFractionsToNearestOutsideRange(UfromfpxFunc func) { 334*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U), 335*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 336*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U), 337*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 338*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U), 339*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 340*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U), 341*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 342*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U), 343*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 344*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U), 345*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 346*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U), 347*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 348*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U), 349*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 350*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U), 351*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 352*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U), 353*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 354*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TONEAREST, 6U), 355*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 356*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TONEAREST, 32U), 357*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 358*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TONEAREST, 6U), 359*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 360*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TONEAREST, 32U), 361*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 362*71db0c75SAndroid Build Coastguard Worker 363*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U), 364*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 365*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U), 366*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 367*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U), 368*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 369*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U), 370*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 371*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U), 372*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 373*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U), 374*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 375*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U), 376*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 377*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U), 378*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 379*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U), 380*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 381*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U), 382*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 383*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U), 384*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 385*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U), 386*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 387*71db0c75SAndroid Build Coastguard Worker } 388*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFallbackWithinRange(UfromfpxFunc func)389*71db0c75SAndroid Build Coastguard Worker void testFractionsToNearestFallbackWithinRange(UfromfpxFunc func) { 390*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 391*71db0c75SAndroid Build Coastguard Worker T(0.0), func(T(0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INEXACT); 392*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 393*71db0c75SAndroid Build Coastguard Worker T(-0.0), func(T(-0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), 394*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 395*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 396*71db0c75SAndroid Build Coastguard Worker T(0.0), func(T(0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), 397*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 398*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 399*71db0c75SAndroid Build Coastguard Worker T(-0.0), func(T(-0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), 400*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 401*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 402*71db0c75SAndroid Build Coastguard Worker T(1.0), func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), 403*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 404*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 405*71db0c75SAndroid Build Coastguard Worker T(1.0), func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INEXACT); 406*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 407*71db0c75SAndroid Build Coastguard Worker T(2.0), func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT); 408*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 409*71db0c75SAndroid Build Coastguard Worker T(2.0), func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT); 410*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 411*71db0c75SAndroid Build Coastguard Worker T(10.0), func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), 412*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 413*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 414*71db0c75SAndroid Build Coastguard Worker T(11.0), func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), 415*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 416*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 417*71db0c75SAndroid Build Coastguard Worker T(123.0), func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U), 418*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 419*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 420*71db0c75SAndroid Build Coastguard Worker T(124.0), func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U), 421*71db0c75SAndroid Build Coastguard Worker FE_INEXACT); 422*71db0c75SAndroid Build Coastguard Worker 423*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 424*71db0c75SAndroid Build Coastguard Worker T(2.0), func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT); 425*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 426*71db0c75SAndroid Build Coastguard Worker T(2.0), func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT); 427*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 428*71db0c75SAndroid Build Coastguard Worker T(3.0), func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT); 429*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 430*71db0c75SAndroid Build Coastguard Worker T(5.0), func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT); 431*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 432*71db0c75SAndroid Build Coastguard Worker T(6.0), func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT); 433*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 434*71db0c75SAndroid Build Coastguard Worker T(6.0), func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT); 435*71db0c75SAndroid Build Coastguard Worker } 436*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFallbackOutsideRange(UfromfpxFunc func)437*71db0c75SAndroid Build Coastguard Worker void testFractionsToNearestFallbackOutsideRange(UfromfpxFunc func) { 438*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 439*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), 440*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 441*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 442*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 443*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 444*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); 445*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 446*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 447*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 448*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); 449*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 450*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 451*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 452*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); 453*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 454*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), 455*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 456*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 457*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); 458*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 459*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), 460*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 461*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 462*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID); 463*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 464*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), 465*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 466*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 467*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID); 468*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 469*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), 470*71db0c75SAndroid Build Coastguard Worker FE_INVALID); 471*71db0c75SAndroid Build Coastguard Worker 472*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 473*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); 474*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 475*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 476*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 477*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); 478*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 479*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 480*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 481*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); 482*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 483*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 484*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 485*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); 486*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 487*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 488*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 489*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); 490*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 491*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 492*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 493*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); 494*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_WITH_EXCEPTION( 495*71db0c75SAndroid Build Coastguard Worker aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); 496*71db0c75SAndroid Build Coastguard Worker } 497*71db0c75SAndroid Build Coastguard Worker }; 498*71db0c75SAndroid Build Coastguard Worker 499*71db0c75SAndroid Build Coastguard Worker #define LIST_UFROMFPX_TESTS(T, func) \ 500*71db0c75SAndroid Build Coastguard Worker using LlvmLibcUfromfpxTest = UfromfpxTestTemplate<T>; \ 501*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, SpecialNumbersNonzeroWidth) { \ 502*71db0c75SAndroid Build Coastguard Worker testSpecialNumbersNonzeroWidth(&func); \ 503*71db0c75SAndroid Build Coastguard Worker } \ 504*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, SpecialNumbersZeroWidth) { \ 505*71db0c75SAndroid Build Coastguard Worker testSpecialNumbersZeroWidth(&func); \ 506*71db0c75SAndroid Build Coastguard Worker } \ 507*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, RoundedNumbersWithinRange) { \ 508*71db0c75SAndroid Build Coastguard Worker testRoundedNumbersWithinRange(&func); \ 509*71db0c75SAndroid Build Coastguard Worker } \ 510*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, RoundedNumbersOutsideRange) { \ 511*71db0c75SAndroid Build Coastguard Worker testRoundedNumbersOutsideRange(&func); \ 512*71db0c75SAndroid Build Coastguard Worker } \ 513*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsUpwardWithinRange) { \ 514*71db0c75SAndroid Build Coastguard Worker testFractionsUpwardWithinRange(&func); \ 515*71db0c75SAndroid Build Coastguard Worker } \ 516*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsUpwardOutsideRange) { \ 517*71db0c75SAndroid Build Coastguard Worker testFractionsUpwardOutsideRange(&func); \ 518*71db0c75SAndroid Build Coastguard Worker } \ 519*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsDownwardWithinRange) { \ 520*71db0c75SAndroid Build Coastguard Worker testFractionsDownwardWithinRange(&func); \ 521*71db0c75SAndroid Build Coastguard Worker } \ 522*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsDownwardOutsideRange) { \ 523*71db0c75SAndroid Build Coastguard Worker testFractionsDownwardOutsideRange(&func); \ 524*71db0c75SAndroid Build Coastguard Worker } \ 525*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsTowardZeroWithinRange) { \ 526*71db0c75SAndroid Build Coastguard Worker testFractionsTowardZeroWithinRange(&func); \ 527*71db0c75SAndroid Build Coastguard Worker } \ 528*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsTowardZeroOutsideRange) { \ 529*71db0c75SAndroid Build Coastguard Worker testFractionsTowardZeroOutsideRange(&func); \ 530*71db0c75SAndroid Build Coastguard Worker } \ 531*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFromZeroWithinRange) { \ 532*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFromZeroWithinRange(&func); \ 533*71db0c75SAndroid Build Coastguard Worker } \ 534*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFromZeroOutsideRange) { \ 535*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFromZeroOutsideRange(&func); \ 536*71db0c75SAndroid Build Coastguard Worker } \ 537*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestWithinRange) { \ 538*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestWithinRange(&func); \ 539*71db0c75SAndroid Build Coastguard Worker } \ 540*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestOutsideRange) { \ 541*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestOutsideRange(&func); \ 542*71db0c75SAndroid Build Coastguard Worker } \ 543*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFallbackWithinRange) { \ 544*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFallbackWithinRange(&func); \ 545*71db0c75SAndroid Build Coastguard Worker } \ 546*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFallbackOutsideRange) { \ 547*71db0c75SAndroid Build Coastguard Worker testFractionsToNearestFallbackOutsideRange(&func); \ 548*71db0c75SAndroid Build Coastguard Worker } 549*71db0c75SAndroid Build Coastguard Worker 550*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TEST_SRC_MATH_SMOKE_UFROMFPXTEST_H 551