APIntTest.cpp 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  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 <array>
  13. #include <ostream>
  14. using namespace llvm;
  15. namespace {
  16. // Test that APInt shift left works when bitwidth > 64 and shiftamt == 0
  17. TEST(APIntTest, ShiftLeftByZero) {
  18. APInt One = APInt::getNullValue(65) + 1;
  19. APInt Shl = One.shl(0);
  20. EXPECT_TRUE(Shl[0]);
  21. EXPECT_FALSE(Shl[1]);
  22. }
  23. TEST(APIntTest, i128_NegativeCount) {
  24. APInt Minus3(128, static_cast<uint64_t>(-3), true);
  25. EXPECT_EQ(126u, Minus3.countLeadingOnes());
  26. EXPECT_EQ(-3, Minus3.getSExtValue());
  27. APInt Minus1(128, static_cast<uint64_t>(-1), true);
  28. EXPECT_EQ(0u, Minus1.countLeadingZeros());
  29. EXPECT_EQ(128u, Minus1.countLeadingOnes());
  30. EXPECT_EQ(128u, Minus1.getActiveBits());
  31. EXPECT_EQ(0u, Minus1.countTrailingZeros());
  32. EXPECT_EQ(128u, Minus1.countTrailingOnes());
  33. EXPECT_EQ(128u, Minus1.countPopulation());
  34. EXPECT_EQ(-1, Minus1.getSExtValue());
  35. }
  36. // XFAIL this test on FreeBSD where the system gcc-4.2.1 seems to miscompile it.
  37. #if defined(__llvm__) || !defined(__FreeBSD__)
  38. TEST(APIntTest, i33_Count) {
  39. APInt i33minus2(33, static_cast<uint64_t>(-2), true);
  40. EXPECT_EQ(0u, i33minus2.countLeadingZeros());
  41. EXPECT_EQ(32u, i33minus2.countLeadingOnes());
  42. EXPECT_EQ(33u, i33minus2.getActiveBits());
  43. EXPECT_EQ(1u, i33minus2.countTrailingZeros());
  44. EXPECT_EQ(32u, i33minus2.countPopulation());
  45. EXPECT_EQ(-2, i33minus2.getSExtValue());
  46. EXPECT_EQ(((uint64_t)-2)&((1ull<<33) -1), i33minus2.getZExtValue());
  47. }
  48. #endif
  49. TEST(APIntTest, i65_Count) {
  50. APInt i65(65, 0, true);
  51. EXPECT_EQ(65u, i65.countLeadingZeros());
  52. EXPECT_EQ(0u, i65.countLeadingOnes());
  53. EXPECT_EQ(0u, i65.getActiveBits());
  54. EXPECT_EQ(1u, i65.getActiveWords());
  55. EXPECT_EQ(65u, i65.countTrailingZeros());
  56. EXPECT_EQ(0u, i65.countPopulation());
  57. APInt i65minus(65, 0, true);
  58. i65minus.setBit(64);
  59. EXPECT_EQ(0u, i65minus.countLeadingZeros());
  60. EXPECT_EQ(1u, i65minus.countLeadingOnes());
  61. EXPECT_EQ(65u, i65minus.getActiveBits());
  62. EXPECT_EQ(64u, i65minus.countTrailingZeros());
  63. EXPECT_EQ(1u, i65minus.countPopulation());
  64. }
  65. TEST(APIntTest, i128_PositiveCount) {
  66. APInt u128max = APInt::getAllOnesValue(128);
  67. EXPECT_EQ(128u, u128max.countLeadingOnes());
  68. EXPECT_EQ(0u, u128max.countLeadingZeros());
  69. EXPECT_EQ(128u, u128max.getActiveBits());
  70. EXPECT_EQ(0u, u128max.countTrailingZeros());
  71. EXPECT_EQ(128u, u128max.countTrailingOnes());
  72. EXPECT_EQ(128u, u128max.countPopulation());
  73. APInt u64max(128, static_cast<uint64_t>(-1), false);
  74. EXPECT_EQ(64u, u64max.countLeadingZeros());
  75. EXPECT_EQ(0u, u64max.countLeadingOnes());
  76. EXPECT_EQ(64u, u64max.getActiveBits());
  77. EXPECT_EQ(0u, u64max.countTrailingZeros());
  78. EXPECT_EQ(64u, u64max.countTrailingOnes());
  79. EXPECT_EQ(64u, u64max.countPopulation());
  80. EXPECT_EQ((uint64_t)~0ull, u64max.getZExtValue());
  81. APInt zero(128, 0, true);
  82. EXPECT_EQ(128u, zero.countLeadingZeros());
  83. EXPECT_EQ(0u, zero.countLeadingOnes());
  84. EXPECT_EQ(0u, zero.getActiveBits());
  85. EXPECT_EQ(128u, zero.countTrailingZeros());
  86. EXPECT_EQ(0u, zero.countTrailingOnes());
  87. EXPECT_EQ(0u, zero.countPopulation());
  88. EXPECT_EQ(0u, zero.getSExtValue());
  89. EXPECT_EQ(0u, zero.getZExtValue());
  90. APInt one(128, 1, true);
  91. EXPECT_EQ(127u, one.countLeadingZeros());
  92. EXPECT_EQ(0u, one.countLeadingOnes());
  93. EXPECT_EQ(1u, one.getActiveBits());
  94. EXPECT_EQ(0u, one.countTrailingZeros());
  95. EXPECT_EQ(1u, one.countTrailingOnes());
  96. EXPECT_EQ(1u, one.countPopulation());
  97. EXPECT_EQ(1, one.getSExtValue());
  98. EXPECT_EQ(1u, one.getZExtValue());
  99. }
  100. TEST(APIntTest, i1) {
  101. const APInt neg_two(1, static_cast<uint64_t>(-2), true);
  102. const APInt neg_one(1, static_cast<uint64_t>(-1), true);
  103. const APInt zero(1, 0);
  104. const APInt one(1, 1);
  105. const APInt two(1, 2);
  106. EXPECT_EQ(0, neg_two.getSExtValue());
  107. EXPECT_EQ(-1, neg_one.getSExtValue());
  108. EXPECT_EQ(1u, neg_one.getZExtValue());
  109. EXPECT_EQ(0u, zero.getZExtValue());
  110. EXPECT_EQ(-1, one.getSExtValue());
  111. EXPECT_EQ(1u, one.getZExtValue());
  112. EXPECT_EQ(0u, two.getZExtValue());
  113. EXPECT_EQ(0, two.getSExtValue());
  114. // Basic equalities for 1-bit values.
  115. EXPECT_EQ(zero, two);
  116. EXPECT_EQ(zero, neg_two);
  117. EXPECT_EQ(one, neg_one);
  118. EXPECT_EQ(two, neg_two);
  119. // Min/max signed values.
  120. EXPECT_TRUE(zero.isMaxSignedValue());
  121. EXPECT_FALSE(one.isMaxSignedValue());
  122. EXPECT_FALSE(zero.isMinSignedValue());
  123. EXPECT_TRUE(one.isMinSignedValue());
  124. // Additions.
  125. EXPECT_EQ(two, one + one);
  126. EXPECT_EQ(zero, neg_one + one);
  127. EXPECT_EQ(neg_two, neg_one + neg_one);
  128. // Subtractions.
  129. EXPECT_EQ(neg_two, neg_one - one);
  130. EXPECT_EQ(two, one - neg_one);
  131. EXPECT_EQ(zero, one - one);
  132. // Shifts.
  133. EXPECT_EQ(zero, one << one);
  134. EXPECT_EQ(one, one << zero);
  135. EXPECT_EQ(zero, one.shl(1));
  136. EXPECT_EQ(one, one.shl(0));
  137. EXPECT_EQ(zero, one.lshr(1));
  138. EXPECT_EQ(zero, one.ashr(1));
  139. // Rotates.
  140. EXPECT_EQ(one, one.rotl(0));
  141. EXPECT_EQ(one, one.rotl(1));
  142. EXPECT_EQ(one, one.rotr(0));
  143. EXPECT_EQ(one, one.rotr(1));
  144. // Multiplies.
  145. EXPECT_EQ(neg_one, neg_one * one);
  146. EXPECT_EQ(neg_one, one * neg_one);
  147. EXPECT_EQ(one, neg_one * neg_one);
  148. EXPECT_EQ(one, one * one);
  149. // Divides.
  150. EXPECT_EQ(neg_one, one.sdiv(neg_one));
  151. EXPECT_EQ(neg_one, neg_one.sdiv(one));
  152. EXPECT_EQ(one, neg_one.sdiv(neg_one));
  153. EXPECT_EQ(one, one.sdiv(one));
  154. EXPECT_EQ(neg_one, one.udiv(neg_one));
  155. EXPECT_EQ(neg_one, neg_one.udiv(one));
  156. EXPECT_EQ(one, neg_one.udiv(neg_one));
  157. EXPECT_EQ(one, one.udiv(one));
  158. // Remainders.
  159. EXPECT_EQ(zero, neg_one.srem(one));
  160. EXPECT_EQ(zero, neg_one.urem(one));
  161. EXPECT_EQ(zero, one.srem(neg_one));
  162. // sdivrem
  163. {
  164. APInt q(8, 0);
  165. APInt r(8, 0);
  166. APInt one(8, 1);
  167. APInt two(8, 2);
  168. APInt nine(8, 9);
  169. APInt four(8, 4);
  170. EXPECT_EQ(nine.srem(two), one);
  171. EXPECT_EQ(nine.srem(-two), one);
  172. EXPECT_EQ((-nine).srem(two), -one);
  173. EXPECT_EQ((-nine).srem(-two), -one);
  174. APInt::sdivrem(nine, two, q, r);
  175. EXPECT_EQ(four, q);
  176. EXPECT_EQ(one, r);
  177. APInt::sdivrem(-nine, two, q, r);
  178. EXPECT_EQ(-four, q);
  179. EXPECT_EQ(-one, r);
  180. APInt::sdivrem(nine, -two, q, r);
  181. EXPECT_EQ(-four, q);
  182. EXPECT_EQ(one, r);
  183. APInt::sdivrem(-nine, -two, q, r);
  184. EXPECT_EQ(four, q);
  185. EXPECT_EQ(-one, r);
  186. }
  187. }
  188. TEST(APIntTest, compare) {
  189. std::array<APInt, 5> testVals{{
  190. APInt{16, 2},
  191. APInt{16, 1},
  192. APInt{16, 0},
  193. APInt{16, (uint64_t)-1, true},
  194. APInt{16, (uint64_t)-2, true},
  195. }};
  196. for (auto &arg1 : testVals)
  197. for (auto &arg2 : testVals) {
  198. auto uv1 = arg1.getZExtValue();
  199. auto uv2 = arg2.getZExtValue();
  200. auto sv1 = arg1.getSExtValue();
  201. auto sv2 = arg2.getSExtValue();
  202. EXPECT_EQ(uv1 < uv2, arg1.ult(arg2));
  203. EXPECT_EQ(uv1 <= uv2, arg1.ule(arg2));
  204. EXPECT_EQ(uv1 > uv2, arg1.ugt(arg2));
  205. EXPECT_EQ(uv1 >= uv2, arg1.uge(arg2));
  206. EXPECT_EQ(sv1 < sv2, arg1.slt(arg2));
  207. EXPECT_EQ(sv1 <= sv2, arg1.sle(arg2));
  208. EXPECT_EQ(sv1 > sv2, arg1.sgt(arg2));
  209. EXPECT_EQ(sv1 >= sv2, arg1.sge(arg2));
  210. EXPECT_EQ(uv1 < uv2, arg1.ult(uv2));
  211. EXPECT_EQ(uv1 <= uv2, arg1.ule(uv2));
  212. EXPECT_EQ(uv1 > uv2, arg1.ugt(uv2));
  213. EXPECT_EQ(uv1 >= uv2, arg1.uge(uv2));
  214. EXPECT_EQ(sv1 < sv2, arg1.slt(sv2));
  215. EXPECT_EQ(sv1 <= sv2, arg1.sle(sv2));
  216. EXPECT_EQ(sv1 > sv2, arg1.sgt(sv2));
  217. EXPECT_EQ(sv1 >= sv2, arg1.sge(sv2));
  218. }
  219. }
  220. TEST(APIntTest, compareWithRawIntegers) {
  221. EXPECT_TRUE(!APInt(8, 1).uge(256));
  222. EXPECT_TRUE(!APInt(8, 1).ugt(256));
  223. EXPECT_TRUE( APInt(8, 1).ule(256));
  224. EXPECT_TRUE( APInt(8, 1).ult(256));
  225. EXPECT_TRUE(!APInt(8, 1).sge(256));
  226. EXPECT_TRUE(!APInt(8, 1).sgt(256));
  227. EXPECT_TRUE( APInt(8, 1).sle(256));
  228. EXPECT_TRUE( APInt(8, 1).slt(256));
  229. EXPECT_TRUE(!(APInt(8, 0) == 256));
  230. EXPECT_TRUE( APInt(8, 0) != 256);
  231. EXPECT_TRUE(!(APInt(8, 1) == 256));
  232. EXPECT_TRUE( APInt(8, 1) != 256);
  233. auto uint64max = UINT64_MAX;
  234. auto int64max = INT64_MAX;
  235. auto int64min = INT64_MIN;
  236. auto u64 = APInt{128, uint64max};
  237. auto s64 = APInt{128, static_cast<uint64_t>(int64max), true};
  238. auto big = u64 + 1;
  239. EXPECT_TRUE( u64.uge(uint64max));
  240. EXPECT_TRUE(!u64.ugt(uint64max));
  241. EXPECT_TRUE( u64.ule(uint64max));
  242. EXPECT_TRUE(!u64.ult(uint64max));
  243. EXPECT_TRUE( u64.sge(int64max));
  244. EXPECT_TRUE( u64.sgt(int64max));
  245. EXPECT_TRUE(!u64.sle(int64max));
  246. EXPECT_TRUE(!u64.slt(int64max));
  247. EXPECT_TRUE( u64.sge(int64min));
  248. EXPECT_TRUE( u64.sgt(int64min));
  249. EXPECT_TRUE(!u64.sle(int64min));
  250. EXPECT_TRUE(!u64.slt(int64min));
  251. EXPECT_TRUE(u64 == uint64max);
  252. EXPECT_TRUE(u64 != int64max);
  253. EXPECT_TRUE(u64 != int64min);
  254. EXPECT_TRUE(!s64.uge(uint64max));
  255. EXPECT_TRUE(!s64.ugt(uint64max));
  256. EXPECT_TRUE( s64.ule(uint64max));
  257. EXPECT_TRUE( s64.ult(uint64max));
  258. EXPECT_TRUE( s64.sge(int64max));
  259. EXPECT_TRUE(!s64.sgt(int64max));
  260. EXPECT_TRUE( s64.sle(int64max));
  261. EXPECT_TRUE(!s64.slt(int64max));
  262. EXPECT_TRUE( s64.sge(int64min));
  263. EXPECT_TRUE( s64.sgt(int64min));
  264. EXPECT_TRUE(!s64.sle(int64min));
  265. EXPECT_TRUE(!s64.slt(int64min));
  266. EXPECT_TRUE(s64 != uint64max);
  267. EXPECT_TRUE(s64 == int64max);
  268. EXPECT_TRUE(s64 != int64min);
  269. EXPECT_TRUE( big.uge(uint64max));
  270. EXPECT_TRUE( big.ugt(uint64max));
  271. EXPECT_TRUE(!big.ule(uint64max));
  272. EXPECT_TRUE(!big.ult(uint64max));
  273. EXPECT_TRUE( big.sge(int64max));
  274. EXPECT_TRUE( big.sgt(int64max));
  275. EXPECT_TRUE(!big.sle(int64max));
  276. EXPECT_TRUE(!big.slt(int64max));
  277. EXPECT_TRUE( big.sge(int64min));
  278. EXPECT_TRUE( big.sgt(int64min));
  279. EXPECT_TRUE(!big.sle(int64min));
  280. EXPECT_TRUE(!big.slt(int64min));
  281. EXPECT_TRUE(big != uint64max);
  282. EXPECT_TRUE(big != int64max);
  283. EXPECT_TRUE(big != int64min);
  284. }
  285. TEST(APIntTest, compareWithInt64Min) {
  286. int64_t edge = INT64_MIN;
  287. int64_t edgeP1 = edge + 1;
  288. int64_t edgeM1 = INT64_MAX;
  289. auto a = APInt{64, static_cast<uint64_t>(edge), true};
  290. EXPECT_TRUE(!a.slt(edge));
  291. EXPECT_TRUE( a.sle(edge));
  292. EXPECT_TRUE(!a.sgt(edge));
  293. EXPECT_TRUE( a.sge(edge));
  294. EXPECT_TRUE( a.slt(edgeP1));
  295. EXPECT_TRUE( a.sle(edgeP1));
  296. EXPECT_TRUE(!a.sgt(edgeP1));
  297. EXPECT_TRUE(!a.sge(edgeP1));
  298. EXPECT_TRUE( a.slt(edgeM1));
  299. EXPECT_TRUE( a.sle(edgeM1));
  300. EXPECT_TRUE(!a.sgt(edgeM1));
  301. EXPECT_TRUE(!a.sge(edgeM1));
  302. }
  303. TEST(APIntTest, compareWithHalfInt64Max) {
  304. uint64_t edge = 0x4000000000000000;
  305. uint64_t edgeP1 = edge + 1;
  306. uint64_t edgeM1 = edge - 1;
  307. auto a = APInt{64, edge};
  308. EXPECT_TRUE(!a.ult(edge));
  309. EXPECT_TRUE( a.ule(edge));
  310. EXPECT_TRUE(!a.ugt(edge));
  311. EXPECT_TRUE( a.uge(edge));
  312. EXPECT_TRUE( a.ult(edgeP1));
  313. EXPECT_TRUE( a.ule(edgeP1));
  314. EXPECT_TRUE(!a.ugt(edgeP1));
  315. EXPECT_TRUE(!a.uge(edgeP1));
  316. EXPECT_TRUE(!a.ult(edgeM1));
  317. EXPECT_TRUE(!a.ule(edgeM1));
  318. EXPECT_TRUE( a.ugt(edgeM1));
  319. EXPECT_TRUE( a.uge(edgeM1));
  320. EXPECT_TRUE(!a.slt(edge));
  321. EXPECT_TRUE( a.sle(edge));
  322. EXPECT_TRUE(!a.sgt(edge));
  323. EXPECT_TRUE( a.sge(edge));
  324. EXPECT_TRUE( a.slt(edgeP1));
  325. EXPECT_TRUE( a.sle(edgeP1));
  326. EXPECT_TRUE(!a.sgt(edgeP1));
  327. EXPECT_TRUE(!a.sge(edgeP1));
  328. EXPECT_TRUE(!a.slt(edgeM1));
  329. EXPECT_TRUE(!a.sle(edgeM1));
  330. EXPECT_TRUE( a.sgt(edgeM1));
  331. EXPECT_TRUE( a.sge(edgeM1));
  332. }
  333. // Tests different div/rem varaints using scheme (a * b + c) / a
  334. void testDiv(APInt a, APInt b, APInt c) {
  335. ASSERT_TRUE(a.uge(b)); // Must: a >= b
  336. ASSERT_TRUE(a.ugt(c)); // Must: a > c
  337. auto p = a * b + c;
  338. auto q = p.udiv(a);
  339. auto r = p.urem(a);
  340. EXPECT_EQ(b, q);
  341. EXPECT_EQ(c, r);
  342. APInt::udivrem(p, a, q, r);
  343. EXPECT_EQ(b, q);
  344. EXPECT_EQ(c, r);
  345. q = p.sdiv(a);
  346. r = p.srem(a);
  347. EXPECT_EQ(b, q);
  348. EXPECT_EQ(c, r);
  349. APInt::sdivrem(p, a, q, r);
  350. EXPECT_EQ(b, q);
  351. EXPECT_EQ(c, r);
  352. if (b.ugt(c)) { // Test also symmetric case
  353. q = p.udiv(b);
  354. r = p.urem(b);
  355. EXPECT_EQ(a, q);
  356. EXPECT_EQ(c, r);
  357. APInt::udivrem(p, b, q, r);
  358. EXPECT_EQ(a, q);
  359. EXPECT_EQ(c, r);
  360. q = p.sdiv(b);
  361. r = p.srem(b);
  362. EXPECT_EQ(a, q);
  363. EXPECT_EQ(c, r);
  364. APInt::sdivrem(p, b, q, r);
  365. EXPECT_EQ(a, q);
  366. EXPECT_EQ(c, r);
  367. }
  368. }
  369. TEST(APIntTest, divrem_big1) {
  370. // Tests KnuthDiv rare step D6
  371. testDiv({256, "1ffffffffffffffff", 16},
  372. {256, "1ffffffffffffffff", 16},
  373. {256, 0});
  374. }
  375. TEST(APIntTest, divrem_big2) {
  376. // Tests KnuthDiv rare step D6
  377. testDiv({1024, "112233ceff"
  378. "cecece000000ffffffffffffffffffff"
  379. "ffffffffffffffffffffffffffffffff"
  380. "ffffffffffffffffffffffffffffffff"
  381. "ffffffffffffffffffffffffffffff33", 16},
  382. {1024, "111111ffffffffffffffff"
  383. "ffffffffffffffffffffffffffffffff"
  384. "fffffffffffffffffffffffffffffccf"
  385. "ffffffffffffffffffffffffffffff00", 16},
  386. {1024, 7919});
  387. }
  388. TEST(APIntTest, divrem_big3) {
  389. // Tests KnuthDiv case without shift
  390. testDiv({256, "80000001ffffffffffffffff", 16},
  391. {256, "ffffffffffffff0000000", 16},
  392. {256, 4219});
  393. }
  394. TEST(APIntTest, divrem_big4) {
  395. // Tests heap allocation in divide() enfoced by huge numbers
  396. testDiv(APInt{4096, 5}.shl(2001),
  397. APInt{4096, 1}.shl(2000),
  398. APInt{4096, 4219*13});
  399. }
  400. TEST(APIntTest, divrem_big5) {
  401. // Tests one word divisor case of divide()
  402. testDiv(APInt{1024, 19}.shl(811),
  403. APInt{1024, 4356013}, // one word
  404. APInt{1024, 1});
  405. }
  406. TEST(APIntTest, divrem_big6) {
  407. // Tests some rare "borrow" cases in D4 step
  408. testDiv(APInt{512, "ffffffffffffffff00000000000000000000000001", 16},
  409. APInt{512, "10000000000000001000000000000001", 16},
  410. APInt{512, "10000000000000000000000000000000", 16});
  411. }
  412. TEST(APIntTest, divrem_big7) {
  413. // Yet another test for KnuthDiv rare step D6.
  414. testDiv({224, "800000008000000200000005", 16},
  415. {224, "fffffffd", 16},
  416. {224, "80000000800000010000000f", 16});
  417. }
  418. TEST(APIntTest, fromString) {
  419. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 2));
  420. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 2));
  421. EXPECT_EQ(APInt(32, 2), APInt(32, "10", 2));
  422. EXPECT_EQ(APInt(32, 3), APInt(32, "11", 2));
  423. EXPECT_EQ(APInt(32, 4), APInt(32, "100", 2));
  424. EXPECT_EQ(APInt(32, 0), APInt(32, "+0", 2));
  425. EXPECT_EQ(APInt(32, 1), APInt(32, "+1", 2));
  426. EXPECT_EQ(APInt(32, 2), APInt(32, "+10", 2));
  427. EXPECT_EQ(APInt(32, 3), APInt(32, "+11", 2));
  428. EXPECT_EQ(APInt(32, 4), APInt(32, "+100", 2));
  429. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 2));
  430. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 2));
  431. EXPECT_EQ(APInt(32, uint64_t(-2LL)), APInt(32, "-10", 2));
  432. EXPECT_EQ(APInt(32, uint64_t(-3LL)), APInt(32, "-11", 2));
  433. EXPECT_EQ(APInt(32, uint64_t(-4LL)), APInt(32, "-100", 2));
  434. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 8));
  435. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 8));
  436. EXPECT_EQ(APInt(32, 7), APInt(32, "7", 8));
  437. EXPECT_EQ(APInt(32, 8), APInt(32, "10", 8));
  438. EXPECT_EQ(APInt(32, 15), APInt(32, "17", 8));
  439. EXPECT_EQ(APInt(32, 16), APInt(32, "20", 8));
  440. EXPECT_EQ(APInt(32, +0), APInt(32, "+0", 8));
  441. EXPECT_EQ(APInt(32, +1), APInt(32, "+1", 8));
  442. EXPECT_EQ(APInt(32, +7), APInt(32, "+7", 8));
  443. EXPECT_EQ(APInt(32, +8), APInt(32, "+10", 8));
  444. EXPECT_EQ(APInt(32, +15), APInt(32, "+17", 8));
  445. EXPECT_EQ(APInt(32, +16), APInt(32, "+20", 8));
  446. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 8));
  447. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 8));
  448. EXPECT_EQ(APInt(32, uint64_t(-7LL)), APInt(32, "-7", 8));
  449. EXPECT_EQ(APInt(32, uint64_t(-8LL)), APInt(32, "-10", 8));
  450. EXPECT_EQ(APInt(32, uint64_t(-15LL)), APInt(32, "-17", 8));
  451. EXPECT_EQ(APInt(32, uint64_t(-16LL)), APInt(32, "-20", 8));
  452. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 10));
  453. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 10));
  454. EXPECT_EQ(APInt(32, 9), APInt(32, "9", 10));
  455. EXPECT_EQ(APInt(32, 10), APInt(32, "10", 10));
  456. EXPECT_EQ(APInt(32, 19), APInt(32, "19", 10));
  457. EXPECT_EQ(APInt(32, 20), APInt(32, "20", 10));
  458. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 10));
  459. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 10));
  460. EXPECT_EQ(APInt(32, uint64_t(-9LL)), APInt(32, "-9", 10));
  461. EXPECT_EQ(APInt(32, uint64_t(-10LL)), APInt(32, "-10", 10));
  462. EXPECT_EQ(APInt(32, uint64_t(-19LL)), APInt(32, "-19", 10));
  463. EXPECT_EQ(APInt(32, uint64_t(-20LL)), APInt(32, "-20", 10));
  464. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 16));
  465. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 16));
  466. EXPECT_EQ(APInt(32, 15), APInt(32, "F", 16));
  467. EXPECT_EQ(APInt(32, 16), APInt(32, "10", 16));
  468. EXPECT_EQ(APInt(32, 31), APInt(32, "1F", 16));
  469. EXPECT_EQ(APInt(32, 32), APInt(32, "20", 16));
  470. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 16));
  471. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 16));
  472. EXPECT_EQ(APInt(32, uint64_t(-15LL)), APInt(32, "-F", 16));
  473. EXPECT_EQ(APInt(32, uint64_t(-16LL)), APInt(32, "-10", 16));
  474. EXPECT_EQ(APInt(32, uint64_t(-31LL)), APInt(32, "-1F", 16));
  475. EXPECT_EQ(APInt(32, uint64_t(-32LL)), APInt(32, "-20", 16));
  476. EXPECT_EQ(APInt(32, 0), APInt(32, "0", 36));
  477. EXPECT_EQ(APInt(32, 1), APInt(32, "1", 36));
  478. EXPECT_EQ(APInt(32, 35), APInt(32, "Z", 36));
  479. EXPECT_EQ(APInt(32, 36), APInt(32, "10", 36));
  480. EXPECT_EQ(APInt(32, 71), APInt(32, "1Z", 36));
  481. EXPECT_EQ(APInt(32, 72), APInt(32, "20", 36));
  482. EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 36));
  483. EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 36));
  484. EXPECT_EQ(APInt(32, uint64_t(-35LL)), APInt(32, "-Z", 36));
  485. EXPECT_EQ(APInt(32, uint64_t(-36LL)), APInt(32, "-10", 36));
  486. EXPECT_EQ(APInt(32, uint64_t(-71LL)), APInt(32, "-1Z", 36));
  487. EXPECT_EQ(APInt(32, uint64_t(-72LL)), APInt(32, "-20", 36));
  488. }
  489. TEST(APIntTest, FromArray) {
  490. EXPECT_EQ(APInt(32, uint64_t(1)), APInt(32, ArrayRef<uint64_t>(1)));
  491. }
  492. TEST(APIntTest, StringBitsNeeded2) {
  493. EXPECT_EQ(1U, APInt::getBitsNeeded( "0", 2));
  494. EXPECT_EQ(1U, APInt::getBitsNeeded( "1", 2));
  495. EXPECT_EQ(2U, APInt::getBitsNeeded( "10", 2));
  496. EXPECT_EQ(2U, APInt::getBitsNeeded( "11", 2));
  497. EXPECT_EQ(3U, APInt::getBitsNeeded("100", 2));
  498. EXPECT_EQ(1U, APInt::getBitsNeeded( "+0", 2));
  499. EXPECT_EQ(1U, APInt::getBitsNeeded( "+1", 2));
  500. EXPECT_EQ(2U, APInt::getBitsNeeded( "+10", 2));
  501. EXPECT_EQ(2U, APInt::getBitsNeeded( "+11", 2));
  502. EXPECT_EQ(3U, APInt::getBitsNeeded("+100", 2));
  503. EXPECT_EQ(2U, APInt::getBitsNeeded( "-0", 2));
  504. EXPECT_EQ(2U, APInt::getBitsNeeded( "-1", 2));
  505. EXPECT_EQ(3U, APInt::getBitsNeeded( "-10", 2));
  506. EXPECT_EQ(3U, APInt::getBitsNeeded( "-11", 2));
  507. EXPECT_EQ(4U, APInt::getBitsNeeded("-100", 2));
  508. }
  509. TEST(APIntTest, StringBitsNeeded8) {
  510. EXPECT_EQ(3U, APInt::getBitsNeeded( "0", 8));
  511. EXPECT_EQ(3U, APInt::getBitsNeeded( "7", 8));
  512. EXPECT_EQ(6U, APInt::getBitsNeeded("10", 8));
  513. EXPECT_EQ(6U, APInt::getBitsNeeded("17", 8));
  514. EXPECT_EQ(6U, APInt::getBitsNeeded("20", 8));
  515. EXPECT_EQ(3U, APInt::getBitsNeeded( "+0", 8));
  516. EXPECT_EQ(3U, APInt::getBitsNeeded( "+7", 8));
  517. EXPECT_EQ(6U, APInt::getBitsNeeded("+10", 8));
  518. EXPECT_EQ(6U, APInt::getBitsNeeded("+17", 8));
  519. EXPECT_EQ(6U, APInt::getBitsNeeded("+20", 8));
  520. EXPECT_EQ(4U, APInt::getBitsNeeded( "-0", 8));
  521. EXPECT_EQ(4U, APInt::getBitsNeeded( "-7", 8));
  522. EXPECT_EQ(7U, APInt::getBitsNeeded("-10", 8));
  523. EXPECT_EQ(7U, APInt::getBitsNeeded("-17", 8));
  524. EXPECT_EQ(7U, APInt::getBitsNeeded("-20", 8));
  525. }
  526. TEST(APIntTest, StringBitsNeeded10) {
  527. EXPECT_EQ(1U, APInt::getBitsNeeded( "0", 10));
  528. EXPECT_EQ(2U, APInt::getBitsNeeded( "3", 10));
  529. EXPECT_EQ(4U, APInt::getBitsNeeded( "9", 10));
  530. EXPECT_EQ(4U, APInt::getBitsNeeded("10", 10));
  531. EXPECT_EQ(5U, APInt::getBitsNeeded("19", 10));
  532. EXPECT_EQ(5U, APInt::getBitsNeeded("20", 10));
  533. EXPECT_EQ(1U, APInt::getBitsNeeded( "+0", 10));
  534. EXPECT_EQ(4U, APInt::getBitsNeeded( "+9", 10));
  535. EXPECT_EQ(4U, APInt::getBitsNeeded("+10", 10));
  536. EXPECT_EQ(5U, APInt::getBitsNeeded("+19", 10));
  537. EXPECT_EQ(5U, APInt::getBitsNeeded("+20", 10));
  538. EXPECT_EQ(2U, APInt::getBitsNeeded( "-0", 10));
  539. EXPECT_EQ(5U, APInt::getBitsNeeded( "-9", 10));
  540. EXPECT_EQ(5U, APInt::getBitsNeeded("-10", 10));
  541. EXPECT_EQ(6U, APInt::getBitsNeeded("-19", 10));
  542. EXPECT_EQ(6U, APInt::getBitsNeeded("-20", 10));
  543. }
  544. TEST(APIntTest, StringBitsNeeded16) {
  545. EXPECT_EQ(4U, APInt::getBitsNeeded( "0", 16));
  546. EXPECT_EQ(4U, APInt::getBitsNeeded( "F", 16));
  547. EXPECT_EQ(8U, APInt::getBitsNeeded("10", 16));
  548. EXPECT_EQ(8U, APInt::getBitsNeeded("1F", 16));
  549. EXPECT_EQ(8U, APInt::getBitsNeeded("20", 16));
  550. EXPECT_EQ(4U, APInt::getBitsNeeded( "+0", 16));
  551. EXPECT_EQ(4U, APInt::getBitsNeeded( "+F", 16));
  552. EXPECT_EQ(8U, APInt::getBitsNeeded("+10", 16));
  553. EXPECT_EQ(8U, APInt::getBitsNeeded("+1F", 16));
  554. EXPECT_EQ(8U, APInt::getBitsNeeded("+20", 16));
  555. EXPECT_EQ(5U, APInt::getBitsNeeded( "-0", 16));
  556. EXPECT_EQ(5U, APInt::getBitsNeeded( "-F", 16));
  557. EXPECT_EQ(9U, APInt::getBitsNeeded("-10", 16));
  558. EXPECT_EQ(9U, APInt::getBitsNeeded("-1F", 16));
  559. EXPECT_EQ(9U, APInt::getBitsNeeded("-20", 16));
  560. }
  561. TEST(APIntTest, toString) {
  562. SmallString<16> S;
  563. bool isSigned;
  564. APInt(8, 0).toString(S, 2, true, true);
  565. EXPECT_EQ(S.str().str(), "0b0");
  566. S.clear();
  567. APInt(8, 0).toString(S, 8, true, true);
  568. EXPECT_EQ(S.str().str(), "00");
  569. S.clear();
  570. APInt(8, 0).toString(S, 10, true, true);
  571. EXPECT_EQ(S.str().str(), "0");
  572. S.clear();
  573. APInt(8, 0).toString(S, 16, true, true);
  574. EXPECT_EQ(S.str().str(), "0x0");
  575. S.clear();
  576. APInt(8, 0).toString(S, 36, true, false);
  577. EXPECT_EQ(S.str().str(), "0");
  578. S.clear();
  579. isSigned = false;
  580. APInt(8, 255, isSigned).toString(S, 2, isSigned, true);
  581. EXPECT_EQ(S.str().str(), "0b11111111");
  582. S.clear();
  583. APInt(8, 255, isSigned).toString(S, 8, isSigned, true);
  584. EXPECT_EQ(S.str().str(), "0377");
  585. S.clear();
  586. APInt(8, 255, isSigned).toString(S, 10, isSigned, true);
  587. EXPECT_EQ(S.str().str(), "255");
  588. S.clear();
  589. APInt(8, 255, isSigned).toString(S, 16, isSigned, true);
  590. EXPECT_EQ(S.str().str(), "0xFF");
  591. S.clear();
  592. APInt(8, 255, isSigned).toString(S, 36, isSigned, false);
  593. EXPECT_EQ(S.str().str(), "73");
  594. S.clear();
  595. isSigned = true;
  596. APInt(8, 255, isSigned).toString(S, 2, isSigned, true);
  597. EXPECT_EQ(S.str().str(), "-0b1");
  598. S.clear();
  599. APInt(8, 255, isSigned).toString(S, 8, isSigned, true);
  600. EXPECT_EQ(S.str().str(), "-01");
  601. S.clear();
  602. APInt(8, 255, isSigned).toString(S, 10, isSigned, true);
  603. EXPECT_EQ(S.str().str(), "-1");
  604. S.clear();
  605. APInt(8, 255, isSigned).toString(S, 16, isSigned, true);
  606. EXPECT_EQ(S.str().str(), "-0x1");
  607. S.clear();
  608. APInt(8, 255, isSigned).toString(S, 36, isSigned, false);
  609. EXPECT_EQ(S.str().str(), "-1");
  610. S.clear();
  611. }
  612. TEST(APIntTest, Log2) {
  613. EXPECT_EQ(APInt(15, 7).logBase2(), 2U);
  614. EXPECT_EQ(APInt(15, 7).ceilLogBase2(), 3U);
  615. EXPECT_EQ(APInt(15, 7).exactLogBase2(), -1);
  616. EXPECT_EQ(APInt(15, 8).logBase2(), 3U);
  617. EXPECT_EQ(APInt(15, 8).ceilLogBase2(), 3U);
  618. EXPECT_EQ(APInt(15, 8).exactLogBase2(), 3);
  619. EXPECT_EQ(APInt(15, 9).logBase2(), 3U);
  620. EXPECT_EQ(APInt(15, 9).ceilLogBase2(), 4U);
  621. EXPECT_EQ(APInt(15, 9).exactLogBase2(), -1);
  622. }
  623. TEST(APIntTest, magic) {
  624. EXPECT_EQ(APInt(32, 3).magic().m, APInt(32, "55555556", 16));
  625. EXPECT_EQ(APInt(32, 3).magic().s, 0U);
  626. EXPECT_EQ(APInt(32, 5).magic().m, APInt(32, "66666667", 16));
  627. EXPECT_EQ(APInt(32, 5).magic().s, 1U);
  628. EXPECT_EQ(APInt(32, 7).magic().m, APInt(32, "92492493", 16));
  629. EXPECT_EQ(APInt(32, 7).magic().s, 2U);
  630. }
  631. TEST(APIntTest, magicu) {
  632. EXPECT_EQ(APInt(32, 3).magicu().m, APInt(32, "AAAAAAAB", 16));
  633. EXPECT_EQ(APInt(32, 3).magicu().s, 1U);
  634. EXPECT_EQ(APInt(32, 5).magicu().m, APInt(32, "CCCCCCCD", 16));
  635. EXPECT_EQ(APInt(32, 5).magicu().s, 2U);
  636. EXPECT_EQ(APInt(32, 7).magicu().m, APInt(32, "24924925", 16));
  637. EXPECT_EQ(APInt(32, 7).magicu().s, 3U);
  638. EXPECT_EQ(APInt(64, 25).magicu(1).m, APInt(64, "A3D70A3D70A3D70B", 16));
  639. EXPECT_EQ(APInt(64, 25).magicu(1).s, 4U);
  640. }
  641. #ifdef GTEST_HAS_DEATH_TEST
  642. #ifndef NDEBUG
  643. TEST(APIntTest, StringDeath) {
  644. EXPECT_DEATH(APInt(0, "", 0), "Bitwidth too small");
  645. EXPECT_DEATH(APInt(32, "", 0), "Invalid string length");
  646. EXPECT_DEATH(APInt(32, "0", 0), "Radix should be 2, 8, 10, 16, or 36!");
  647. EXPECT_DEATH(APInt(32, "", 10), "Invalid string length");
  648. EXPECT_DEATH(APInt(32, "-", 10), "String is only a sign, needs a value.");
  649. EXPECT_DEATH(APInt(1, "1234", 10), "Insufficient bit width");
  650. EXPECT_DEATH(APInt(32, "\0", 10), "Invalid string length");
  651. EXPECT_DEATH(APInt(32, StringRef("1\02", 3), 10), "Invalid character in digit string");
  652. EXPECT_DEATH(APInt(32, "1L", 10), "Invalid character in digit string");
  653. }
  654. #endif
  655. #endif
  656. TEST(APIntTest, mul_clear) {
  657. APInt ValA(65, -1ULL);
  658. APInt ValB(65, 4);
  659. APInt ValC(65, 0);
  660. ValC = ValA * ValB;
  661. ValA *= ValB;
  662. EXPECT_EQ(ValA.toString(10, false), ValC.toString(10, false));
  663. }
  664. TEST(APIntTest, Rotate) {
  665. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotl(0));
  666. EXPECT_EQ(APInt(8, 2), APInt(8, 1).rotl(1));
  667. EXPECT_EQ(APInt(8, 4), APInt(8, 1).rotl(2));
  668. EXPECT_EQ(APInt(8, 16), APInt(8, 1).rotl(4));
  669. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotl(8));
  670. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotl(0));
  671. EXPECT_EQ(APInt(8, 32), APInt(8, 16).rotl(1));
  672. EXPECT_EQ(APInt(8, 64), APInt(8, 16).rotl(2));
  673. EXPECT_EQ(APInt(8, 1), APInt(8, 16).rotl(4));
  674. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotl(8));
  675. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotr(0));
  676. EXPECT_EQ(APInt(8, 8), APInt(8, 16).rotr(1));
  677. EXPECT_EQ(APInt(8, 4), APInt(8, 16).rotr(2));
  678. EXPECT_EQ(APInt(8, 1), APInt(8, 16).rotr(4));
  679. EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotr(8));
  680. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotr(0));
  681. EXPECT_EQ(APInt(8, 128), APInt(8, 1).rotr(1));
  682. EXPECT_EQ(APInt(8, 64), APInt(8, 1).rotr(2));
  683. EXPECT_EQ(APInt(8, 16), APInt(8, 1).rotr(4));
  684. EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotr(8));
  685. APInt Big(256, "00004000800000000000000000003fff8000000000000000", 16);
  686. APInt Rot(256, "3fff80000000000000000000000000000000000040008000", 16);
  687. EXPECT_EQ(Rot, Big.rotr(144));
  688. }
  689. TEST(APIntTest, Splat) {
  690. APInt ValA(8, 0x01);
  691. EXPECT_EQ(ValA, APInt::getSplat(8, ValA));
  692. EXPECT_EQ(APInt(64, 0x0101010101010101ULL), APInt::getSplat(64, ValA));
  693. APInt ValB(3, 5);
  694. EXPECT_EQ(APInt(4, 0xD), APInt::getSplat(4, ValB));
  695. EXPECT_EQ(APInt(15, 0xDB6D), APInt::getSplat(15, ValB));
  696. }
  697. TEST(APIntTest, tcDecrement) {
  698. // Test single word decrement.
  699. // No out borrow.
  700. {
  701. integerPart singleWord = ~integerPart(0) << (integerPartWidth - 1);
  702. integerPart carry = APInt::tcDecrement(&singleWord, 1);
  703. EXPECT_EQ(carry, integerPart(0));
  704. EXPECT_EQ(singleWord, ~integerPart(0) >> 1);
  705. }
  706. // With out borrow.
  707. {
  708. integerPart singleWord = 0;
  709. integerPart carry = APInt::tcDecrement(&singleWord, 1);
  710. EXPECT_EQ(carry, integerPart(1));
  711. EXPECT_EQ(singleWord, ~integerPart(0));
  712. }
  713. // Test multiword decrement.
  714. // No across word borrow, no out borrow.
  715. {
  716. integerPart test[4] = {0x1, 0x1, 0x1, 0x1};
  717. integerPart expected[4] = {0x0, 0x1, 0x1, 0x1};
  718. APInt::tcDecrement(test, 4);
  719. EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
  720. }
  721. // 1 across word borrow, no out borrow.
  722. {
  723. integerPart test[4] = {0x0, 0xF, 0x1, 0x1};
  724. integerPart expected[4] = {~integerPart(0), 0xE, 0x1, 0x1};
  725. integerPart carry = APInt::tcDecrement(test, 4);
  726. EXPECT_EQ(carry, integerPart(0));
  727. EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
  728. }
  729. // 2 across word borrow, no out borrow.
  730. {
  731. integerPart test[4] = {0x0, 0x0, 0xC, 0x1};
  732. integerPart expected[4] = {~integerPart(0), ~integerPart(0), 0xB, 0x1};
  733. integerPart carry = APInt::tcDecrement(test, 4);
  734. EXPECT_EQ(carry, integerPart(0));
  735. EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
  736. }
  737. // 3 across word borrow, no out borrow.
  738. {
  739. integerPart test[4] = {0x0, 0x0, 0x0, 0x1};
  740. integerPart expected[4] = {~integerPart(0), ~integerPart(0), ~integerPart(0), 0x0};
  741. integerPart carry = APInt::tcDecrement(test, 4);
  742. EXPECT_EQ(carry, integerPart(0));
  743. EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
  744. }
  745. // 3 across word borrow, with out borrow.
  746. {
  747. integerPart test[4] = {0x0, 0x0, 0x0, 0x0};
  748. integerPart expected[4] = {~integerPart(0), ~integerPart(0), ~integerPart(0), ~integerPart(0)};
  749. integerPart carry = APInt::tcDecrement(test, 4);
  750. EXPECT_EQ(carry, integerPart(1));
  751. EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
  752. }
  753. }
  754. TEST(APIntTest, arrayAccess) {
  755. // Single word check.
  756. uint64_t E1 = 0x2CA7F46BF6569915ULL;
  757. APInt A1(64, E1);
  758. for (unsigned i = 0, e = 64; i < e; ++i) {
  759. EXPECT_EQ(bool(E1 & (1ULL << i)),
  760. A1[i]);
  761. }
  762. // Multiword check.
  763. integerPart E2[4] = {
  764. 0xEB6EB136591CBA21ULL,
  765. 0x7B9358BD6A33F10AULL,
  766. 0x7E7FFA5EADD8846ULL,
  767. 0x305F341CA00B613DULL
  768. };
  769. APInt A2(integerPartWidth*4, E2);
  770. for (unsigned i = 0; i < 4; ++i) {
  771. for (unsigned j = 0; j < integerPartWidth; ++j) {
  772. EXPECT_EQ(bool(E2[i] & (1ULL << j)),
  773. A2[i*integerPartWidth + j]);
  774. }
  775. }
  776. }
  777. TEST(APIntTest, LargeAPIntConstruction) {
  778. // Check that we can properly construct very large APInt. It is very
  779. // unlikely that people will ever do this, but it is a legal input,
  780. // so we should not crash on it.
  781. APInt A9(UINT32_MAX, 0);
  782. EXPECT_FALSE(A9.getBoolValue());
  783. }
  784. TEST(APIntTest, nearestLogBase2) {
  785. // Single word check.
  786. // Test round up.
  787. uint64_t I1 = 0x1800001;
  788. APInt A1(64, I1);
  789. EXPECT_EQ(A1.nearestLogBase2(), A1.ceilLogBase2());
  790. // Test round down.
  791. uint64_t I2 = 0x1000011;
  792. APInt A2(64, I2);
  793. EXPECT_EQ(A2.nearestLogBase2(), A2.logBase2());
  794. // Test ties round up.
  795. uint64_t I3 = 0x1800000;
  796. APInt A3(64, I3);
  797. EXPECT_EQ(A3.nearestLogBase2(), A3.ceilLogBase2());
  798. // Multiple word check.
  799. // Test round up.
  800. integerPart I4[4] = {0x0, 0xF, 0x18, 0x0};
  801. APInt A4(integerPartWidth*4, I4);
  802. EXPECT_EQ(A4.nearestLogBase2(), A4.ceilLogBase2());
  803. // Test round down.
  804. integerPart I5[4] = {0x0, 0xF, 0x10, 0x0};
  805. APInt A5(integerPartWidth*4, I5);
  806. EXPECT_EQ(A5.nearestLogBase2(), A5.logBase2());
  807. // Test ties round up.
  808. uint64_t I6[4] = {0x0, 0x0, 0x0, 0x18};
  809. APInt A6(integerPartWidth*4, I6);
  810. EXPECT_EQ(A6.nearestLogBase2(), A6.ceilLogBase2());
  811. // Test BitWidth == 1 special cases.
  812. APInt A7(1, 1);
  813. EXPECT_EQ(A7.nearestLogBase2(), 0ULL);
  814. APInt A8(1, 0);
  815. EXPECT_EQ(A8.nearestLogBase2(), UINT32_MAX);
  816. // Test the zero case when we have a bit width large enough such
  817. // that the bit width is larger than UINT32_MAX-1.
  818. APInt A9(UINT32_MAX, 0);
  819. EXPECT_EQ(A9.nearestLogBase2(), UINT32_MAX);
  820. }
  821. TEST(APIntTest, IsSplat) {
  822. APInt A(32, 0x01010101);
  823. EXPECT_FALSE(A.isSplat(1));
  824. EXPECT_FALSE(A.isSplat(2));
  825. EXPECT_FALSE(A.isSplat(4));
  826. EXPECT_TRUE(A.isSplat(8));
  827. EXPECT_TRUE(A.isSplat(16));
  828. EXPECT_TRUE(A.isSplat(32));
  829. APInt B(24, 0xAAAAAA);
  830. EXPECT_FALSE(B.isSplat(1));
  831. EXPECT_TRUE(B.isSplat(2));
  832. EXPECT_TRUE(B.isSplat(4));
  833. EXPECT_TRUE(B.isSplat(8));
  834. EXPECT_TRUE(B.isSplat(24));
  835. APInt C(24, 0xABAAAB);
  836. EXPECT_FALSE(C.isSplat(1));
  837. EXPECT_FALSE(C.isSplat(2));
  838. EXPECT_FALSE(C.isSplat(4));
  839. EXPECT_FALSE(C.isSplat(8));
  840. EXPECT_TRUE(C.isSplat(24));
  841. APInt D(32, 0xABBAABBA);
  842. EXPECT_FALSE(D.isSplat(1));
  843. EXPECT_FALSE(D.isSplat(2));
  844. EXPECT_FALSE(D.isSplat(4));
  845. EXPECT_FALSE(D.isSplat(8));
  846. EXPECT_TRUE(D.isSplat(16));
  847. EXPECT_TRUE(D.isSplat(32));
  848. APInt E(32, 0);
  849. EXPECT_TRUE(E.isSplat(1));
  850. EXPECT_TRUE(E.isSplat(2));
  851. EXPECT_TRUE(E.isSplat(4));
  852. EXPECT_TRUE(E.isSplat(8));
  853. EXPECT_TRUE(E.isSplat(16));
  854. EXPECT_TRUE(E.isSplat(32));
  855. }
  856. #if defined(__clang__)
  857. // Disable the pragma warning from versions of Clang without -Wself-move
  858. #pragma clang diagnostic push
  859. #pragma clang diagnostic ignored "-Wunknown-pragmas"
  860. // Disable the warning that triggers on exactly what is being tested.
  861. #pragma clang diagnostic push
  862. #pragma clang diagnostic ignored "-Wself-move"
  863. #endif
  864. TEST(APIntTest, SelfMoveAssignment) {
  865. APInt X(32, 0xdeadbeef);
  866. X = std::move(X);
  867. EXPECT_EQ(32u, X.getBitWidth());
  868. EXPECT_EQ(0xdeadbeefULL, X.getLimitedValue());
  869. uint64_t Bits[] = {0xdeadbeefdeadbeefULL, 0xdeadbeefdeadbeefULL};
  870. APInt Y(128, Bits);
  871. Y = std::move(Y);
  872. EXPECT_EQ(128u, Y.getBitWidth());
  873. EXPECT_EQ(~0ULL, Y.getLimitedValue());
  874. const uint64_t *Raw = Y.getRawData();
  875. EXPECT_EQ(2u, Y.getNumWords());
  876. EXPECT_EQ(0xdeadbeefdeadbeefULL, Raw[0]);
  877. EXPECT_EQ(0xdeadbeefdeadbeefULL, Raw[1]);
  878. }
  879. #if defined(__clang__)
  880. #pragma clang diagnostic pop
  881. #pragma clang diagnostic pop
  882. #endif
  883. }