|
11 | 11 | #include "src/__support/fixed_point/fx_rep.h" |
12 | 12 | #include "test/UnitTest/Test.h" |
13 | 13 |
|
| 14 | +#include <stdio.h> |
| 15 | + |
14 | 16 | template <typename XType> XType get_epsilon() = delete; |
15 | 17 | template <> fract get_epsilon() { return FRACT_EPSILON; } |
16 | 18 | template <> unsigned fract get_epsilon() { return UFRACT_EPSILON; } |
@@ -44,22 +46,27 @@ class DivITest : public LIBC_NAMESPACE::testing::Test { |
44 | 46 | } |
45 | 47 |
|
46 | 48 | void testSpecial(DivIFunc func) { |
47 | | - EXPECT_EQ(func(0,10), 0.r); |
48 | | - EXPECT_EQ(func(0,-10), 0.r); |
49 | | - EXPECT_EQ(func(-32768,32768), FRACT_MIN); |
50 | | - EXPECT_EQ(func(32767,32768), FRACT_MAX); |
51 | | - EXPECT_EQ(func(INT_MAX,INT_MAX), 1.0r); |
52 | | - EXPECT_EQ(func(INT_MAX-1,INT_MAX), 0.99999999r); |
53 | | - EXPECT_EQ(func(INT_MIN,INT_MAX), FRACT_MIN); |
54 | | - /* Expecting 0 here as fract is not precise enough to |
| 49 | + XType epsilon = get_epsilon<XType>(); |
| 50 | + EXPECT_EQ(func(0, 10), 0.r); |
| 51 | + EXPECT_EQ(func(0, -10), 0.r); |
| 52 | + EXPECT_EQ(func(-(1 << FRACT_FBIT), 1 << FRACT_FBIT), FRACT_MIN); |
| 53 | + EXPECT_EQ(func((1 << FRACT_FBIT) - 1, 1 << FRACT_FBIT), FRACT_MAX); |
| 54 | + /* From Section 7.18a.6.1, functions returning a fixed-point value, the |
| 55 | + * return value is saturated on overflow. */ |
| 56 | + EXPECT_EQ(func(INT_MAX, INT_MAX), FRACT_MAX); |
| 57 | + EXPECT_LT(func(INT_MAX - 1, INT_MAX) - 0.99999999r, epsilon); |
| 58 | + EXPECT_EQ(func(INT_MIN, INT_MAX), FRACT_MIN); |
| 59 | + /* Expecting 0 here as fract is not precise enough to |
55 | 60 | * handle 1/INT_MAX |
56 | 61 | */ |
57 | | - EXPECT_EQ(func(1, INT_MAX), 0.r); |
| 62 | + EXPECT_LT(func(1, INT_MAX) - 0.r, epsilon); |
| 63 | + /* This results in 1.1739, which should be saturated to FRACT_MAX */ |
| 64 | + EXPECT_EQ(func(27, 23), FRACT_MAX); |
58 | 65 | } |
59 | 66 | }; |
60 | 67 |
|
61 | 68 | #define LIST_DIVI_TESTS(Name, XType, func) \ |
62 | 69 | using LlvmLibc##Name##diviTest = DivITest<XType>; \ |
63 | 70 | TEST_F(LlvmLibc##Name##diviTest, Basic) { testBasic(&func); } \ |
64 | | - TEST_F(LlvmLibc##Name##diviTest, Special) { testSpecial(&func); } \ |
| 71 | + TEST_F(LlvmLibc##Name##diviTest, Special) { testSpecial(&func); } \ |
65 | 72 | static_assert(true, "Require semicolon.") |
0 commit comments