@@ -582,7 +582,46 @@ TEST(APFloatTest, MinNum) {
582582 APFloat zp (0.0 );
583583 APFloat zn (-0.0 );
584584 EXPECT_EQ (-0.0 , minnum (zp, zn).convertToDouble ());
585- EXPECT_EQ (-0.0 , minnum (zn, zp).convertToDouble ());
585+
586+ APInt intPayload_89ab (64 , 0x89ab );
587+ APInt intPayload_cdef (64 , 0xcdef );
588+ APFloat nan_0123[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 ),
589+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 )};
590+ APFloat mnan_4567[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 ),
591+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 )};
592+ APFloat nan_89ab[2 ] = {
593+ APFloat::getSNaN (APFloat::IEEEdouble (), false , &intPayload_89ab),
594+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x89ab )};
595+ APFloat mnan_cdef[2 ] = {
596+ APFloat::getSNaN (APFloat::IEEEdouble (), true , &intPayload_cdef),
597+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0xcdef )};
598+
599+ for (APFloat n : {nan_0123[0 ], mnan_4567[0 ]})
600+ for (APFloat f : {f1, f2, zn, zp}) {
601+ APFloat res = minnum (f, n);
602+ EXPECT_FALSE (res.isNaN ());
603+ EXPECT_TRUE (res.bitwiseIsEqual (f));
604+ res = minnum (n, f);
605+ EXPECT_FALSE (res.isNaN ());
606+ EXPECT_TRUE (res.bitwiseIsEqual (f));
607+ }
608+ for (auto n : {nan_89ab, mnan_cdef})
609+ for (APFloat f : {f1, f2, zn, zp}) {
610+ APFloat res = minnum (f, n[0 ]);
611+ EXPECT_TRUE (res.isNaN ());
612+ EXPECT_TRUE (res.bitwiseIsEqual (n[1 ]));
613+ res = minnum (n[0 ], f);
614+ EXPECT_TRUE (res.isNaN ());
615+ EXPECT_TRUE (res.bitwiseIsEqual (n[1 ]));
616+ }
617+
618+ // When NaN vs NaN, we should keep payload/sign of either one.
619+ for (auto n1 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef})
620+ for (auto n2 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef}) {
621+ APFloat res = minnum (n1[0 ], n2[0 ]);
622+ EXPECT_TRUE (res.bitwiseIsEqual (n1[1 ]) || res.bitwiseIsEqual (n2[1 ]));
623+ EXPECT_FALSE (res.isSignaling ());
624+ }
586625}
587626
588627TEST (APFloatTest, MaxNum) {
@@ -599,6 +638,46 @@ TEST(APFloatTest, MaxNum) {
599638 APFloat zn (-0.0 );
600639 EXPECT_EQ (0.0 , maxnum (zp, zn).convertToDouble ());
601640 EXPECT_EQ (0.0 , maxnum (zn, zp).convertToDouble ());
641+
642+ APInt intPayload_89ab (64 , 0x89ab );
643+ APInt intPayload_cdef (64 , 0xcdef );
644+ APFloat nan_0123[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 ),
645+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x0123 )};
646+ APFloat mnan_4567[2 ] = {APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 ),
647+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0x4567 )};
648+ APFloat nan_89ab[2 ] = {
649+ APFloat::getSNaN (APFloat::IEEEdouble (), false , &intPayload_89ab),
650+ APFloat::getNaN (APFloat::IEEEdouble (), false , 0x89ab )};
651+ APFloat mnan_cdef[2 ] = {
652+ APFloat::getSNaN (APFloat::IEEEdouble (), true , &intPayload_cdef),
653+ APFloat::getNaN (APFloat::IEEEdouble (), true , 0xcdef )};
654+
655+ for (APFloat n : {nan_0123[0 ], mnan_4567[0 ]})
656+ for (APFloat f : {f1, f2, zn, zp}) {
657+ APFloat res = maxnum (f, n);
658+ EXPECT_FALSE (res.isNaN ());
659+ EXPECT_TRUE (res.bitwiseIsEqual (f));
660+ res = maxnum (n, f);
661+ EXPECT_FALSE (res.isNaN ());
662+ EXPECT_TRUE (res.bitwiseIsEqual (f));
663+ }
664+ for (auto n : {nan_89ab, mnan_cdef})
665+ for (APFloat f : {f1, f2, zn, zp}) {
666+ APFloat res = maxnum (f, n[0 ]);
667+ EXPECT_TRUE (res.isNaN ());
668+ EXPECT_TRUE (res.bitwiseIsEqual (n[1 ]));
669+ res = maxnum (n[0 ], f);
670+ EXPECT_TRUE (res.isNaN ());
671+ EXPECT_TRUE (res.bitwiseIsEqual (n[1 ]));
672+ }
673+
674+ // When NaN vs NaN, we should keep payload/sign of either one.
675+ for (auto n1 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef})
676+ for (auto n2 : {nan_0123, mnan_4567, nan_89ab, mnan_cdef}) {
677+ APFloat res = maxnum (n1[0 ], n2[0 ]);
678+ EXPECT_TRUE (res.bitwiseIsEqual (n1[1 ]) || res.bitwiseIsEqual (n2[1 ]));
679+ EXPECT_FALSE (res.isSignaling ());
680+ }
602681}
603682
604683TEST (APFloatTest, Minimum) {
0 commit comments