diff options
| author | 2019-06-23 21:36:31 +0000 | |
|---|---|---|
| committer | 2019-06-23 21:36:31 +0000 | |
| commit | 23f101f37937a1bd4a29726cab2f76e0fb038b35 (patch) | |
| tree | f7da7d6b32c2e07114da399150bfa88d72187012 /gnu/llvm/unittests/ADT/APFloatTest.cpp | |
| parent | sort previous; ok deraadt (diff) | |
| download | wireguard-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.cpp | 90 |
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 |
