brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.9 KiB · 16785de Raw
460 lines · c
1//===-- Utility class to test different flavors of ufromfp ------*- 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_UFROMFPTEST_H10#define LIBC_TEST_SRC_MATH_SMOKE_UFROMFPTEST_H11 12#include "test/UnitTest/FEnvSafeTest.h"13#include "test/UnitTest/FPMatcher.h"14#include "test/UnitTest/Test.h"15 16template <typename T>17class UfromfpTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {18 19  DECLARE_SPECIAL_CONSTANTS(T)20 21public:22  typedef T (*UfromfpFunc)(T, int, unsigned int);23 24  void testSpecialNumbersNonzeroWidth(UfromfpFunc 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(UfromfpFunc 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(UfromfpFunc 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(UfromfpFunc 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(UfromfpFunc func) {68    EXPECT_FP_EQ(T(1.0), func(T(0.5), FP_INT_UPWARD, 1U));69    EXPECT_FP_EQ(T(-0.0), func(T(-0.5), FP_INT_UPWARD, 1U));70    EXPECT_FP_EQ(T(1.0), func(T(0.115), FP_INT_UPWARD, 1U));71    EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_UPWARD, 1U));72    EXPECT_FP_EQ(T(1.0), func(T(0.715), FP_INT_UPWARD, 1U));73    EXPECT_FP_EQ(T(-0.0), func(T(-0.715), FP_INT_UPWARD, 1U));74    EXPECT_FP_EQ(T(2.0), func(T(1.3), FP_INT_UPWARD, 2U));75    EXPECT_FP_EQ(T(2.0), func(T(1.5), FP_INT_UPWARD, 2U));76    EXPECT_FP_EQ(T(2.0), func(T(1.75), FP_INT_UPWARD, 2U));77    EXPECT_FP_EQ(T(11.0), func(T(10.32), FP_INT_UPWARD, 4U));78    EXPECT_FP_EQ(T(11.0), func(T(10.65), FP_INT_UPWARD, 4U));79    EXPECT_FP_EQ(T(64.0), func(T(63.25), FP_INT_UPWARD, 7U));80    EXPECT_FP_EQ(T(64.0), func(T(63.75), FP_INT_UPWARD, 7U));81  }82 83  void testFractionsUpwardOutsideRange(UfromfpFunc func) {84    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 1U),85                                FE_INVALID);86    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U),87                                FE_INVALID);88    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 1U),89                                FE_INVALID);90    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U),91                                FE_INVALID);92    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 1U),93                                FE_INVALID);94    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U),95                                FE_INVALID);96    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 3U),97                                FE_INVALID);98    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U),99                                FE_INVALID);100    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 3U),101                                FE_INVALID);102    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U),103                                FE_INVALID);104    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_UPWARD, 6U),105                                FE_INVALID);106    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_UPWARD, 32U),107                                FE_INVALID);108    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_UPWARD, 6U),109                                FE_INVALID);110    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_UPWARD, 32U),111                                FE_INVALID);112  }113 114  void testFractionsDownwardWithinRange(UfromfpFunc func) {115    EXPECT_FP_EQ(T(0.0), func(T(0.5), FP_INT_DOWNWARD, 1U));116    EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_DOWNWARD, 1U));117    EXPECT_FP_EQ(T(0.0), func(T(0.715), FP_INT_DOWNWARD, 1U));118    EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_DOWNWARD, 1U));119    EXPECT_FP_EQ(T(1.0), func(T(1.5), FP_INT_DOWNWARD, 1U));120    EXPECT_FP_EQ(T(1.0), func(T(1.75), FP_INT_DOWNWARD, 1U));121    EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_DOWNWARD, 4U));122    EXPECT_FP_EQ(T(10.0), func(T(10.65), FP_INT_DOWNWARD, 4U));123    EXPECT_FP_EQ(T(63.0), func(T(63.25), FP_INT_DOWNWARD, 7U));124    EXPECT_FP_EQ(T(63.0), func(T(63.75), FP_INT_DOWNWARD, 7U));125  }126 127  void testFractionsDownwardOutsideRange(UfromfpFunc func) {128    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U),129                                FE_INVALID);130    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U),131                                FE_INVALID);132    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U),133                                FE_INVALID);134    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U),135                                FE_INVALID);136    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U),137                                FE_INVALID);138    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U),139                                FE_INVALID);140    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U),141                                FE_INVALID);142    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U),143                                FE_INVALID);144    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U),145                                FE_INVALID);146    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U),147                                FE_INVALID);148    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_DOWNWARD, 6U),149                                FE_INVALID);150    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_DOWNWARD, 32U),151                                FE_INVALID);152    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_DOWNWARD, 6U),153                                FE_INVALID);154    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_DOWNWARD, 32U),155                                FE_INVALID);156  }157 158  void testFractionsTowardZeroWithinRange(UfromfpFunc func) {159    EXPECT_FP_EQ(T(0.0), func(T(0.5), FP_INT_TOWARDZERO, 1U));160    EXPECT_FP_EQ(T(-0.0), func(T(-0.5), FP_INT_TOWARDZERO, 1U));161    EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_TOWARDZERO, 1U));162    EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_TOWARDZERO, 1U));163    EXPECT_FP_EQ(T(0.0), func(T(0.715), FP_INT_TOWARDZERO, 1U));164    EXPECT_FP_EQ(T(-0.0), func(T(-0.715), FP_INT_TOWARDZERO, 1U));165    EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_TOWARDZERO, 1U));166    EXPECT_FP_EQ(T(1.0), func(T(1.5), FP_INT_TOWARDZERO, 1U));167    EXPECT_FP_EQ(T(1.0), func(T(1.75), FP_INT_TOWARDZERO, 1U));168    EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_TOWARDZERO, 4U));169    EXPECT_FP_EQ(T(10.0), func(T(10.65), FP_INT_TOWARDZERO, 4U));170    EXPECT_FP_EQ(T(63.0), func(T(63.25), FP_INT_TOWARDZERO, 7U));171    EXPECT_FP_EQ(T(63.0), func(T(63.75), FP_INT_TOWARDZERO, 7U));172  }173 174  void testFractionsTowardZeroOutsideRange(UfromfpFunc func) {175    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U),176                                FE_INVALID);177    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U),178                                FE_INVALID);179    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U),180                                FE_INVALID);181    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U),182                                FE_INVALID);183    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U),184                                FE_INVALID);185    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U),186                                FE_INVALID);187    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U),188                                FE_INVALID);189    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TOWARDZERO, 6U),190                                FE_INVALID);191    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TOWARDZERO, 32U),192                                FE_INVALID);193    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TOWARDZERO, 6U),194                                FE_INVALID);195    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TOWARDZERO, 32U),196                                FE_INVALID);197  }198 199  void testFractionsToNearestFromZeroWithinRange(UfromfpFunc func) {200    EXPECT_FP_EQ(T(1.0), func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U));201    EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_TONEARESTFROMZERO, 1U));202    EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_TONEARESTFROMZERO, 1U));203    EXPECT_FP_EQ(T(1.0), func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U));204    EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U));205    EXPECT_FP_EQ(T(2.0), func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U));206    EXPECT_FP_EQ(T(2.0), func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U));207    EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U));208    EXPECT_FP_EQ(T(11.0), func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U));209    EXPECT_FP_EQ(T(63.0), func(T(63.25), FP_INT_TONEARESTFROMZERO, 7U));210    EXPECT_FP_EQ(T(64.0), func(T(63.75), FP_INT_TONEARESTFROMZERO, 7U));211  }212 213  void testFractionsToNearestFromZeroOutsideRange(UfromfpFunc func) {214    EXPECT_FP_EQ_WITH_EXCEPTION(215        aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);216    EXPECT_FP_EQ_WITH_EXCEPTION(217        aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);218    EXPECT_FP_EQ_WITH_EXCEPTION(219        aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);220    EXPECT_FP_EQ_WITH_EXCEPTION(221        aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);222    EXPECT_FP_EQ_WITH_EXCEPTION(223        aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);224    EXPECT_FP_EQ_WITH_EXCEPTION(225        aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);226    EXPECT_FP_EQ_WITH_EXCEPTION(227        aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);228    EXPECT_FP_EQ_WITH_EXCEPTION(229        aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID);230    EXPECT_FP_EQ_WITH_EXCEPTION(231        aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);232    EXPECT_FP_EQ_WITH_EXCEPTION(233        aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID);234    EXPECT_FP_EQ_WITH_EXCEPTION(235        aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);236    EXPECT_FP_EQ_WITH_EXCEPTION(237        aNaN, func(T(123.38), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID);238    EXPECT_FP_EQ_WITH_EXCEPTION(239        aNaN, func(T(-123.38), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);240    EXPECT_FP_EQ_WITH_EXCEPTION(241        aNaN, func(T(123.96), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID);242    EXPECT_FP_EQ_WITH_EXCEPTION(243        aNaN, func(T(-123.96), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);244  }245 246  void testFractionsToNearestWithinRange(UfromfpFunc func) {247    EXPECT_FP_EQ(T(0.0), func(T(0.5), FP_INT_TONEAREST, 1U));248    EXPECT_FP_EQ(T(-0.0), func(T(-0.5), FP_INT_TONEAREST, 1U));249    EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_TONEAREST, 1U));250    EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_TONEAREST, 1U));251    EXPECT_FP_EQ(T(1.0), func(T(0.715), FP_INT_TONEAREST, 1U));252    EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_TONEAREST, 1U));253    EXPECT_FP_EQ(T(2.0), func(T(1.5), FP_INT_TONEAREST, 2U));254    EXPECT_FP_EQ(T(2.0), func(T(1.75), FP_INT_TONEAREST, 2U));255    EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_TONEAREST, 4U));256    EXPECT_FP_EQ(T(11.0), func(T(10.65), FP_INT_TONEAREST, 4U));257    EXPECT_FP_EQ(T(63.0), func(T(63.25), FP_INT_TONEAREST, 7U));258    EXPECT_FP_EQ(T(64.0), func(T(63.75), FP_INT_TONEAREST, 7U));259 260    EXPECT_FP_EQ(T(2.0), func(T(2.3), FP_INT_TONEAREST, 2U));261    EXPECT_FP_EQ(T(2.0), func(T(2.5), FP_INT_TONEAREST, 2U));262    EXPECT_FP_EQ(T(3.0), func(T(2.75), FP_INT_TONEAREST, 2U));263    EXPECT_FP_EQ(T(5.0), func(T(5.3), FP_INT_TONEAREST, 3U));264    EXPECT_FP_EQ(T(6.0), func(T(5.5), FP_INT_TONEAREST, 3U));265    EXPECT_FP_EQ(T(6.0), func(T(5.75), FP_INT_TONEAREST, 3U));266  }267 268  void testFractionsToNearestOutsideRange(UfromfpFunc func) {269    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U),270                                FE_INVALID);271    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U),272                                FE_INVALID);273    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U),274                                FE_INVALID);275    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U),276                                FE_INVALID);277    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U),278                                FE_INVALID);279    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U),280                                FE_INVALID);281    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U),282                                FE_INVALID);283    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U),284                                FE_INVALID);285    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U),286                                FE_INVALID);287    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U),288                                FE_INVALID);289    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TONEAREST, 6U),290                                FE_INVALID);291    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TONEAREST, 32U),292                                FE_INVALID);293    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TONEAREST, 6U),294                                FE_INVALID);295    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TONEAREST, 32U),296                                FE_INVALID);297 298    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U),299                                FE_INVALID);300    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U),301                                FE_INVALID);302    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U),303                                FE_INVALID);304    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U),305                                FE_INVALID);306    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U),307                                FE_INVALID);308    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U),309                                FE_INVALID);310    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U),311                                FE_INVALID);312    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U),313                                FE_INVALID);314    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U),315                                FE_INVALID);316    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U),317                                FE_INVALID);318    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U),319                                FE_INVALID);320    EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U),321                                FE_INVALID);322  }323 324  void testFractionsToNearestFallbackWithinRange(UfromfpFunc func) {325    EXPECT_FP_EQ(T(0.0), func(T(0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));326    EXPECT_FP_EQ(T(-0.0), func(T(-0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));327    EXPECT_FP_EQ(T(0.0), func(T(0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));328    EXPECT_FP_EQ(T(-0.0), func(T(-0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));329    EXPECT_FP_EQ(T(1.0), func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));330    EXPECT_FP_EQ(T(1.0), func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));331    EXPECT_FP_EQ(T(2.0), func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));332    EXPECT_FP_EQ(T(2.0), func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));333    EXPECT_FP_EQ(T(10.0), func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));334    EXPECT_FP_EQ(T(11.0), func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));335    EXPECT_FP_EQ(T(63.0), func(T(63.25), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U));336    EXPECT_FP_EQ(T(64.0), func(T(63.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U));337 338    EXPECT_FP_EQ(T(2.0), func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));339    EXPECT_FP_EQ(T(2.0), func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));340    EXPECT_FP_EQ(T(3.0), func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));341    EXPECT_FP_EQ(T(5.0), func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));342    EXPECT_FP_EQ(T(6.0), func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));343    EXPECT_FP_EQ(T(6.0), func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));344  }345 346  void testFractionsToNearestFallbackOutsideRange(UfromfpFunc func) {347    EXPECT_FP_EQ_WITH_EXCEPTION(348        aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),349        FE_INVALID);350    EXPECT_FP_EQ_WITH_EXCEPTION(351        aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);352    EXPECT_FP_EQ_WITH_EXCEPTION(353        aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);354    EXPECT_FP_EQ_WITH_EXCEPTION(355        aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);356    EXPECT_FP_EQ_WITH_EXCEPTION(357        aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);358    EXPECT_FP_EQ_WITH_EXCEPTION(359        aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);360    EXPECT_FP_EQ_WITH_EXCEPTION(361        aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);362    EXPECT_FP_EQ_WITH_EXCEPTION(363        aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),364        FE_INVALID);365    EXPECT_FP_EQ_WITH_EXCEPTION(366        aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);367    EXPECT_FP_EQ_WITH_EXCEPTION(368        aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),369        FE_INVALID);370    EXPECT_FP_EQ_WITH_EXCEPTION(371        aNaN, func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID);372    EXPECT_FP_EQ_WITH_EXCEPTION(373        aNaN, func(T(-123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),374        FE_INVALID);375    EXPECT_FP_EQ_WITH_EXCEPTION(376        aNaN, func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID);377    EXPECT_FP_EQ_WITH_EXCEPTION(378        aNaN, func(T(-123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),379        FE_INVALID);380 381    EXPECT_FP_EQ_WITH_EXCEPTION(382        aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);383    EXPECT_FP_EQ_WITH_EXCEPTION(384        aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);385    EXPECT_FP_EQ_WITH_EXCEPTION(386        aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);387    EXPECT_FP_EQ_WITH_EXCEPTION(388        aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);389    EXPECT_FP_EQ_WITH_EXCEPTION(390        aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);391    EXPECT_FP_EQ_WITH_EXCEPTION(392        aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);393    EXPECT_FP_EQ_WITH_EXCEPTION(394        aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);395    EXPECT_FP_EQ_WITH_EXCEPTION(396        aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);397    EXPECT_FP_EQ_WITH_EXCEPTION(398        aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);399    EXPECT_FP_EQ_WITH_EXCEPTION(400        aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);401    EXPECT_FP_EQ_WITH_EXCEPTION(402        aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);403    EXPECT_FP_EQ_WITH_EXCEPTION(404        aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);405  }406};407 408#define LIST_UFROMFP_TESTS(T, func)                                            \409  using LlvmLibcUfromfpTest = UfromfpTestTemplate<T>;                          \410  TEST_F(LlvmLibcUfromfpTest, SpecialNumbersNonzeroWidth) {                    \411    testSpecialNumbersNonzeroWidth(&func);                                     \412  }                                                                            \413  TEST_F(LlvmLibcUfromfpTest, SpecialNumbersZeroWidth) {                       \414    testSpecialNumbersZeroWidth(&func);                                        \415  }                                                                            \416  TEST_F(LlvmLibcUfromfpTest, RoundedNumbersWithinRange) {                     \417    testRoundedNumbersWithinRange(&func);                                      \418  }                                                                            \419  TEST_F(LlvmLibcUfromfpTest, RoundedNumbersOutsideRange) {                    \420    testRoundedNumbersOutsideRange(&func);                                     \421  }                                                                            \422  TEST_F(LlvmLibcUfromfpTest, FractionsUpwardWithinRange) {                    \423    testFractionsUpwardWithinRange(&func);                                     \424  }                                                                            \425  TEST_F(LlvmLibcUfromfpTest, FractionsUpwardOutsideRange) {                   \426    testFractionsUpwardOutsideRange(&func);                                    \427  }                                                                            \428  TEST_F(LlvmLibcUfromfpTest, FractionsDownwardWithinRange) {                  \429    testFractionsDownwardWithinRange(&func);                                   \430  }                                                                            \431  TEST_F(LlvmLibcUfromfpTest, FractionsDownwardOutsideRange) {                 \432    testFractionsDownwardOutsideRange(&func);                                  \433  }                                                                            \434  TEST_F(LlvmLibcUfromfpTest, FractionsTowardZeroWithinRange) {                \435    testFractionsTowardZeroWithinRange(&func);                                 \436  }                                                                            \437  TEST_F(LlvmLibcUfromfpTest, FractionsTowardZeroOutsideRange) {               \438    testFractionsTowardZeroOutsideRange(&func);                                \439  }                                                                            \440  TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFromZeroWithinRange) {         \441    testFractionsToNearestFromZeroWithinRange(&func);                          \442  }                                                                            \443  TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFromZeroOutsideRange) {        \444    testFractionsToNearestFromZeroOutsideRange(&func);                         \445  }                                                                            \446  TEST_F(LlvmLibcUfromfpTest, FractionsToNearestWithinRange) {                 \447    testFractionsToNearestWithinRange(&func);                                  \448  }                                                                            \449  TEST_F(LlvmLibcUfromfpTest, FractionsToNearestOutsideRange) {                \450    testFractionsToNearestOutsideRange(&func);                                 \451  }                                                                            \452  TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFallbackWithinRange) {         \453    testFractionsToNearestFallbackWithinRange(&func);                          \454  }                                                                            \455  TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFallbackOutsideRange) {        \456    testFractionsToNearestFallbackOutsideRange(&func);                         \457  }458 459#endif // LIBC_TEST_SRC_MATH_SMOKE_UFROMFPTEST_H460