@@ -636,47 +636,93 @@ TEST(APFloatTest, MinimumNumber) {
636
636
APFloat f2 (2.0 );
637
637
APFloat zp (0.0 );
638
638
APFloat zn (-0.0 );
639
- APFloat nan = APFloat::getNaN (APFloat::IEEEdouble ());
640
- APFloat snan = APFloat::getSNaN (APFloat::IEEEdouble ());
639
+ APInt intPayload_89ab (64 , 0x89ab );
640
+ APInt intPayload_cdef (64 , 0xcdef );
641
+ APFloat nan_0123[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 ),
642
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 )};
643
+ APFloat mnan_4567[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 ),
644
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 )};
645
+ APFloat nan_89ab[2 ] = {
646
+ APFloat::getSNaN (APFloat::IEEEdouble (), false , &intPayload_89ab),
647
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x89ab )};
648
+ APFloat mnan_cdef[2 ] = {
649
+ APFloat::getSNaN (APFloat::IEEEdouble (), true , &intPayload_cdef),
650
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0xcdef )};
641
651
642
652
EXPECT_EQ (1.0 , minimumnum (f1, f2).convertToDouble ());
643
653
EXPECT_EQ (1.0 , minimumnum (f2, f1).convertToDouble ());
644
654
EXPECT_EQ (-0.0 , minimumnum (zp, zn).convertToDouble ());
645
655
EXPECT_EQ (-0.0 , minimumnum (zn, zp).convertToDouble ());
656
+
646
657
EXPECT_TRUE (minimumnum (zn, zp).isNegative ());
647
658
EXPECT_TRUE (minimumnum (zp, zn).isNegative ());
648
659
EXPECT_TRUE (minimumnum (zn, zn).isNegative ());
649
660
EXPECT_FALSE (minimumnum (zp, zp).isNegative ());
650
- EXPECT_FALSE (std::isnan (minimumnum (f1, nan).convertToDouble ()));
651
- EXPECT_FALSE (std::isnan (minimumnum (nan, f1).convertToDouble ()));
652
- EXPECT_FALSE (std::isnan (minimumnum (f1, snan).convertToDouble ()));
653
- EXPECT_FALSE (std::isnan (minimumnum (snan, f1).convertToDouble ()));
654
- EXPECT_FALSE (minimumnum (snan, nan).isSignaling ());
655
- EXPECT_FALSE (minimumnum (snan, snan).isSignaling ());
661
+
662
+ for (APFloat n : {nan_0123[0 ], mnan_4567[0 ], nan_89ab[0 ], mnan_cdef[0 ]})
663
+ for (APFloat f : {f1, f2, zn, zp}) {
664
+ APFloat res = minimumnum (f, n);
665
+ EXPECT_FALSE (res.isNaN ());
666
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
667
+ res = minimumnum (n, f);
668
+ EXPECT_FALSE (res.isNaN ());
669
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
670
+ }
671
+
672
+ // When NaN vs NaN, we should keep payload/sign of either one.
673
+ for (auto n1 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef})
674
+ for (auto n2 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef}) {
675
+ APFloat res = minimumnum (n1[0 ], n2[0 ]);
676
+ EXPECT_TRUE (res.bitwiseIsEqual (n1[1 ]) || res.bitwiseIsEqual (n2[1 ]));
677
+ EXPECT_FALSE (res.isSignaling ());
678
+ }
656
679
}
657
680
658
681
TEST (APFloatTest, MaximumNumber) {
659
682
APFloat f1 (1.0 );
660
683
APFloat f2 (2.0 );
661
684
APFloat zp (0.0 );
662
685
APFloat zn (-0.0 );
663
- APFloat nan = APFloat::getNaN (APFloat::IEEEdouble ());
664
- APFloat snan = APFloat::getSNaN (APFloat::IEEEdouble ());
686
+ APInt intPayload_89ab (64 , 0x89ab );
687
+ APInt intPayload_cdef (64 , 0xcdef );
688
+ APFloat nan_0123[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 ),
689
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 )};
690
+ APFloat mnan_4567[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 ),
691
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 )};
692
+ APFloat nan_89ab[2 ] = {
693
+ APFloat::getSNaN (APFloat::IEEEdouble (), false , &intPayload_89ab),
694
+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x89ab )};
695
+ APFloat mnan_cdef[2 ] = {
696
+ APFloat::getSNaN (APFloat::IEEEdouble (), true , &intPayload_cdef),
697
+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0xcdef )};
665
698
666
699
EXPECT_EQ (2.0 , maximumnum (f1, f2).convertToDouble ());
667
700
EXPECT_EQ (2.0 , maximumnum (f2, f1).convertToDouble ());
668
701
EXPECT_EQ (0.0 , maximumnum (zp, zn).convertToDouble ());
669
702
EXPECT_EQ (0.0 , maximumnum (zn, zp).convertToDouble ());
703
+
670
704
EXPECT_FALSE (maximumnum (zn, zp).isNegative ());
671
705
EXPECT_FALSE (maximumnum (zp, zn).isNegative ());
672
706
EXPECT_TRUE (maximumnum (zn, zn).isNegative ());
673
707
EXPECT_FALSE (maximumnum (zp, zp).isNegative ());
674
- EXPECT_FALSE (std::isnan (maximumnum (f1, nan).convertToDouble ()));
675
- EXPECT_FALSE (std::isnan (maximumnum (nan, f1).convertToDouble ()));
676
- EXPECT_FALSE (std::isnan (maximumnum (f1, snan).convertToDouble ()));
677
- EXPECT_FALSE (std::isnan (maximumnum (snan, f1).convertToDouble ()));
678
- EXPECT_FALSE (maximumnum (snan, nan).isSignaling ());
679
- EXPECT_FALSE (maximumnum (snan, snan).isSignaling ());
708
+
709
+ for (APFloat n : {nan_0123[0 ], mnan_4567[0 ], nan_89ab[0 ], mnan_cdef[0 ]})
710
+ for (APFloat f : {f1, f2, zn, zp}) {
711
+ APFloat res = maximumnum (f, n);
712
+ EXPECT_FALSE (res.isNaN ());
713
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
714
+ res = maximumnum (n, f);
715
+ EXPECT_FALSE (res.isNaN ());
716
+ EXPECT_TRUE (res.bitwiseIsEqual (f));
717
+ }
718
+
719
+ // When NaN vs NaN, we should keep payload/sign of either one.
720
+ for (auto n1 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef})
721
+ for (auto n2 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef}) {
722
+ APFloat res = maximumnum (n1[0 ], n2[0 ]);
723
+ EXPECT_TRUE (res.bitwiseIsEqual (n1[1 ]) || res.bitwiseIsEqual (n2[1 ]));
724
+ EXPECT_FALSE (res.isSignaling ());
725
+ }
680
726
}
681
727
682
728
TEST (APFloatTest, Denormal) {
0 commit comments