@@ -21,7 +21,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
21
21
typedef T (*FromfpxFunc)(T, int , unsigned int );
22
22
23
23
void testSpecialNumbersNonzeroWidth (FromfpxFunc func) {
24
- for (int rnd : MATH_ROUNDING_DIRECTIONS ) {
24
+ for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN ) {
25
25
EXPECT_FP_EQ (zero, func (zero, rnd, 32U ));
26
26
EXPECT_FP_EQ (neg_zero, func (neg_zero, rnd, 32U ));
27
27
@@ -33,7 +33,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
33
33
}
34
34
35
35
void testSpecialNumbersZeroWidth (FromfpxFunc func) {
36
- for (int rnd : MATH_ROUNDING_DIRECTIONS ) {
36
+ for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN ) {
37
37
EXPECT_FP_EQ (aNaN, func (zero, rnd, 0U ));
38
38
EXPECT_FP_EQ (aNaN, func (neg_zero, rnd, 0U ));
39
39
@@ -45,7 +45,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
45
45
}
46
46
47
47
void testRoundedNumbersWithinRange (FromfpxFunc func) {
48
- for (int rnd : MATH_ROUNDING_DIRECTIONS ) {
48
+ for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN ) {
49
49
EXPECT_FP_EQ (T (1.0 ), func (T (1.0 ), rnd, 2U ));
50
50
EXPECT_FP_EQ (T (-1.0 ), func (T (-1.0 ), rnd, 1U ));
51
51
EXPECT_FP_EQ (T (10.0 ), func (T (10.0 ), rnd, 5U ));
@@ -56,7 +56,7 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
56
56
}
57
57
58
58
void testRoundedNumbersOutsideRange (FromfpxFunc func) {
59
- for (int rnd : MATH_ROUNDING_DIRECTIONS ) {
59
+ for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN ) {
60
60
EXPECT_FP_EQ (aNaN, func (T (1.0 ), rnd, 1U ));
61
61
EXPECT_FP_EQ (aNaN, func (T (10.0 ), rnd, 4U ));
62
62
EXPECT_FP_EQ (aNaN, func (T (-10.0 ), rnd, 4U ));
@@ -402,6 +402,126 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
402
402
EXPECT_FP_EQ (aNaN, func (T (5.75 ), FP_INT_TONEAREST, 3U ));
403
403
EXPECT_FP_EQ (aNaN, func (T (-5.75 ), FP_INT_TONEAREST, 3U ));
404
404
}
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
+ }
405
525
};
406
526
407
527
#define LIST_FROMFPX_TESTS (T, func ) \
@@ -447,6 +567,12 @@ class FromfpxTestTemplate : public LIBC_NAMESPACE::testing::Test {
447
567
} \
448
568
TEST_F (LlvmLibcFromfpxTest, FractionsToNearestOutsideRange) { \
449
569
testFractionsToNearestOutsideRange (&func); \
570
+ } \
571
+ TEST_F (LlvmLibcFromfpxTest, FractionsToNearestFallbackWithinRange) { \
572
+ testFractionsToNearestFallbackWithinRange (&func); \
573
+ } \
574
+ TEST_F (LlvmLibcFromfpxTest, FractionsToNearestFallbackOutsideRange) { \
575
+ testFractionsToNearestFallbackOutsideRange (&func); \
450
576
}
451
577
452
578
#endif // LIBC_TEST_SRC_MATH_SMOKE_FROMFPXTEST_H
0 commit comments