summaryrefslogtreecommitdiffstats
path: root/clang/unittests/Frontend/FixedPointString.cpp
diff options
context:
space:
mode:
authorLeonard Chan <leonardchan@google.com>2018-08-06 16:05:08 +0000
committerLeonard Chan <leonardchan@google.com>2018-08-06 16:05:08 +0000
commitc03642e9a86d9ed128676d5405a1906282d727ad (patch)
treec221a392e0bf810a25b78cc0f46c89c8525c0c48 /clang/unittests/Frontend/FixedPointString.cpp
parent0d1b3934e27f72f706345678204a87f72007ed64 (diff)
downloadbcm5719-llvm-c03642e9a86d9ed128676d5405a1906282d727ad.tar.gz
bcm5719-llvm-c03642e9a86d9ed128676d5405a1906282d727ad.zip
[Fixed Point Arithmetic] Fix for FixedPointValueToString
- Print negative numbers correctly - Handle APInts of different sizes - Add formal unit tests for FixedPointValueToString - Add tests for checking correct printing when padding is set - Restrict to printing in radix 10 since that's all we need for now Differential Revision: https://reviews.llvm.org/D49945 llvm-svn: 339026
Diffstat (limited to 'clang/unittests/Frontend/FixedPointString.cpp')
-rw-r--r--clang/unittests/Frontend/FixedPointString.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/clang/unittests/Frontend/FixedPointString.cpp b/clang/unittests/Frontend/FixedPointString.cpp
new file mode 100644
index 00000000000..755efd7fcaa
--- /dev/null
+++ b/clang/unittests/Frontend/FixedPointString.cpp
@@ -0,0 +1,107 @@
+#include "clang/AST/Type.h"
+#include "llvm/ADT/APSInt.h"
+#include "llvm/ADT/SmallString.h"
+#include "gtest/gtest.h"
+
+using clang::FixedPointValueToString;
+using llvm::APSInt;
+using llvm::SmallString;
+
+namespace {
+
+TEST(FixedPointString, DifferentTypes) {
+ SmallString<64> S;
+ FixedPointValueToString(S, APSInt::get(320), 7);
+ ASSERT_STREQ(S.c_str(), "2.5");
+
+ S.clear();
+ FixedPointValueToString(S, APSInt::get(0), 7);
+ ASSERT_STREQ(S.c_str(), "0.0");
+
+ // signed short _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/false), 7);
+ ASSERT_STREQ(S.c_str(), "255.9921875");
+
+ // signed _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/false), 15);
+ ASSERT_STREQ(S.c_str(), "65535.999969482421875");
+
+ // signed long _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(64, /*Unsigned=*/false), 31);
+ ASSERT_STREQ(S.c_str(), "4294967295.9999999995343387126922607421875");
+
+ // unsigned short _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/true), 8);
+ ASSERT_STREQ(S.c_str(), "255.99609375");
+
+ // unsigned _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/true), 16);
+ ASSERT_STREQ(S.c_str(), "65535.9999847412109375");
+
+ // unsigned long _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(64, /*Unsigned=*/true), 32);
+ ASSERT_STREQ(S.c_str(), "4294967295.99999999976716935634613037109375");
+
+ // signed short _Fract
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(8, /*Unsigned=*/false), 7);
+ ASSERT_STREQ(S.c_str(), "0.9921875");
+
+ // signed _Fract
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/false), 15);
+ ASSERT_STREQ(S.c_str(), "0.999969482421875");
+
+ // signed long _Fract
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/false), 31);
+ ASSERT_STREQ(S.c_str(), "0.9999999995343387126922607421875");
+
+ // unsigned short _Fract
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(8, /*Unsigned=*/true), 8);
+ ASSERT_STREQ(S.c_str(), "0.99609375");
+
+ // unsigned _Fract
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/true), 16);
+ ASSERT_STREQ(S.c_str(), "0.9999847412109375");
+
+ // unsigned long _Fract
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/true), 32);
+ ASSERT_STREQ(S.c_str(), "0.99999999976716935634613037109375");
+}
+
+TEST(FixedPointString, Negative) {
+ SmallString<64> S;
+ FixedPointValueToString(S, APSInt::get(-320), 7);
+ ASSERT_STREQ(S.c_str(), "-2.5");
+
+ S.clear();
+ FixedPointValueToString(S, APSInt::get(-64), 7);
+ ASSERT_STREQ(S.c_str(), "-0.5");
+
+ // signed short _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMinValue(16, /*Unsigned=*/false), 7);
+ ASSERT_STREQ(S.c_str(), "-256.0");
+
+ // signed _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMinValue(32, /*Unsigned=*/false), 15);
+ ASSERT_STREQ(S.c_str(), "-65536.0");
+
+ // signed long _Accum
+ S.clear();
+ FixedPointValueToString(S, APSInt::getMinValue(64, /*Unsigned=*/false), 31);
+ ASSERT_STREQ(S.c_str(), "-4294967296.0");
+}
+
+} // namespace
OpenPOWER on IntegriCloud