diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2014-10-10 04:17:04 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2014-10-10 04:17:04 +0000 |
commit | 7468b069446f43cc06ae77e71e6f50a9ae3c5fbc (patch) | |
tree | de7869a59ef2bbeac0d76592efe9736c269bedee /llvm/unittests/ADT/APFloatTest.cpp | |
parent | 5d1159ebe95b0ac0152a5905369a83b2350e9352 (diff) | |
download | bcm5719-llvm-7468b069446f43cc06ae77e71e6f50a9ae3c5fbc.tar.gz bcm5719-llvm-7468b069446f43cc06ae77e71e6f50a9ae3c5fbc.zip |
[ADT] Implement the 'logb' functionality for APFloat. This is necessary
to implement complex division in the constant folder of Clang.
llvm-svn: 219471
Diffstat (limited to 'llvm/unittests/ADT/APFloatTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/APFloatTest.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp index a4816efc214..8dd6f9f9931 100644 --- a/llvm/unittests/ADT/APFloatTest.cpp +++ b/llvm/unittests/ADT/APFloatTest.cpp @@ -2691,4 +2691,55 @@ TEST(APFloatTest, operatorOverloads) { EXPECT_TRUE(Two.bitwiseIsEqual(One * Two)); EXPECT_TRUE(One.bitwiseIsEqual(Two / Two)); } + +TEST(APFloatTest, logb) { + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "0x0p+0") + .bitwiseIsEqual(logb(APFloat(APFloat::IEEEsingle, "0x1p+0")))); + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "0x0p+0") + .bitwiseIsEqual(logb(APFloat(APFloat::IEEEsingle, "-0x1p+0")))); + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "0x2Ap+0") + .bitwiseIsEqual(logb(APFloat(APFloat::IEEEsingle, "0x1p+42")))); + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "-0x2Ap+0") + .bitwiseIsEqual(logb(APFloat(APFloat::IEEEsingle, "0x1p-42")))); + + APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false); + APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true); + APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false); + APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true); + APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false); + APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false); + + EXPECT_TRUE(PInf.bitwiseIsEqual(logb(PInf))); + EXPECT_TRUE(PInf.bitwiseIsEqual(logb(MInf))); + EXPECT_TRUE(PZero.bitwiseIsEqual(logb(PZero))); + EXPECT_TRUE(MZero.bitwiseIsEqual(logb(MZero))); + EXPECT_TRUE(QNaN.bitwiseIsEqual(logb(QNaN))); + EXPECT_TRUE(SNaN.bitwiseIsEqual(logb(SNaN))); + + APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false); + APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true); + APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false); + APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true); + APFloat PSmallestNormalized = + APFloat::getSmallestNormalized(APFloat::IEEEsingle, false); + APFloat MSmallestNormalized = + APFloat::getSmallestNormalized(APFloat::IEEEsingle, true); + + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "0x7Fp+0").bitwiseIsEqual(logb(PLargestValue))); + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "0x7Fp+0").bitwiseIsEqual(logb(MLargestValue))); + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "-0x7Ep+0").bitwiseIsEqual(logb(PSmallestValue))); + EXPECT_TRUE( + APFloat(APFloat::IEEEsingle, "-0x7Ep+0").bitwiseIsEqual(logb(MSmallestValue))); + EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x7Ep+0") + .bitwiseIsEqual(logb(PSmallestNormalized))); + EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x7Ep+0") + .bitwiseIsEqual(logb(MSmallestNormalized))); +} } |