Skip to content

Commit 7d8234f

Browse files
committed
fixup! [libc][math][c23] Add {,u}fromfp{,x}{,f,l,f128} functions
1 parent bfd4fa9 commit 7d8234f

File tree

5 files changed

+368
-19
lines changed

5 files changed

+368
-19
lines changed

libc/test/UnitTest/FPMatcher.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,12 @@ template <typename T> struct FPTest : public Test {
107107
const T min_denormal = FPBits::min_subnormal(Sign::POS).get_val(); \
108108
const T neg_min_denormal = FPBits::min_subnormal(Sign::NEG).get_val(); \
109109
const T max_denormal = FPBits::max_subnormal().get_val(); \
110-
static constexpr LIBC_NAMESPACE::cpp::array<int, 5> \
111-
MATH_ROUNDING_DIRECTIONS = { \
110+
static constexpr int UNKNOWN_MATH_ROUNDING_DIRECTION = 99; \
111+
static constexpr LIBC_NAMESPACE::cpp::array<int, 6> \
112+
MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN = { \
112113
FP_INT_UPWARD, FP_INT_DOWNWARD, \
113114
FP_INT_TOWARDZERO, FP_INT_TONEARESTFROMZERO, \
114-
FP_INT_TONEAREST, \
115+
FP_INT_TONEAREST, UNKNOWN_MATH_ROUNDING_DIRECTION, \
115116
};
116117

117118
#define EXPECT_FP_EQ(expected, actual) \

libc/test/src/math/smoke/FromfpTest.h

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class FromfpTestTemplate : public LIBC_NAMESPACE::testing::Test {
2121
typedef T (*FromfpFunc)(T, int, unsigned int);
2222

2323
void testSpecialNumbersNonzeroWidth(FromfpFunc func) {
24-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
24+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
2525
EXPECT_FP_EQ(zero, func(zero, rnd, 32U));
2626
EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U));
2727

@@ -33,7 +33,7 @@ class FromfpTestTemplate : public LIBC_NAMESPACE::testing::Test {
3333
}
3434

3535
void testSpecialNumbersZeroWidth(FromfpFunc func) {
36-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
36+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
3737
EXPECT_FP_EQ(aNaN, func(zero, rnd, 0U));
3838
EXPECT_FP_EQ(aNaN, func(neg_zero, rnd, 0U));
3939

@@ -45,7 +45,7 @@ class FromfpTestTemplate : public LIBC_NAMESPACE::testing::Test {
4545
}
4646

4747
void testRoundedNumbersWithinRange(FromfpFunc func) {
48-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
48+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
4949
EXPECT_FP_EQ(T(1.0), func(T(1.0), rnd, 2U));
5050
EXPECT_FP_EQ(T(-1.0), func(T(-1.0), rnd, 1U));
5151
EXPECT_FP_EQ(T(10.0), func(T(10.0), rnd, 5U));
@@ -56,7 +56,7 @@ class FromfpTestTemplate : public LIBC_NAMESPACE::testing::Test {
5656
}
5757

5858
void testRoundedNumbersOutsideRange(FromfpFunc func) {
59-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
59+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
6060
EXPECT_FP_EQ(aNaN, func(T(1.0), rnd, 1U));
6161
EXPECT_FP_EQ(aNaN, func(T(10.0), rnd, 4U));
6262
EXPECT_FP_EQ(aNaN, func(T(-10.0), rnd, 4U));
@@ -288,6 +288,78 @@ class FromfpTestTemplate : public LIBC_NAMESPACE::testing::Test {
288288
EXPECT_FP_EQ(aNaN, func(T(5.75), FP_INT_TONEAREST, 3U));
289289
EXPECT_FP_EQ(aNaN, func(T(-5.75), FP_INT_TONEAREST, 3U));
290290
}
291+
292+
void testFractionsToNearestFallbackWithinRange(FromfpFunc func) {
293+
EXPECT_FP_EQ(T(0.0), func(T(0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
294+
EXPECT_FP_EQ(T(-0.0), func(T(-0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
295+
EXPECT_FP_EQ(T(0.0), func(T(0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
296+
EXPECT_FP_EQ(T(-0.0), func(T(-0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
297+
EXPECT_FP_EQ(T(1.0), func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
298+
EXPECT_FP_EQ(T(-1.0), func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
299+
EXPECT_FP_EQ(T(1.0), func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
300+
EXPECT_FP_EQ(T(-1.0), func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
301+
EXPECT_FP_EQ(T(2.0), func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
302+
EXPECT_FP_EQ(T(-2.0), func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
303+
EXPECT_FP_EQ(T(2.0), func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
304+
EXPECT_FP_EQ(T(-2.0), func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
305+
EXPECT_FP_EQ(T(10.0), func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U));
306+
EXPECT_FP_EQ(T(-10.0),
307+
func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U));
308+
EXPECT_FP_EQ(T(11.0), func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U));
309+
EXPECT_FP_EQ(T(-11.0),
310+
func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U));
311+
EXPECT_FP_EQ(T(1234.0),
312+
func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U));
313+
EXPECT_FP_EQ(T(-1234.0),
314+
func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U));
315+
EXPECT_FP_EQ(T(1235.0),
316+
func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U));
317+
EXPECT_FP_EQ(T(-1235.0),
318+
func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U));
319+
320+
EXPECT_FP_EQ(T(2.0), func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
321+
EXPECT_FP_EQ(T(-2.0), func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
322+
EXPECT_FP_EQ(T(2.0), func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
323+
EXPECT_FP_EQ(T(-2.0), func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
324+
EXPECT_FP_EQ(T(3.0), func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
325+
EXPECT_FP_EQ(T(-3.0), func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
326+
EXPECT_FP_EQ(T(5.0), func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
327+
EXPECT_FP_EQ(T(-5.0), func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
328+
EXPECT_FP_EQ(T(6.0), func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
329+
EXPECT_FP_EQ(T(-6.0), func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
330+
EXPECT_FP_EQ(T(6.0), func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
331+
EXPECT_FP_EQ(T(-6.0), func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
332+
}
333+
334+
void testFractionsToNearestFallbackOutsideRange(FromfpFunc func) {
335+
EXPECT_FP_EQ(aNaN, func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
336+
EXPECT_FP_EQ(aNaN, func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
337+
EXPECT_FP_EQ(aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
338+
EXPECT_FP_EQ(aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
339+
EXPECT_FP_EQ(aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
340+
EXPECT_FP_EQ(aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
341+
EXPECT_FP_EQ(aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
342+
EXPECT_FP_EQ(aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
343+
EXPECT_FP_EQ(aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
344+
EXPECT_FP_EQ(aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
345+
EXPECT_FP_EQ(aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
346+
EXPECT_FP_EQ(aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
347+
EXPECT_FP_EQ(aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
348+
EXPECT_FP_EQ(aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
349+
350+
EXPECT_FP_EQ(aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
351+
EXPECT_FP_EQ(aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
352+
EXPECT_FP_EQ(aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
353+
EXPECT_FP_EQ(aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
354+
EXPECT_FP_EQ(aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
355+
EXPECT_FP_EQ(aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
356+
EXPECT_FP_EQ(aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
357+
EXPECT_FP_EQ(aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
358+
EXPECT_FP_EQ(aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
359+
EXPECT_FP_EQ(aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
360+
EXPECT_FP_EQ(aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
361+
EXPECT_FP_EQ(aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
362+
}
291363
};
292364

293365
#define LIST_FROMFP_TESTS(T, func) \
@@ -333,6 +405,12 @@ class FromfpTestTemplate : public LIBC_NAMESPACE::testing::Test {
333405
} \
334406
TEST_F(LlvmLibcFromfpTest, FractionsToNearestOutsideRange) { \
335407
testFractionsToNearestOutsideRange(&func); \
408+
} \
409+
TEST_F(LlvmLibcFromfpTest, FractionsToNearestFallbackWithinRange) { \
410+
testFractionsToNearestFallbackWithinRange(&func); \
411+
} \
412+
TEST_F(LlvmLibcFromfpTest, FractionsToNearestFallbackOutsideRange) { \
413+
testFractionsToNearestFallbackOutsideRange(&func); \
336414
}
337415

338416
#endif // LIBC_TEST_SRC_MATH_SMOKE_FROMFPTEST_H

libc/test/src/math/smoke/FromfpxTest.h

Lines changed: 130 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
2121
typedef T (*FromfpxFunc)(T, int, unsigned int);
2222

2323
void testSpecialNumbersNonzeroWidth(FromfpxFunc func) {
24-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
24+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
2525
EXPECT_FP_EQ(zero, func(zero, rnd, 32U));
2626
EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U));
2727

@@ -33,7 +33,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
3333
}
3434

3535
void testSpecialNumbersZeroWidth(FromfpxFunc func) {
36-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
36+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
3737
EXPECT_FP_EQ(aNaN, func(zero, rnd, 0U));
3838
EXPECT_FP_EQ(aNaN, func(neg_zero, rnd, 0U));
3939

@@ -45,7 +45,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
4545
}
4646

4747
void testRoundedNumbersWithinRange(FromfpxFunc func) {
48-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
48+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
4949
EXPECT_FP_EQ(T(1.0), func(T(1.0), rnd, 2U));
5050
EXPECT_FP_EQ(T(-1.0), func(T(-1.0), rnd, 1U));
5151
EXPECT_FP_EQ(T(10.0), func(T(10.0), rnd, 5U));
@@ -56,7 +56,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
5656
}
5757

5858
void testRoundedNumbersOutsideRange(FromfpxFunc func) {
59-
for (int rnd : MATH_ROUNDING_DIRECTIONS) {
59+
for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
6060
EXPECT_FP_EQ(aNaN, func(T(1.0), rnd, 1U));
6161
EXPECT_FP_EQ(aNaN, func(T(10.0), rnd, 4U));
6262
EXPECT_FP_EQ(aNaN, func(T(-10.0), rnd, 4U));
@@ -402,6 +402,126 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
402402
EXPECT_FP_EQ(aNaN, func(T(5.75), FP_INT_TONEAREST, 3U));
403403
EXPECT_FP_EQ(aNaN, func(T(-5.75), FP_INT_TONEAREST, 3U));
404404
}
405+
406+
void testFractionsToNearestFallbackWithinRange(FromfpxFunc func) {
407+
EXPECT_FP_EQ_WITH_EXCEPTION(
408+
T(0.0), func(T(0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INEXACT);
409+
EXPECT_FP_EQ_WITH_EXCEPTION(
410+
T(-0.0), func(T(-0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
411+
FE_INEXACT);
412+
EXPECT_FP_EQ_WITH_EXCEPTION(
413+
T(0.0), func(T(0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
414+
FE_INEXACT);
415+
EXPECT_FP_EQ_WITH_EXCEPTION(
416+
T(-0.0), func(T(-0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
417+
FE_INEXACT);
418+
EXPECT_FP_EQ_WITH_EXCEPTION(
419+
T(1.0), func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
420+
FE_INEXACT);
421+
EXPECT_FP_EQ_WITH_EXCEPTION(
422+
T(-1.0), func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
423+
FE_INEXACT);
424+
EXPECT_FP_EQ_WITH_EXCEPTION(
425+
T(1.0), func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT);
426+
EXPECT_FP_EQ_WITH_EXCEPTION(
427+
T(-1.0), func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
428+
FE_INEXACT);
429+
EXPECT_FP_EQ_WITH_EXCEPTION(
430+
T(2.0), func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
431+
EXPECT_FP_EQ_WITH_EXCEPTION(
432+
T(-2.0), func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
433+
FE_INEXACT);
434+
EXPECT_FP_EQ_WITH_EXCEPTION(
435+
T(2.0), func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
436+
EXPECT_FP_EQ_WITH_EXCEPTION(
437+
T(-2.0), func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
438+
FE_INEXACT);
439+
EXPECT_FP_EQ_WITH_EXCEPTION(
440+
T(10.0), func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
441+
FE_INEXACT);
442+
EXPECT_FP_EQ_WITH_EXCEPTION(
443+
T(-10.0), func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
444+
FE_INEXACT);
445+
EXPECT_FP_EQ_WITH_EXCEPTION(
446+
T(11.0), func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
447+
FE_INEXACT);
448+
EXPECT_FP_EQ_WITH_EXCEPTION(
449+
T(-11.0), func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
450+
FE_INEXACT);
451+
EXPECT_FP_EQ_WITH_EXCEPTION(
452+
T(1234.0), func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U),
453+
FE_INEXACT);
454+
EXPECT_FP_EQ_WITH_EXCEPTION(
455+
T(-1234.0), func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U),
456+
FE_INEXACT);
457+
EXPECT_FP_EQ_WITH_EXCEPTION(
458+
T(1235.0), func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U),
459+
FE_INEXACT);
460+
EXPECT_FP_EQ_WITH_EXCEPTION(
461+
T(-1235.0), func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 12U),
462+
FE_INEXACT);
463+
464+
EXPECT_FP_EQ_WITH_EXCEPTION(
465+
T(2.0), func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
466+
EXPECT_FP_EQ_WITH_EXCEPTION(
467+
T(-2.0), func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
468+
FE_INEXACT);
469+
EXPECT_FP_EQ_WITH_EXCEPTION(
470+
T(2.0), func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
471+
EXPECT_FP_EQ_WITH_EXCEPTION(
472+
T(-2.0), func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
473+
FE_INEXACT);
474+
EXPECT_FP_EQ_WITH_EXCEPTION(
475+
T(3.0), func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
476+
EXPECT_FP_EQ_WITH_EXCEPTION(
477+
T(-3.0), func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U),
478+
FE_INEXACT);
479+
EXPECT_FP_EQ_WITH_EXCEPTION(
480+
T(5.0), func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INEXACT);
481+
EXPECT_FP_EQ_WITH_EXCEPTION(
482+
T(-5.0), func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
483+
FE_INEXACT);
484+
EXPECT_FP_EQ_WITH_EXCEPTION(
485+
T(6.0), func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INEXACT);
486+
EXPECT_FP_EQ_WITH_EXCEPTION(
487+
T(-6.0), func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
488+
FE_INEXACT);
489+
EXPECT_FP_EQ_WITH_EXCEPTION(
490+
T(6.0), func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INEXACT);
491+
EXPECT_FP_EQ_WITH_EXCEPTION(
492+
T(-6.0), func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
493+
FE_INEXACT);
494+
}
495+
496+
void testFractionsToNearestFallbackOutsideRange(FromfpxFunc func) {
497+
EXPECT_FP_EQ(aNaN, func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
498+
EXPECT_FP_EQ(aNaN, func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
499+
EXPECT_FP_EQ(aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
500+
EXPECT_FP_EQ(aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
501+
EXPECT_FP_EQ(aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
502+
EXPECT_FP_EQ(aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
503+
EXPECT_FP_EQ(aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
504+
EXPECT_FP_EQ(aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
505+
EXPECT_FP_EQ(aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
506+
EXPECT_FP_EQ(aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
507+
EXPECT_FP_EQ(aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
508+
EXPECT_FP_EQ(aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
509+
EXPECT_FP_EQ(aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
510+
EXPECT_FP_EQ(aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U));
511+
512+
EXPECT_FP_EQ(aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
513+
EXPECT_FP_EQ(aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
514+
EXPECT_FP_EQ(aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
515+
EXPECT_FP_EQ(aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
516+
EXPECT_FP_EQ(aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
517+
EXPECT_FP_EQ(aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
518+
EXPECT_FP_EQ(aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
519+
EXPECT_FP_EQ(aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
520+
EXPECT_FP_EQ(aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
521+
EXPECT_FP_EQ(aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
522+
EXPECT_FP_EQ(aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
523+
EXPECT_FP_EQ(aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
524+
}
405525
};
406526

407527
#define LIST_FROMFPX_TESTS(T, func) \
@@ -447,6 +567,12 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
447567
} \
448568
TEST_F(LlvmLibcFromfpxTest, FractionsToNearestOutsideRange) { \
449569
testFractionsToNearestOutsideRange(&func); \
570+
} \
571+
TEST_F(LlvmLibcFromfpxTest, FractionsToNearestFallbackWithinRange) { \
572+
testFractionsToNearestFallbackWithinRange(&func); \
573+
} \
574+
TEST_F(LlvmLibcFromfpxTest, FractionsToNearestFallbackOutsideRange) { \
575+
testFractionsToNearestFallbackOutsideRange(&func); \
450576
}
451577

452578
#endif // LIBC_TEST_SRC_MATH_SMOKE_FROMFPXTEST_H

0 commit comments

Comments
 (0)