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