blob: c939c3942d7e80996a2e2c3e623423743dab9b88 [file] [log] [blame]
Bill Wendlingb9ad4922009-02-09 12:31:40 +00001//===- llvm/unittest/ADT/APInt.cpp - APInt unit tests ---------------------===//
Nick Lewyckyee226112009-01-19 18:08:33 +00002//
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
Nick Lewyckyee226112009-01-19 18:08:33 +000010#include "llvm/ADT/APInt.h"
Mehdi Amini47b292d2016-04-16 07:51:28 +000011#include "llvm/ADT/ArrayRef.h"
Misha Brukmand1d2c502009-03-24 21:36:09 +000012#include "llvm/ADT/SmallString.h"
Chandler Carruth130cec22012-12-04 10:23:08 +000013#include "gtest/gtest.h"
Pawel Bylica0dda1642015-06-25 10:47:08 +000014#include <array>
Nick Lewyckyee226112009-01-19 18:08:33 +000015
16using namespace llvm;
17
18namespace {
19
Richard Smith55f5e652015-09-04 04:08:36 +000020TEST(APIntTest, ValueInit) {
21 APInt Zero = APInt();
22 EXPECT_TRUE(!Zero);
23 EXPECT_TRUE(!Zero.zext(64));
24 EXPECT_TRUE(!Zero.sext(64));
25}
26
Nick Lewyckyee226112009-01-19 18:08:33 +000027// Test that APInt shift left works when bitwidth > 64 and shiftamt == 0
28TEST(APIntTest, ShiftLeftByZero) {
29 APInt One = APInt::getNullValue(65) + 1;
30 APInt Shl = One.shl(0);
Chandler Carruthbc3e8a72010-07-13 17:28:05 +000031 EXPECT_TRUE(Shl[0]);
32 EXPECT_FALSE(Shl[1]);
Torok Edwinec39eb82009-01-27 18:06:03 +000033}
34
Jonathan Roelofs851b79d2016-08-10 19:50:14 +000035TEST(APIntTest, i64_ArithmeticRightShiftNegative) {
36 const APInt neg_one(64, static_cast<uint64_t>(-1), true);
37 EXPECT_EQ(neg_one, neg_one.ashr(7));
38}
39
Misha Brukmand1d2c502009-03-24 21:36:09 +000040TEST(APIntTest, i128_NegativeCount) {
Misha Brukman680336d2009-04-08 16:17:23 +000041 APInt Minus3(128, static_cast<uint64_t>(-3), true);
Torok Edwinec39eb82009-01-27 18:06:03 +000042 EXPECT_EQ(126u, Minus3.countLeadingOnes());
43 EXPECT_EQ(-3, Minus3.getSExtValue());
44
Misha Brukman680336d2009-04-08 16:17:23 +000045 APInt Minus1(128, static_cast<uint64_t>(-1), true);
Torok Edwinec39eb82009-01-27 18:06:03 +000046 EXPECT_EQ(0u, Minus1.countLeadingZeros());
47 EXPECT_EQ(128u, Minus1.countLeadingOnes());
48 EXPECT_EQ(128u, Minus1.getActiveBits());
49 EXPECT_EQ(0u, Minus1.countTrailingZeros());
50 EXPECT_EQ(128u, Minus1.countTrailingOnes());
51 EXPECT_EQ(128u, Minus1.countPopulation());
52 EXPECT_EQ(-1, Minus1.getSExtValue());
53}
54
Misha Brukmand1d2c502009-03-24 21:36:09 +000055TEST(APIntTest, i33_Count) {
Misha Brukman680336d2009-04-08 16:17:23 +000056 APInt i33minus2(33, static_cast<uint64_t>(-2), true);
Torok Edwinec39eb82009-01-27 18:06:03 +000057 EXPECT_EQ(0u, i33minus2.countLeadingZeros());
58 EXPECT_EQ(32u, i33minus2.countLeadingOnes());
59 EXPECT_EQ(33u, i33minus2.getActiveBits());
60 EXPECT_EQ(1u, i33minus2.countTrailingZeros());
61 EXPECT_EQ(32u, i33minus2.countPopulation());
62 EXPECT_EQ(-2, i33minus2.getSExtValue());
63 EXPECT_EQ(((uint64_t)-2)&((1ull<<33) -1), i33minus2.getZExtValue());
64}
65
Misha Brukmand1d2c502009-03-24 21:36:09 +000066TEST(APIntTest, i65_Count) {
Meador Inge32dc7242013-02-07 18:36:50 +000067 APInt i65(65, 0, true);
68 EXPECT_EQ(65u, i65.countLeadingZeros());
69 EXPECT_EQ(0u, i65.countLeadingOnes());
70 EXPECT_EQ(0u, i65.getActiveBits());
71 EXPECT_EQ(1u, i65.getActiveWords());
72 EXPECT_EQ(65u, i65.countTrailingZeros());
73 EXPECT_EQ(0u, i65.countPopulation());
74
Torok Edwinec39eb82009-01-27 18:06:03 +000075 APInt i65minus(65, 0, true);
Jay Foad25a5e4c2010-12-01 08:53:58 +000076 i65minus.setBit(64);
Torok Edwinec39eb82009-01-27 18:06:03 +000077 EXPECT_EQ(0u, i65minus.countLeadingZeros());
78 EXPECT_EQ(1u, i65minus.countLeadingOnes());
79 EXPECT_EQ(65u, i65minus.getActiveBits());
80 EXPECT_EQ(64u, i65minus.countTrailingZeros());
81 EXPECT_EQ(1u, i65minus.countPopulation());
82}
83
Misha Brukmand1d2c502009-03-24 21:36:09 +000084TEST(APIntTest, i128_PositiveCount) {
Torok Edwinec39eb82009-01-27 18:06:03 +000085 APInt u128max = APInt::getAllOnesValue(128);
86 EXPECT_EQ(128u, u128max.countLeadingOnes());
87 EXPECT_EQ(0u, u128max.countLeadingZeros());
88 EXPECT_EQ(128u, u128max.getActiveBits());
89 EXPECT_EQ(0u, u128max.countTrailingZeros());
90 EXPECT_EQ(128u, u128max.countTrailingOnes());
91 EXPECT_EQ(128u, u128max.countPopulation());
92
Misha Brukman680336d2009-04-08 16:17:23 +000093 APInt u64max(128, static_cast<uint64_t>(-1), false);
Torok Edwinec39eb82009-01-27 18:06:03 +000094 EXPECT_EQ(64u, u64max.countLeadingZeros());
95 EXPECT_EQ(0u, u64max.countLeadingOnes());
96 EXPECT_EQ(64u, u64max.getActiveBits());
97 EXPECT_EQ(0u, u64max.countTrailingZeros());
98 EXPECT_EQ(64u, u64max.countTrailingOnes());
99 EXPECT_EQ(64u, u64max.countPopulation());
100 EXPECT_EQ((uint64_t)~0ull, u64max.getZExtValue());
101
102 APInt zero(128, 0, true);
103 EXPECT_EQ(128u, zero.countLeadingZeros());
104 EXPECT_EQ(0u, zero.countLeadingOnes());
105 EXPECT_EQ(0u, zero.getActiveBits());
106 EXPECT_EQ(128u, zero.countTrailingZeros());
107 EXPECT_EQ(0u, zero.countTrailingOnes());
108 EXPECT_EQ(0u, zero.countPopulation());
109 EXPECT_EQ(0u, zero.getSExtValue());
110 EXPECT_EQ(0u, zero.getZExtValue());
111
112 APInt one(128, 1, true);
113 EXPECT_EQ(127u, one.countLeadingZeros());
114 EXPECT_EQ(0u, one.countLeadingOnes());
115 EXPECT_EQ(1u, one.getActiveBits());
116 EXPECT_EQ(0u, one.countTrailingZeros());
117 EXPECT_EQ(1u, one.countTrailingOnes());
118 EXPECT_EQ(1u, one.countPopulation());
119 EXPECT_EQ(1, one.getSExtValue());
120 EXPECT_EQ(1u, one.getZExtValue());
Nick Lewyckyee226112009-01-19 18:08:33 +0000121}
122
Misha Brukmand1d2c502009-03-24 21:36:09 +0000123TEST(APIntTest, i1) {
Misha Brukman680336d2009-04-08 16:17:23 +0000124 const APInt neg_two(1, static_cast<uint64_t>(-2), true);
125 const APInt neg_one(1, static_cast<uint64_t>(-1), true);
Misha Brukmand1d2c502009-03-24 21:36:09 +0000126 const APInt zero(1, 0);
127 const APInt one(1, 1);
128 const APInt two(1, 2);
129
130 EXPECT_EQ(0, neg_two.getSExtValue());
131 EXPECT_EQ(-1, neg_one.getSExtValue());
132 EXPECT_EQ(1u, neg_one.getZExtValue());
133 EXPECT_EQ(0u, zero.getZExtValue());
134 EXPECT_EQ(-1, one.getSExtValue());
135 EXPECT_EQ(1u, one.getZExtValue());
136 EXPECT_EQ(0u, two.getZExtValue());
137 EXPECT_EQ(0, two.getSExtValue());
138
139 // Basic equalities for 1-bit values.
140 EXPECT_EQ(zero, two);
141 EXPECT_EQ(zero, neg_two);
142 EXPECT_EQ(one, neg_one);
143 EXPECT_EQ(two, neg_two);
144
Benjamin Kramer886461e2015-06-04 18:19:13 +0000145 // Min/max signed values.
146 EXPECT_TRUE(zero.isMaxSignedValue());
147 EXPECT_FALSE(one.isMaxSignedValue());
148 EXPECT_FALSE(zero.isMinSignedValue());
149 EXPECT_TRUE(one.isMinSignedValue());
150
Misha Brukmand1d2c502009-03-24 21:36:09 +0000151 // Additions.
152 EXPECT_EQ(two, one + one);
153 EXPECT_EQ(zero, neg_one + one);
154 EXPECT_EQ(neg_two, neg_one + neg_one);
155
156 // Subtractions.
157 EXPECT_EQ(neg_two, neg_one - one);
158 EXPECT_EQ(two, one - neg_one);
159 EXPECT_EQ(zero, one - one);
160
Craig Topper9028f052017-01-24 02:10:15 +0000161 // And
162 EXPECT_EQ(zero, zero & zero);
163 EXPECT_EQ(zero, one & zero);
164 EXPECT_EQ(zero, zero & one);
165 EXPECT_EQ(one, one & one);
166 EXPECT_EQ(zero, zero & zero);
167 EXPECT_EQ(zero, neg_one & zero);
168 EXPECT_EQ(zero, zero & neg_one);
169 EXPECT_EQ(neg_one, neg_one & neg_one);
170
171 // Or
172 EXPECT_EQ(zero, zero | zero);
173 EXPECT_EQ(one, one | zero);
174 EXPECT_EQ(one, zero | one);
175 EXPECT_EQ(one, one | one);
176 EXPECT_EQ(zero, zero | zero);
177 EXPECT_EQ(neg_one, neg_one | zero);
178 EXPECT_EQ(neg_one, zero | neg_one);
179 EXPECT_EQ(neg_one, neg_one | neg_one);
180
181 // Xor
182 EXPECT_EQ(zero, zero ^ zero);
183 EXPECT_EQ(one, one ^ zero);
184 EXPECT_EQ(one, zero ^ one);
185 EXPECT_EQ(zero, one ^ one);
186 EXPECT_EQ(zero, zero ^ zero);
187 EXPECT_EQ(neg_one, neg_one ^ zero);
188 EXPECT_EQ(neg_one, zero ^ neg_one);
189 EXPECT_EQ(zero, neg_one ^ neg_one);
190
Misha Brukmand1d2c502009-03-24 21:36:09 +0000191 // Shifts.
192 EXPECT_EQ(zero, one << one);
193 EXPECT_EQ(one, one << zero);
194 EXPECT_EQ(zero, one.shl(1));
195 EXPECT_EQ(one, one.shl(0));
196 EXPECT_EQ(zero, one.lshr(1));
197 EXPECT_EQ(zero, one.ashr(1));
198
Eli Friedmanf70c8622011-12-22 22:11:19 +0000199 // Rotates.
200 EXPECT_EQ(one, one.rotl(0));
201 EXPECT_EQ(one, one.rotl(1));
202 EXPECT_EQ(one, one.rotr(0));
203 EXPECT_EQ(one, one.rotr(1));
204
Misha Brukmand1d2c502009-03-24 21:36:09 +0000205 // Multiplies.
206 EXPECT_EQ(neg_one, neg_one * one);
207 EXPECT_EQ(neg_one, one * neg_one);
208 EXPECT_EQ(one, neg_one * neg_one);
209 EXPECT_EQ(one, one * one);
210
211 // Divides.
212 EXPECT_EQ(neg_one, one.sdiv(neg_one));
213 EXPECT_EQ(neg_one, neg_one.sdiv(one));
214 EXPECT_EQ(one, neg_one.sdiv(neg_one));
215 EXPECT_EQ(one, one.sdiv(one));
216
217 EXPECT_EQ(neg_one, one.udiv(neg_one));
218 EXPECT_EQ(neg_one, neg_one.udiv(one));
219 EXPECT_EQ(one, neg_one.udiv(neg_one));
220 EXPECT_EQ(one, one.udiv(one));
221
222 // Remainders.
223 EXPECT_EQ(zero, neg_one.srem(one));
224 EXPECT_EQ(zero, neg_one.urem(one));
225 EXPECT_EQ(zero, one.srem(neg_one));
Nuno Lopes61b7fa22012-05-22 01:09:48 +0000226
227 // sdivrem
228 {
229 APInt q(8, 0);
230 APInt r(8, 0);
231 APInt one(8, 1);
232 APInt two(8, 2);
233 APInt nine(8, 9);
234 APInt four(8, 4);
235
236 EXPECT_EQ(nine.srem(two), one);
237 EXPECT_EQ(nine.srem(-two), one);
238 EXPECT_EQ((-nine).srem(two), -one);
239 EXPECT_EQ((-nine).srem(-two), -one);
240
241 APInt::sdivrem(nine, two, q, r);
242 EXPECT_EQ(four, q);
243 EXPECT_EQ(one, r);
244 APInt::sdivrem(-nine, two, q, r);
245 EXPECT_EQ(-four, q);
246 EXPECT_EQ(-one, r);
247 APInt::sdivrem(nine, -two, q, r);
248 EXPECT_EQ(-four, q);
249 EXPECT_EQ(one, r);
250 APInt::sdivrem(-nine, -two, q, r);
251 EXPECT_EQ(four, q);
252 EXPECT_EQ(-one, r);
253 }
Misha Brukmand1d2c502009-03-24 21:36:09 +0000254}
255
Pawel Bylica8bebed92015-06-25 10:23:52 +0000256TEST(APIntTest, compare) {
257 std::array<APInt, 5> testVals{{
258 APInt{16, 2},
259 APInt{16, 1},
260 APInt{16, 0},
261 APInt{16, (uint64_t)-1, true},
262 APInt{16, (uint64_t)-2, true},
263 }};
264
265 for (auto &arg1 : testVals)
266 for (auto &arg2 : testVals) {
267 auto uv1 = arg1.getZExtValue();
268 auto uv2 = arg2.getZExtValue();
269 auto sv1 = arg1.getSExtValue();
270 auto sv2 = arg2.getSExtValue();
271
272 EXPECT_EQ(uv1 < uv2, arg1.ult(arg2));
273 EXPECT_EQ(uv1 <= uv2, arg1.ule(arg2));
274 EXPECT_EQ(uv1 > uv2, arg1.ugt(arg2));
275 EXPECT_EQ(uv1 >= uv2, arg1.uge(arg2));
276
277 EXPECT_EQ(sv1 < sv2, arg1.slt(arg2));
278 EXPECT_EQ(sv1 <= sv2, arg1.sle(arg2));
279 EXPECT_EQ(sv1 > sv2, arg1.sgt(arg2));
280 EXPECT_EQ(sv1 >= sv2, arg1.sge(arg2));
281
282 EXPECT_EQ(uv1 < uv2, arg1.ult(uv2));
283 EXPECT_EQ(uv1 <= uv2, arg1.ule(uv2));
284 EXPECT_EQ(uv1 > uv2, arg1.ugt(uv2));
285 EXPECT_EQ(uv1 >= uv2, arg1.uge(uv2));
286
287 EXPECT_EQ(sv1 < sv2, arg1.slt(sv2));
288 EXPECT_EQ(sv1 <= sv2, arg1.sle(sv2));
289 EXPECT_EQ(sv1 > sv2, arg1.sgt(sv2));
290 EXPECT_EQ(sv1 >= sv2, arg1.sge(sv2));
291 }
292}
293
Pawel Bylicaea46a662015-07-01 22:56:43 +0000294TEST(APIntTest, compareWithRawIntegers) {
295 EXPECT_TRUE(!APInt(8, 1).uge(256));
296 EXPECT_TRUE(!APInt(8, 1).ugt(256));
297 EXPECT_TRUE( APInt(8, 1).ule(256));
298 EXPECT_TRUE( APInt(8, 1).ult(256));
299 EXPECT_TRUE(!APInt(8, 1).sge(256));
300 EXPECT_TRUE(!APInt(8, 1).sgt(256));
301 EXPECT_TRUE( APInt(8, 1).sle(256));
302 EXPECT_TRUE( APInt(8, 1).slt(256));
303 EXPECT_TRUE(!(APInt(8, 0) == 256));
304 EXPECT_TRUE( APInt(8, 0) != 256);
305 EXPECT_TRUE(!(APInt(8, 1) == 256));
306 EXPECT_TRUE( APInt(8, 1) != 256);
307
308 auto uint64max = UINT64_MAX;
309 auto int64max = INT64_MAX;
310 auto int64min = INT64_MIN;
311
312 auto u64 = APInt{128, uint64max};
313 auto s64 = APInt{128, static_cast<uint64_t>(int64max), true};
314 auto big = u64 + 1;
315
316 EXPECT_TRUE( u64.uge(uint64max));
317 EXPECT_TRUE(!u64.ugt(uint64max));
318 EXPECT_TRUE( u64.ule(uint64max));
319 EXPECT_TRUE(!u64.ult(uint64max));
320 EXPECT_TRUE( u64.sge(int64max));
321 EXPECT_TRUE( u64.sgt(int64max));
322 EXPECT_TRUE(!u64.sle(int64max));
323 EXPECT_TRUE(!u64.slt(int64max));
324 EXPECT_TRUE( u64.sge(int64min));
325 EXPECT_TRUE( u64.sgt(int64min));
326 EXPECT_TRUE(!u64.sle(int64min));
327 EXPECT_TRUE(!u64.slt(int64min));
328
329 EXPECT_TRUE(u64 == uint64max);
330 EXPECT_TRUE(u64 != int64max);
331 EXPECT_TRUE(u64 != int64min);
332
333 EXPECT_TRUE(!s64.uge(uint64max));
334 EXPECT_TRUE(!s64.ugt(uint64max));
335 EXPECT_TRUE( s64.ule(uint64max));
336 EXPECT_TRUE( s64.ult(uint64max));
337 EXPECT_TRUE( s64.sge(int64max));
338 EXPECT_TRUE(!s64.sgt(int64max));
339 EXPECT_TRUE( s64.sle(int64max));
340 EXPECT_TRUE(!s64.slt(int64max));
341 EXPECT_TRUE( s64.sge(int64min));
342 EXPECT_TRUE( s64.sgt(int64min));
343 EXPECT_TRUE(!s64.sle(int64min));
344 EXPECT_TRUE(!s64.slt(int64min));
345
346 EXPECT_TRUE(s64 != uint64max);
347 EXPECT_TRUE(s64 == int64max);
348 EXPECT_TRUE(s64 != int64min);
349
350 EXPECT_TRUE( big.uge(uint64max));
351 EXPECT_TRUE( big.ugt(uint64max));
352 EXPECT_TRUE(!big.ule(uint64max));
353 EXPECT_TRUE(!big.ult(uint64max));
354 EXPECT_TRUE( big.sge(int64max));
355 EXPECT_TRUE( big.sgt(int64max));
356 EXPECT_TRUE(!big.sle(int64max));
357 EXPECT_TRUE(!big.slt(int64max));
358 EXPECT_TRUE( big.sge(int64min));
359 EXPECT_TRUE( big.sgt(int64min));
360 EXPECT_TRUE(!big.sle(int64min));
361 EXPECT_TRUE(!big.slt(int64min));
362
363 EXPECT_TRUE(big != uint64max);
364 EXPECT_TRUE(big != int64max);
365 EXPECT_TRUE(big != int64min);
366}
367
368TEST(APIntTest, compareWithInt64Min) {
369 int64_t edge = INT64_MIN;
370 int64_t edgeP1 = edge + 1;
371 int64_t edgeM1 = INT64_MAX;
372 auto a = APInt{64, static_cast<uint64_t>(edge), true};
373
374 EXPECT_TRUE(!a.slt(edge));
375 EXPECT_TRUE( a.sle(edge));
376 EXPECT_TRUE(!a.sgt(edge));
377 EXPECT_TRUE( a.sge(edge));
378 EXPECT_TRUE( a.slt(edgeP1));
379 EXPECT_TRUE( a.sle(edgeP1));
380 EXPECT_TRUE(!a.sgt(edgeP1));
381 EXPECT_TRUE(!a.sge(edgeP1));
382 EXPECT_TRUE( a.slt(edgeM1));
383 EXPECT_TRUE( a.sle(edgeM1));
384 EXPECT_TRUE(!a.sgt(edgeM1));
385 EXPECT_TRUE(!a.sge(edgeM1));
386}
387
388TEST(APIntTest, compareWithHalfInt64Max) {
389 uint64_t edge = 0x4000000000000000;
390 uint64_t edgeP1 = edge + 1;
391 uint64_t edgeM1 = edge - 1;
392 auto a = APInt{64, edge};
393
394 EXPECT_TRUE(!a.ult(edge));
395 EXPECT_TRUE( a.ule(edge));
396 EXPECT_TRUE(!a.ugt(edge));
397 EXPECT_TRUE( a.uge(edge));
398 EXPECT_TRUE( a.ult(edgeP1));
399 EXPECT_TRUE( a.ule(edgeP1));
400 EXPECT_TRUE(!a.ugt(edgeP1));
401 EXPECT_TRUE(!a.uge(edgeP1));
402 EXPECT_TRUE(!a.ult(edgeM1));
403 EXPECT_TRUE(!a.ule(edgeM1));
404 EXPECT_TRUE( a.ugt(edgeM1));
405 EXPECT_TRUE( a.uge(edgeM1));
406
407 EXPECT_TRUE(!a.slt(edge));
408 EXPECT_TRUE( a.sle(edge));
409 EXPECT_TRUE(!a.sgt(edge));
410 EXPECT_TRUE( a.sge(edge));
411 EXPECT_TRUE( a.slt(edgeP1));
412 EXPECT_TRUE( a.sle(edgeP1));
413 EXPECT_TRUE(!a.sgt(edgeP1));
414 EXPECT_TRUE(!a.sge(edgeP1));
415 EXPECT_TRUE(!a.slt(edgeM1));
416 EXPECT_TRUE(!a.sle(edgeM1));
417 EXPECT_TRUE( a.sgt(edgeM1));
418 EXPECT_TRUE( a.sge(edgeM1));
419}
420
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000421TEST(APIntTest, compareLargeIntegers) {
422 // Make sure all the combinations of signed comparisons work with big ints.
423 auto One = APInt{128, static_cast<uint64_t>(1), true};
424 auto Two = APInt{128, static_cast<uint64_t>(2), true};
425 auto MinusOne = APInt{128, static_cast<uint64_t>(-1), true};
426 auto MinusTwo = APInt{128, static_cast<uint64_t>(-2), true};
427
428 EXPECT_TRUE(!One.slt(One));
429 EXPECT_TRUE(!Two.slt(One));
430 EXPECT_TRUE(MinusOne.slt(One));
431 EXPECT_TRUE(MinusTwo.slt(One));
432
433 EXPECT_TRUE(One.slt(Two));
434 EXPECT_TRUE(!Two.slt(Two));
435 EXPECT_TRUE(MinusOne.slt(Two));
436 EXPECT_TRUE(MinusTwo.slt(Two));
437
438 EXPECT_TRUE(!One.slt(MinusOne));
439 EXPECT_TRUE(!Two.slt(MinusOne));
440 EXPECT_TRUE(!MinusOne.slt(MinusOne));
441 EXPECT_TRUE(MinusTwo.slt(MinusOne));
442
443 EXPECT_TRUE(!One.slt(MinusTwo));
444 EXPECT_TRUE(!Two.slt(MinusTwo));
445 EXPECT_TRUE(!MinusOne.slt(MinusTwo));
446 EXPECT_TRUE(!MinusTwo.slt(MinusTwo));
447}
448
Amaury Sechetfb1756b2017-02-03 22:54:41 +0000449TEST(APIntTest, binaryOpsWithRawIntegers) {
450 // Single word check.
451 uint64_t E1 = 0x2CA7F46BF6569915ULL;
452 APInt A1(64, E1);
453
454 EXPECT_EQ(A1 & E1, E1);
455 EXPECT_EQ(A1 & 0, 0);
456 EXPECT_EQ(A1 & 1, 1);
457 EXPECT_EQ(A1 & 5, 5);
458 EXPECT_EQ(A1 & UINT64_MAX, E1);
459
460 EXPECT_EQ(A1 | E1, E1);
461 EXPECT_EQ(A1 | 0, E1);
462 EXPECT_EQ(A1 | 1, E1);
463 EXPECT_EQ(A1 | 2, E1 | 2);
464 EXPECT_EQ(A1 | UINT64_MAX, UINT64_MAX);
465
466 EXPECT_EQ(A1 ^ E1, 0);
467 EXPECT_EQ(A1 ^ 0, E1);
468 EXPECT_EQ(A1 ^ 1, E1 ^ 1);
469 EXPECT_EQ(A1 ^ 7, E1 ^ 7);
470 EXPECT_EQ(A1 ^ UINT64_MAX, ~E1);
471
472 // Multiword check.
473 uint64_t N = 0xEB6EB136591CBA21ULL;
474 integerPart E2[4] = {
475 N,
476 0x7B9358BD6A33F10AULL,
477 0x7E7FFA5EADD8846ULL,
478 0x305F341CA00B613DULL
479 };
480 APInt A2(integerPartWidth*4, E2);
481
482 EXPECT_EQ(A2 & N, N);
483 EXPECT_EQ(A2 & 0, 0);
484 EXPECT_EQ(A2 & 1, 1);
485 EXPECT_EQ(A2 & 5, 1);
486 EXPECT_EQ(A2 & UINT64_MAX, N);
487
488 EXPECT_EQ(A2 | N, A2);
489 EXPECT_EQ(A2 | 0, A2);
490 EXPECT_EQ(A2 | 1, A2);
491 EXPECT_EQ(A2 | 2, A2 + 2);
492 EXPECT_EQ(A2 | UINT64_MAX, A2 - N + UINT64_MAX);
493
494 EXPECT_EQ(A2 ^ N, A2 - N);
495 EXPECT_EQ(A2 ^ 0, A2);
496 EXPECT_EQ(A2 ^ 1, A2 - 1);
497 EXPECT_EQ(A2 ^ 7, A2 + 5);
498 EXPECT_EQ(A2 ^ UINT64_MAX, A2 - N + ~N);
499}
500
Pete Cooperfea21392016-07-22 20:55:46 +0000501TEST(APIntTest, rvalue_arithmetic) {
502 // Test all combinations of lvalue/rvalue lhs/rhs of add/sub
503
504 // Lamdba to return an APInt by value, but also provide the raw value of the
505 // allocated data.
506 auto getRValue = [](const char *HexString, uint64_t const *&RawData) {
507 APInt V(129, HexString, 16);
508 RawData = V.getRawData();
509 return V;
510 };
511
512 APInt One(129, "1", 16);
513 APInt Two(129, "2", 16);
514 APInt Three(129, "3", 16);
515 APInt MinusOne = -One;
516
517 const uint64_t *RawDataL = nullptr;
518 const uint64_t *RawDataR = nullptr;
519
520 {
521 // 1 + 1 = 2
522 APInt AddLL = One + One;
523 EXPECT_EQ(AddLL, Two);
524
525 APInt AddLR = One + getRValue("1", RawDataR);
526 EXPECT_EQ(AddLR, Two);
527 EXPECT_EQ(AddLR.getRawData(), RawDataR);
528
529 APInt AddRL = getRValue("1", RawDataL) + One;
530 EXPECT_EQ(AddRL, Two);
531 EXPECT_EQ(AddRL.getRawData(), RawDataL);
532
533 APInt AddRR = getRValue("1", RawDataL) + getRValue("1", RawDataR);
534 EXPECT_EQ(AddRR, Two);
535 EXPECT_EQ(AddRR.getRawData(), RawDataR);
536
537 // LValue's and constants
538 APInt AddLK = One + 1;
539 EXPECT_EQ(AddLK, Two);
540
541 APInt AddKL = 1 + One;
542 EXPECT_EQ(AddKL, Two);
543
544 // RValue's and constants
545 APInt AddRK = getRValue("1", RawDataL) + 1;
546 EXPECT_EQ(AddRK, Two);
547 EXPECT_EQ(AddRK.getRawData(), RawDataL);
548
549 APInt AddKR = 1 + getRValue("1", RawDataR);
550 EXPECT_EQ(AddKR, Two);
551 EXPECT_EQ(AddKR.getRawData(), RawDataR);
552 }
553
554 {
555 // 0x0,FFFF...FFFF + 0x2 = 0x100...0001
556 APInt AllOnes(129, "0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 16);
557 APInt HighOneLowOne(129, "100000000000000000000000000000001", 16);
558
559 APInt AddLL = AllOnes + Two;
560 EXPECT_EQ(AddLL, HighOneLowOne);
561
562 APInt AddLR = AllOnes + getRValue("2", RawDataR);
563 EXPECT_EQ(AddLR, HighOneLowOne);
564 EXPECT_EQ(AddLR.getRawData(), RawDataR);
565
566 APInt AddRL = getRValue("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", RawDataL) + Two;
567 EXPECT_EQ(AddRL, HighOneLowOne);
568 EXPECT_EQ(AddRL.getRawData(), RawDataL);
569
570 APInt AddRR = getRValue("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", RawDataL) +
571 getRValue("2", RawDataR);
572 EXPECT_EQ(AddRR, HighOneLowOne);
573 EXPECT_EQ(AddRR.getRawData(), RawDataR);
574
575 // LValue's and constants
576 APInt AddLK = AllOnes + 2;
577 EXPECT_EQ(AddLK, HighOneLowOne);
578
579 APInt AddKL = 2 + AllOnes;
580 EXPECT_EQ(AddKL, HighOneLowOne);
581
582 // RValue's and constants
583 APInt AddRK = getRValue("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", RawDataL) + 2;
584 EXPECT_EQ(AddRK, HighOneLowOne);
585 EXPECT_EQ(AddRK.getRawData(), RawDataL);
586
587 APInt AddKR = 2 + getRValue("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", RawDataR);
588 EXPECT_EQ(AddKR, HighOneLowOne);
589 EXPECT_EQ(AddKR.getRawData(), RawDataR);
590 }
591
592 {
593 // 2 - 1 = 1
594 APInt SubLL = Two - One;
595 EXPECT_EQ(SubLL, One);
596
597 APInt SubLR = Two - getRValue("1", RawDataR);
598 EXPECT_EQ(SubLR, One);
599 EXPECT_EQ(SubLR.getRawData(), RawDataR);
600
601 APInt SubRL = getRValue("2", RawDataL) - One;
602 EXPECT_EQ(SubRL, One);
603 EXPECT_EQ(SubRL.getRawData(), RawDataL);
604
605 APInt SubRR = getRValue("2", RawDataL) - getRValue("1", RawDataR);
606 EXPECT_EQ(SubRR, One);
607 EXPECT_EQ(SubRR.getRawData(), RawDataR);
608
609 // LValue's and constants
610 APInt SubLK = Two - 1;
611 EXPECT_EQ(SubLK, One);
612
613 APInt SubKL = 2 - One;
614 EXPECT_EQ(SubKL, One);
615
616 // RValue's and constants
617 APInt SubRK = getRValue("2", RawDataL) - 1;
618 EXPECT_EQ(SubRK, One);
619 EXPECT_EQ(SubRK.getRawData(), RawDataL);
620
621 APInt SubKR = 2 - getRValue("1", RawDataR);
622 EXPECT_EQ(SubKR, One);
623 EXPECT_EQ(SubKR.getRawData(), RawDataR);
624 }
625
626 {
627 // 0x100...0001 - 0x0,FFFF...FFFF = 0x2
628 APInt AllOnes(129, "0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 16);
629 APInt HighOneLowOne(129, "100000000000000000000000000000001", 16);
630
631 APInt SubLL = HighOneLowOne - AllOnes;
632 EXPECT_EQ(SubLL, Two);
633
634 APInt SubLR = HighOneLowOne -
635 getRValue("0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", RawDataR);
636 EXPECT_EQ(SubLR, Two);
637 EXPECT_EQ(SubLR.getRawData(), RawDataR);
638
639 APInt SubRL = getRValue("100000000000000000000000000000001", RawDataL) -
640 AllOnes;
641 EXPECT_EQ(SubRL, Two);
642 EXPECT_EQ(SubRL.getRawData(), RawDataL);
643
644 APInt SubRR = getRValue("100000000000000000000000000000001", RawDataL) -
645 getRValue("0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", RawDataR);
646 EXPECT_EQ(SubRR, Two);
647 EXPECT_EQ(SubRR.getRawData(), RawDataR);
648
649 // LValue's and constants
650 // 0x100...0001 - 0x2 = 0x0,FFFF...FFFF
651 APInt SubLK = HighOneLowOne - 2;
652 EXPECT_EQ(SubLK, AllOnes);
653
654 // 2 - (-1) = 3
655 APInt SubKL = 2 - MinusOne;
656 EXPECT_EQ(SubKL, Three);
657
658 // RValue's and constants
659 // 0x100...0001 - 0x2 = 0x0,FFFF...FFFF
660 APInt SubRK = getRValue("100000000000000000000000000000001", RawDataL) - 2;
661 EXPECT_EQ(SubRK, AllOnes);
662 EXPECT_EQ(SubRK.getRawData(), RawDataL);
663
664 APInt SubKR = 2 - getRValue("1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", RawDataR);
665 EXPECT_EQ(SubKR, Three);
666 EXPECT_EQ(SubKR.getRawData(), RawDataR);
667 }
668}
669
Pawel Bylica86ac4472015-04-24 07:38:39 +0000670
671// Tests different div/rem varaints using scheme (a * b + c) / a
672void testDiv(APInt a, APInt b, APInt c) {
673 ASSERT_TRUE(a.uge(b)); // Must: a >= b
674 ASSERT_TRUE(a.ugt(c)); // Must: a > c
Yaron Keren39fc5a62015-03-26 19:45:19 +0000675
676 auto p = a * b + c;
Pawel Bylica86ac4472015-04-24 07:38:39 +0000677
Yaron Keren39fc5a62015-03-26 19:45:19 +0000678 auto q = p.udiv(a);
679 auto r = p.urem(a);
Pawel Bylica86ac4472015-04-24 07:38:39 +0000680 EXPECT_EQ(b, q);
681 EXPECT_EQ(c, r);
Yaron Keren39fc5a62015-03-26 19:45:19 +0000682 APInt::udivrem(p, a, q, r);
Pawel Bylica86ac4472015-04-24 07:38:39 +0000683 EXPECT_EQ(b, q);
684 EXPECT_EQ(c, r);
Yaron Keren39fc5a62015-03-26 19:45:19 +0000685 q = p.sdiv(a);
686 r = p.srem(a);
Pawel Bylica86ac4472015-04-24 07:38:39 +0000687 EXPECT_EQ(b, q);
688 EXPECT_EQ(c, r);
Yaron Keren39fc5a62015-03-26 19:45:19 +0000689 APInt::sdivrem(p, a, q, r);
Pawel Bylica86ac4472015-04-24 07:38:39 +0000690 EXPECT_EQ(b, q);
691 EXPECT_EQ(c, r);
692
693 if (b.ugt(c)) { // Test also symmetric case
694 q = p.udiv(b);
695 r = p.urem(b);
696 EXPECT_EQ(a, q);
697 EXPECT_EQ(c, r);
698 APInt::udivrem(p, b, q, r);
699 EXPECT_EQ(a, q);
700 EXPECT_EQ(c, r);
701 q = p.sdiv(b);
702 r = p.srem(b);
703 EXPECT_EQ(a, q);
704 EXPECT_EQ(c, r);
705 APInt::sdivrem(p, b, q, r);
706 EXPECT_EQ(a, q);
707 EXPECT_EQ(c, r);
708 }
709}
710
711TEST(APIntTest, divrem_big1) {
712 // Tests KnuthDiv rare step D6
713 testDiv({256, "1ffffffffffffffff", 16},
714 {256, "1ffffffffffffffff", 16},
715 {256, 0});
Yaron Keren39fc5a62015-03-26 19:45:19 +0000716}
717
718TEST(APIntTest, divrem_big2) {
719 // Tests KnuthDiv rare step D6
Pawel Bylica86ac4472015-04-24 07:38:39 +0000720 testDiv({1024, "112233ceff"
721 "cecece000000ffffffffffffffffffff"
722 "ffffffffffffffffffffffffffffffff"
723 "ffffffffffffffffffffffffffffffff"
724 "ffffffffffffffffffffffffffffff33", 16},
725 {1024, "111111ffffffffffffffff"
726 "ffffffffffffffffffffffffffffffff"
727 "fffffffffffffffffffffffffffffccf"
728 "ffffffffffffffffffffffffffffff00", 16},
729 {1024, 7919});
Yaron Keren39fc5a62015-03-26 19:45:19 +0000730}
731
732TEST(APIntTest, divrem_big3) {
733 // Tests KnuthDiv case without shift
Pawel Bylica86ac4472015-04-24 07:38:39 +0000734 testDiv({256, "80000001ffffffffffffffff", 16},
735 {256, "ffffffffffffff0000000", 16},
736 {256, 4219});
Yaron Keren39fc5a62015-03-26 19:45:19 +0000737}
738
739TEST(APIntTest, divrem_big4) {
740 // Tests heap allocation in divide() enfoced by huge numbers
Pawel Bylica86ac4472015-04-24 07:38:39 +0000741 testDiv(APInt{4096, 5}.shl(2001),
742 APInt{4096, 1}.shl(2000),
743 APInt{4096, 4219*13});
Yaron Keren39fc5a62015-03-26 19:45:19 +0000744}
745
746TEST(APIntTest, divrem_big5) {
747 // Tests one word divisor case of divide()
Pawel Bylica86ac4472015-04-24 07:38:39 +0000748 testDiv(APInt{1024, 19}.shl(811),
749 APInt{1024, 4356013}, // one word
750 APInt{1024, 1});
751}
Yaron Keren39fc5a62015-03-26 19:45:19 +0000752
Pawel Bylica86ac4472015-04-24 07:38:39 +0000753TEST(APIntTest, divrem_big6) {
754 // Tests some rare "borrow" cases in D4 step
755 testDiv(APInt{512, "ffffffffffffffff00000000000000000000000001", 16},
756 APInt{512, "10000000000000001000000000000001", 16},
757 APInt{512, "10000000000000000000000000000000", 16});
Yaron Keren39fc5a62015-03-26 19:45:19 +0000758}
759
Yaron Keren61ad9d82015-04-22 18:49:59 +0000760TEST(APIntTest, divrem_big7) {
761 // Yet another test for KnuthDiv rare step D6.
Pawel Bylica86ac4472015-04-24 07:38:39 +0000762 testDiv({224, "800000008000000200000005", 16},
763 {224, "fffffffd", 16},
764 {224, "80000000800000010000000f", 16});
Yaron Keren61ad9d82015-04-22 18:49:59 +0000765}
766
Chris Lattnerb869a0a2009-04-25 18:34:04 +0000767TEST(APIntTest, fromString) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000768 EXPECT_EQ(APInt(32, 0), APInt(32, "0", 2));
769 EXPECT_EQ(APInt(32, 1), APInt(32, "1", 2));
770 EXPECT_EQ(APInt(32, 2), APInt(32, "10", 2));
771 EXPECT_EQ(APInt(32, 3), APInt(32, "11", 2));
772 EXPECT_EQ(APInt(32, 4), APInt(32, "100", 2));
773
774 EXPECT_EQ(APInt(32, 0), APInt(32, "+0", 2));
775 EXPECT_EQ(APInt(32, 1), APInt(32, "+1", 2));
776 EXPECT_EQ(APInt(32, 2), APInt(32, "+10", 2));
777 EXPECT_EQ(APInt(32, 3), APInt(32, "+11", 2));
778 EXPECT_EQ(APInt(32, 4), APInt(32, "+100", 2));
779
Daniel Dunbar73e76a12009-09-18 17:48:05 +0000780 EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 2));
781 EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 2));
782 EXPECT_EQ(APInt(32, uint64_t(-2LL)), APInt(32, "-10", 2));
783 EXPECT_EQ(APInt(32, uint64_t(-3LL)), APInt(32, "-11", 2));
784 EXPECT_EQ(APInt(32, uint64_t(-4LL)), APInt(32, "-100", 2));
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000785
786
787 EXPECT_EQ(APInt(32, 0), APInt(32, "0", 8));
788 EXPECT_EQ(APInt(32, 1), APInt(32, "1", 8));
789 EXPECT_EQ(APInt(32, 7), APInt(32, "7", 8));
790 EXPECT_EQ(APInt(32, 8), APInt(32, "10", 8));
791 EXPECT_EQ(APInt(32, 15), APInt(32, "17", 8));
792 EXPECT_EQ(APInt(32, 16), APInt(32, "20", 8));
793
794 EXPECT_EQ(APInt(32, +0), APInt(32, "+0", 8));
795 EXPECT_EQ(APInt(32, +1), APInt(32, "+1", 8));
796 EXPECT_EQ(APInt(32, +7), APInt(32, "+7", 8));
797 EXPECT_EQ(APInt(32, +8), APInt(32, "+10", 8));
798 EXPECT_EQ(APInt(32, +15), APInt(32, "+17", 8));
799 EXPECT_EQ(APInt(32, +16), APInt(32, "+20", 8));
800
Daniel Dunbar0ec4ed72009-09-17 17:46:53 +0000801 EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 8));
802 EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 8));
803 EXPECT_EQ(APInt(32, uint64_t(-7LL)), APInt(32, "-7", 8));
804 EXPECT_EQ(APInt(32, uint64_t(-8LL)), APInt(32, "-10", 8));
805 EXPECT_EQ(APInt(32, uint64_t(-15LL)), APInt(32, "-17", 8));
806 EXPECT_EQ(APInt(32, uint64_t(-16LL)), APInt(32, "-20", 8));
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000807
808
809 EXPECT_EQ(APInt(32, 0), APInt(32, "0", 10));
810 EXPECT_EQ(APInt(32, 1), APInt(32, "1", 10));
811 EXPECT_EQ(APInt(32, 9), APInt(32, "9", 10));
812 EXPECT_EQ(APInt(32, 10), APInt(32, "10", 10));
813 EXPECT_EQ(APInt(32, 19), APInt(32, "19", 10));
814 EXPECT_EQ(APInt(32, 20), APInt(32, "20", 10));
815
Daniel Dunbar0ec4ed72009-09-17 17:46:53 +0000816 EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 10));
817 EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 10));
818 EXPECT_EQ(APInt(32, uint64_t(-9LL)), APInt(32, "-9", 10));
819 EXPECT_EQ(APInt(32, uint64_t(-10LL)), APInt(32, "-10", 10));
820 EXPECT_EQ(APInt(32, uint64_t(-19LL)), APInt(32, "-19", 10));
821 EXPECT_EQ(APInt(32, uint64_t(-20LL)), APInt(32, "-20", 10));
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000822
823
824 EXPECT_EQ(APInt(32, 0), APInt(32, "0", 16));
825 EXPECT_EQ(APInt(32, 1), APInt(32, "1", 16));
826 EXPECT_EQ(APInt(32, 15), APInt(32, "F", 16));
827 EXPECT_EQ(APInt(32, 16), APInt(32, "10", 16));
828 EXPECT_EQ(APInt(32, 31), APInt(32, "1F", 16));
829 EXPECT_EQ(APInt(32, 32), APInt(32, "20", 16));
830
Daniel Dunbar0ec4ed72009-09-17 17:46:53 +0000831 EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 16));
832 EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 16));
833 EXPECT_EQ(APInt(32, uint64_t(-15LL)), APInt(32, "-F", 16));
834 EXPECT_EQ(APInt(32, uint64_t(-16LL)), APInt(32, "-10", 16));
835 EXPECT_EQ(APInt(32, uint64_t(-31LL)), APInt(32, "-1F", 16));
836 EXPECT_EQ(APInt(32, uint64_t(-32LL)), APInt(32, "-20", 16));
Douglas Gregor663c0682011-09-14 15:54:46 +0000837
838 EXPECT_EQ(APInt(32, 0), APInt(32, "0", 36));
839 EXPECT_EQ(APInt(32, 1), APInt(32, "1", 36));
840 EXPECT_EQ(APInt(32, 35), APInt(32, "Z", 36));
841 EXPECT_EQ(APInt(32, 36), APInt(32, "10", 36));
842 EXPECT_EQ(APInt(32, 71), APInt(32, "1Z", 36));
843 EXPECT_EQ(APInt(32, 72), APInt(32, "20", 36));
844
845 EXPECT_EQ(APInt(32, uint64_t(-0LL)), APInt(32, "-0", 36));
846 EXPECT_EQ(APInt(32, uint64_t(-1LL)), APInt(32, "-1", 36));
847 EXPECT_EQ(APInt(32, uint64_t(-35LL)), APInt(32, "-Z", 36));
848 EXPECT_EQ(APInt(32, uint64_t(-36LL)), APInt(32, "-10", 36));
849 EXPECT_EQ(APInt(32, uint64_t(-71LL)), APInt(32, "-1Z", 36));
850 EXPECT_EQ(APInt(32, uint64_t(-72LL)), APInt(32, "-20", 36));
Chris Lattnerb869a0a2009-04-25 18:34:04 +0000851}
852
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000853TEST(APIntTest, FromArray) {
854 EXPECT_EQ(APInt(32, uint64_t(1)), APInt(32, ArrayRef<uint64_t>(1)));
855}
856
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000857TEST(APIntTest, StringBitsNeeded2) {
858 EXPECT_EQ(1U, APInt::getBitsNeeded( "0", 2));
859 EXPECT_EQ(1U, APInt::getBitsNeeded( "1", 2));
860 EXPECT_EQ(2U, APInt::getBitsNeeded( "10", 2));
861 EXPECT_EQ(2U, APInt::getBitsNeeded( "11", 2));
862 EXPECT_EQ(3U, APInt::getBitsNeeded("100", 2));
863
864 EXPECT_EQ(1U, APInt::getBitsNeeded( "+0", 2));
865 EXPECT_EQ(1U, APInt::getBitsNeeded( "+1", 2));
866 EXPECT_EQ(2U, APInt::getBitsNeeded( "+10", 2));
867 EXPECT_EQ(2U, APInt::getBitsNeeded( "+11", 2));
868 EXPECT_EQ(3U, APInt::getBitsNeeded("+100", 2));
869
870 EXPECT_EQ(2U, APInt::getBitsNeeded( "-0", 2));
871 EXPECT_EQ(2U, APInt::getBitsNeeded( "-1", 2));
872 EXPECT_EQ(3U, APInt::getBitsNeeded( "-10", 2));
873 EXPECT_EQ(3U, APInt::getBitsNeeded( "-11", 2));
874 EXPECT_EQ(4U, APInt::getBitsNeeded("-100", 2));
875}
876
877TEST(APIntTest, StringBitsNeeded8) {
878 EXPECT_EQ(3U, APInt::getBitsNeeded( "0", 8));
879 EXPECT_EQ(3U, APInt::getBitsNeeded( "7", 8));
880 EXPECT_EQ(6U, APInt::getBitsNeeded("10", 8));
881 EXPECT_EQ(6U, APInt::getBitsNeeded("17", 8));
882 EXPECT_EQ(6U, APInt::getBitsNeeded("20", 8));
883
884 EXPECT_EQ(3U, APInt::getBitsNeeded( "+0", 8));
885 EXPECT_EQ(3U, APInt::getBitsNeeded( "+7", 8));
886 EXPECT_EQ(6U, APInt::getBitsNeeded("+10", 8));
887 EXPECT_EQ(6U, APInt::getBitsNeeded("+17", 8));
888 EXPECT_EQ(6U, APInt::getBitsNeeded("+20", 8));
889
890 EXPECT_EQ(4U, APInt::getBitsNeeded( "-0", 8));
891 EXPECT_EQ(4U, APInt::getBitsNeeded( "-7", 8));
892 EXPECT_EQ(7U, APInt::getBitsNeeded("-10", 8));
893 EXPECT_EQ(7U, APInt::getBitsNeeded("-17", 8));
894 EXPECT_EQ(7U, APInt::getBitsNeeded("-20", 8));
895}
896
897TEST(APIntTest, StringBitsNeeded10) {
898 EXPECT_EQ(1U, APInt::getBitsNeeded( "0", 10));
899 EXPECT_EQ(2U, APInt::getBitsNeeded( "3", 10));
900 EXPECT_EQ(4U, APInt::getBitsNeeded( "9", 10));
901 EXPECT_EQ(4U, APInt::getBitsNeeded("10", 10));
902 EXPECT_EQ(5U, APInt::getBitsNeeded("19", 10));
903 EXPECT_EQ(5U, APInt::getBitsNeeded("20", 10));
904
905 EXPECT_EQ(1U, APInt::getBitsNeeded( "+0", 10));
906 EXPECT_EQ(4U, APInt::getBitsNeeded( "+9", 10));
907 EXPECT_EQ(4U, APInt::getBitsNeeded("+10", 10));
908 EXPECT_EQ(5U, APInt::getBitsNeeded("+19", 10));
909 EXPECT_EQ(5U, APInt::getBitsNeeded("+20", 10));
910
911 EXPECT_EQ(2U, APInt::getBitsNeeded( "-0", 10));
912 EXPECT_EQ(5U, APInt::getBitsNeeded( "-9", 10));
913 EXPECT_EQ(5U, APInt::getBitsNeeded("-10", 10));
914 EXPECT_EQ(6U, APInt::getBitsNeeded("-19", 10));
915 EXPECT_EQ(6U, APInt::getBitsNeeded("-20", 10));
916}
917
918TEST(APIntTest, StringBitsNeeded16) {
919 EXPECT_EQ(4U, APInt::getBitsNeeded( "0", 16));
920 EXPECT_EQ(4U, APInt::getBitsNeeded( "F", 16));
921 EXPECT_EQ(8U, APInt::getBitsNeeded("10", 16));
922 EXPECT_EQ(8U, APInt::getBitsNeeded("1F", 16));
923 EXPECT_EQ(8U, APInt::getBitsNeeded("20", 16));
924
925 EXPECT_EQ(4U, APInt::getBitsNeeded( "+0", 16));
926 EXPECT_EQ(4U, APInt::getBitsNeeded( "+F", 16));
927 EXPECT_EQ(8U, APInt::getBitsNeeded("+10", 16));
928 EXPECT_EQ(8U, APInt::getBitsNeeded("+1F", 16));
929 EXPECT_EQ(8U, APInt::getBitsNeeded("+20", 16));
930
931 EXPECT_EQ(5U, APInt::getBitsNeeded( "-0", 16));
932 EXPECT_EQ(5U, APInt::getBitsNeeded( "-F", 16));
933 EXPECT_EQ(9U, APInt::getBitsNeeded("-10", 16));
934 EXPECT_EQ(9U, APInt::getBitsNeeded("-1F", 16));
935 EXPECT_EQ(9U, APInt::getBitsNeeded("-20", 16));
936}
937
Dylan Noblesmithc8c184d2011-06-15 23:36:34 +0000938TEST(APIntTest, toString) {
939 SmallString<16> S;
940 bool isSigned;
941
942 APInt(8, 0).toString(S, 2, true, true);
943 EXPECT_EQ(S.str().str(), "0b0");
944 S.clear();
945 APInt(8, 0).toString(S, 8, true, true);
946 EXPECT_EQ(S.str().str(), "00");
947 S.clear();
948 APInt(8, 0).toString(S, 10, true, true);
949 EXPECT_EQ(S.str().str(), "0");
950 S.clear();
951 APInt(8, 0).toString(S, 16, true, true);
952 EXPECT_EQ(S.str().str(), "0x0");
953 S.clear();
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +0000954 APInt(8, 0).toString(S, 36, true, false);
Douglas Gregor663c0682011-09-14 15:54:46 +0000955 EXPECT_EQ(S.str().str(), "0");
956 S.clear();
Dylan Noblesmithc8c184d2011-06-15 23:36:34 +0000957
958 isSigned = false;
959 APInt(8, 255, isSigned).toString(S, 2, isSigned, true);
960 EXPECT_EQ(S.str().str(), "0b11111111");
961 S.clear();
962 APInt(8, 255, isSigned).toString(S, 8, isSigned, true);
963 EXPECT_EQ(S.str().str(), "0377");
964 S.clear();
965 APInt(8, 255, isSigned).toString(S, 10, isSigned, true);
966 EXPECT_EQ(S.str().str(), "255");
967 S.clear();
968 APInt(8, 255, isSigned).toString(S, 16, isSigned, true);
969 EXPECT_EQ(S.str().str(), "0xFF");
970 S.clear();
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +0000971 APInt(8, 255, isSigned).toString(S, 36, isSigned, false);
Douglas Gregor663c0682011-09-14 15:54:46 +0000972 EXPECT_EQ(S.str().str(), "73");
973 S.clear();
Dylan Noblesmithc8c184d2011-06-15 23:36:34 +0000974
975 isSigned = true;
976 APInt(8, 255, isSigned).toString(S, 2, isSigned, true);
977 EXPECT_EQ(S.str().str(), "-0b1");
978 S.clear();
979 APInt(8, 255, isSigned).toString(S, 8, isSigned, true);
980 EXPECT_EQ(S.str().str(), "-01");
981 S.clear();
982 APInt(8, 255, isSigned).toString(S, 10, isSigned, true);
983 EXPECT_EQ(S.str().str(), "-1");
984 S.clear();
985 APInt(8, 255, isSigned).toString(S, 16, isSigned, true);
986 EXPECT_EQ(S.str().str(), "-0x1");
987 S.clear();
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +0000988 APInt(8, 255, isSigned).toString(S, 36, isSigned, false);
Douglas Gregor663c0682011-09-14 15:54:46 +0000989 EXPECT_EQ(S.str().str(), "-1");
990 S.clear();
Dylan Noblesmithc8c184d2011-06-15 23:36:34 +0000991}
992
Dan Gohmanc4e367b2009-10-13 01:49:02 +0000993TEST(APIntTest, Log2) {
Duncan Sandsf7ad6202009-10-13 09:23:11 +0000994 EXPECT_EQ(APInt(15, 7).logBase2(), 2U);
995 EXPECT_EQ(APInt(15, 7).ceilLogBase2(), 3U);
Dan Gohmanc4e367b2009-10-13 01:49:02 +0000996 EXPECT_EQ(APInt(15, 7).exactLogBase2(), -1);
Duncan Sandsf7ad6202009-10-13 09:23:11 +0000997 EXPECT_EQ(APInt(15, 8).logBase2(), 3U);
998 EXPECT_EQ(APInt(15, 8).ceilLogBase2(), 3U);
Dan Gohmanc4e367b2009-10-13 01:49:02 +0000999 EXPECT_EQ(APInt(15, 8).exactLogBase2(), 3);
Duncan Sandsf7ad6202009-10-13 09:23:11 +00001000 EXPECT_EQ(APInt(15, 9).logBase2(), 3U);
1001 EXPECT_EQ(APInt(15, 9).ceilLogBase2(), 4U);
Dan Gohmanc4e367b2009-10-13 01:49:02 +00001002 EXPECT_EQ(APInt(15, 9).exactLogBase2(), -1);
1003}
Erick Tryzelaardadb15712009-08-21 03:15:28 +00001004
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001005TEST(APIntTest, magic) {
1006 EXPECT_EQ(APInt(32, 3).magic().m, APInt(32, "55555556", 16));
1007 EXPECT_EQ(APInt(32, 3).magic().s, 0U);
1008 EXPECT_EQ(APInt(32, 5).magic().m, APInt(32, "66666667", 16));
1009 EXPECT_EQ(APInt(32, 5).magic().s, 1U);
1010 EXPECT_EQ(APInt(32, 7).magic().m, APInt(32, "92492493", 16));
1011 EXPECT_EQ(APInt(32, 7).magic().s, 2U);
1012}
1013
1014TEST(APIntTest, magicu) {
1015 EXPECT_EQ(APInt(32, 3).magicu().m, APInt(32, "AAAAAAAB", 16));
1016 EXPECT_EQ(APInt(32, 3).magicu().s, 1U);
1017 EXPECT_EQ(APInt(32, 5).magicu().m, APInt(32, "CCCCCCCD", 16));
1018 EXPECT_EQ(APInt(32, 5).magicu().s, 2U);
1019 EXPECT_EQ(APInt(32, 7).magicu().m, APInt(32, "24924925", 16));
1020 EXPECT_EQ(APInt(32, 7).magicu().s, 3U);
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001021 EXPECT_EQ(APInt(64, 25).magicu(1).m, APInt(64, "A3D70A3D70A3D70B", 16));
1022 EXPECT_EQ(APInt(64, 25).magicu(1).s, 4U);
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001023}
1024
Erick Tryzelaar927191f2009-08-17 00:55:33 +00001025#ifdef GTEST_HAS_DEATH_TEST
Jeffrey Yasskinb5cd0132010-03-17 01:18:45 +00001026#ifndef NDEBUG
Erick Tryzelaar2b01eab2009-08-16 23:36:01 +00001027TEST(APIntTest, StringDeath) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00001028 EXPECT_DEATH(APInt(0, "", 0), "Bitwidth too small");
1029 EXPECT_DEATH(APInt(32, "", 0), "Invalid string length");
Douglas Gregor663c0682011-09-14 15:54:46 +00001030 EXPECT_DEATH(APInt(32, "0", 0), "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar2b01eab2009-08-16 23:36:01 +00001031 EXPECT_DEATH(APInt(32, "", 10), "Invalid string length");
Bill Wendlingef793cc2009-08-21 06:35:41 +00001032 EXPECT_DEATH(APInt(32, "-", 10), "String is only a sign, needs a value.");
Erick Tryzelaar2b01eab2009-08-16 23:36:01 +00001033 EXPECT_DEATH(APInt(1, "1234", 10), "Insufficient bit width");
1034 EXPECT_DEATH(APInt(32, "\0", 10), "Invalid string length");
1035 EXPECT_DEATH(APInt(32, StringRef("1\02", 3), 10), "Invalid character in digit string");
1036 EXPECT_DEATH(APInt(32, "1L", 10), "Invalid character in digit string");
1037}
Erick Tryzelaar927191f2009-08-17 00:55:33 +00001038#endif
Jeffrey Yasskinb5cd0132010-03-17 01:18:45 +00001039#endif
Erick Tryzelaar2b01eab2009-08-16 23:36:01 +00001040
Eli Friedman19546412011-10-07 23:40:49 +00001041TEST(APIntTest, mul_clear) {
1042 APInt ValA(65, -1ULL);
1043 APInt ValB(65, 4);
1044 APInt ValC(65, 0);
1045 ValC = ValA * ValB;
1046 ValA *= ValB;
1047 EXPECT_EQ(ValA.toString(10, false), ValC.toString(10, false));
1048}
1049
Eli Friedmanf70c8622011-12-22 22:11:19 +00001050TEST(APIntTest, Rotate) {
1051 EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotl(0));
1052 EXPECT_EQ(APInt(8, 2), APInt(8, 1).rotl(1));
1053 EXPECT_EQ(APInt(8, 4), APInt(8, 1).rotl(2));
1054 EXPECT_EQ(APInt(8, 16), APInt(8, 1).rotl(4));
1055 EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotl(8));
1056
1057 EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotl(0));
1058 EXPECT_EQ(APInt(8, 32), APInt(8, 16).rotl(1));
1059 EXPECT_EQ(APInt(8, 64), APInt(8, 16).rotl(2));
1060 EXPECT_EQ(APInt(8, 1), APInt(8, 16).rotl(4));
1061 EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotl(8));
1062
Joey Gouly51c0ae52017-02-07 11:58:22 +00001063 EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(33));
1064 EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(APInt(32, 33)));
1065
1066 EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(33));
1067 EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(APInt(32, 33)));
1068 EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(APInt(33, 33)));
1069 EXPECT_EQ(APInt(32, (1 << 8)), APInt(32, 1).rotl(APInt(32, 40)));
1070 EXPECT_EQ(APInt(32, (1 << 30)), APInt(32, 1).rotl(APInt(31, 30)));
1071 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotl(APInt(31, 31)));
1072
1073 EXPECT_EQ(APInt(32, 1), APInt(32, 1).rotl(APInt(1, 0)));
1074 EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(APInt(1, 1)));
1075
1076 EXPECT_EQ(APInt(32, 16), APInt(32, 1).rotl(APInt(3, 4)));
1077
1078 EXPECT_EQ(APInt(32, 1), APInt(32, 1).rotl(APInt(64, 64)));
1079 EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(APInt(64, 65)));
1080
1081 EXPECT_EQ(APInt(7, 24), APInt(7, 3).rotl(APInt(7, 3)));
1082 EXPECT_EQ(APInt(7, 24), APInt(7, 3).rotl(APInt(7, 10)));
1083 EXPECT_EQ(APInt(7, 24), APInt(7, 3).rotl(APInt(5, 10)));
1084 EXPECT_EQ(APInt(7, 6), APInt(7, 3).rotl(APInt(12, 120)));
1085
Eli Friedmanf70c8622011-12-22 22:11:19 +00001086 EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotr(0));
1087 EXPECT_EQ(APInt(8, 8), APInt(8, 16).rotr(1));
1088 EXPECT_EQ(APInt(8, 4), APInt(8, 16).rotr(2));
1089 EXPECT_EQ(APInt(8, 1), APInt(8, 16).rotr(4));
1090 EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotr(8));
1091
1092 EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotr(0));
1093 EXPECT_EQ(APInt(8, 128), APInt(8, 1).rotr(1));
1094 EXPECT_EQ(APInt(8, 64), APInt(8, 1).rotr(2));
1095 EXPECT_EQ(APInt(8, 16), APInt(8, 1).rotr(4));
1096 EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotr(8));
Benjamin Kramer47ddf602012-02-07 16:27:39 +00001097
Joey Gouly51c0ae52017-02-07 11:58:22 +00001098 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(33));
1099 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(APInt(32, 33)));
1100
1101 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(33));
1102 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(APInt(32, 33)));
1103 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(APInt(33, 33)));
1104 EXPECT_EQ(APInt(32, (1 << 24)), APInt(32, 1).rotr(APInt(32, 40)));
1105
1106 EXPECT_EQ(APInt(32, (1 << 2)), APInt(32, 1).rotr(APInt(31, 30)));
1107 EXPECT_EQ(APInt(32, (1 << 1)), APInt(32, 1).rotr(APInt(31, 31)));
1108
1109 EXPECT_EQ(APInt(32, 1), APInt(32, 1).rotr(APInt(1, 0)));
1110 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(APInt(1, 1)));
1111
1112 EXPECT_EQ(APInt(32, (1 << 28)), APInt(32, 1).rotr(APInt(3, 4)));
1113
1114 EXPECT_EQ(APInt(32, 1), APInt(32, 1).rotr(APInt(64, 64)));
1115 EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(APInt(64, 65)));
1116
1117 EXPECT_EQ(APInt(7, 48), APInt(7, 3).rotr(APInt(7, 3)));
1118 EXPECT_EQ(APInt(7, 48), APInt(7, 3).rotr(APInt(7, 10)));
1119 EXPECT_EQ(APInt(7, 48), APInt(7, 3).rotr(APInt(5, 10)));
1120 EXPECT_EQ(APInt(7, 65), APInt(7, 3).rotr(APInt(12, 120)));
1121
1122 APInt Big(256, "00004000800000000000000000003fff8000000000000003", 16);
1123 APInt Rot(256, "3fff80000000000000030000000000000000000040008000", 16);
Benjamin Kramer47ddf602012-02-07 16:27:39 +00001124 EXPECT_EQ(Rot, Big.rotr(144));
Joey Gouly51c0ae52017-02-07 11:58:22 +00001125
1126 EXPECT_EQ(APInt(32, 8), APInt(32, 1).rotl(Big));
1127 EXPECT_EQ(APInt(32, (1 << 29)), APInt(32, 1).rotr(Big));
Eli Friedmanf70c8622011-12-22 22:11:19 +00001128}
1129
Benjamin Kramer5c3e21b2013-02-20 13:00:06 +00001130TEST(APIntTest, Splat) {
1131 APInt ValA(8, 0x01);
1132 EXPECT_EQ(ValA, APInt::getSplat(8, ValA));
1133 EXPECT_EQ(APInt(64, 0x0101010101010101ULL), APInt::getSplat(64, ValA));
1134
1135 APInt ValB(3, 5);
1136 EXPECT_EQ(APInt(4, 0xD), APInt::getSplat(4, ValB));
1137 EXPECT_EQ(APInt(15, 0xDB6D), APInt::getSplat(15, ValB));
1138}
1139
Michael Gottesman9d406f42013-05-28 19:50:20 +00001140TEST(APIntTest, tcDecrement) {
1141 // Test single word decrement.
1142
1143 // No out borrow.
1144 {
1145 integerPart singleWord = ~integerPart(0) << (integerPartWidth - 1);
1146 integerPart carry = APInt::tcDecrement(&singleWord, 1);
1147 EXPECT_EQ(carry, integerPart(0));
1148 EXPECT_EQ(singleWord, ~integerPart(0) >> 1);
1149 }
1150
1151 // With out borrow.
1152 {
1153 integerPart singleWord = 0;
1154 integerPart carry = APInt::tcDecrement(&singleWord, 1);
1155 EXPECT_EQ(carry, integerPart(1));
1156 EXPECT_EQ(singleWord, ~integerPart(0));
1157 }
1158
1159 // Test multiword decrement.
1160
1161 // No across word borrow, no out borrow.
1162 {
1163 integerPart test[4] = {0x1, 0x1, 0x1, 0x1};
1164 integerPart expected[4] = {0x0, 0x1, 0x1, 0x1};
1165 APInt::tcDecrement(test, 4);
1166 EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
1167 }
1168
1169 // 1 across word borrow, no out borrow.
1170 {
1171 integerPart test[4] = {0x0, 0xF, 0x1, 0x1};
1172 integerPart expected[4] = {~integerPart(0), 0xE, 0x1, 0x1};
1173 integerPart carry = APInt::tcDecrement(test, 4);
1174 EXPECT_EQ(carry, integerPart(0));
1175 EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
1176 }
1177
1178 // 2 across word borrow, no out borrow.
1179 {
1180 integerPart test[4] = {0x0, 0x0, 0xC, 0x1};
1181 integerPart expected[4] = {~integerPart(0), ~integerPart(0), 0xB, 0x1};
1182 integerPart carry = APInt::tcDecrement(test, 4);
1183 EXPECT_EQ(carry, integerPart(0));
1184 EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
1185 }
1186
1187 // 3 across word borrow, no out borrow.
1188 {
1189 integerPart test[4] = {0x0, 0x0, 0x0, 0x1};
1190 integerPart expected[4] = {~integerPart(0), ~integerPart(0), ~integerPart(0), 0x0};
1191 integerPart carry = APInt::tcDecrement(test, 4);
1192 EXPECT_EQ(carry, integerPart(0));
1193 EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
1194 }
1195
1196 // 3 across word borrow, with out borrow.
1197 {
1198 integerPart test[4] = {0x0, 0x0, 0x0, 0x0};
1199 integerPart expected[4] = {~integerPart(0), ~integerPart(0), ~integerPart(0), ~integerPart(0)};
1200 integerPart carry = APInt::tcDecrement(test, 4);
1201 EXPECT_EQ(carry, integerPart(1));
1202 EXPECT_EQ(APInt::tcCompare(test, expected, 4), 0);
1203 }
1204}
Michael Gottesman4497d962013-12-13 20:47:34 +00001205
Michael Gottesmane1fad2b2013-12-13 22:00:19 +00001206TEST(APIntTest, arrayAccess) {
Michael Gottesman4497d962013-12-13 20:47:34 +00001207 // Single word check.
1208 uint64_t E1 = 0x2CA7F46BF6569915ULL;
1209 APInt A1(64, E1);
Duncan P. N. Exon Smithc47069b2014-01-31 21:45:51 +00001210 for (unsigned i = 0, e = 64; i < e; ++i) {
Michael Gottesman4497d962013-12-13 20:47:34 +00001211 EXPECT_EQ(bool(E1 & (1ULL << i)),
Michael Gottesmane1fad2b2013-12-13 22:00:19 +00001212 A1[i]);
Michael Gottesman4497d962013-12-13 20:47:34 +00001213 }
1214
1215 // Multiword check.
1216 integerPart E2[4] = {
Michael Gottesmanf6d58ff2013-12-13 20:47:37 +00001217 0xEB6EB136591CBA21ULL,
1218 0x7B9358BD6A33F10AULL,
1219 0x7E7FFA5EADD8846ULL,
1220 0x305F341CA00B613DULL
Michael Gottesman4497d962013-12-13 20:47:34 +00001221 };
Craig Toppere1d12942014-08-27 05:25:25 +00001222 APInt A2(integerPartWidth*4, E2);
Michael Gottesman4497d962013-12-13 20:47:34 +00001223 for (unsigned i = 0; i < 4; ++i) {
1224 for (unsigned j = 0; j < integerPartWidth; ++j) {
1225 EXPECT_EQ(bool(E2[i] & (1ULL << j)),
Michael Gottesmane1fad2b2013-12-13 22:00:19 +00001226 A2[i*integerPartWidth + j]);
Michael Gottesman4497d962013-12-13 20:47:34 +00001227 }
1228 }
1229}
1230
Michael Gottesman073af742014-01-19 20:33:38 +00001231TEST(APIntTest, LargeAPIntConstruction) {
1232 // Check that we can properly construct very large APInt. It is very
1233 // unlikely that people will ever do this, but it is a legal input,
1234 // so we should not crash on it.
1235 APInt A9(UINT32_MAX, 0);
1236 EXPECT_FALSE(A9.getBoolValue());
1237}
1238
Michael Gottesmanf6d58ff2013-12-13 20:47:37 +00001239TEST(APIntTest, nearestLogBase2) {
Duncan P. N. Exon Smithc47069b2014-01-31 21:45:51 +00001240 // Single word check.
Michael Gottesmanf6d58ff2013-12-13 20:47:37 +00001241
1242 // Test round up.
1243 uint64_t I1 = 0x1800001;
1244 APInt A1(64, I1);
1245 EXPECT_EQ(A1.nearestLogBase2(), A1.ceilLogBase2());
1246
1247 // Test round down.
1248 uint64_t I2 = 0x1000011;
1249 APInt A2(64, I2);
1250 EXPECT_EQ(A2.nearestLogBase2(), A2.logBase2());
1251
1252 // Test ties round up.
1253 uint64_t I3 = 0x1800000;
1254 APInt A3(64, I3);
1255 EXPECT_EQ(A3.nearestLogBase2(), A3.ceilLogBase2());
1256
1257 // Multiple word check.
1258
1259 // Test round up.
1260 integerPart I4[4] = {0x0, 0xF, 0x18, 0x0};
Craig Toppere1d12942014-08-27 05:25:25 +00001261 APInt A4(integerPartWidth*4, I4);
Michael Gottesmanf6d58ff2013-12-13 20:47:37 +00001262 EXPECT_EQ(A4.nearestLogBase2(), A4.ceilLogBase2());
1263
1264 // Test round down.
1265 integerPart I5[4] = {0x0, 0xF, 0x10, 0x0};
Craig Toppere1d12942014-08-27 05:25:25 +00001266 APInt A5(integerPartWidth*4, I5);
Michael Gottesmanf6d58ff2013-12-13 20:47:37 +00001267 EXPECT_EQ(A5.nearestLogBase2(), A5.logBase2());
1268
1269 // Test ties round up.
1270 uint64_t I6[4] = {0x0, 0x0, 0x0, 0x18};
Craig Toppere1d12942014-08-27 05:25:25 +00001271 APInt A6(integerPartWidth*4, I6);
Michael Gottesmanf6d58ff2013-12-13 20:47:37 +00001272 EXPECT_EQ(A6.nearestLogBase2(), A6.ceilLogBase2());
Michael Gottesman84fcbde2014-01-19 20:33:48 +00001273
1274 // Test BitWidth == 1 special cases.
1275 APInt A7(1, 1);
1276 EXPECT_EQ(A7.nearestLogBase2(), 0ULL);
1277 APInt A8(1, 0);
1278 EXPECT_EQ(A8.nearestLogBase2(), UINT32_MAX);
1279
1280 // Test the zero case when we have a bit width large enough such
1281 // that the bit width is larger than UINT32_MAX-1.
1282 APInt A9(UINT32_MAX, 0);
1283 EXPECT_EQ(A9.nearestLogBase2(), UINT32_MAX);
Michael Gottesmanf6d58ff2013-12-13 20:47:37 +00001284}
1285
Benjamin Kramerb4b51502015-03-25 16:49:59 +00001286TEST(APIntTest, IsSplat) {
1287 APInt A(32, 0x01010101);
1288 EXPECT_FALSE(A.isSplat(1));
1289 EXPECT_FALSE(A.isSplat(2));
1290 EXPECT_FALSE(A.isSplat(4));
1291 EXPECT_TRUE(A.isSplat(8));
1292 EXPECT_TRUE(A.isSplat(16));
1293 EXPECT_TRUE(A.isSplat(32));
1294
1295 APInt B(24, 0xAAAAAA);
1296 EXPECT_FALSE(B.isSplat(1));
1297 EXPECT_TRUE(B.isSplat(2));
1298 EXPECT_TRUE(B.isSplat(4));
1299 EXPECT_TRUE(B.isSplat(8));
1300 EXPECT_TRUE(B.isSplat(24));
1301
1302 APInt C(24, 0xABAAAB);
1303 EXPECT_FALSE(C.isSplat(1));
1304 EXPECT_FALSE(C.isSplat(2));
1305 EXPECT_FALSE(C.isSplat(4));
1306 EXPECT_FALSE(C.isSplat(8));
1307 EXPECT_TRUE(C.isSplat(24));
1308
1309 APInt D(32, 0xABBAABBA);
1310 EXPECT_FALSE(D.isSplat(1));
1311 EXPECT_FALSE(D.isSplat(2));
1312 EXPECT_FALSE(D.isSplat(4));
1313 EXPECT_FALSE(D.isSplat(8));
1314 EXPECT_TRUE(D.isSplat(16));
1315 EXPECT_TRUE(D.isSplat(32));
1316
1317 APInt E(32, 0);
1318 EXPECT_TRUE(E.isSplat(1));
1319 EXPECT_TRUE(E.isSplat(2));
1320 EXPECT_TRUE(E.isSplat(4));
1321 EXPECT_TRUE(E.isSplat(8));
1322 EXPECT_TRUE(E.isSplat(16));
1323 EXPECT_TRUE(E.isSplat(32));
1324}
1325
Matt Arsenaultc3943572016-04-12 18:17:23 +00001326TEST(APIntTest, isMask) {
1327 EXPECT_FALSE(APIntOps::isMask(APInt(32, 0x01010101)));
1328 EXPECT_FALSE(APIntOps::isMask(APInt(32, 0xf0000000)));
1329 EXPECT_FALSE(APIntOps::isMask(APInt(32, 0xffff0000)));
1330 EXPECT_FALSE(APIntOps::isMask(APInt(32, 0xff << 1)));
1331
1332 for (int N : { 1, 2, 3, 4, 7, 8, 16, 32, 64, 127, 128, 129, 256 }) {
1333 EXPECT_FALSE(APIntOps::isMask(APInt(N, 0)));
1334
1335 APInt One(N, 1);
1336 for (int I = 1; I <= N; ++I) {
1337 APInt MaskVal = One.shl(I) - 1;
1338 EXPECT_TRUE(APIntOps::isMask(MaskVal));
1339 }
1340 }
1341}
1342
Aaron Ballman8bd98972015-01-13 14:30:07 +00001343#if defined(__clang__)
Richard Trieua64949d2015-01-14 01:50:12 +00001344// Disable the pragma warning from versions of Clang without -Wself-move
1345#pragma clang diagnostic push
1346#pragma clang diagnostic ignored "-Wunknown-pragmas"
Richard Trieu5dc76a52015-01-13 02:10:33 +00001347// Disable the warning that triggers on exactly what is being tested.
1348#pragma clang diagnostic push
1349#pragma clang diagnostic ignored "-Wself-move"
Aaron Ballman8bd98972015-01-13 14:30:07 +00001350#endif
Reid Kleckner3d4eae72014-08-12 22:01:39 +00001351TEST(APIntTest, SelfMoveAssignment) {
1352 APInt X(32, 0xdeadbeef);
1353 X = std::move(X);
David Blaikie1508a652014-08-12 23:23:05 +00001354 EXPECT_EQ(32u, X.getBitWidth());
Reid Kleckner3d4eae72014-08-12 22:01:39 +00001355 EXPECT_EQ(0xdeadbeefULL, X.getLimitedValue());
1356
1357 uint64_t Bits[] = {0xdeadbeefdeadbeefULL, 0xdeadbeefdeadbeefULL};
1358 APInt Y(128, Bits);
1359 Y = std::move(Y);
David Blaikie1508a652014-08-12 23:23:05 +00001360 EXPECT_EQ(128u, Y.getBitWidth());
Reid Kleckner3d4eae72014-08-12 22:01:39 +00001361 EXPECT_EQ(~0ULL, Y.getLimitedValue());
1362 const uint64_t *Raw = Y.getRawData();
David Blaikie1508a652014-08-12 23:23:05 +00001363 EXPECT_EQ(2u, Y.getNumWords());
Reid Kleckner3d4eae72014-08-12 22:01:39 +00001364 EXPECT_EQ(0xdeadbeefdeadbeefULL, Raw[0]);
1365 EXPECT_EQ(0xdeadbeefdeadbeefULL, Raw[1]);
1366}
Aaron Ballman8bd98972015-01-13 14:30:07 +00001367#if defined(__clang__)
Richard Trieu5dc76a52015-01-13 02:10:33 +00001368#pragma clang diagnostic pop
Richard Trieua64949d2015-01-14 01:50:12 +00001369#pragma clang diagnostic pop
Aaron Ballman8bd98972015-01-13 14:30:07 +00001370#endif
Nick Lewyckyee226112009-01-19 18:08:33 +00001371}
Matt Arsenault155dda92016-03-21 15:00:35 +00001372
1373TEST(APIntTest, reverseBits) {
1374 EXPECT_EQ(1, APInt(1, 1).reverseBits());
1375 EXPECT_EQ(0, APInt(1, 0).reverseBits());
1376
1377 EXPECT_EQ(3, APInt(2, 3).reverseBits());
1378 EXPECT_EQ(3, APInt(2, 3).reverseBits());
1379
1380 EXPECT_EQ(0xb, APInt(4, 0xd).reverseBits());
1381 EXPECT_EQ(0xd, APInt(4, 0xb).reverseBits());
1382 EXPECT_EQ(0xf, APInt(4, 0xf).reverseBits());
1383
1384 EXPECT_EQ(0x30, APInt(7, 0x6).reverseBits());
1385 EXPECT_EQ(0x5a, APInt(7, 0x2d).reverseBits());
1386
1387 EXPECT_EQ(0x0f, APInt(8, 0xf0).reverseBits());
1388 EXPECT_EQ(0xf0, APInt(8, 0x0f).reverseBits());
1389
1390 EXPECT_EQ(0x0f0f, APInt(16, 0xf0f0).reverseBits());
1391 EXPECT_EQ(0xf0f0, APInt(16, 0x0f0f).reverseBits());
1392
1393 EXPECT_EQ(0x0f0f0f0f, APInt(32, 0xf0f0f0f0).reverseBits());
1394 EXPECT_EQ(0xf0f0f0f0, APInt(32, 0x0f0f0f0f).reverseBits());
1395
1396 EXPECT_EQ(0x402880a0 >> 1, APInt(31, 0x05011402).reverseBits());
1397
1398 EXPECT_EQ(0x0f0f0f0f, APInt(32, 0xf0f0f0f0).reverseBits());
1399 EXPECT_EQ(0xf0f0f0f0, APInt(32, 0x0f0f0f0f).reverseBits());
1400
1401 EXPECT_EQ(0x0f0f0f0f0f0f0f0f, APInt(64, 0xf0f0f0f0f0f0f0f0).reverseBits());
1402 EXPECT_EQ(0xf0f0f0f0f0f0f0f0, APInt(64, 0x0f0f0f0f0f0f0f0f).reverseBits());
1403
1404 for (unsigned N : { 1, 8, 16, 24, 31, 32, 33,
1405 63, 64, 65, 127, 128, 257, 1024 }) {
1406 for (unsigned I = 0; I < N; ++I) {
1407 APInt X = APInt::getOneBitSet(N, I);
1408 APInt Y = APInt::getOneBitSet(N, N - (I + 1));
1409 EXPECT_EQ(Y, X.reverseBits());
1410 EXPECT_EQ(X, Y.reverseBits());
1411 }
1412 }
1413}