X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=unittests%2FADT%2FAPFloatTest.cpp;h=964b04da473c19b475417ba782bb7b9c70241ae0;hb=a75ce9f5d2236d93c117e861e60e6f3f748c9555;hp=76cdafcf3fe16e008fba61e99bded2e8d06c9a08;hpb=6a09affdf62fccbd190ca6e9cac0cb065b5f2677;p=oota-llvm.git diff --git a/unittests/ADT/APFloatTest.cpp b/unittests/ADT/APFloatTest.cpp index 76cdafcf3fe..964b04da473 100644 --- a/unittests/ADT/APFloatTest.cpp +++ b/unittests/ADT/APFloatTest.cpp @@ -236,6 +236,13 @@ TEST(APFloatTest, fromDecimalString) { EXPECT_EQ(2.05e12, APFloat(APFloat::IEEEdouble, "002.05000e12").convertToDouble()); EXPECT_EQ(2.05e+12, APFloat(APFloat::IEEEdouble, "002.05000e+12").convertToDouble()); EXPECT_EQ(2.05e-12, APFloat(APFloat::IEEEdouble, "002.05000e-12").convertToDouble()); + + // These are "carefully selected" to overflow the fast log-base + // calculations in APFloat.cpp + EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "99e99999").isInfinity()); + EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-99e99999").isInfinity()); + EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "1e-99999").isPosZero()); + EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-1e-99999").isNegZero()); } TEST(APFloatTest, fromHexadecimalString) { @@ -333,9 +340,41 @@ TEST(APFloatTest, toString) { ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1)); ASSERT_EQ("0.7853981633974483", convertToString(0.78539816339744830961, 0, 3)); ASSERT_EQ("4.940656458412465E-324", convertToString(4.9406564584124654e-324, 0, 3)); + ASSERT_EQ("873.1834", convertToString(873.1834, 0, 1)); + ASSERT_EQ("8.731834E+2", convertToString(873.1834, 0, 0)); +} + +static APInt nanbits(const fltSemantics &Sem, + bool SNaN, bool Negative, uint64_t fill) { + APInt apfill(64, fill); + if (SNaN) + return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt(); + else + return APFloat::getQNaN(Sem, Negative, &apfill).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)); } #ifdef GTEST_HAS_DEATH_TEST +#ifndef NDEBUG TEST(APFloatTest, SemanticsDeath) { EXPECT_DEATH(APFloat(APFloat::IEEEsingle, 0.0f).convertToDouble(), "Float semantics are not IEEEdouble"); EXPECT_DEATH(APFloat(APFloat::IEEEdouble, 0.0 ).convertToFloat(), "Float semantics are not IEEEsingle"); @@ -535,5 +574,6 @@ TEST(APFloatTest, StringHexadecimalExponentDeath) { EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p-"), "Exponent has no digits"); } #endif +#endif }