APIntTest.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. //===- llvm/unittest/ADT/APInt.cpp - APInt unit tests ---------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/ADT/APInt.h"
  10. #include "llvm/ADT/SmallString.h"
  11. #include "gtest/gtest.h"
  12. #include <ostream>
  13. using namespace llvm;
  14. namespace {
  15. // Test that APInt shift left works when bitwidth > 64 and shiftamt == 0
  16. TEST(APIntTest, ShiftLeftByZero) {
  17. APInt One = APInt::getNullValue(65) + 1;
  18. APInt Shl = One.shl(0);
  19. EXPECT_TRUE(Shl[0]);
  20. EXPECT_FALSE(Shl[1]);
  21. }
  22. TEST(APIntTest, i128_NegativeCount) {
  23. APInt Minus3(128, static_cast<uint64_t>(-3), true);
  24. EXPECT_EQ(126u, Minus3.countLeadingOnes());
  25. EXPECT_EQ(-3, Minus3.getSExtValue());
  26. APInt Minus1(128, static_cast<uint64_t>(-1), true);
  27. EXPECT_EQ(0u, Minus1.countLeadingZeros());
  28. EXPECT_EQ(128u, Minus1.countLeadingOnes());
  29. EXPECT_EQ(128u, Minus1.getActiveBits());
  30. EXPECT_EQ(0u, Minus1.countTrailingZeros());
  31. EXPECT_EQ(128u, Minus1.countTrailingOnes());
  32. EXPECT_EQ(128u, Minus1.countPopulation());
  33. EXPECT_EQ(-1, Minus1.getSExtValue());
  34. }
  35. // XFAIL this test on FreeBSD where the system gcc-4.2.1 seems to miscompile it.
  36. #if defined(__llvm__) || !defined(__FreeBSD__)
  37. TEST(APIntTest, i33_Count) {
  38. APInt i33minus2(33, static_cast<uint64_t>(-2), true);
  39. EXPECT_EQ(0u, i33minus2.countLeadingZeros());
  40. EXPECT_EQ(32u, i33minus2.countLeadingOnes());
  41. EXPECT_EQ(33u, i33minus2.getActiveBits());
  42. EXPECT_EQ(1u, i33minus2.countTrailingZeros());
  43. EXPECT_EQ(32u, i33minus2.countPopulation());
  44. EXPECT_EQ(-2, i33minus2.getSExtValue());
  45. EXPECT_EQ(((uint64_t)-2)&((1ull<<33) -1), i33minus2.getZExtValue());
  46. }
  47. #endif
  48. TEST(APIntTest, i65_Count) {
  49. APInt i65minus(65, 0, true);
  50. i65minus.setBit(64);
  51. EXPECT_EQ(0u, i65minus.countLeadingZeros());
  52. EXPECT_EQ(1u, i65minus.countLeadingOnes());
  53. EXPECT_EQ(65u, i65minus.getActiveBits());
  54. EXPECT_EQ(64u, i65minus.countTrailingZeros());
  55. EXPECT_EQ(1u, i65minus.countPopulation());
  56. }
  57. TEST(APIntTest, i128_PositiveCount) {
  58. APInt u128max = APInt::getAllOnesValue(128);
  59. EXPECT_EQ(128u, u128max.countLeadingOnes());
  60. EXPECT_EQ(0u, u128max.countLeadingZeros());
  61. EXPECT_EQ(128u, u128max.getActiveBits());
  62. EXPECT_EQ(0u, u128max.countTrailingZeros());
  63. EXPECT_EQ(128u, u128max.countTrailingOnes());
  64. EXPECT_EQ(128u, u128max.countPopulation());
  65. APInt u64max(128, static_cast<uint64_t>(-1), false);
  66. EXPECT_EQ(64u, u64max.countLeadingZeros());
  67. EXPECT_EQ(0u, u64max.countLeadingOnes());
  68. EXPECT_EQ(64u, u64max.getActiveBits());
  69. EXPECT_EQ(0u, u64max.countTrailingZeros());
  70. EXPECT_EQ(64u, u64max.countTrailingOnes());
  71. EXPECT_EQ(64u, u64max.countPopulation());
  72. EXPECT_EQ((uint64_t)~0ull, u64max.getZExtValue());
  73. APInt zero(128, 0, true);
  74. EXPECT_EQ(128u, zero.countLeadingZeros());
  75. EXPECT_EQ(0u, zero.countLeadingOnes());
  76. EXPECT_EQ(0u, zero.getActiveBits());
  77. EXPECT_EQ(128u, zero.countTrailingZeros());
  78. EXPECT_EQ(0u, zero.countTrailingOnes());
  79. EXPECT_EQ(0u, zero.countPopulation());
  80. EXPECT_EQ(0u, zero.getSExtValue());
  81. EXPECT_EQ(0u, zero.getZExtValue());
  82. APInt one(128, 1, true);
  83. EXPECT_EQ(127u, one.countLeadingZeros());
  84. EXPECT_EQ(0u, one.countLeadingOnes());
  85. EXPECT_EQ(1u, one.getActiveBits());
  86. EXPECT_EQ(0u, one.countTrailingZeros());
  87. EXPECT_EQ(1u, one.countTrailingOnes());
  88. EXPECT_EQ(1u, one.countPopulation());
  89. EXPECT_EQ(1, one.getSExtValue());
  90. EXPECT_EQ(1u, one.getZExtValue());
  91. }
  92. TEST(APIntTest, i1) {
  93. const APInt neg_two(1, static_cast<uint64_t>(-2), true);
  94. const APInt neg_one(1, static_cast<uint64_t>(-1), true);
  95. const APInt zero(1, 0);
  96. const APInt one(1, 1);
  97. const APInt two(1, 2);
  98. EXPECT_EQ(0, neg_two.getSExtValue());
  99. EXPECT_EQ(-1, neg_one.getSExtValue());
  100. EXPECT_EQ(1u, neg_one.getZExtValue());
  101. EXPECT_EQ(0u, zero.getZExtValue());
  102. EXPECT_EQ(-1, one.getSExtValue());
  103. EXPECT_EQ(1u, one.getZExtValue());
  104. EXPECT_EQ(0u, two.getZExtValue());
  105. EXPECT_EQ(0, two.getSExtValue());
  106. // Basic equalities for 1-bit values.
  107. EXPECT_EQ(zero, two);
  108. EXPECT_EQ(zero, neg_two);
  109. EXPECT_EQ(one, neg_one);
  110. EXPECT_EQ(two, neg_two);
  111. // Additions.
  112. EXPECT_EQ(two, one + one);
  113. EXPECT_EQ(zero, neg_one + one);
  114. EXPECT_EQ(neg_two, neg_one + neg_one);
  115. // Subtractions.
  116. EXPECT_EQ(neg_two, neg_one - one);
  117. EXPECT_EQ(two, one - neg_one);
  118. EXPECT_EQ(zero, one - one);
  119. // Shifts.
  120. EXPECT_EQ(zero, one << one);
  121. EXPECT_EQ(one, one << zero);
  122. EXPECT_EQ(zero, one.shl(1));
  123. EXPECT_EQ(one, one.shl(0));
  124. EXPECT_EQ(zero, one.lshr(1));
  125. EXPECT_EQ(zero, one.ashr(1));
  126. // Rotates.
  127. EXPECT_EQ(one, one.rotl(0));
  128. EXPECT_EQ(one, one.rotl(1));
  129. EXPECT_EQ(one, one.rotr(0));
  130. EXPECT_EQ(one, one.rotr(1));
  131. // Multiplies.
  132. EXPECT_EQ(neg_one, neg_one * one);
  133. EXPECT_EQ(neg_one, one * neg_one);
  134. EXPECT_EQ(one, neg_one * neg_one);
  135. EXPECT_EQ(one, one * one);
  136. // Divides.
  137. EXPECT_EQ(neg_one, one.sdiv(neg_one));
  138. EXPECT_EQ(neg_one, neg_one.sdiv(one));
  139. EXPECT_EQ(one, neg_one.sdiv(neg_one));
  140. EXPECT_EQ(one, one.sdiv(one));
  141. EXPECT_EQ(neg_one, one.udiv(neg_one));
  142. EXPECT_EQ(neg_one, neg_one.udiv(one));
  143. EXPECT_EQ(one, neg_one.udiv(neg_one));
  144. EXPECT_EQ(one, one.udiv(one));
  145. // Remainders.
  146. EXPECT_EQ(zero, neg_one.srem(one));
  147. EXPECT_EQ(zero, neg_one.urem(one));
  148. EXPECT_EQ(zero, one.srem(neg_one));
  149. // sdivrem
  150. {
  151. APInt q(8, 0);
  152. APInt r(8, 0);
  153. APInt one(8, 1);
  154. APInt two(8, 2);
  155. APInt nine(8, 9);
  156. APInt four(8, 4);
  157. EXPECT_EQ(nine.srem(two), one);
  158. EXPECT_EQ(nine.srem(-two), one);
  159. EXPECT_EQ((-nine).srem(two), -one);
  160. EXPECT_EQ((-nine).srem(-two), -one);
  161. APInt::sdivrem(nine, two, q, r);
  162. EXPECT_EQ(four, q);
  163. EXPECT_EQ(one, r);
  164. APInt::sdivrem(-nine, two, q, r);
  165. EXPECT_EQ(-four, q);
  166. EXPECT_EQ(-one, r);
  167. APInt::sdivrem(nine, -two, q, r);
  168. EXPECT_EQ(-four, q);
  169. EXPECT_EQ(one, r);
  170. APInt::sdivrem(-nine, -two, q, r);
  171. EXPECT_EQ(four, q);
  172. EXPECT_EQ(-one, r);
  173. }
  174. }
  175. TEST(APIntTest, fromString) {
  176. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 2));
  177. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 2));
  178. EXPECT_EQ(APInt(32, 2), APInt(32, "10", 2));
  179. EXPECT_EQ(APInt(32, 3), APInt(32, "11", 2));
  180. EXPECT_EQ(APInt(32, 4), APInt(32, "100", 2));
  181. EXPECT_EQ(APInt(32, 0), APInt(32, "+0", 2));
  182. EXPECT_EQ(APInt(32, 1), APInt(32, "+1", 2));
  183. EXPECT_EQ(APInt(32, 2), APInt(32, "+10", 2));
  184. EXPECT_EQ(APInt(32, 3), APInt(32, "+11", 2));
  185. EXPECT_EQ(APInt(32, 4), APInt(32, "+100", 2));
  186. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 2));
  187. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 2));
  188. EXPECT_EQ(APInt(32, uint64_t(-2LL)), APInt(32, "-10", 2));
  189. EXPECT_EQ(APInt(32, uint64_t(-3LL)), APInt(32, "-11", 2));
  190. EXPECT_EQ(APInt(32, uint64_t(-4LL)), APInt(32, "-100", 2));
  191. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 8));
  192. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 8));
  193. EXPECT_EQ(APInt(32, 7), APInt(32, "7", 8));
  194. EXPECT_EQ(APInt(32, 8), APInt(32, "10", 8));
  195. EXPECT_EQ(APInt(32, 15), APInt(32, "17", 8));
  196. EXPECT_EQ(APInt(32, 16), APInt(32, "20", 8));
  197. EXPECT_EQ(APInt(32, +0), APInt(32, "+0", 8));
  198. EXPECT_EQ(APInt(32, +1), APInt(32, "+1", 8));
  199. EXPECT_EQ(APInt(32, +7), APInt(32, "+7", 8));
  200. EXPECT_EQ(APInt(32, +8), APInt(32, "+10", 8));
  201. EXPECT_EQ(APInt(32, +15), APInt(32, "+17", 8));
  202. EXPECT_EQ(APInt(32, +16), APInt(32, "+20", 8));
  203. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 8));
  204. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 8));
  205. EXPECT_EQ(APInt(32, uint64_t(-7LL)), APInt(32, "-7", 8));
  206. EXPECT_EQ(APInt(32, uint64_t(-8LL)), APInt(32, "-10", 8));
  207. EXPECT_EQ(APInt(32, uint64_t(-15LL)), APInt(32, "-17", 8));
  208. EXPECT_EQ(APInt(32, uint64_t(-16LL)), APInt(32, "-20", 8));
  209. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 10));
  210. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 10));
  211. EXPECT_EQ(APInt(32, 9), APInt(32, "9", 10));
  212. EXPECT_EQ(APInt(32, 10), APInt(32, "10", 10));
  213. EXPECT_EQ(APInt(32, 19), APInt(32, "19", 10));
  214. EXPECT_EQ(APInt(32, 20), APInt(32, "20", 10));
  215. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 10));
  216. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 10));
  217. EXPECT_EQ(APInt(32, uint64_t(-9LL)), APInt(32, "-9", 10));
  218. EXPECT_EQ(APInt(32, uint64_t(-10LL)), APInt(32, "-10", 10));
  219. EXPECT_EQ(APInt(32, uint64_t(-19LL)), APInt(32, "-19", 10));
  220. EXPECT_EQ(APInt(32, uint64_t(-20LL)), APInt(32, "-20", 10));
  221. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 16));
  222. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 16));
  223. EXPECT_EQ(APInt(32, 15), APInt(32, "F", 16));
  224. EXPECT_EQ(APInt(32, 16), APInt(32, "10", 16));
  225. EXPECT_EQ(APInt(32, 31), APInt(32, "1F", 16));
  226. EXPECT_EQ(APInt(32, 32), APInt(32, "20", 16));
  227. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 16));
  228. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 16));
  229. EXPECT_EQ(APInt(32, uint64_t(-15LL)), APInt(32, "-F", 16));
  230. EXPECT_EQ(APInt(32, uint64_t(-16LL)), APInt(32, "-10", 16));
  231. EXPECT_EQ(APInt(32, uint64_t(-31LL)), APInt(32, "-1F", 16));
  232. EXPECT_EQ(APInt(32, uint64_t(-32LL)), APInt(32, "-20", 16));
  233. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 36));
  234. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 36));
  235. EXPECT_EQ(APInt(32, 35), APInt(32, "Z", 36));
  236. EXPECT_EQ(APInt(32, 36), APInt(32, "10", 36));
  237. EXPECT_EQ(APInt(32, 71), APInt(32, "1Z", 36));
  238. EXPECT_EQ(APInt(32, 72), APInt(32, "20", 36));
  239. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 36));
  240. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 36));
  241. EXPECT_EQ(APInt(32, uint64_t(-35LL)), APInt(32, "-Z", 36));
  242. EXPECT_EQ(APInt(32, uint64_t(-36LL)), APInt(32, "-10", 36));
  243. EXPECT_EQ(APInt(32, uint64_t(-71LL)), APInt(32, "-1Z", 36));
  244. EXPECT_EQ(APInt(32, uint64_t(-72LL)), APInt(32, "-20", 36));
  245. }
  246. TEST(APIntTest, FromArray) {
  247. EXPECT_EQ(APInt(32, uint64_t(1)), APInt(32, ArrayRef<uint64_t>(1)));
  248. }
  249. TEST(APIntTest, StringBitsNeeded2) {
  250. EXPECT_EQ(1U, APInt::getBitsNeeded( "0", 2));
  251. EXPECT_EQ(1U, APInt::getBitsNeeded( "1", 2));
  252. EXPECT_EQ(2U, APInt::getBitsNeeded( "10", 2));
  253. EXPECT_EQ(2U, APInt::getBitsNeeded( "11", 2));
  254. EXPECT_EQ(3U, APInt::getBitsNeeded("100", 2));
  255. EXPECT_EQ(1U, APInt::getBitsNeeded( "+0", 2));
  256. EXPECT_EQ(1U, APInt::getBitsNeeded( "+1", 2));
  257. EXPECT_EQ(2U, APInt::getBitsNeeded( "+10", 2));
  258. EXPECT_EQ(2U, APInt::getBitsNeeded( "+11", 2));
  259. EXPECT_EQ(3U, APInt::getBitsNeeded("+100", 2));
  260. EXPECT_EQ(2U, APInt::getBitsNeeded( "-0", 2));
  261. EXPECT_EQ(2U, APInt::getBitsNeeded( "-1", 2));
  262. EXPECT_EQ(3U, APInt::getBitsNeeded( "-10", 2));
  263. EXPECT_EQ(3U, APInt::getBitsNeeded( "-11", 2));
  264. EXPECT_EQ(4U, APInt::getBitsNeeded("-100", 2));
  265. }
  266. TEST(APIntTest, StringBitsNeeded8) {
  267. EXPECT_EQ(3U, APInt::getBitsNeeded( "0", 8));
  268. EXPECT_EQ(3U, APInt::getBitsNeeded( "7", 8));
  269. EXPECT_EQ(6U, APInt::getBitsNeeded("10", 8));
  270. EXPECT_EQ(6U, APInt::getBitsNeeded("17", 8));
  271. EXPECT_EQ(6U, APInt::getBitsNeeded("20", 8));
  272. EXPECT_EQ(3U, APInt::getBitsNeeded( "+0", 8));
  273. EXPECT_EQ(3U, APInt::getBitsNeeded( "+7", 8));
  274. EXPECT_EQ(6U, APInt::getBitsNeeded("+10", 8));
  275. EXPECT_EQ(6U, APInt::getBitsNeeded("+17", 8));
  276. EXPECT_EQ(6U, APInt::getBitsNeeded("+20", 8));
  277. EXPECT_EQ(4U, APInt::getBitsNeeded( "-0", 8));
  278. EXPECT_EQ(4U, APInt::getBitsNeeded( "-7", 8));
  279. EXPECT_EQ(7U, APInt::getBitsNeeded("-10", 8));
  280. EXPECT_EQ(7U, APInt::getBitsNeeded("-17", 8));
  281. EXPECT_EQ(7U, APInt::getBitsNeeded("-20", 8));
  282. }
  283. TEST(APIntTest, StringBitsNeeded10) {
  284. EXPECT_EQ(1U, APInt::getBitsNeeded( "0", 10));
  285. EXPECT_EQ(2U, APInt::getBitsNeeded( "3", 10));
  286. EXPECT_EQ(4U, APInt::getBitsNeeded( "9", 10));
  287. EXPECT_EQ(4U, APInt::getBitsNeeded("10", 10));
  288. EXPECT_EQ(5U, APInt::getBitsNeeded("19", 10));
  289. EXPECT_EQ(5U, APInt::getBitsNeeded("20", 10));
  290. EXPECT_EQ(1U, APInt::getBitsNeeded( "+0", 10));
  291. EXPECT_EQ(4U, APInt::getBitsNeeded( "+9", 10));
  292. EXPECT_EQ(4U, APInt::getBitsNeeded("+10", 10));
  293. EXPECT_EQ(5U, APInt::getBitsNeeded("+19", 10));
  294. EXPECT_EQ(5U, APInt::getBitsNeeded("+20", 10));
  295. EXPECT_EQ(2U, APInt::getBitsNeeded( "-0", 10));
  296. EXPECT_EQ(5U, APInt::getBitsNeeded( "-9", 10));
  297. EXPECT_EQ(5U, APInt::getBitsNeeded("-10", 10));
  298. EXPECT_EQ(6U, APInt::getBitsNeeded("-19", 10));
  299. EXPECT_EQ(6U, APInt::getBitsNeeded("-20", 10));
  300. }
  301. TEST(APIntTest, StringBitsNeeded16) {
  302. EXPECT_EQ(4U, APInt::getBitsNeeded( "0", 16));
  303. EXPECT_EQ(4U, APInt::getBitsNeeded( "F", 16));
  304. EXPECT_EQ(8U, APInt::getBitsNeeded("10", 16));
  305. EXPECT_EQ(8U, APInt::getBitsNeeded("1F", 16));
  306. EXPECT_EQ(8U, APInt::getBitsNeeded("20", 16));
  307. EXPECT_EQ(4U, APInt::getBitsNeeded( "+0", 16));
  308. EXPECT_EQ(4U, APInt::getBitsNeeded( "+F", 16));
  309. EXPECT_EQ(8U, APInt::getBitsNeeded("+10", 16));
  310. EXPECT_EQ(8U, APInt::getBitsNeeded("+1F", 16));
  311. EXPECT_EQ(8U, APInt::getBitsNeeded("+20", 16));
  312. EXPECT_EQ(5U, APInt::getBitsNeeded( "-0", 16));
  313. EXPECT_EQ(5U, APInt::getBitsNeeded( "-F", 16));
  314. EXPECT_EQ(9U, APInt::getBitsNeeded("-10", 16));
  315. EXPECT_EQ(9U, APInt::getBitsNeeded("-1F", 16));
  316. EXPECT_EQ(9U, APInt::getBitsNeeded("-20", 16));
  317. }
  318. TEST(APIntTest, toString) {
  319. SmallString<16> S;
  320. bool isSigned;
  321. APInt(8, 0).toString(S, 2, true, true);
  322. EXPECT_EQ(S.str().str(), "0b0");
  323. S.clear();
  324. APInt(8, 0).toString(S, 8, true, true);
  325. EXPECT_EQ(S.str().str(), "00");
  326. S.clear();
  327. APInt(8, 0).toString(S, 10, true, true);
  328. EXPECT_EQ(S.str().str(), "0");
  329. S.clear();
  330. APInt(8, 0).toString(S, 16, true, true);
  331. EXPECT_EQ(S.str().str(), "0x0");
  332. S.clear();
  333. APInt(8, 0).toString(S, 36, true, false);
  334. EXPECT_EQ(S.str().str(), "0");
  335. S.clear();
  336. isSigned = false;
  337. APInt(8, 255, isSigned).toString(S, 2, isSigned, true);
  338. EXPECT_EQ(S.str().str(), "0b11111111");
  339. S.clear();
  340. APInt(8, 255, isSigned).toString(S, 8, isSigned, true);
  341. EXPECT_EQ(S.str().str(), "0377");
  342. S.clear();
  343. APInt(8, 255, isSigned).toString(S, 10, isSigned, true);
  344. EXPECT_EQ(S.str().str(), "255");
  345. S.clear();
  346. APInt(8, 255, isSigned).toString(S, 16, isSigned, true);
  347. EXPECT_EQ(S.str().str(), "0xFF");
  348. S.clear();
  349. APInt(8, 255, isSigned).toString(S, 36, isSigned, false);
  350. EXPECT_EQ(S.str().str(), "73");
  351. S.clear();
  352. isSigned = true;
  353. APInt(8, 255, isSigned).toString(S, 2, isSigned, true);
  354. EXPECT_EQ(S.str().str(), "-0b1");
  355. S.clear();
  356. APInt(8, 255, isSigned).toString(S, 8, isSigned, true);
  357. EXPECT_EQ(S.str().str(), "-01");
  358. S.clear();
  359. APInt(8, 255, isSigned).toString(S, 10, isSigned, true);
  360. EXPECT_EQ(S.str().str(), "-1");
  361. S.clear();
  362. APInt(8, 255, isSigned).toString(S, 16, isSigned, true);
  363. EXPECT_EQ(S.str().str(), "-0x1");
  364. S.clear();
  365. APInt(8, 255, isSigned).toString(S, 36, isSigned, false);
  366. EXPECT_EQ(S.str().str(), "-1");
  367. S.clear();
  368. }
  369. TEST(APIntTest, Log2) {
  370. EXPECT_EQ(APInt(15, 7).logBase2(), 2U);
  371. EXPECT_EQ(APInt(15, 7).ceilLogBase2(), 3U);
  372. EXPECT_EQ(APInt(15, 7).exactLogBase2(), -1);
  373. EXPECT_EQ(APInt(15, 8).logBase2(), 3U);
  374. EXPECT_EQ(APInt(15, 8).ceilLogBase2(), 3U);
  375. EXPECT_EQ(APInt(15, 8).exactLogBase2(), 3);
  376. EXPECT_EQ(APInt(15, 9).logBase2(), 3U);
  377. EXPECT_EQ(APInt(15, 9).ceilLogBase2(), 4U);
  378. EXPECT_EQ(APInt(15, 9).exactLogBase2(), -1);
  379. }
  380. TEST(APIntTest, magic) {
  381. EXPECT_EQ(APInt(32, 3).magic().m, APInt(32, "55555556", 16));
  382. EXPECT_EQ(APInt(32, 3).magic().s, 0U);
  383. EXPECT_EQ(APInt(32, 5).magic().m, APInt(32, "66666667", 16));
  384. EXPECT_EQ(APInt(32, 5).magic().s, 1U);
  385. EXPECT_EQ(APInt(32, 7).magic().m, APInt(32, "92492493", 16));
  386. EXPECT_EQ(APInt(32, 7).magic().s, 2U);
  387. }
  388. TEST(APIntTest, magicu) {
  389. EXPECT_EQ(APInt(32, 3).magicu().m, APInt(32, "AAAAAAAB", 16));
  390. EXPECT_EQ(APInt(32, 3).magicu().s, 1U);
  391. EXPECT_EQ(APInt(32, 5).magicu().m, APInt(32, "CCCCCCCD", 16));
  392. EXPECT_EQ(APInt(32, 5).magicu().s, 2U);
  393. EXPECT_EQ(APInt(32, 7).magicu().m, APInt(32, "24924925", 16));
  394. EXPECT_EQ(APInt(32, 7).magicu().s, 3U);
  395. EXPECT_EQ(APInt(64, 25).magicu(1).m, APInt(64, "A3D70A3D70A3D70B", 16));
  396. EXPECT_EQ(APInt(64, 25).magicu(1).s, 4U);
  397. }
  398. #ifdef GTEST_HAS_DEATH_TEST
  399. #ifndef NDEBUG
  400. TEST(APIntTest, StringDeath) {
  401. EXPECT_DEATH(APInt(0, "", 0), "Bitwidth too small");
  402. EXPECT_DEATH(APInt(32, "", 0), "Invalid string length");
  403. EXPECT_DEATH(APInt(32, "0", 0), "Radix should be 2, 8, 10, 16, or 36!");
  404. EXPECT_DEATH(APInt(32, "", 10), "Invalid string length");
  405. EXPECT_DEATH(APInt(32, "-", 10), "String is only a sign, needs a value.");
  406. EXPECT_DEATH(APInt(1, "1234", 10), "Insufficient bit width");
  407. EXPECT_DEATH(APInt(32, "\0", 10), "Invalid string length");
  408. EXPECT_DEATH(APInt(32, StringRef("1\02", 3), 10), "Invalid character in digit string");
  409. EXPECT_DEATH(APInt(32, "1L", 10), "Invalid character in digit string");
  410. }
  411. #endif
  412. #endif
  413. TEST(APIntTest, mul_clear) {
  414. APInt ValA(65, -1ULL);
  415. APInt ValB(65, 4);
  416. APInt ValC(65, 0);
  417. ValC = ValA * ValB;
  418. ValA *= ValB;
  419. EXPECT_EQ(ValA.toString(10, false), ValC.toString(10, false));
  420. }
  421. TEST(APIntTest, Rotate) {
  422. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotl(0));
  423. EXPECT_EQ(APInt(8, 2), APInt(8, 1).rotl(1));
  424. EXPECT_EQ(APInt(8, 4), APInt(8, 1).rotl(2));
  425. EXPECT_EQ(APInt(8, 16), APInt(8, 1).rotl(4));
  426. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotl(8));
  427. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotl(0));
  428. EXPECT_EQ(APInt(8, 32), APInt(8, 16).rotl(1));
  429. EXPECT_EQ(APInt(8, 64), APInt(8, 16).rotl(2));
  430. EXPECT_EQ(APInt(8, 1), APInt(8, 16).rotl(4));
  431. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotl(8));
  432. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotr(0));
  433. EXPECT_EQ(APInt(8, 8), APInt(8, 16).rotr(1));
  434. EXPECT_EQ(APInt(8, 4), APInt(8, 16).rotr(2));
  435. EXPECT_EQ(APInt(8, 1), APInt(8, 16).rotr(4));
  436. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotr(8));
  437. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotr(0));
  438. EXPECT_EQ(APInt(8, 128), APInt(8, 1).rotr(1));
  439. EXPECT_EQ(APInt(8, 64), APInt(8, 1).rotr(2));
  440. EXPECT_EQ(APInt(8, 16), APInt(8, 1).rotr(4));
  441. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotr(8));
  442. APInt Big(256, "00004000800000000000000000003fff8000000000000000", 16);
  443. APInt Rot(256, "3fff80000000000000000000000000000000000040008000", 16);
  444. EXPECT_EQ(Rot, Big.rotr(144));
  445. }
  446. }