summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/unittests/ADT/APFloatTest.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2019-06-23 21:36:31 +0000
committerpatrick <patrick@openbsd.org>2019-06-23 21:36:31 +0000
commit23f101f37937a1bd4a29726cab2f76e0fb038b35 (patch)
treef7da7d6b32c2e07114da399150bfa88d72187012 /gnu/llvm/unittests/ADT/APFloatTest.cpp
parentsort previous; ok deraadt (diff)
downloadwireguard-openbsd-23f101f37937a1bd4a29726cab2f76e0fb038b35.tar.xz
wireguard-openbsd-23f101f37937a1bd4a29726cab2f76e0fb038b35.zip
Import LLVM 8.0.0 release including clang, lld and lldb.
Diffstat (limited to 'gnu/llvm/unittests/ADT/APFloatTest.cpp')
-rw-r--r--gnu/llvm/unittests/ADT/APFloatTest.cpp90
1 files changed, 68 insertions, 22 deletions
diff --git a/gnu/llvm/unittests/ADT/APFloatTest.cpp b/gnu/llvm/unittests/ADT/APFloatTest.cpp
index 1212b45fb57..64053a811a3 100644
--- a/gnu/llvm/unittests/ADT/APFloatTest.cpp
+++ b/gnu/llvm/unittests/ADT/APFloatTest.cpp
@@ -555,6 +555,36 @@ TEST(APFloatTest, MaxNum) {
EXPECT_EQ(1.0, maxnum(nan, f1).convertToDouble());
}
+TEST(APFloatTest, Minimum) {
+ APFloat f1(1.0);
+ APFloat f2(2.0);
+ APFloat zp(0.0);
+ APFloat zn(-0.0);
+ APFloat nan = APFloat::getNaN(APFloat::IEEEdouble());
+
+ EXPECT_EQ(1.0, minimum(f1, f2).convertToDouble());
+ EXPECT_EQ(1.0, minimum(f2, f1).convertToDouble());
+ EXPECT_EQ(-0.0, minimum(zp, zn).convertToDouble());
+ EXPECT_EQ(-0.0, minimum(zn, zp).convertToDouble());
+ EXPECT_TRUE(std::isnan(minimum(f1, nan).convertToDouble()));
+ EXPECT_TRUE(std::isnan(minimum(nan, f1).convertToDouble()));
+}
+
+TEST(APFloatTest, Maximum) {
+ APFloat f1(1.0);
+ APFloat f2(2.0);
+ APFloat zp(0.0);
+ APFloat zn(-0.0);
+ APFloat nan = APFloat::getNaN(APFloat::IEEEdouble());
+
+ EXPECT_EQ(2.0, maximum(f1, f2).convertToDouble());
+ EXPECT_EQ(2.0, maximum(f2, f1).convertToDouble());
+ EXPECT_EQ(0.0, maximum(zp, zn).convertToDouble());
+ EXPECT_EQ(0.0, maximum(zn, zp).convertToDouble());
+ EXPECT_TRUE(std::isnan(maximum(f1, nan).convertToDouble()));
+ EXPECT_TRUE(std::isnan(maximum(nan, f1).convertToDouble()));
+}
+
TEST(APFloatTest, Denormal) {
APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
@@ -1040,33 +1070,49 @@ TEST(APFloatTest, toInteger) {
EXPECT_EQ(APSInt::getMaxValue(5, false), result);
}
-static APInt nanbits(const fltSemantics &Sem,
- bool SNaN, bool Negative, uint64_t fill) {
- APInt apfill(64, fill);
+static APInt nanbitsFromAPInt(const fltSemantics &Sem, bool SNaN, bool Negative,
+ uint64_t payload) {
+ APInt appayload(64, payload);
if (SNaN)
- return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt();
+ return APFloat::getSNaN(Sem, Negative, &appayload).bitcastToAPInt();
else
- return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt();
+ return APFloat::getQNaN(Sem, Negative, &appayload).bitcastToAPInt();
}
TEST(APFloatTest, makeNaN) {
- ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle(), false, false, 0));
- ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle(), false, true, 0));
- ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle(), false, false, 0xae72));
- ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle(), false, false, 0xffffae72));
- ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle(), true, false, 0));
- ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle(), true, true, 0));
- ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle(), true, false, 0xae72));
- ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle(), true, false, 0xffffae72));
-
- ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, false, 0));
- ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, true, 0));
- ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xae72));
- ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL));
- ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, false, 0));
- ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, true, 0));
- ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xae72));
- ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL));
+ const struct {
+ uint64_t expected;
+ const fltSemantics &semantics;
+ bool SNaN;
+ bool Negative;
+ uint64_t payload;
+ } tests[] = {
+ /* expected semantics SNaN Neg payload */
+ { 0x7fc00000ULL, APFloat::IEEEsingle(), false, false, 0x00000000ULL },
+ { 0xffc00000ULL, APFloat::IEEEsingle(), false, true, 0x00000000ULL },
+ { 0x7fc0ae72ULL, APFloat::IEEEsingle(), false, false, 0x0000ae72ULL },
+ { 0x7fffae72ULL, APFloat::IEEEsingle(), false, false, 0xffffae72ULL },
+ { 0x7fdaae72ULL, APFloat::IEEEsingle(), false, false, 0x00daae72ULL },
+ { 0x7fa00000ULL, APFloat::IEEEsingle(), true, false, 0x00000000ULL },
+ { 0xffa00000ULL, APFloat::IEEEsingle(), true, true, 0x00000000ULL },
+ { 0x7f80ae72ULL, APFloat::IEEEsingle(), true, false, 0x0000ae72ULL },
+ { 0x7fbfae72ULL, APFloat::IEEEsingle(), true, false, 0xffffae72ULL },
+ { 0x7f9aae72ULL, APFloat::IEEEsingle(), true, false, 0x001aae72ULL },
+ { 0x7ff8000000000000ULL, APFloat::IEEEdouble(), false, false, 0x0000000000000000ULL },
+ { 0xfff8000000000000ULL, APFloat::IEEEdouble(), false, true, 0x0000000000000000ULL },
+ { 0x7ff800000000ae72ULL, APFloat::IEEEdouble(), false, false, 0x000000000000ae72ULL },
+ { 0x7fffffffffffae72ULL, APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL },
+ { 0x7ffdaaaaaaaaae72ULL, APFloat::IEEEdouble(), false, false, 0x000daaaaaaaaae72ULL },
+ { 0x7ff4000000000000ULL, APFloat::IEEEdouble(), true, false, 0x0000000000000000ULL },
+ { 0xfff4000000000000ULL, APFloat::IEEEdouble(), true, true, 0x0000000000000000ULL },
+ { 0x7ff000000000ae72ULL, APFloat::IEEEdouble(), true, false, 0x000000000000ae72ULL },
+ { 0x7ff7ffffffffae72ULL, APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL },
+ { 0x7ff1aaaaaaaaae72ULL, APFloat::IEEEdouble(), true, false, 0x0001aaaaaaaaae72ULL },
+ };
+
+ for (const auto &t : tests) {
+ ASSERT_EQ(t.expected, nanbitsFromAPInt(t.semantics, t.SNaN, t.Negative, t.payload));
+ }
}
#ifdef GTEST_HAS_DEATH_TEST