@@ -631,6 +631,100 @@ TEST(APFloatTest, Maximum) {
631631 EXPECT_TRUE (std::isnan (maximum (nan, f1).convertToDouble ()));
632632}
633633
634+ TEST (APFloatTest, MinimumNumber) {
635+ APFloat f1 (1.0 );
636+ APFloat f2 (2.0 );
637+ APFloat zp (0.0 );
638+ APFloat zn (-0.0 );
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 )};
651+
652+ EXPECT_TRUE (f1.bitwiseIsEqual (minimumnum (f1, f2)));
653+ EXPECT_TRUE (f1.bitwiseIsEqual (minimumnum (f2, f1)));
654+ EXPECT_TRUE (zn.bitwiseIsEqual (minimumnum (zp, zn)));
655+ EXPECT_TRUE (zn.bitwiseIsEqual (minimumnum (zn, zp)));
656+
657+ EXPECT_TRUE (minimumnum (zn, zp).isNegative ());
658+ EXPECT_TRUE (minimumnum (zp, zn).isNegative ());
659+ EXPECT_TRUE (minimumnum (zn, zn).isNegative ());
660+ EXPECT_FALSE (minimumnum (zp, zp).isNegative ());
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+ }
679+ }
680+
681+ TEST (APFloatTest, MaximumNumber) {
682+ APFloat f1 (1.0 );
683+ APFloat f2 (2.0 );
684+ APFloat zp (0.0 );
685+ APFloat zn (-0.0 );
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 )};
698+
699+ EXPECT_TRUE (f2.bitwiseIsEqual (maximumnum (f1, f2)));
700+ EXPECT_TRUE (f2.bitwiseIsEqual (maximumnum (f2, f1)));
701+ EXPECT_TRUE (zp.bitwiseIsEqual (maximumnum (zp, zn)));
702+ EXPECT_TRUE (zp.bitwiseIsEqual (maximumnum (zn, zp)));
703+
704+ EXPECT_FALSE (maximumnum (zn, zp).isNegative ());
705+ EXPECT_FALSE (maximumnum (zp, zn).isNegative ());
706+ EXPECT_TRUE (maximumnum (zn, zn).isNegative ());
707+ EXPECT_FALSE (maximumnum (zp, zp).isNegative ());
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+ }
726+ }
727+
634728TEST (APFloatTest, Denormal) {
635729 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
636730
0 commit comments