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