551 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LIBC_TEST_SRC_MATH_SMOKE_UFROMFPXTEST_H10#define LIBC_TEST_SRC_MATH_SMOKE_UFROMFPXTEST_H11 12#include "test/UnitTest/FEnvSafeTest.h"13#include "test/UnitTest/FPMatcher.h"14#include "test/UnitTest/Test.h"15 16template <typename T>17class UfromfpxTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {18 19 DECLARE_SPECIAL_CONSTANTS(T)20 21public:22 typedef T (*UfromfpxFunc)(T, int, unsigned int);23 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 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 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 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 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(64.0), func(T(63.25), FP_INT_UPWARD, 7U),91 FE_INEXACT);92 EXPECT_FP_EQ_WITH_EXCEPTION(T(64.0), func(T(63.75), FP_INT_UPWARD, 7U),93 FE_INEXACT);94 }95 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 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(63.0), func(T(63.25), FP_INT_DOWNWARD, 7U),145 FE_INEXACT);146 EXPECT_FP_EQ_WITH_EXCEPTION(T(63.0), func(T(63.75), FP_INT_DOWNWARD, 7U),147 FE_INEXACT);148 }149 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 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(T(63.0), func(T(63.25), FP_INT_TOWARDZERO, 7U),205 FE_INEXACT);206 EXPECT_FP_EQ_WITH_EXCEPTION(T(63.0), func(T(63.75), FP_INT_TOWARDZERO, 7U),207 FE_INEXACT);208 }209 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 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(63.0), func(T(63.25), FP_INT_TONEARESTFROMZERO, 7U), FE_INEXACT);256 EXPECT_FP_EQ_WITH_EXCEPTION(257 T(64.0), func(T(63.75), FP_INT_TONEARESTFROMZERO, 7U), FE_INEXACT);258 }259 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 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(63.0), func(T(63.25), FP_INT_TONEAREST, 7U),315 FE_INEXACT);316 EXPECT_FP_EQ_WITH_EXCEPTION(T(64.0), func(T(63.75), 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 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 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(63.0), func(T(63.25), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U),418 FE_INEXACT);419 EXPECT_FP_EQ_WITH_EXCEPTION(420 T(64.0), func(T(63.75), 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 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_H551