Skip to content

Commit e6a6794

Browse files
committed
Add more unittest
1 parent d3f2af2 commit e6a6794

File tree

1 file changed

+62
-16
lines changed

1 file changed

+62
-16
lines changed

llvm/unittests/ADT/APFloatTest.cpp

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -636,47 +636,93 @@ TEST(APFloatTest, MinimumNumber) {
636636
APFloat f2(2.0);
637637
APFloat zp(0.0);
638638
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)};
641651

642652
EXPECT_EQ(1.0, minimumnum(f1, f2).convertToDouble());
643653
EXPECT_EQ(1.0, minimumnum(f2, f1).convertToDouble());
644654
EXPECT_EQ(-0.0, minimumnum(zp, zn).convertToDouble());
645655
EXPECT_EQ(-0.0, minimumnum(zn, zp).convertToDouble());
656+
646657
EXPECT_TRUE(minimumnum(zn, zp).isNegative());
647658
EXPECT_TRUE(minimumnum(zp, zn).isNegative());
648659
EXPECT_TRUE(minimumnum(zn, zn).isNegative());
649660
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+
}
656679
}
657680

658681
TEST(APFloatTest, MaximumNumber) {
659682
APFloat f1(1.0);
660683
APFloat f2(2.0);
661684
APFloat zp(0.0);
662685
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)};
665698

666699
EXPECT_EQ(2.0, maximumnum(f1, f2).convertToDouble());
667700
EXPECT_EQ(2.0, maximumnum(f2, f1).convertToDouble());
668701
EXPECT_EQ(0.0, maximumnum(zp, zn).convertToDouble());
669702
EXPECT_EQ(0.0, maximumnum(zn, zp).convertToDouble());
703+
670704
EXPECT_FALSE(maximumnum(zn, zp).isNegative());
671705
EXPECT_FALSE(maximumnum(zp, zn).isNegative());
672706
EXPECT_TRUE(maximumnum(zn, zn).isNegative());
673707
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+
}
680726
}
681727

682728
TEST(APFloatTest, Denormal) {

0 commit comments

Comments
 (0)