blob: 6b637ba20cbbd86cc73fb75454cdb2c1933c2656 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements a class to represent arbitrary precision integer
11// constant values and provide a variety of arithmetic operations on them.
12//
13//===----------------------------------------------------------------------===//
14
15#define DEBUG_TYPE "apint"
16#include "llvm/ADT/APInt.h"
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +000017#include "llvm/ADT/StringRef.h"
Ted Kremenek109de0d2008-01-19 04:23:33 +000018#include "llvm/ADT/FoldingSet.h"
Chris Lattner89b36582008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Dan Gohmanf17a25c2007-07-18 16:29:46 +000020#include "llvm/Support/Debug.h"
Edwin Török675d5622009-07-11 20:10:48 +000021#include "llvm/Support/ErrorHandling.h"
Dan Gohmanf17a25c2007-07-18 16:29:46 +000022#include "llvm/Support/MathExtras.h"
Chris Lattner1fefaac2008-08-23 22:23:09 +000023#include "llvm/Support/raw_ostream.h"
Chris Lattner89b36582008-08-17 07:19:36 +000024#include <cmath>
Dan Gohmanf17a25c2007-07-18 16:29:46 +000025#include <limits>
26#include <cstring>
27#include <cstdlib>
Dan Gohmanf17a25c2007-07-18 16:29:46 +000028using namespace llvm;
29
30/// A utility function for allocating memory, checking for allocation failures,
31/// and ensuring the contents are zeroed.
Chris Lattneree5417c2009-01-21 18:09:24 +000032inline static uint64_t* getClearedMemory(unsigned numWords) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +000033 uint64_t * result = new uint64_t[numWords];
34 assert(result && "APInt memory allocation fails!");
35 memset(result, 0, numWords * sizeof(uint64_t));
36 return result;
37}
38
39/// A utility function for allocating memory and checking for allocation
40/// failure. The content is not zeroed.
Chris Lattneree5417c2009-01-21 18:09:24 +000041inline static uint64_t* getMemory(unsigned numWords) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +000042 uint64_t * result = new uint64_t[numWords];
43 assert(result && "APInt memory allocation fails!");
44 return result;
45}
46
Chris Lattneree5417c2009-01-21 18:09:24 +000047void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner84886852008-08-20 17:02:31 +000048 pVal = getClearedMemory(getNumWords());
49 pVal[0] = val;
50 if (isSigned && int64_t(val) < 0)
51 for (unsigned i = 1; i < getNumWords(); ++i)
52 pVal[i] = -1ULL;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000053}
54
Chris Lattnera1f63bb2008-10-11 22:07:19 +000055void APInt::initSlowCase(const APInt& that) {
56 pVal = getMemory(getNumWords());
57 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
58}
59
60
Chris Lattneree5417c2009-01-21 18:09:24 +000061APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Chris Lattner1fefaac2008-08-23 22:23:09 +000062 : BitWidth(numBits), VAL(0) {
Erick Tryzelaara3c44c92009-08-21 03:15:14 +000063 assert(BitWidth && "Bitwidth too small");
Dan Gohmanf17a25c2007-07-18 16:29:46 +000064 assert(bigVal && "Null pointer detected!");
65 if (isSingleWord())
66 VAL = bigVal[0];
67 else {
68 // Get memory, cleared to 0
69 pVal = getClearedMemory(getNumWords());
70 // Calculate the number of words to copy
Chris Lattneree5417c2009-01-21 18:09:24 +000071 unsigned words = std::min<unsigned>(numWords, getNumWords());
Dan Gohmanf17a25c2007-07-18 16:29:46 +000072 // Copy the words from bigVal to pVal
73 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
74 }
75 // Make sure unused high bits are cleared
76 clearUnusedBits();
77}
78
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +000079APInt::APInt(unsigned numbits, const StringRef& Str, uint8_t radix)
Dan Gohmanf17a25c2007-07-18 16:29:46 +000080 : BitWidth(numbits), VAL(0) {
Erick Tryzelaara3c44c92009-08-21 03:15:14 +000081 assert(BitWidth && "Bitwidth too small");
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +000082 fromString(numbits, Str, radix);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000083}
84
Chris Lattner84886852008-08-20 17:02:31 +000085APInt& APInt::AssignSlowCase(const APInt& RHS) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +000086 // Don't do anything for X = X
87 if (this == &RHS)
88 return *this;
89
Dan Gohmanf17a25c2007-07-18 16:29:46 +000090 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner84886852008-08-20 17:02:31 +000091 // assume same bit-width single-word case is already handled
92 assert(!isSingleWord());
93 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000094 return *this;
95 }
96
Chris Lattner84886852008-08-20 17:02:31 +000097 if (isSingleWord()) {
98 // assume case where both are single words is already handled
99 assert(!RHS.isSingleWord());
100 VAL = 0;
101 pVal = getMemory(RHS.getNumWords());
102 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
103 } else if (getNumWords() == RHS.getNumWords())
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000104 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
105 else if (RHS.isSingleWord()) {
106 delete [] pVal;
107 VAL = RHS.VAL;
108 } else {
109 delete [] pVal;
110 pVal = getMemory(RHS.getNumWords());
111 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
112 }
113 BitWidth = RHS.BitWidth;
114 return clearUnusedBits();
115}
116
117APInt& APInt::operator=(uint64_t RHS) {
118 if (isSingleWord())
119 VAL = RHS;
120 else {
121 pVal[0] = RHS;
122 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
123 }
124 return clearUnusedBits();
125}
126
Ted Kremenek109de0d2008-01-19 04:23:33 +0000127/// Profile - This method 'profiles' an APInt for use with FoldingSet.
128void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek79f65912008-02-19 20:50:41 +0000129 ID.AddInteger(BitWidth);
130
Ted Kremenek109de0d2008-01-19 04:23:33 +0000131 if (isSingleWord()) {
132 ID.AddInteger(VAL);
133 return;
134 }
135
Chris Lattneree5417c2009-01-21 18:09:24 +0000136 unsigned NumWords = getNumWords();
Ted Kremenek109de0d2008-01-19 04:23:33 +0000137 for (unsigned i = 0; i < NumWords; ++i)
138 ID.AddInteger(pVal[i]);
139}
140
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000141/// add_1 - This function adds a single "digit" integer, y, to the multiple
142/// "digit" integer array, x[]. x[] is modified to reflect the addition and
143/// 1 is returned if there is a carry out, otherwise 0 is returned.
144/// @returns the carry of the addition.
Chris Lattneree5417c2009-01-21 18:09:24 +0000145static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
146 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000147 dest[i] = y + x[i];
148 if (dest[i] < y)
149 y = 1; // Carry one to next digit.
150 else {
151 y = 0; // No need to carry so exit early
152 break;
153 }
154 }
155 return y;
156}
157
158/// @brief Prefix increment operator. Increments the APInt by one.
159APInt& APInt::operator++() {
160 if (isSingleWord())
161 ++VAL;
162 else
163 add_1(pVal, pVal, getNumWords(), 1);
164 return clearUnusedBits();
165}
166
167/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
168/// the multi-digit integer array, x[], propagating the borrowed 1 value until
169/// no further borrowing is neeeded or it runs out of "digits" in x. The result
170/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
171/// In other words, if y > x then this function returns 1, otherwise 0.
172/// @returns the borrow out of the subtraction
Chris Lattneree5417c2009-01-21 18:09:24 +0000173static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
174 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000175 uint64_t X = x[i];
176 x[i] -= y;
177 if (y > X)
178 y = 1; // We have to "borrow 1" from next "digit"
179 else {
180 y = 0; // No need to borrow
181 break; // Remaining digits are unchanged so exit early
182 }
183 }
184 return bool(y);
185}
186
187/// @brief Prefix decrement operator. Decrements the APInt by one.
188APInt& APInt::operator--() {
189 if (isSingleWord())
190 --VAL;
191 else
192 sub_1(pVal, getNumWords(), 1);
193 return clearUnusedBits();
194}
195
196/// add - This function adds the integer array x to the integer array Y and
197/// places the result in dest.
198/// @returns the carry out from the addition
199/// @brief General addition of 64-bit integer arrays
200static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattneree5417c2009-01-21 18:09:24 +0000201 unsigned len) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000202 bool carry = false;
Chris Lattneree5417c2009-01-21 18:09:24 +0000203 for (unsigned i = 0; i< len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000204 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
205 dest[i] = x[i] + y[i] + carry;
206 carry = dest[i] < limit || (carry && dest[i] == limit);
207 }
208 return carry;
209}
210
211/// Adds the RHS APint to this APInt.
212/// @returns this, after addition of RHS.
213/// @brief Addition assignment operator.
214APInt& APInt::operator+=(const APInt& RHS) {
215 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
216 if (isSingleWord())
217 VAL += RHS.VAL;
218 else {
219 add(pVal, pVal, RHS.pVal, getNumWords());
220 }
221 return clearUnusedBits();
222}
223
224/// Subtracts the integer array y from the integer array x
225/// @returns returns the borrow out.
226/// @brief Generalized subtraction of 64-bit integer arrays.
227static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattneree5417c2009-01-21 18:09:24 +0000228 unsigned len) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000229 bool borrow = false;
Chris Lattneree5417c2009-01-21 18:09:24 +0000230 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000231 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
232 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
233 dest[i] = x_tmp - y[i];
234 }
235 return borrow;
236}
237
238/// Subtracts the RHS APInt from this APInt
239/// @returns this, after subtraction
240/// @brief Subtraction assignment operator.
241APInt& APInt::operator-=(const APInt& RHS) {
242 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
243 if (isSingleWord())
244 VAL -= RHS.VAL;
245 else
246 sub(pVal, pVal, RHS.pVal, getNumWords());
247 return clearUnusedBits();
248}
249
250/// Multiplies an integer array, x by a a uint64_t integer and places the result
251/// into dest.
252/// @returns the carry out of the multiplication.
253/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattneree5417c2009-01-21 18:09:24 +0000254static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000255 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
256 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
257 uint64_t carry = 0;
258
259 // For each digit of x.
Chris Lattneree5417c2009-01-21 18:09:24 +0000260 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000261 // Split x into high and low words
262 uint64_t lx = x[i] & 0xffffffffULL;
263 uint64_t hx = x[i] >> 32;
264 // hasCarry - A flag to indicate if there is a carry to the next digit.
265 // hasCarry == 0, no carry
266 // hasCarry == 1, has carry
267 // hasCarry == 2, no carry and the calculation result == 0.
268 uint8_t hasCarry = 0;
269 dest[i] = carry + lx * ly;
270 // Determine if the add above introduces carry.
271 hasCarry = (dest[i] < carry) ? 1 : 0;
272 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
273 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
274 // (2^32 - 1) + 2^32 = 2^64.
275 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
276
277 carry += (lx * hy) & 0xffffffffULL;
278 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
279 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
280 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
281 }
282 return carry;
283}
284
285/// Multiplies integer array x by integer array y and stores the result into
286/// the integer array dest. Note that dest's size must be >= xlen + ylen.
287/// @brief Generalized multiplicate of integer arrays.
Chris Lattneree5417c2009-01-21 18:09:24 +0000288static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
289 unsigned ylen) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000290 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattneree5417c2009-01-21 18:09:24 +0000291 for (unsigned i = 1; i < ylen; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000292 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
293 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +0000294 for (unsigned j = 0; j < xlen; ++j) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000295 lx = x[j] & 0xffffffffULL;
296 hx = x[j] >> 32;
297 // hasCarry - A flag to indicate if has carry.
298 // hasCarry == 0, no carry
299 // hasCarry == 1, has carry
300 // hasCarry == 2, no carry and the calculation result == 0.
301 uint8_t hasCarry = 0;
302 uint64_t resul = carry + lx * ly;
303 hasCarry = (resul < carry) ? 1 : 0;
304 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
305 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
306
307 carry += (lx * hy) & 0xffffffffULL;
308 resul = (carry << 32) | (resul & 0xffffffffULL);
309 dest[i+j] += resul;
310 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
311 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
312 ((lx * hy) >> 32) + hx * hy;
313 }
314 dest[i+xlen] = carry;
315 }
316}
317
318APInt& APInt::operator*=(const APInt& RHS) {
319 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
320 if (isSingleWord()) {
321 VAL *= RHS.VAL;
322 clearUnusedBits();
323 return *this;
324 }
325
326 // Get some bit facts about LHS and check for zero
Chris Lattneree5417c2009-01-21 18:09:24 +0000327 unsigned lhsBits = getActiveBits();
328 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000329 if (!lhsWords)
330 // 0 * X ===> 0
331 return *this;
332
333 // Get some bit facts about RHS and check for zero
Chris Lattneree5417c2009-01-21 18:09:24 +0000334 unsigned rhsBits = RHS.getActiveBits();
335 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000336 if (!rhsWords) {
337 // X * 0 ===> 0
338 clear();
339 return *this;
340 }
341
342 // Allocate space for the result
Chris Lattneree5417c2009-01-21 18:09:24 +0000343 unsigned destWords = rhsWords + lhsWords;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000344 uint64_t *dest = getMemory(destWords);
345
346 // Perform the long multiply
347 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
348
349 // Copy result back into *this
350 clear();
Chris Lattneree5417c2009-01-21 18:09:24 +0000351 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000352 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
353
354 // delete dest array and return
355 delete[] dest;
356 return *this;
357}
358
359APInt& APInt::operator&=(const APInt& RHS) {
360 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
361 if (isSingleWord()) {
362 VAL &= RHS.VAL;
363 return *this;
364 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000365 unsigned numWords = getNumWords();
366 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000367 pVal[i] &= RHS.pVal[i];
368 return *this;
369}
370
371APInt& APInt::operator|=(const APInt& RHS) {
372 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
373 if (isSingleWord()) {
374 VAL |= RHS.VAL;
375 return *this;
376 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000377 unsigned numWords = getNumWords();
378 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000379 pVal[i] |= RHS.pVal[i];
380 return *this;
381}
382
383APInt& APInt::operator^=(const APInt& RHS) {
384 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
385 if (isSingleWord()) {
386 VAL ^= RHS.VAL;
387 this->clearUnusedBits();
388 return *this;
389 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000390 unsigned numWords = getNumWords();
391 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000392 pVal[i] ^= RHS.pVal[i];
393 return clearUnusedBits();
394}
395
Chris Lattner84886852008-08-20 17:02:31 +0000396APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000397 unsigned numWords = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000398 uint64_t* val = getMemory(numWords);
Chris Lattneree5417c2009-01-21 18:09:24 +0000399 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000400 val[i] = pVal[i] & RHS.pVal[i];
401 return APInt(val, getBitWidth());
402}
403
Chris Lattner84886852008-08-20 17:02:31 +0000404APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000405 unsigned numWords = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000406 uint64_t *val = getMemory(numWords);
Chris Lattneree5417c2009-01-21 18:09:24 +0000407 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000408 val[i] = pVal[i] | RHS.pVal[i];
409 return APInt(val, getBitWidth());
410}
411
Chris Lattner84886852008-08-20 17:02:31 +0000412APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000413 unsigned numWords = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000414 uint64_t *val = getMemory(numWords);
Chris Lattneree5417c2009-01-21 18:09:24 +0000415 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000416 val[i] = pVal[i] ^ RHS.pVal[i];
417
418 // 0^0==1 so clear the high bits in case they got set.
419 return APInt(val, getBitWidth()).clearUnusedBits();
420}
421
422bool APInt::operator !() const {
423 if (isSingleWord())
424 return !VAL;
425
Chris Lattneree5417c2009-01-21 18:09:24 +0000426 for (unsigned i = 0; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000427 if (pVal[i])
428 return false;
429 return true;
430}
431
432APInt APInt::operator*(const APInt& RHS) const {
433 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
434 if (isSingleWord())
435 return APInt(BitWidth, VAL * RHS.VAL);
436 APInt Result(*this);
437 Result *= RHS;
438 return Result.clearUnusedBits();
439}
440
441APInt APInt::operator+(const APInt& RHS) const {
442 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
443 if (isSingleWord())
444 return APInt(BitWidth, VAL + RHS.VAL);
445 APInt Result(BitWidth, 0);
446 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
447 return Result.clearUnusedBits();
448}
449
450APInt APInt::operator-(const APInt& RHS) const {
451 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
452 if (isSingleWord())
453 return APInt(BitWidth, VAL - RHS.VAL);
454 APInt Result(BitWidth, 0);
455 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
456 return Result.clearUnusedBits();
457}
458
Chris Lattneree5417c2009-01-21 18:09:24 +0000459bool APInt::operator[](unsigned bitPosition) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000460 return (maskBit(bitPosition) &
461 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
462}
463
Chris Lattner84886852008-08-20 17:02:31 +0000464bool APInt::EqualSlowCase(const APInt& RHS) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000465 // Get some facts about the number of bits used in the two operands.
Chris Lattneree5417c2009-01-21 18:09:24 +0000466 unsigned n1 = getActiveBits();
467 unsigned n2 = RHS.getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000468
469 // If the number of bits isn't the same, they aren't equal
470 if (n1 != n2)
471 return false;
472
473 // If the number of bits fits in a word, we only need to compare the low word.
474 if (n1 <= APINT_BITS_PER_WORD)
475 return pVal[0] == RHS.pVal[0];
476
477 // Otherwise, compare everything
478 for (int i = whichWord(n1 - 1); i >= 0; --i)
479 if (pVal[i] != RHS.pVal[i])
480 return false;
481 return true;
482}
483
Chris Lattner84886852008-08-20 17:02:31 +0000484bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000485 unsigned n = getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000486 if (n <= APINT_BITS_PER_WORD)
487 return pVal[0] == Val;
488 else
489 return false;
490}
491
492bool APInt::ult(const APInt& RHS) const {
493 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
494 if (isSingleWord())
495 return VAL < RHS.VAL;
496
497 // Get active bit length of both operands
Chris Lattneree5417c2009-01-21 18:09:24 +0000498 unsigned n1 = getActiveBits();
499 unsigned n2 = RHS.getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000500
501 // If magnitude of LHS is less than RHS, return true.
502 if (n1 < n2)
503 return true;
504
505 // If magnitude of RHS is greather than LHS, return false.
506 if (n2 < n1)
507 return false;
508
509 // If they bot fit in a word, just compare the low order word
510 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
511 return pVal[0] < RHS.pVal[0];
512
513 // Otherwise, compare all words
Chris Lattneree5417c2009-01-21 18:09:24 +0000514 unsigned topWord = whichWord(std::max(n1,n2)-1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000515 for (int i = topWord; i >= 0; --i) {
516 if (pVal[i] > RHS.pVal[i])
517 return false;
518 if (pVal[i] < RHS.pVal[i])
519 return true;
520 }
521 return false;
522}
523
524bool APInt::slt(const APInt& RHS) const {
525 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
526 if (isSingleWord()) {
527 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
528 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
529 return lhsSext < rhsSext;
530 }
531
532 APInt lhs(*this);
533 APInt rhs(RHS);
534 bool lhsNeg = isNegative();
535 bool rhsNeg = rhs.isNegative();
536 if (lhsNeg) {
537 // Sign bit is set so perform two's complement to make it positive
538 lhs.flip();
539 lhs++;
540 }
541 if (rhsNeg) {
542 // Sign bit is set so perform two's complement to make it positive
543 rhs.flip();
544 rhs++;
545 }
546
547 // Now we have unsigned values to compare so do the comparison if necessary
548 // based on the negativeness of the values.
549 if (lhsNeg)
550 if (rhsNeg)
551 return lhs.ugt(rhs);
552 else
553 return true;
554 else if (rhsNeg)
555 return false;
556 else
557 return lhs.ult(rhs);
558}
559
Chris Lattneree5417c2009-01-21 18:09:24 +0000560APInt& APInt::set(unsigned bitPosition) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000561 if (isSingleWord())
562 VAL |= maskBit(bitPosition);
563 else
564 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
565 return *this;
566}
567
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000568/// Set the given bit to 0 whose position is given as "bitPosition".
569/// @brief Set a given bit to 0.
Chris Lattneree5417c2009-01-21 18:09:24 +0000570APInt& APInt::clear(unsigned bitPosition) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000571 if (isSingleWord())
572 VAL &= ~maskBit(bitPosition);
573 else
574 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
575 return *this;
576}
577
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000578/// @brief Toggle every bit to its opposite value.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000579
580/// Toggle a given bit to its opposite value whose position is given
581/// as "bitPosition".
582/// @brief Toggles a given bit to its opposite value.
Chris Lattneree5417c2009-01-21 18:09:24 +0000583APInt& APInt::flip(unsigned bitPosition) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000584 assert(bitPosition < BitWidth && "Out of the bit-width range!");
585 if ((*this)[bitPosition]) clear(bitPosition);
586 else set(bitPosition);
587 return *this;
588}
589
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000590unsigned APInt::getBitsNeeded(const StringRef& str, uint8_t radix) {
591 assert(!str.empty() && "Invalid string length");
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000592 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
593 "Radix should be 2, 8, 10, or 16!");
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000594
595 size_t slen = str.size();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000596
597 // Each computation below needs to know if its negative
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000598 StringRef::iterator p = str.begin();
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000599 unsigned isNegative = str.front() == '-';
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000600 if (*p == '-' || *p == '+') {
601 p++;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000602 slen--;
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000603 assert(slen && "string is only a minus!");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000604 }
605 // For radixes of power-of-two values, the bits required is accurately and
606 // easily computed
607 if (radix == 2)
608 return slen + isNegative;
609 if (radix == 8)
610 return slen * 3 + isNegative;
611 if (radix == 16)
612 return slen * 4 + isNegative;
613
614 // Otherwise it must be radix == 10, the hard case
615 assert(radix == 10 && "Invalid radix");
616
617 // This is grossly inefficient but accurate. We could probably do something
618 // with a computation of roughly slen*64/20 and then adjust by the value of
619 // the first few digits. But, I'm not sure how accurate that could be.
620
621 // Compute a sufficient number of bits that is always large enough but might
622 // be too large. This avoids the assertion in the constructor.
Chris Lattneree5417c2009-01-21 18:09:24 +0000623 unsigned sufficient = slen*64/18;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000624
625 // Convert to the actual binary value.
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000626 APInt tmp(sufficient, StringRef(p, slen), radix);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000627
628 // Compute how many bits are required.
629 return isNegative + tmp.logBase2() + 1;
630}
631
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000632// From http://www.burtleburtle.net, byBob Jenkins.
633// When targeting x86, both GCC and LLVM seem to recognize this as a
634// rotate instruction.
635#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000636
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000637// From http://www.burtleburtle.net, by Bob Jenkins.
638#define mix(a,b,c) \
639 { \
640 a -= c; a ^= rot(c, 4); c += b; \
641 b -= a; b ^= rot(a, 6); a += c; \
642 c -= b; c ^= rot(b, 8); b += a; \
643 a -= c; a ^= rot(c,16); c += b; \
644 b -= a; b ^= rot(a,19); a += c; \
645 c -= b; c ^= rot(b, 4); b += a; \
646 }
647
648// From http://www.burtleburtle.net, by Bob Jenkins.
649#define final(a,b,c) \
650 { \
651 c ^= b; c -= rot(b,14); \
652 a ^= c; a -= rot(c,11); \
653 b ^= a; b -= rot(a,25); \
654 c ^= b; c -= rot(b,16); \
655 a ^= c; a -= rot(c,4); \
656 b ^= a; b -= rot(a,14); \
657 c ^= b; c -= rot(b,24); \
658 }
659
660// hashword() was adapted from http://www.burtleburtle.net, by Bob
661// Jenkins. k is a pointer to an array of uint32_t values; length is
662// the length of the key, in 32-bit chunks. This version only handles
663// keys that are a multiple of 32 bits in size.
664static inline uint32_t hashword(const uint64_t *k64, size_t length)
665{
666 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
667 uint32_t a,b,c;
668
669 /* Set up the internal state */
670 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
671
672 /*------------------------------------------------- handle most of the key */
673 while (length > 3)
674 {
675 a += k[0];
676 b += k[1];
677 c += k[2];
678 mix(a,b,c);
679 length -= 3;
680 k += 3;
681 }
682
683 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stump7134bb52009-05-13 23:23:20 +0000684 switch (length) { /* all the case statements fall through */
685 case 3 : c+=k[2];
686 case 2 : b+=k[1];
687 case 1 : a+=k[0];
688 final(a,b,c);
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000689 case 0: /* case 0: nothing left to add */
690 break;
691 }
692 /*------------------------------------------------------ report the result */
693 return c;
694}
695
696// hashword8() was adapted from http://www.burtleburtle.net, by Bob
697// Jenkins. This computes a 32-bit hash from one 64-bit word. When
698// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
699// function into about 35 instructions when inlined.
700static inline uint32_t hashword8(const uint64_t k64)
701{
702 uint32_t a,b,c;
703 a = b = c = 0xdeadbeef + 4;
704 b += k64 >> 32;
705 a += k64 & 0xffffffff;
706 final(a,b,c);
707 return c;
708}
709#undef final
710#undef mix
711#undef rot
712
713uint64_t APInt::getHashValue() const {
714 uint64_t hash;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000715 if (isSingleWord())
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000716 hash = hashword8(VAL);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000717 else
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000718 hash = hashword(pVal, getNumWords()*2);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000719 return hash;
720}
721
722/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattneree5417c2009-01-21 18:09:24 +0000723APInt APInt::getHiBits(unsigned numBits) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000724 return APIntOps::lshr(*this, BitWidth - numBits);
725}
726
727/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattneree5417c2009-01-21 18:09:24 +0000728APInt APInt::getLoBits(unsigned numBits) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000729 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
730 BitWidth - numBits);
731}
732
733bool APInt::isPowerOf2() const {
734 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
735}
736
Chris Lattneree5417c2009-01-21 18:09:24 +0000737unsigned APInt::countLeadingZerosSlowCase() const {
738 unsigned Count = 0;
739 for (unsigned i = getNumWords(); i > 0u; --i) {
Chris Lattner84886852008-08-20 17:02:31 +0000740 if (pVal[i-1] == 0)
741 Count += APINT_BITS_PER_WORD;
742 else {
743 Count += CountLeadingZeros_64(pVal[i-1]);
744 break;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000745 }
746 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000747 unsigned remainder = BitWidth % APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000748 if (remainder)
749 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner00b08ce2007-11-23 22:42:31 +0000750 return std::min(Count, BitWidth);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000751}
752
Chris Lattneree5417c2009-01-21 18:09:24 +0000753static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
754 unsigned Count = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000755 if (skip)
756 V <<= skip;
757 while (V && (V & (1ULL << 63))) {
758 Count++;
759 V <<= 1;
760 }
761 return Count;
762}
763
Chris Lattneree5417c2009-01-21 18:09:24 +0000764unsigned APInt::countLeadingOnes() const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000765 if (isSingleWord())
766 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
767
Chris Lattneree5417c2009-01-21 18:09:24 +0000768 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
edwinb95462a2009-01-27 18:06:03 +0000769 unsigned shift;
770 if (!highWordBits) {
771 highWordBits = APINT_BITS_PER_WORD;
772 shift = 0;
773 } else {
774 shift = APINT_BITS_PER_WORD - highWordBits;
775 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000776 int i = getNumWords() - 1;
Chris Lattneree5417c2009-01-21 18:09:24 +0000777 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000778 if (Count == highWordBits) {
779 for (i--; i >= 0; --i) {
780 if (pVal[i] == -1ULL)
781 Count += APINT_BITS_PER_WORD;
782 else {
783 Count += countLeadingOnes_64(pVal[i], 0);
784 break;
785 }
786 }
787 }
788 return Count;
789}
790
Chris Lattneree5417c2009-01-21 18:09:24 +0000791unsigned APInt::countTrailingZeros() const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000792 if (isSingleWord())
Chris Lattneree5417c2009-01-21 18:09:24 +0000793 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
794 unsigned Count = 0;
795 unsigned i = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000796 for (; i < getNumWords() && pVal[i] == 0; ++i)
797 Count += APINT_BITS_PER_WORD;
798 if (i < getNumWords())
799 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner9ee26cf2007-11-23 22:36:25 +0000800 return std::min(Count, BitWidth);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000801}
802
Chris Lattneree5417c2009-01-21 18:09:24 +0000803unsigned APInt::countTrailingOnesSlowCase() const {
804 unsigned Count = 0;
805 unsigned i = 0;
Dan Gohmane4428412008-02-14 22:38:45 +0000806 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohmanf550d412008-02-13 21:11:05 +0000807 Count += APINT_BITS_PER_WORD;
808 if (i < getNumWords())
809 Count += CountTrailingOnes_64(pVal[i]);
810 return std::min(Count, BitWidth);
811}
812
Chris Lattneree5417c2009-01-21 18:09:24 +0000813unsigned APInt::countPopulationSlowCase() const {
814 unsigned Count = 0;
815 for (unsigned i = 0; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000816 Count += CountPopulation_64(pVal[i]);
817 return Count;
818}
819
820APInt APInt::byteSwap() const {
821 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
822 if (BitWidth == 16)
823 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
824 else if (BitWidth == 32)
Chris Lattneree5417c2009-01-21 18:09:24 +0000825 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000826 else if (BitWidth == 48) {
Chris Lattneree5417c2009-01-21 18:09:24 +0000827 unsigned Tmp1 = unsigned(VAL >> 16);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000828 Tmp1 = ByteSwap_32(Tmp1);
829 uint16_t Tmp2 = uint16_t(VAL);
830 Tmp2 = ByteSwap_16(Tmp2);
831 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
832 } else if (BitWidth == 64)
833 return APInt(BitWidth, ByteSwap_64(VAL));
834 else {
835 APInt Result(BitWidth, 0);
836 char *pByte = (char*)Result.pVal;
Chris Lattneree5417c2009-01-21 18:09:24 +0000837 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000838 char Tmp = pByte[i];
839 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
840 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
841 }
842 return Result;
843 }
844}
845
846APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
847 const APInt& API2) {
848 APInt A = API1, B = API2;
849 while (!!B) {
850 APInt T = B;
851 B = APIntOps::urem(A, B);
852 A = T;
853 }
854 return A;
855}
856
Chris Lattneree5417c2009-01-21 18:09:24 +0000857APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000858 union {
859 double D;
860 uint64_t I;
861 } T;
862 T.D = Double;
863
864 // Get the sign bit from the highest order bit
865 bool isNeg = T.I >> 63;
866
867 // Get the 11-bit exponent and adjust for the 1023 bit bias
868 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
869
870 // If the exponent is negative, the value is < 0 so just return 0.
871 if (exp < 0)
872 return APInt(width, 0u);
873
874 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
875 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
876
877 // If the exponent doesn't shift all bits out of the mantissa
878 if (exp < 52)
879 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
880 APInt(width, mantissa >> (52 - exp));
881
882 // If the client didn't provide enough bits for us to shift the mantissa into
883 // then the result is undefined, just return 0
884 if (width <= exp - 52)
885 return APInt(width, 0);
886
887 // Otherwise, we have to shift the mantissa bits up to the right location
888 APInt Tmp(width, mantissa);
Chris Lattneree5417c2009-01-21 18:09:24 +0000889 Tmp = Tmp.shl((unsigned)exp - 52);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000890 return isNeg ? -Tmp : Tmp;
891}
892
Dale Johannesene326f252009-08-12 18:04:11 +0000893/// RoundToDouble - This function converts this APInt to a double.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000894/// The layout for double is as following (IEEE Standard 754):
895/// --------------------------------------
896/// | Sign Exponent Fraction Bias |
897/// |-------------------------------------- |
898/// | 1[63] 11[62-52] 52[51-00] 1023 |
899/// --------------------------------------
900double APInt::roundToDouble(bool isSigned) const {
901
902 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesene326f252009-08-12 18:04:11 +0000903 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000904 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
905 if (isSigned) {
Dale Johannesen25210cd2009-08-12 17:42:34 +0000906 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000907 return double(sext);
908 } else
Dale Johannesen25210cd2009-08-12 17:42:34 +0000909 return double(getWord(0));
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000910 }
911
912 // Determine if the value is negative.
913 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
914
915 // Construct the absolute value if we're negative.
916 APInt Tmp(isNeg ? -(*this) : (*this));
917
918 // Figure out how many bits we're using.
Chris Lattneree5417c2009-01-21 18:09:24 +0000919 unsigned n = Tmp.getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000920
921 // The exponent (without bias normalization) is just the number of bits
922 // we are using. Note that the sign bit is gone since we constructed the
923 // absolute value.
924 uint64_t exp = n;
925
926 // Return infinity for exponent overflow
927 if (exp > 1023) {
928 if (!isSigned || !isNeg)
929 return std::numeric_limits<double>::infinity();
930 else
931 return -std::numeric_limits<double>::infinity();
932 }
933 exp += 1023; // Increment for 1023 bias
934
935 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
936 // extract the high 52 bits from the correct words in pVal.
937 uint64_t mantissa;
938 unsigned hiWord = whichWord(n-1);
939 if (hiWord == 0) {
940 mantissa = Tmp.pVal[0];
941 if (n > 52)
942 mantissa >>= n - 52; // shift down, we want the top 52 bits.
943 } else {
944 assert(hiWord > 0 && "huh?");
945 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
946 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
947 mantissa = hibits | lobits;
948 }
949
950 // The leading bit of mantissa is implicit, so get rid of it.
951 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
952 union {
953 double D;
954 uint64_t I;
955 } T;
956 T.I = sign | (exp << 52) | mantissa;
957 return T.D;
958}
959
960// Truncate to new width.
Chris Lattneree5417c2009-01-21 18:09:24 +0000961APInt &APInt::trunc(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000962 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner84886852008-08-20 17:02:31 +0000963 assert(width && "Can't truncate to 0 bits");
Chris Lattneree5417c2009-01-21 18:09:24 +0000964 unsigned wordsBefore = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000965 BitWidth = width;
Chris Lattneree5417c2009-01-21 18:09:24 +0000966 unsigned wordsAfter = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000967 if (wordsBefore != wordsAfter) {
968 if (wordsAfter == 1) {
969 uint64_t *tmp = pVal;
970 VAL = pVal[0];
971 delete [] tmp;
972 } else {
973 uint64_t *newVal = getClearedMemory(wordsAfter);
Chris Lattneree5417c2009-01-21 18:09:24 +0000974 for (unsigned i = 0; i < wordsAfter; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000975 newVal[i] = pVal[i];
976 delete [] pVal;
977 pVal = newVal;
978 }
979 }
980 return clearUnusedBits();
981}
982
983// Sign extend to a new width.
Chris Lattneree5417c2009-01-21 18:09:24 +0000984APInt &APInt::sext(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000985 assert(width > BitWidth && "Invalid APInt SignExtend request");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000986 // If the sign bit isn't set, this is the same as zext.
987 if (!isNegative()) {
988 zext(width);
989 return *this;
990 }
991
992 // The sign bit is set. First, get some facts
Chris Lattneree5417c2009-01-21 18:09:24 +0000993 unsigned wordsBefore = getNumWords();
994 unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000995 BitWidth = width;
Chris Lattneree5417c2009-01-21 18:09:24 +0000996 unsigned wordsAfter = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000997
998 // Mask the high order word appropriately
999 if (wordsBefore == wordsAfter) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001000 unsigned newWordBits = width % APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001001 // The extension is contained to the wordsBefore-1th word.
1002 uint64_t mask = ~0ULL;
1003 if (newWordBits)
1004 mask >>= APINT_BITS_PER_WORD - newWordBits;
1005 mask <<= wordBits;
1006 if (wordsBefore == 1)
1007 VAL |= mask;
1008 else
1009 pVal[wordsBefore-1] |= mask;
1010 return clearUnusedBits();
1011 }
1012
1013 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
1014 uint64_t *newVal = getMemory(wordsAfter);
1015 if (wordsBefore == 1)
1016 newVal[0] = VAL | mask;
1017 else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001018 for (unsigned i = 0; i < wordsBefore; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001019 newVal[i] = pVal[i];
1020 newVal[wordsBefore-1] |= mask;
1021 }
Chris Lattneree5417c2009-01-21 18:09:24 +00001022 for (unsigned i = wordsBefore; i < wordsAfter; i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001023 newVal[i] = -1ULL;
1024 if (wordsBefore != 1)
1025 delete [] pVal;
1026 pVal = newVal;
1027 return clearUnusedBits();
1028}
1029
1030// Zero extend to a new width.
Chris Lattneree5417c2009-01-21 18:09:24 +00001031APInt &APInt::zext(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001032 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Chris Lattneree5417c2009-01-21 18:09:24 +00001033 unsigned wordsBefore = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001034 BitWidth = width;
Chris Lattneree5417c2009-01-21 18:09:24 +00001035 unsigned wordsAfter = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001036 if (wordsBefore != wordsAfter) {
1037 uint64_t *newVal = getClearedMemory(wordsAfter);
1038 if (wordsBefore == 1)
1039 newVal[0] = VAL;
1040 else
Chris Lattneree5417c2009-01-21 18:09:24 +00001041 for (unsigned i = 0; i < wordsBefore; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001042 newVal[i] = pVal[i];
1043 if (wordsBefore != 1)
1044 delete [] pVal;
1045 pVal = newVal;
1046 }
1047 return *this;
1048}
1049
Chris Lattneree5417c2009-01-21 18:09:24 +00001050APInt &APInt::zextOrTrunc(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001051 if (BitWidth < width)
1052 return zext(width);
1053 if (BitWidth > width)
1054 return trunc(width);
1055 return *this;
1056}
1057
Chris Lattneree5417c2009-01-21 18:09:24 +00001058APInt &APInt::sextOrTrunc(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001059 if (BitWidth < width)
1060 return sext(width);
1061 if (BitWidth > width)
1062 return trunc(width);
1063 return *this;
1064}
1065
1066/// Arithmetic right-shift this APInt by shiftAmt.
1067/// @brief Arithmetic right-shift function.
Dan Gohman625ff8d2008-02-29 01:40:47 +00001068APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001069 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001070}
1071
1072/// Arithmetic right-shift this APInt by shiftAmt.
1073/// @brief Arithmetic right-shift function.
Chris Lattneree5417c2009-01-21 18:09:24 +00001074APInt APInt::ashr(unsigned shiftAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001075 assert(shiftAmt <= BitWidth && "Invalid shift amount");
1076 // Handle a degenerate case
1077 if (shiftAmt == 0)
1078 return *this;
1079
1080 // Handle single word shifts with built-in ashr
1081 if (isSingleWord()) {
1082 if (shiftAmt == BitWidth)
1083 return APInt(BitWidth, 0); // undefined
1084 else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001085 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001086 return APInt(BitWidth,
1087 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1088 }
1089 }
1090
1091 // If all the bits were shifted out, the result is, technically, undefined.
1092 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1093 // issues in the algorithm below.
1094 if (shiftAmt == BitWidth) {
1095 if (isNegative())
Zhou Sheng3f7ab5c2008-06-05 13:27:38 +00001096 return APInt(BitWidth, -1ULL, true);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001097 else
1098 return APInt(BitWidth, 0);
1099 }
1100
1101 // Create some space for the result.
1102 uint64_t * val = new uint64_t[getNumWords()];
1103
1104 // Compute some values needed by the following shift algorithms
Chris Lattneree5417c2009-01-21 18:09:24 +00001105 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1106 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1107 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1108 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001109 if (bitsInWord == 0)
1110 bitsInWord = APINT_BITS_PER_WORD;
1111
1112 // If we are shifting whole words, just move whole words
1113 if (wordShift == 0) {
1114 // Move the words containing significant bits
Chris Lattneree5417c2009-01-21 18:09:24 +00001115 for (unsigned i = 0; i <= breakWord; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001116 val[i] = pVal[i+offset]; // move whole word
1117
1118 // Adjust the top significant word for sign bit fill, if negative
1119 if (isNegative())
1120 if (bitsInWord < APINT_BITS_PER_WORD)
1121 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1122 } else {
1123 // Shift the low order words
Chris Lattneree5417c2009-01-21 18:09:24 +00001124 for (unsigned i = 0; i < breakWord; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001125 // This combines the shifted corresponding word with the low bits from
1126 // the next word (shifted into this word's high bits).
1127 val[i] = (pVal[i+offset] >> wordShift) |
1128 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1129 }
1130
1131 // Shift the break word. In this case there are no bits from the next word
1132 // to include in this word.
1133 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1134
1135 // Deal with sign extenstion in the break word, and possibly the word before
1136 // it.
1137 if (isNegative()) {
1138 if (wordShift > bitsInWord) {
1139 if (breakWord > 0)
1140 val[breakWord-1] |=
1141 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1142 val[breakWord] |= ~0ULL;
1143 } else
1144 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
1145 }
1146 }
1147
1148 // Remaining words are 0 or -1, just assign them.
1149 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattneree5417c2009-01-21 18:09:24 +00001150 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001151 val[i] = fillValue;
1152 return APInt(val, BitWidth).clearUnusedBits();
1153}
1154
1155/// Logical right-shift this APInt by shiftAmt.
1156/// @brief Logical right-shift function.
Dan Gohman625ff8d2008-02-29 01:40:47 +00001157APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001158 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001159}
1160
1161/// Logical right-shift this APInt by shiftAmt.
1162/// @brief Logical right-shift function.
Chris Lattneree5417c2009-01-21 18:09:24 +00001163APInt APInt::lshr(unsigned shiftAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001164 if (isSingleWord()) {
1165 if (shiftAmt == BitWidth)
1166 return APInt(BitWidth, 0);
1167 else
1168 return APInt(BitWidth, this->VAL >> shiftAmt);
1169 }
1170
1171 // If all the bits were shifted out, the result is 0. This avoids issues
1172 // with shifting by the size of the integer type, which produces undefined
1173 // results. We define these "undefined results" to always be 0.
1174 if (shiftAmt == BitWidth)
1175 return APInt(BitWidth, 0);
1176
1177 // If none of the bits are shifted out, the result is *this. This avoids
Nick Lewycky11df0fc2009-01-19 17:42:33 +00001178 // issues with shifting by the size of the integer type, which produces
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001179 // undefined results in the code below. This is also an optimization.
1180 if (shiftAmt == 0)
1181 return *this;
1182
1183 // Create some space for the result.
1184 uint64_t * val = new uint64_t[getNumWords()];
1185
1186 // If we are shifting less than a word, compute the shift with a simple carry
1187 if (shiftAmt < APINT_BITS_PER_WORD) {
1188 uint64_t carry = 0;
1189 for (int i = getNumWords()-1; i >= 0; --i) {
1190 val[i] = (pVal[i] >> shiftAmt) | carry;
1191 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1192 }
1193 return APInt(val, BitWidth).clearUnusedBits();
1194 }
1195
1196 // Compute some values needed by the remaining shift algorithms
Chris Lattneree5417c2009-01-21 18:09:24 +00001197 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1198 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001199
1200 // If we are shifting whole words, just move whole words
1201 if (wordShift == 0) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001202 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001203 val[i] = pVal[i+offset];
Chris Lattneree5417c2009-01-21 18:09:24 +00001204 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001205 val[i] = 0;
1206 return APInt(val,BitWidth).clearUnusedBits();
1207 }
1208
1209 // Shift the low order words
Chris Lattneree5417c2009-01-21 18:09:24 +00001210 unsigned breakWord = getNumWords() - offset -1;
1211 for (unsigned i = 0; i < breakWord; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001212 val[i] = (pVal[i+offset] >> wordShift) |
1213 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1214 // Shift the break word.
1215 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1216
1217 // Remaining words are 0
Chris Lattneree5417c2009-01-21 18:09:24 +00001218 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001219 val[i] = 0;
1220 return APInt(val, BitWidth).clearUnusedBits();
1221}
1222
1223/// Left-shift this APInt by shiftAmt.
1224/// @brief Left-shift function.
Dan Gohman625ff8d2008-02-29 01:40:47 +00001225APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky11df0fc2009-01-19 17:42:33 +00001226 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattneree5417c2009-01-21 18:09:24 +00001227 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001228}
1229
Chris Lattneree5417c2009-01-21 18:09:24 +00001230APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001231 // If all the bits were shifted out, the result is 0. This avoids issues
1232 // with shifting by the size of the integer type, which produces undefined
1233 // results. We define these "undefined results" to always be 0.
1234 if (shiftAmt == BitWidth)
1235 return APInt(BitWidth, 0);
1236
1237 // If none of the bits are shifted out, the result is *this. This avoids a
1238 // lshr by the words size in the loop below which can produce incorrect
1239 // results. It also avoids the expensive computation below for a common case.
1240 if (shiftAmt == 0)
1241 return *this;
1242
1243 // Create some space for the result.
1244 uint64_t * val = new uint64_t[getNumWords()];
1245
1246 // If we are shifting less than a word, do it the easy way
1247 if (shiftAmt < APINT_BITS_PER_WORD) {
1248 uint64_t carry = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +00001249 for (unsigned i = 0; i < getNumWords(); i++) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001250 val[i] = pVal[i] << shiftAmt | carry;
1251 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1252 }
1253 return APInt(val, BitWidth).clearUnusedBits();
1254 }
1255
1256 // Compute some values needed by the remaining shift algorithms
Chris Lattneree5417c2009-01-21 18:09:24 +00001257 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1258 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001259
1260 // If we are shifting whole words, just move whole words
1261 if (wordShift == 0) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001262 for (unsigned i = 0; i < offset; i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001263 val[i] = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +00001264 for (unsigned i = offset; i < getNumWords(); i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001265 val[i] = pVal[i-offset];
1266 return APInt(val,BitWidth).clearUnusedBits();
1267 }
1268
1269 // Copy whole words from this to Result.
Chris Lattneree5417c2009-01-21 18:09:24 +00001270 unsigned i = getNumWords() - 1;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001271 for (; i > offset; --i)
1272 val[i] = pVal[i-offset] << wordShift |
1273 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
1274 val[offset] = pVal[0] << wordShift;
1275 for (i = 0; i < offset; ++i)
1276 val[i] = 0;
1277 return APInt(val, BitWidth).clearUnusedBits();
1278}
1279
Dan Gohman625ff8d2008-02-29 01:40:47 +00001280APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001281 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001282}
1283
Chris Lattneree5417c2009-01-21 18:09:24 +00001284APInt APInt::rotl(unsigned rotateAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001285 if (rotateAmt == 0)
1286 return *this;
1287 // Don't get too fancy, just use existing shift/or facilities
1288 APInt hi(*this);
1289 APInt lo(*this);
1290 hi.shl(rotateAmt);
1291 lo.lshr(BitWidth - rotateAmt);
1292 return hi | lo;
1293}
1294
Dan Gohman625ff8d2008-02-29 01:40:47 +00001295APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001296 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001297}
1298
Chris Lattneree5417c2009-01-21 18:09:24 +00001299APInt APInt::rotr(unsigned rotateAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001300 if (rotateAmt == 0)
1301 return *this;
1302 // Don't get too fancy, just use existing shift/or facilities
1303 APInt hi(*this);
1304 APInt lo(*this);
1305 lo.lshr(rotateAmt);
1306 hi.shl(BitWidth - rotateAmt);
1307 return hi | lo;
1308}
1309
1310// Square Root - this method computes and returns the square root of "this".
1311// Three mechanisms are used for computation. For small values (<= 5 bits),
1312// a table lookup is done. This gets some performance for common cases. For
1313// values using less than 52 bits, the value is converted to double and then
1314// the libc sqrt function is called. The result is rounded and then converted
1315// back to a uint64_t which is then used to construct the result. Finally,
1316// the Babylonian method for computing square roots is used.
1317APInt APInt::sqrt() const {
1318
1319 // Determine the magnitude of the value.
Chris Lattneree5417c2009-01-21 18:09:24 +00001320 unsigned magnitude = getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001321
1322 // Use a fast table for some small values. This also gets rid of some
1323 // rounding errors in libc sqrt for small values.
1324 if (magnitude <= 5) {
1325 static const uint8_t results[32] = {
1326 /* 0 */ 0,
1327 /* 1- 2 */ 1, 1,
1328 /* 3- 6 */ 2, 2, 2, 2,
1329 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1330 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1331 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1332 /* 31 */ 6
1333 };
1334 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
1335 }
1336
1337 // If the magnitude of the value fits in less than 52 bits (the precision of
1338 // an IEEE double precision floating point value), then we can use the
1339 // libc sqrt function which will probably use a hardware sqrt computation.
1340 // This should be faster than the algorithm below.
1341 if (magnitude < 52) {
1342#ifdef _MSC_VER
1343 // Amazingly, VC++ doesn't have round().
1344 return APInt(BitWidth,
1345 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1346#else
1347 return APInt(BitWidth,
1348 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
1349#endif
1350 }
1351
1352 // Okay, all the short cuts are exhausted. We must compute it. The following
1353 // is a classical Babylonian method for computing the square root. This code
1354 // was adapted to APINt from a wikipedia article on such computations.
1355 // See http://www.wikipedia.org/ and go to the page named
1356 // Calculate_an_integer_square_root.
Chris Lattneree5417c2009-01-21 18:09:24 +00001357 unsigned nbits = BitWidth, i = 4;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001358 APInt testy(BitWidth, 16);
1359 APInt x_old(BitWidth, 1);
1360 APInt x_new(BitWidth, 0);
1361 APInt two(BitWidth, 2);
1362
1363 // Select a good starting value using binary logarithms.
1364 for (;; i += 2, testy = testy.shl(2))
1365 if (i >= nbits || this->ule(testy)) {
1366 x_old = x_old.shl(i / 2);
1367 break;
1368 }
1369
1370 // Use the Babylonian method to arrive at the integer square root:
1371 for (;;) {
1372 x_new = (this->udiv(x_old) + x_old).udiv(two);
1373 if (x_old.ule(x_new))
1374 break;
1375 x_old = x_new;
1376 }
1377
1378 // Make sure we return the closest approximation
1379 // NOTE: The rounding calculation below is correct. It will produce an
1380 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
1381 // determined to be a rounding issue with pari/gp as it begins to use a
1382 // floating point representation after 192 bits. There are no discrepancies
1383 // between this algorithm and pari/gp for bit widths < 192 bits.
1384 APInt square(x_old * x_old);
1385 APInt nextSquare((x_old + 1) * (x_old +1));
1386 if (this->ult(square))
1387 return x_old;
1388 else if (this->ule(nextSquare)) {
1389 APInt midpoint((nextSquare - square).udiv(two));
1390 APInt offset(*this - square);
1391 if (offset.ult(midpoint))
1392 return x_old;
1393 else
1394 return x_old + 1;
1395 } else
Edwin Törökbd448e32009-07-14 16:55:14 +00001396 llvm_unreachable("Error in APInt::sqrt computation");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001397 return x_old + 1;
1398}
1399
Wojciech Matyjewicz1f1e0882008-06-23 19:39:50 +00001400/// Computes the multiplicative inverse of this APInt for a given modulo. The
1401/// iterative extended Euclidean algorithm is used to solve for this value,
1402/// however we simplify it to speed up calculating only the inverse, and take
1403/// advantage of div+rem calculations. We also use some tricks to avoid copying
1404/// (potentially large) APInts around.
1405APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1406 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1407
1408 // Using the properties listed at the following web page (accessed 06/21/08):
1409 // http://www.numbertheory.org/php/euclid.html
1410 // (especially the properties numbered 3, 4 and 9) it can be proved that
1411 // BitWidth bits suffice for all the computations in the algorithm implemented
1412 // below. More precisely, this number of bits suffice if the multiplicative
1413 // inverse exists, but may not suffice for the general extended Euclidean
1414 // algorithm.
1415
1416 APInt r[2] = { modulo, *this };
1417 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1418 APInt q(BitWidth, 0);
1419
1420 unsigned i;
1421 for (i = 0; r[i^1] != 0; i ^= 1) {
1422 // An overview of the math without the confusing bit-flipping:
1423 // q = r[i-2] / r[i-1]
1424 // r[i] = r[i-2] % r[i-1]
1425 // t[i] = t[i-2] - t[i-1] * q
1426 udivrem(r[i], r[i^1], q, r[i]);
1427 t[i] -= t[i^1] * q;
1428 }
1429
1430 // If this APInt and the modulo are not coprime, there is no multiplicative
1431 // inverse, so return 0. We check this by looking at the next-to-last
1432 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1433 // algorithm.
1434 if (r[i] != 1)
1435 return APInt(BitWidth, 0);
1436
1437 // The next-to-last t is the multiplicative inverse. However, we are
1438 // interested in a positive inverse. Calcuate a positive one from a negative
1439 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewicz961b34c2008-07-20 15:55:14 +00001440 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz1f1e0882008-06-23 19:39:50 +00001441 return t[i].isNegative() ? t[i] + modulo : t[i];
1442}
1443
Jay Foad56b11f92009-04-30 10:15:35 +00001444/// Calculate the magic numbers required to implement a signed integer division
1445/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1446/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1447/// Warren, Jr., chapter 10.
1448APInt::ms APInt::magic() const {
1449 const APInt& d = *this;
1450 unsigned p;
1451 APInt ad, anc, delta, q1, r1, q2, r2, t;
1452 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1453 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1454 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1455 struct ms mag;
1456
1457 ad = d.abs();
1458 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1459 anc = t - 1 - t.urem(ad); // absolute value of nc
1460 p = d.getBitWidth() - 1; // initialize p
1461 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1462 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1463 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1464 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1465 do {
1466 p = p + 1;
1467 q1 = q1<<1; // update q1 = 2p/abs(nc)
1468 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1469 if (r1.uge(anc)) { // must be unsigned comparison
1470 q1 = q1 + 1;
1471 r1 = r1 - anc;
1472 }
1473 q2 = q2<<1; // update q2 = 2p/abs(d)
1474 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1475 if (r2.uge(ad)) { // must be unsigned comparison
1476 q2 = q2 + 1;
1477 r2 = r2 - ad;
1478 }
1479 delta = ad - r2;
1480 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
1481
1482 mag.m = q2 + 1;
1483 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1484 mag.s = p - d.getBitWidth(); // resulting shift
1485 return mag;
1486}
1487
1488/// Calculate the magic numbers required to implement an unsigned integer
1489/// division by a constant as a sequence of multiplies, adds and shifts.
1490/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1491/// S. Warren, Jr., chapter 10.
1492APInt::mu APInt::magicu() const {
1493 const APInt& d = *this;
1494 unsigned p;
1495 APInt nc, delta, q1, r1, q2, r2;
1496 struct mu magu;
1497 magu.a = 0; // initialize "add" indicator
1498 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1499 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1500 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1501
1502 nc = allOnes - (-d).urem(d);
1503 p = d.getBitWidth() - 1; // initialize p
1504 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1505 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1506 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1507 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1508 do {
1509 p = p + 1;
1510 if (r1.uge(nc - r1)) {
1511 q1 = q1 + q1 + 1; // update q1
1512 r1 = r1 + r1 - nc; // update r1
1513 }
1514 else {
1515 q1 = q1+q1; // update q1
1516 r1 = r1+r1; // update r1
1517 }
1518 if ((r2 + 1).uge(d - r2)) {
1519 if (q2.uge(signedMax)) magu.a = 1;
1520 q2 = q2+q2 + 1; // update q2
1521 r2 = r2+r2 + 1 - d; // update r2
1522 }
1523 else {
1524 if (q2.uge(signedMin)) magu.a = 1;
1525 q2 = q2+q2; // update q2
1526 r2 = r2+r2 + 1; // update r2
1527 }
1528 delta = d - 1 - r2;
1529 } while (p < d.getBitWidth()*2 &&
1530 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1531 magu.m = q2 + 1; // resulting magic number
1532 magu.s = p - d.getBitWidth(); // resulting shift
1533 return magu;
1534}
1535
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001536/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1537/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1538/// variables here have the same names as in the algorithm. Comments explain
1539/// the algorithm and any deviation from it.
Chris Lattneree5417c2009-01-21 18:09:24 +00001540static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1541 unsigned m, unsigned n) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001542 assert(u && "Must provide dividend");
1543 assert(v && "Must provide divisor");
1544 assert(q && "Must provide quotient");
1545 assert(u != v && u != q && v != q && "Must us different memory");
1546 assert(n>1 && "n must be > 1");
1547
1548 // Knuth uses the value b as the base of the number system. In our case b
1549 // is 2^31 so we just set it to -1u.
1550 uint64_t b = uint64_t(1) << 32;
1551
Chris Lattner89b36582008-08-17 07:19:36 +00001552#if 0
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001553 DEBUG(errs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1554 DEBUG(errs() << "KnuthDiv: original:");
1555 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1556 DEBUG(errs() << " by");
1557 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1558 DEBUG(errs() << '\n');
Chris Lattner89b36582008-08-17 07:19:36 +00001559#endif
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001560 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1561 // u and v by d. Note that we have taken Knuth's advice here to use a power
1562 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1563 // 2 allows us to shift instead of multiply and it is easy to determine the
1564 // shift amount from the leading zeros. We are basically normalizing the u
1565 // and v so that its high bits are shifted to the top of v's range without
1566 // overflow. Note that this can require an extra word in u so that u must
1567 // be of length m+n+1.
Chris Lattneree5417c2009-01-21 18:09:24 +00001568 unsigned shift = CountLeadingZeros_32(v[n-1]);
1569 unsigned v_carry = 0;
1570 unsigned u_carry = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001571 if (shift) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001572 for (unsigned i = 0; i < m+n; ++i) {
1573 unsigned u_tmp = u[i] >> (32 - shift);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001574 u[i] = (u[i] << shift) | u_carry;
1575 u_carry = u_tmp;
1576 }
Chris Lattneree5417c2009-01-21 18:09:24 +00001577 for (unsigned i = 0; i < n; ++i) {
1578 unsigned v_tmp = v[i] >> (32 - shift);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001579 v[i] = (v[i] << shift) | v_carry;
1580 v_carry = v_tmp;
1581 }
1582 }
1583 u[m+n] = u_carry;
Chris Lattner89b36582008-08-17 07:19:36 +00001584#if 0
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001585 DEBUG(errs() << "KnuthDiv: normal:");
1586 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1587 DEBUG(errs() << " by");
1588 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1589 DEBUG(errs() << '\n');
Chris Lattner89b36582008-08-17 07:19:36 +00001590#endif
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001591
1592 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1593 int j = m;
1594 do {
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001595 DEBUG(errs() << "KnuthDiv: quotient digit #" << j << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001596 // D3. [Calculate q'.].
1597 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1598 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1599 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1600 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1601 // on v[n-2] determines at high speed most of the cases in which the trial
1602 // value qp is one too large, and it eliminates all cases where qp is two
1603 // too large.
1604 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001605 DEBUG(errs() << "KnuthDiv: dividend == " << dividend << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001606 uint64_t qp = dividend / v[n-1];
1607 uint64_t rp = dividend % v[n-1];
1608 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1609 qp--;
1610 rp += v[n-1];
1611 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
1612 qp--;
1613 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001614 DEBUG(errs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001615
1616 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1617 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1618 // consists of a simple multiplication by a one-place number, combined with
1619 // a subtraction.
1620 bool isNeg = false;
Chris Lattneree5417c2009-01-21 18:09:24 +00001621 for (unsigned i = 0; i < n; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001622 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
1623 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
1624 bool borrow = subtrahend > u_tmp;
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001625 DEBUG(errs() << "KnuthDiv: u_tmp == " << u_tmp
1626 << ", subtrahend == " << subtrahend
1627 << ", borrow = " << borrow << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001628
1629 uint64_t result = u_tmp - subtrahend;
Chris Lattneree5417c2009-01-21 18:09:24 +00001630 unsigned k = j + i;
1631 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1632 u[k++] = (unsigned)(result >> 32); // subtract high word
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001633 while (borrow && k <= m+n) { // deal with borrow to the left
1634 borrow = u[k] == 0;
1635 u[k]--;
1636 k++;
1637 }
1638 isNeg |= borrow;
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001639 DEBUG(errs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001640 u[j+i+1] << '\n');
1641 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001642 DEBUG(errs() << "KnuthDiv: after subtraction:");
1643 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1644 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001645 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1646 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1647 // true value plus b**(n+1), namely as the b's complement of
1648 // the true value, and a "borrow" to the left should be remembered.
1649 //
1650 if (isNeg) {
1651 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattneree5417c2009-01-21 18:09:24 +00001652 for (unsigned i = 0; i <= m+n; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001653 u[i] = ~u[i] + carry; // b's complement
1654 carry = carry && u[i] == 0;
1655 }
1656 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001657 DEBUG(errs() << "KnuthDiv: after complement:");
1658 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1659 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001660
1661 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
1662 // negative, go to step D6; otherwise go on to step D7.
Chris Lattneree5417c2009-01-21 18:09:24 +00001663 q[j] = (unsigned)qp;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001664 if (isNeg) {
1665 // D6. [Add back]. The probability that this step is necessary is very
1666 // small, on the order of only 2/b. Make sure that test data accounts for
1667 // this possibility. Decrease q[j] by 1
1668 q[j]--;
1669 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1670 // A carry will occur to the left of u[j+n], and it should be ignored
1671 // since it cancels with the borrow that occurred in D4.
1672 bool carry = false;
Chris Lattneree5417c2009-01-21 18:09:24 +00001673 for (unsigned i = 0; i < n; i++) {
1674 unsigned limit = std::min(u[j+i],v[i]);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001675 u[j+i] += v[i] + carry;
1676 carry = u[j+i] < limit || (carry && u[j+i] == limit);
1677 }
1678 u[j+n] += carry;
1679 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001680 DEBUG(errs() << "KnuthDiv: after correction:");
1681 DEBUG(for (int i = m+n; i >=0; i--) errs() <<" " << u[i]);
1682 DEBUG(errs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001683
1684 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1685 } while (--j >= 0);
1686
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001687 DEBUG(errs() << "KnuthDiv: quotient:");
1688 DEBUG(for (int i = m; i >=0; i--) errs() <<" " << q[i]);
1689 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001690
1691 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1692 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1693 // compute the remainder (urem uses this).
1694 if (r) {
1695 // The value d is expressed by the "shift" value above since we avoided
1696 // multiplication by d by using a shift left. So, all we have to do is
1697 // shift right here. In order to mak
1698 if (shift) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001699 unsigned carry = 0;
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001700 DEBUG(errs() << "KnuthDiv: remainder:");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001701 for (int i = n-1; i >= 0; i--) {
1702 r[i] = (u[i] >> shift) | carry;
1703 carry = u[i] << (32 - shift);
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001704 DEBUG(errs() << " " << r[i]);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001705 }
1706 } else {
1707 for (int i = n-1; i >= 0; i--) {
1708 r[i] = u[i];
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001709 DEBUG(errs() << " " << r[i]);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001710 }
1711 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001712 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001713 }
Chris Lattner89b36582008-08-17 07:19:36 +00001714#if 0
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001715 DEBUG(errs() << '\n');
Chris Lattner89b36582008-08-17 07:19:36 +00001716#endif
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001717}
1718
Chris Lattneree5417c2009-01-21 18:09:24 +00001719void APInt::divide(const APInt LHS, unsigned lhsWords,
1720 const APInt &RHS, unsigned rhsWords,
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001721 APInt *Quotient, APInt *Remainder)
1722{
1723 assert(lhsWords >= rhsWords && "Fractional result");
1724
1725 // First, compose the values into an array of 32-bit words instead of
1726 // 64-bit words. This is a necessity of both the "short division" algorithm
1727 // and the the Knuth "classical algorithm" which requires there to be native
1728 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1729 // can't use 64-bit operands here because we don't have native results of
Duncan Sandsf3a74072009-03-19 11:37:15 +00001730 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001731 // work on large-endian machines.
Dan Gohmand06cad62009-04-01 18:45:54 +00001732 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattneree5417c2009-01-21 18:09:24 +00001733 unsigned n = rhsWords * 2;
1734 unsigned m = (lhsWords * 2) - n;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001735
1736 // Allocate space for the temporary values we need either on the stack, if
1737 // it will fit, or on the heap if it won't.
Chris Lattneree5417c2009-01-21 18:09:24 +00001738 unsigned SPACE[128];
1739 unsigned *U = 0;
1740 unsigned *V = 0;
1741 unsigned *Q = 0;
1742 unsigned *R = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001743 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1744 U = &SPACE[0];
1745 V = &SPACE[m+n+1];
1746 Q = &SPACE[(m+n+1) + n];
1747 if (Remainder)
1748 R = &SPACE[(m+n+1) + n + (m+n)];
1749 } else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001750 U = new unsigned[m + n + 1];
1751 V = new unsigned[n];
1752 Q = new unsigned[m+n];
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001753 if (Remainder)
Chris Lattneree5417c2009-01-21 18:09:24 +00001754 R = new unsigned[n];
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001755 }
1756
1757 // Initialize the dividend
Chris Lattneree5417c2009-01-21 18:09:24 +00001758 memset(U, 0, (m+n+1)*sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001759 for (unsigned i = 0; i < lhsWords; ++i) {
1760 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattneree5417c2009-01-21 18:09:24 +00001761 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmand06cad62009-04-01 18:45:54 +00001762 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001763 }
1764 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1765
1766 // Initialize the divisor
Chris Lattneree5417c2009-01-21 18:09:24 +00001767 memset(V, 0, (n)*sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001768 for (unsigned i = 0; i < rhsWords; ++i) {
1769 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattneree5417c2009-01-21 18:09:24 +00001770 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmand06cad62009-04-01 18:45:54 +00001771 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001772 }
1773
1774 // initialize the quotient and remainder
Chris Lattneree5417c2009-01-21 18:09:24 +00001775 memset(Q, 0, (m+n) * sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001776 if (Remainder)
Chris Lattneree5417c2009-01-21 18:09:24 +00001777 memset(R, 0, n * sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001778
1779 // Now, adjust m and n for the Knuth division. n is the number of words in
1780 // the divisor. m is the number of words by which the dividend exceeds the
1781 // divisor (i.e. m+n is the length of the dividend). These sizes must not
1782 // contain any zero words or the Knuth algorithm fails.
1783 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1784 n--;
1785 m++;
1786 }
1787 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1788 m--;
1789
1790 // If we're left with only a single word for the divisor, Knuth doesn't work
1791 // so we implement the short division algorithm here. This is much simpler
1792 // and faster because we are certain that we can divide a 64-bit quantity
1793 // by a 32-bit quantity at hardware speed and short division is simply a
1794 // series of such operations. This is just like doing short division but we
1795 // are using base 2^32 instead of base 10.
1796 assert(n != 0 && "Divide by zero?");
1797 if (n == 1) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001798 unsigned divisor = V[0];
1799 unsigned remainder = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001800 for (int i = m+n-1; i >= 0; i--) {
1801 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1802 if (partial_dividend == 0) {
1803 Q[i] = 0;
1804 remainder = 0;
1805 } else if (partial_dividend < divisor) {
1806 Q[i] = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +00001807 remainder = (unsigned)partial_dividend;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001808 } else if (partial_dividend == divisor) {
1809 Q[i] = 1;
1810 remainder = 0;
1811 } else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001812 Q[i] = (unsigned)(partial_dividend / divisor);
1813 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001814 }
1815 }
1816 if (R)
1817 R[0] = remainder;
1818 } else {
1819 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1820 // case n > 1.
1821 KnuthDiv(U, V, Q, R, m, n);
1822 }
1823
1824 // If the caller wants the quotient
1825 if (Quotient) {
1826 // Set up the Quotient value's memory.
1827 if (Quotient->BitWidth != LHS.BitWidth) {
1828 if (Quotient->isSingleWord())
1829 Quotient->VAL = 0;
1830 else
1831 delete [] Quotient->pVal;
1832 Quotient->BitWidth = LHS.BitWidth;
1833 if (!Quotient->isSingleWord())
1834 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
1835 } else
1836 Quotient->clear();
1837
1838 // The quotient is in Q. Reconstitute the quotient into Quotient's low
1839 // order words.
1840 if (lhsWords == 1) {
1841 uint64_t tmp =
1842 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1843 if (Quotient->isSingleWord())
1844 Quotient->VAL = tmp;
1845 else
1846 Quotient->pVal[0] = tmp;
1847 } else {
1848 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1849 for (unsigned i = 0; i < lhsWords; ++i)
1850 Quotient->pVal[i] =
1851 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1852 }
1853 }
1854
1855 // If the caller wants the remainder
1856 if (Remainder) {
1857 // Set up the Remainder value's memory.
1858 if (Remainder->BitWidth != RHS.BitWidth) {
1859 if (Remainder->isSingleWord())
1860 Remainder->VAL = 0;
1861 else
1862 delete [] Remainder->pVal;
1863 Remainder->BitWidth = RHS.BitWidth;
1864 if (!Remainder->isSingleWord())
1865 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
1866 } else
1867 Remainder->clear();
1868
1869 // The remainder is in R. Reconstitute the remainder into Remainder's low
1870 // order words.
1871 if (rhsWords == 1) {
1872 uint64_t tmp =
1873 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1874 if (Remainder->isSingleWord())
1875 Remainder->VAL = tmp;
1876 else
1877 Remainder->pVal[0] = tmp;
1878 } else {
1879 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1880 for (unsigned i = 0; i < rhsWords; ++i)
1881 Remainder->pVal[i] =
1882 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1883 }
1884 }
1885
1886 // Clean up the memory we allocated.
1887 if (U != &SPACE[0]) {
1888 delete [] U;
1889 delete [] V;
1890 delete [] Q;
1891 delete [] R;
1892 }
1893}
1894
1895APInt APInt::udiv(const APInt& RHS) const {
1896 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
1897
1898 // First, deal with the easy case
1899 if (isSingleWord()) {
1900 assert(RHS.VAL != 0 && "Divide by zero?");
1901 return APInt(BitWidth, VAL / RHS.VAL);
1902 }
1903
1904 // Get some facts about the LHS and RHS number of bits and words
Chris Lattneree5417c2009-01-21 18:09:24 +00001905 unsigned rhsBits = RHS.getActiveBits();
1906 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001907 assert(rhsWords && "Divided by zero???");
Chris Lattneree5417c2009-01-21 18:09:24 +00001908 unsigned lhsBits = this->getActiveBits();
1909 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001910
1911 // Deal with some degenerate cases
1912 if (!lhsWords)
1913 // 0 / X ===> 0
1914 return APInt(BitWidth, 0);
1915 else if (lhsWords < rhsWords || this->ult(RHS)) {
1916 // X / Y ===> 0, iff X < Y
1917 return APInt(BitWidth, 0);
1918 } else if (*this == RHS) {
1919 // X / X ===> 1
1920 return APInt(BitWidth, 1);
1921 } else if (lhsWords == 1 && rhsWords == 1) {
1922 // All high words are zero, just use native divide
1923 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
1924 }
1925
1926 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1927 APInt Quotient(1,0); // to hold result.
1928 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1929 return Quotient;
1930}
1931
1932APInt APInt::urem(const APInt& RHS) const {
1933 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
1934 if (isSingleWord()) {
1935 assert(RHS.VAL != 0 && "Remainder by zero?");
1936 return APInt(BitWidth, VAL % RHS.VAL);
1937 }
1938
1939 // Get some facts about the LHS
Chris Lattneree5417c2009-01-21 18:09:24 +00001940 unsigned lhsBits = getActiveBits();
1941 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001942
1943 // Get some facts about the RHS
Chris Lattneree5417c2009-01-21 18:09:24 +00001944 unsigned rhsBits = RHS.getActiveBits();
1945 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001946 assert(rhsWords && "Performing remainder operation by zero ???");
1947
1948 // Check the degenerate cases
1949 if (lhsWords == 0) {
1950 // 0 % Y ===> 0
1951 return APInt(BitWidth, 0);
1952 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1953 // X % Y ===> X, iff X < Y
1954 return *this;
1955 } else if (*this == RHS) {
1956 // X % X == 0;
1957 return APInt(BitWidth, 0);
1958 } else if (lhsWords == 1) {
1959 // All high words are zero, just use native remainder
1960 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
1961 }
1962
1963 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1964 APInt Remainder(1,0);
1965 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1966 return Remainder;
1967}
1968
1969void APInt::udivrem(const APInt &LHS, const APInt &RHS,
1970 APInt &Quotient, APInt &Remainder) {
1971 // Get some size facts about the dividend and divisor
Chris Lattneree5417c2009-01-21 18:09:24 +00001972 unsigned lhsBits = LHS.getActiveBits();
1973 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1974 unsigned rhsBits = RHS.getActiveBits();
1975 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001976
1977 // Check the degenerate cases
1978 if (lhsWords == 0) {
1979 Quotient = 0; // 0 / Y ===> 0
1980 Remainder = 0; // 0 % Y ===> 0
1981 return;
1982 }
1983
1984 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1985 Quotient = 0; // X / Y ===> 0, iff X < Y
1986 Remainder = LHS; // X % Y ===> X, iff X < Y
1987 return;
1988 }
1989
1990 if (LHS == RHS) {
1991 Quotient = 1; // X / X ===> 1
1992 Remainder = 0; // X % X ===> 0;
1993 return;
1994 }
1995
1996 if (lhsWords == 1 && rhsWords == 1) {
1997 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz1f1e0882008-06-23 19:39:50 +00001998 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1999 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2000 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2001 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002002 return;
2003 }
2004
2005 // Okay, lets do it the long way
2006 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2007}
2008
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002009void APInt::fromString(unsigned numbits, const StringRef& str, uint8_t radix) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002010 // Check our assumptions here
Erick Tryzelaara3c44c92009-08-21 03:15:14 +00002011 assert(!str.empty() && "Invalid string length");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002012 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2013 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaara3c44c92009-08-21 03:15:14 +00002014
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002015 StringRef::iterator p = str.begin();
2016 size_t slen = str.size();
2017 bool isNeg = *p == '-';
Erick Tryzelaara3c44c92009-08-21 03:15:14 +00002018 if (*p == '-' || *p == '+') {
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002019 p++;
2020 slen--;
2021 assert(slen && "string is only a minus!");
2022 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002023 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner981440e2009-04-25 18:34:04 +00002024 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2025 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
2026 assert((((slen-1)*64)/22 <= numbits || radix != 10) && "Insufficient bit width");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002027
2028 // Allocate memory
2029 if (!isSingleWord())
2030 pVal = getClearedMemory(getNumWords());
2031
2032 // Figure out if we can shift instead of multiply
Chris Lattneree5417c2009-01-21 18:09:24 +00002033 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002034
2035 // Set up an APInt for the digit to add outside the loop so we don't
2036 // constantly construct/destruct it.
2037 APInt apdigit(getBitWidth(), 0);
2038 APInt apradix(getBitWidth(), radix);
2039
2040 // Enter digit traversal loop
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002041 for (StringRef::iterator e = str.end(); p != e; ++p) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002042 // Get a digit
Chris Lattneree5417c2009-01-21 18:09:24 +00002043 unsigned digit = 0;
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002044 char cdigit = *p;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002045 if (radix == 16) {
2046 if (!isxdigit(cdigit))
Edwin Törökbd448e32009-07-14 16:55:14 +00002047 llvm_unreachable("Invalid hex digit in string");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002048 if (isdigit(cdigit))
2049 digit = cdigit - '0';
2050 else if (cdigit >= 'a')
2051 digit = cdigit - 'a' + 10;
2052 else if (cdigit >= 'A')
2053 digit = cdigit - 'A' + 10;
2054 else
Edwin Törökbd448e32009-07-14 16:55:14 +00002055 llvm_unreachable("huh? we shouldn't get here");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002056 } else if (isdigit(cdigit)) {
2057 digit = cdigit - '0';
Bill Wendling1dde5862008-03-16 20:05:52 +00002058 assert((radix == 10 ||
2059 (radix == 8 && digit != 8 && digit != 9) ||
2060 (radix == 2 && (digit == 0 || digit == 1))) &&
2061 "Invalid digit in string for given radix");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002062 } else {
Edwin Törökbd448e32009-07-14 16:55:14 +00002063 llvm_unreachable("Invalid character in digit string");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002064 }
2065
2066 // Shift or multiply the value by the radix
Chris Lattner981440e2009-04-25 18:34:04 +00002067 if (slen > 1) {
2068 if (shift)
2069 *this <<= shift;
2070 else
2071 *this *= apradix;
2072 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002073
2074 // Add in the digit we just interpreted
2075 if (apdigit.isSingleWord())
2076 apdigit.VAL = digit;
2077 else
2078 apdigit.pVal[0] = digit;
2079 *this += apdigit;
2080 }
2081 // If its negative, put it in two's complement form
2082 if (isNeg) {
2083 (*this)--;
2084 this->flip();
2085 }
2086}
2087
Chris Lattner89b36582008-08-17 07:19:36 +00002088void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2089 bool Signed) const {
2090 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002091 "Radix should be 2, 8, 10, or 16!");
Chris Lattner89b36582008-08-17 07:19:36 +00002092
2093 // First, check for a zero value and just short circuit the logic below.
2094 if (*this == 0) {
2095 Str.push_back('0');
2096 return;
2097 }
2098
2099 static const char Digits[] = "0123456789ABCDEF";
2100
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002101 if (isSingleWord()) {
Chris Lattner89b36582008-08-17 07:19:36 +00002102 char Buffer[65];
2103 char *BufPtr = Buffer+65;
2104
2105 uint64_t N;
2106 if (Signed) {
2107 int64_t I = getSExtValue();
2108 if (I < 0) {
2109 Str.push_back('-');
2110 I = -I;
2111 }
2112 N = I;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002113 } else {
Chris Lattner89b36582008-08-17 07:19:36 +00002114 N = getZExtValue();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002115 }
Chris Lattner89b36582008-08-17 07:19:36 +00002116
2117 while (N) {
2118 *--BufPtr = Digits[N % Radix];
2119 N /= Radix;
2120 }
2121 Str.append(BufPtr, Buffer+65);
2122 return;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002123 }
2124
Chris Lattner89b36582008-08-17 07:19:36 +00002125 APInt Tmp(*this);
2126
2127 if (Signed && isNegative()) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002128 // They want to print the signed version and it is a negative value
2129 // Flip the bits and add one to turn it into the equivalent positive
2130 // value and put a '-' in the result.
Chris Lattner89b36582008-08-17 07:19:36 +00002131 Tmp.flip();
2132 Tmp++;
2133 Str.push_back('-');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002134 }
Chris Lattner89b36582008-08-17 07:19:36 +00002135
2136 // We insert the digits backward, then reverse them to get the right order.
2137 unsigned StartDig = Str.size();
2138
2139 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2140 // because the number of bits per digit (1, 3 and 4 respectively) divides
2141 // equaly. We just shift until the value is zero.
2142 if (Radix != 10) {
2143 // Just shift tmp right for each digit width until it becomes zero
2144 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2145 unsigned MaskAmt = Radix - 1;
2146
2147 while (Tmp != 0) {
2148 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2149 Str.push_back(Digits[Digit]);
2150 Tmp = Tmp.lshr(ShiftAmt);
2151 }
2152 } else {
2153 APInt divisor(4, 10);
2154 while (Tmp != 0) {
2155 APInt APdigit(1, 0);
2156 APInt tmp2(Tmp.getBitWidth(), 0);
2157 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
2158 &APdigit);
Chris Lattneree5417c2009-01-21 18:09:24 +00002159 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner89b36582008-08-17 07:19:36 +00002160 assert(Digit < Radix && "divide failed");
2161 Str.push_back(Digits[Digit]);
2162 Tmp = tmp2;
2163 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002164 }
Chris Lattner89b36582008-08-17 07:19:36 +00002165
2166 // Reverse the digits before returning.
2167 std::reverse(Str.begin()+StartDig, Str.end());
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002168}
2169
Chris Lattner89b36582008-08-17 07:19:36 +00002170/// toString - This returns the APInt as a std::string. Note that this is an
2171/// inefficient method. It is better to pass in a SmallVector/SmallString
2172/// to the methods above.
2173std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2174 SmallString<40> S;
2175 toString(S, Radix, Signed);
Daniel Dunbar768e97d2009-08-19 20:07:03 +00002176 return S.str();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002177}
Chris Lattner73cde982007-08-16 15:56:55 +00002178
Chris Lattner89b36582008-08-17 07:19:36 +00002179
2180void APInt::dump() const {
2181 SmallString<40> S, U;
2182 this->toStringUnsigned(U);
2183 this->toStringSigned(S);
Daniel Dunbar768e97d2009-08-19 20:07:03 +00002184 errs() << "APInt(" << BitWidth << "b, "
2185 << U.str() << "u " << S.str() << "s)";
Chris Lattner89b36582008-08-17 07:19:36 +00002186}
2187
Chris Lattner1fefaac2008-08-23 22:23:09 +00002188void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner89b36582008-08-17 07:19:36 +00002189 SmallString<40> S;
2190 this->toString(S, 10, isSigned);
Daniel Dunbar768e97d2009-08-19 20:07:03 +00002191 OS << S.str();
Chris Lattner89b36582008-08-17 07:19:36 +00002192}
2193
Dan Gohman5d84bee2009-06-30 20:10:56 +00002194std::ostream &llvm::operator<<(std::ostream &o, const APInt &I) {
2195 raw_os_ostream OS(o);
2196 OS << I;
2197 return o;
2198}
2199
Chris Lattner73cde982007-08-16 15:56:55 +00002200// This implements a variety of operations on a representation of
2201// arbitrary precision, two's-complement, bignum integer values.
2202
2203/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2204 and unrestricting assumption. */
Chris Lattner12e44312008-08-17 04:58:58 +00002205#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerdb80e212007-08-20 22:49:32 +00002206COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattner73cde982007-08-16 15:56:55 +00002207
2208/* Some handy functions local to this file. */
2209namespace {
2210
Chris Lattnerdb80e212007-08-20 22:49:32 +00002211 /* Returns the integer part with the least significant BITS set.
2212 BITS cannot be zero. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002213 static inline integerPart
Chris Lattnerdb80e212007-08-20 22:49:32 +00002214 lowBitMask(unsigned int bits)
2215 {
2216 assert (bits != 0 && bits <= integerPartWidth);
2217
2218 return ~(integerPart) 0 >> (integerPartWidth - bits);
2219 }
2220
Neil Booth58ffb232007-10-06 00:43:45 +00002221 /* Returns the value of the lower half of PART. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002222 static inline integerPart
Chris Lattnerdb80e212007-08-20 22:49:32 +00002223 lowHalf(integerPart part)
2224 {
2225 return part & lowBitMask(integerPartWidth / 2);
2226 }
2227
Neil Booth58ffb232007-10-06 00:43:45 +00002228 /* Returns the value of the upper half of PART. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002229 static inline integerPart
Chris Lattnerdb80e212007-08-20 22:49:32 +00002230 highHalf(integerPart part)
2231 {
2232 return part >> (integerPartWidth / 2);
2233 }
2234
Neil Booth58ffb232007-10-06 00:43:45 +00002235 /* Returns the bit number of the most significant set bit of a part.
2236 If the input number has no bits set -1U is returned. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002237 static unsigned int
Chris Lattnerdb80e212007-08-20 22:49:32 +00002238 partMSB(integerPart value)
Chris Lattner73cde982007-08-16 15:56:55 +00002239 {
2240 unsigned int n, msb;
2241
2242 if (value == 0)
2243 return -1U;
2244
2245 n = integerPartWidth / 2;
2246
2247 msb = 0;
2248 do {
2249 if (value >> n) {
2250 value >>= n;
2251 msb += n;
2252 }
2253
2254 n >>= 1;
2255 } while (n);
2256
2257 return msb;
2258 }
2259
Neil Booth58ffb232007-10-06 00:43:45 +00002260 /* Returns the bit number of the least significant set bit of a
2261 part. If the input number has no bits set -1U is returned. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002262 static unsigned int
Chris Lattner73cde982007-08-16 15:56:55 +00002263 partLSB(integerPart value)
2264 {
2265 unsigned int n, lsb;
2266
2267 if (value == 0)
2268 return -1U;
2269
2270 lsb = integerPartWidth - 1;
2271 n = integerPartWidth / 2;
2272
2273 do {
2274 if (value << n) {
2275 value <<= n;
2276 lsb -= n;
2277 }
2278
2279 n >>= 1;
2280 } while (n);
2281
2282 return lsb;
2283 }
2284}
2285
2286/* Sets the least significant part of a bignum to the input value, and
2287 zeroes out higher parts. */
2288void
2289APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2290{
2291 unsigned int i;
2292
Neil Bootha0f524a2007-10-08 13:47:12 +00002293 assert (parts > 0);
2294
Chris Lattner73cde982007-08-16 15:56:55 +00002295 dst[0] = part;
2296 for(i = 1; i < parts; i++)
2297 dst[i] = 0;
2298}
2299
2300/* Assign one bignum to another. */
2301void
2302APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2303{
2304 unsigned int i;
2305
2306 for(i = 0; i < parts; i++)
2307 dst[i] = src[i];
2308}
2309
2310/* Returns true if a bignum is zero, false otherwise. */
2311bool
2312APInt::tcIsZero(const integerPart *src, unsigned int parts)
2313{
2314 unsigned int i;
2315
2316 for(i = 0; i < parts; i++)
2317 if (src[i])
2318 return false;
2319
2320 return true;
2321}
2322
2323/* Extract the given bit of a bignum; returns 0 or 1. */
2324int
2325APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2326{
2327 return(parts[bit / integerPartWidth]
2328 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2329}
2330
2331/* Set the given bit of a bignum. */
2332void
2333APInt::tcSetBit(integerPart *parts, unsigned int bit)
2334{
2335 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2336}
2337
Neil Booth58ffb232007-10-06 00:43:45 +00002338/* Returns the bit number of the least significant set bit of a
2339 number. If the input number has no bits set -1U is returned. */
Chris Lattner73cde982007-08-16 15:56:55 +00002340unsigned int
2341APInt::tcLSB(const integerPart *parts, unsigned int n)
2342{
2343 unsigned int i, lsb;
2344
2345 for(i = 0; i < n; i++) {
2346 if (parts[i] != 0) {
2347 lsb = partLSB(parts[i]);
2348
2349 return lsb + i * integerPartWidth;
2350 }
2351 }
2352
2353 return -1U;
2354}
2355
Neil Booth58ffb232007-10-06 00:43:45 +00002356/* Returns the bit number of the most significant set bit of a number.
2357 If the input number has no bits set -1U is returned. */
Chris Lattner73cde982007-08-16 15:56:55 +00002358unsigned int
2359APInt::tcMSB(const integerPart *parts, unsigned int n)
2360{
2361 unsigned int msb;
2362
2363 do {
2364 --n;
2365
2366 if (parts[n] != 0) {
Chris Lattnerdb80e212007-08-20 22:49:32 +00002367 msb = partMSB(parts[n]);
Chris Lattner73cde982007-08-16 15:56:55 +00002368
2369 return msb + n * integerPartWidth;
2370 }
2371 } while (n);
2372
2373 return -1U;
2374}
2375
Neil Bootha0f524a2007-10-08 13:47:12 +00002376/* Copy the bit vector of width srcBITS from SRC, starting at bit
2377 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2378 the least significant bit of DST. All high bits above srcBITS in
2379 DST are zero-filled. */
2380void
Evan Chengc257df32009-05-21 23:47:47 +00002381APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Bootha0f524a2007-10-08 13:47:12 +00002382 unsigned int srcBits, unsigned int srcLSB)
2383{
2384 unsigned int firstSrcPart, dstParts, shift, n;
2385
2386 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2387 assert (dstParts <= dstCount);
2388
2389 firstSrcPart = srcLSB / integerPartWidth;
2390 tcAssign (dst, src + firstSrcPart, dstParts);
2391
2392 shift = srcLSB % integerPartWidth;
2393 tcShiftRight (dst, dstParts, shift);
2394
2395 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2396 in DST. If this is less that srcBits, append the rest, else
2397 clear the high bits. */
2398 n = dstParts * integerPartWidth - shift;
2399 if (n < srcBits) {
2400 integerPart mask = lowBitMask (srcBits - n);
2401 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2402 << n % integerPartWidth);
2403 } else if (n > srcBits) {
Neil Booth69731ff2007-10-12 15:31:31 +00002404 if (srcBits % integerPartWidth)
2405 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Bootha0f524a2007-10-08 13:47:12 +00002406 }
2407
2408 /* Clear high parts. */
2409 while (dstParts < dstCount)
2410 dst[dstParts++] = 0;
2411}
2412
Chris Lattner73cde982007-08-16 15:56:55 +00002413/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2414integerPart
2415APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2416 integerPart c, unsigned int parts)
2417{
2418 unsigned int i;
2419
2420 assert(c <= 1);
2421
2422 for(i = 0; i < parts; i++) {
2423 integerPart l;
2424
2425 l = dst[i];
2426 if (c) {
2427 dst[i] += rhs[i] + 1;
2428 c = (dst[i] <= l);
2429 } else {
2430 dst[i] += rhs[i];
2431 c = (dst[i] < l);
2432 }
2433 }
2434
2435 return c;
2436}
2437
2438/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2439integerPart
2440APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2441 integerPart c, unsigned int parts)
2442{
2443 unsigned int i;
2444
2445 assert(c <= 1);
2446
2447 for(i = 0; i < parts; i++) {
2448 integerPart l;
2449
2450 l = dst[i];
2451 if (c) {
2452 dst[i] -= rhs[i] + 1;
2453 c = (dst[i] >= l);
2454 } else {
2455 dst[i] -= rhs[i];
2456 c = (dst[i] > l);
2457 }
2458 }
2459
2460 return c;
2461}
2462
2463/* Negate a bignum in-place. */
2464void
2465APInt::tcNegate(integerPart *dst, unsigned int parts)
2466{
2467 tcComplement(dst, parts);
2468 tcIncrement(dst, parts);
2469}
2470
Neil Booth58ffb232007-10-06 00:43:45 +00002471/* DST += SRC * MULTIPLIER + CARRY if add is true
2472 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner73cde982007-08-16 15:56:55 +00002473
2474 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2475 they must start at the same point, i.e. DST == SRC.
2476
2477 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2478 returned. Otherwise DST is filled with the least significant
2479 DSTPARTS parts of the result, and if all of the omitted higher
2480 parts were zero return zero, otherwise overflow occurred and
2481 return one. */
2482int
2483APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2484 integerPart multiplier, integerPart carry,
2485 unsigned int srcParts, unsigned int dstParts,
2486 bool add)
2487{
2488 unsigned int i, n;
2489
2490 /* Otherwise our writes of DST kill our later reads of SRC. */
2491 assert(dst <= src || dst >= src + srcParts);
2492 assert(dstParts <= srcParts + 1);
2493
2494 /* N loops; minimum of dstParts and srcParts. */
2495 n = dstParts < srcParts ? dstParts: srcParts;
2496
2497 for(i = 0; i < n; i++) {
2498 integerPart low, mid, high, srcPart;
2499
2500 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2501
2502 This cannot overflow, because
2503
2504 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2505
2506 which is less than n^2. */
2507
2508 srcPart = src[i];
2509
2510 if (multiplier == 0 || srcPart == 0) {
2511 low = carry;
2512 high = 0;
2513 } else {
2514 low = lowHalf(srcPart) * lowHalf(multiplier);
2515 high = highHalf(srcPart) * highHalf(multiplier);
2516
2517 mid = lowHalf(srcPart) * highHalf(multiplier);
2518 high += highHalf(mid);
2519 mid <<= integerPartWidth / 2;
2520 if (low + mid < low)
2521 high++;
2522 low += mid;
2523
2524 mid = highHalf(srcPart) * lowHalf(multiplier);
2525 high += highHalf(mid);
2526 mid <<= integerPartWidth / 2;
2527 if (low + mid < low)
2528 high++;
2529 low += mid;
2530
2531 /* Now add carry. */
2532 if (low + carry < low)
2533 high++;
2534 low += carry;
2535 }
2536
2537 if (add) {
2538 /* And now DST[i], and store the new low part there. */
2539 if (low + dst[i] < low)
2540 high++;
2541 dst[i] += low;
2542 } else
2543 dst[i] = low;
2544
2545 carry = high;
2546 }
2547
2548 if (i < dstParts) {
2549 /* Full multiplication, there is no overflow. */
2550 assert(i + 1 == dstParts);
2551 dst[i] = carry;
2552 return 0;
2553 } else {
2554 /* We overflowed if there is carry. */
2555 if (carry)
2556 return 1;
2557
2558 /* We would overflow if any significant unwritten parts would be
2559 non-zero. This is true if any remaining src parts are non-zero
2560 and the multiplier is non-zero. */
2561 if (multiplier)
2562 for(; i < srcParts; i++)
2563 if (src[i])
2564 return 1;
2565
2566 /* We fitted in the narrow destination. */
2567 return 0;
2568 }
2569}
2570
2571/* DST = LHS * RHS, where DST has the same width as the operands and
2572 is filled with the least significant parts of the result. Returns
2573 one if overflow occurred, otherwise zero. DST must be disjoint
2574 from both operands. */
2575int
2576APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2577 const integerPart *rhs, unsigned int parts)
2578{
2579 unsigned int i;
2580 int overflow;
2581
2582 assert(dst != lhs && dst != rhs);
2583
2584 overflow = 0;
2585 tcSet(dst, 0, parts);
2586
2587 for(i = 0; i < parts; i++)
2588 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2589 parts - i, true);
2590
2591 return overflow;
2592}
2593
Neil Booth004e9f42007-10-06 00:24:48 +00002594/* DST = LHS * RHS, where DST has width the sum of the widths of the
2595 operands. No overflow occurs. DST must be disjoint from both
2596 operands. Returns the number of parts required to hold the
2597 result. */
2598unsigned int
Chris Lattner73cde982007-08-16 15:56:55 +00002599APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth004e9f42007-10-06 00:24:48 +00002600 const integerPart *rhs, unsigned int lhsParts,
2601 unsigned int rhsParts)
Chris Lattner73cde982007-08-16 15:56:55 +00002602{
Neil Booth004e9f42007-10-06 00:24:48 +00002603 /* Put the narrower number on the LHS for less loops below. */
2604 if (lhsParts > rhsParts) {
2605 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2606 } else {
2607 unsigned int n;
Chris Lattner73cde982007-08-16 15:56:55 +00002608
Neil Booth004e9f42007-10-06 00:24:48 +00002609 assert(dst != lhs && dst != rhs);
Chris Lattner73cde982007-08-16 15:56:55 +00002610
Neil Booth004e9f42007-10-06 00:24:48 +00002611 tcSet(dst, 0, rhsParts);
Chris Lattner73cde982007-08-16 15:56:55 +00002612
Neil Booth004e9f42007-10-06 00:24:48 +00002613 for(n = 0; n < lhsParts; n++)
2614 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattner73cde982007-08-16 15:56:55 +00002615
Neil Booth004e9f42007-10-06 00:24:48 +00002616 n = lhsParts + rhsParts;
2617
2618 return n - (dst[n - 1] == 0);
2619 }
Chris Lattner73cde982007-08-16 15:56:55 +00002620}
2621
2622/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2623 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2624 set REMAINDER to the remainder, return zero. i.e.
2625
2626 OLD_LHS = RHS * LHS + REMAINDER
2627
2628 SCRATCH is a bignum of the same size as the operands and result for
2629 use by the routine; its contents need not be initialized and are
2630 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2631*/
2632int
2633APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2634 integerPart *remainder, integerPart *srhs,
2635 unsigned int parts)
2636{
2637 unsigned int n, shiftCount;
2638 integerPart mask;
2639
2640 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2641
Chris Lattnerdb80e212007-08-20 22:49:32 +00002642 shiftCount = tcMSB(rhs, parts) + 1;
2643 if (shiftCount == 0)
Chris Lattner73cde982007-08-16 15:56:55 +00002644 return true;
2645
Chris Lattnerdb80e212007-08-20 22:49:32 +00002646 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattner73cde982007-08-16 15:56:55 +00002647 n = shiftCount / integerPartWidth;
2648 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2649
2650 tcAssign(srhs, rhs, parts);
2651 tcShiftLeft(srhs, parts, shiftCount);
2652 tcAssign(remainder, lhs, parts);
2653 tcSet(lhs, 0, parts);
2654
2655 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2656 the total. */
2657 for(;;) {
2658 int compare;
2659
2660 compare = tcCompare(remainder, srhs, parts);
2661 if (compare >= 0) {
2662 tcSubtract(remainder, srhs, 0, parts);
2663 lhs[n] |= mask;
2664 }
2665
2666 if (shiftCount == 0)
2667 break;
2668 shiftCount--;
2669 tcShiftRight(srhs, parts, 1);
2670 if ((mask >>= 1) == 0)
2671 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2672 }
2673
2674 return false;
2675}
2676
2677/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2678 There are no restrictions on COUNT. */
2679void
2680APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2681{
Neil Bootha0f524a2007-10-08 13:47:12 +00002682 if (count) {
2683 unsigned int jump, shift;
Chris Lattner73cde982007-08-16 15:56:55 +00002684
Neil Bootha0f524a2007-10-08 13:47:12 +00002685 /* Jump is the inter-part jump; shift is is intra-part shift. */
2686 jump = count / integerPartWidth;
2687 shift = count % integerPartWidth;
Chris Lattner73cde982007-08-16 15:56:55 +00002688
Neil Bootha0f524a2007-10-08 13:47:12 +00002689 while (parts > jump) {
2690 integerPart part;
Chris Lattner73cde982007-08-16 15:56:55 +00002691
Neil Bootha0f524a2007-10-08 13:47:12 +00002692 parts--;
Chris Lattner73cde982007-08-16 15:56:55 +00002693
Neil Bootha0f524a2007-10-08 13:47:12 +00002694 /* dst[i] comes from the two parts src[i - jump] and, if we have
2695 an intra-part shift, src[i - jump - 1]. */
2696 part = dst[parts - jump];
2697 if (shift) {
2698 part <<= shift;
Chris Lattner73cde982007-08-16 15:56:55 +00002699 if (parts >= jump + 1)
2700 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2701 }
2702
Neil Bootha0f524a2007-10-08 13:47:12 +00002703 dst[parts] = part;
2704 }
Chris Lattner73cde982007-08-16 15:56:55 +00002705
Neil Bootha0f524a2007-10-08 13:47:12 +00002706 while (parts > 0)
2707 dst[--parts] = 0;
2708 }
Chris Lattner73cde982007-08-16 15:56:55 +00002709}
2710
2711/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2712 zero. There are no restrictions on COUNT. */
2713void
2714APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2715{
Neil Bootha0f524a2007-10-08 13:47:12 +00002716 if (count) {
2717 unsigned int i, jump, shift;
Chris Lattner73cde982007-08-16 15:56:55 +00002718
Neil Bootha0f524a2007-10-08 13:47:12 +00002719 /* Jump is the inter-part jump; shift is is intra-part shift. */
2720 jump = count / integerPartWidth;
2721 shift = count % integerPartWidth;
Chris Lattner73cde982007-08-16 15:56:55 +00002722
Neil Bootha0f524a2007-10-08 13:47:12 +00002723 /* Perform the shift. This leaves the most significant COUNT bits
2724 of the result at zero. */
2725 for(i = 0; i < parts; i++) {
2726 integerPart part;
Chris Lattner73cde982007-08-16 15:56:55 +00002727
Neil Bootha0f524a2007-10-08 13:47:12 +00002728 if (i + jump >= parts) {
2729 part = 0;
2730 } else {
2731 part = dst[i + jump];
2732 if (shift) {
2733 part >>= shift;
2734 if (i + jump + 1 < parts)
2735 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2736 }
Chris Lattner73cde982007-08-16 15:56:55 +00002737 }
Chris Lattner73cde982007-08-16 15:56:55 +00002738
Neil Bootha0f524a2007-10-08 13:47:12 +00002739 dst[i] = part;
2740 }
Chris Lattner73cde982007-08-16 15:56:55 +00002741 }
2742}
2743
2744/* Bitwise and of two bignums. */
2745void
2746APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2747{
2748 unsigned int i;
2749
2750 for(i = 0; i < parts; i++)
2751 dst[i] &= rhs[i];
2752}
2753
2754/* Bitwise inclusive or of two bignums. */
2755void
2756APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2757{
2758 unsigned int i;
2759
2760 for(i = 0; i < parts; i++)
2761 dst[i] |= rhs[i];
2762}
2763
2764/* Bitwise exclusive or of two bignums. */
2765void
2766APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2767{
2768 unsigned int i;
2769
2770 for(i = 0; i < parts; i++)
2771 dst[i] ^= rhs[i];
2772}
2773
2774/* Complement a bignum in-place. */
2775void
2776APInt::tcComplement(integerPart *dst, unsigned int parts)
2777{
2778 unsigned int i;
2779
2780 for(i = 0; i < parts; i++)
2781 dst[i] = ~dst[i];
2782}
2783
2784/* Comparison (unsigned) of two bignums. */
2785int
2786APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2787 unsigned int parts)
2788{
2789 while (parts) {
2790 parts--;
2791 if (lhs[parts] == rhs[parts])
2792 continue;
2793
2794 if (lhs[parts] > rhs[parts])
2795 return 1;
2796 else
2797 return -1;
2798 }
2799
2800 return 0;
2801}
2802
2803/* Increment a bignum in-place, return the carry flag. */
2804integerPart
2805APInt::tcIncrement(integerPart *dst, unsigned int parts)
2806{
2807 unsigned int i;
2808
2809 for(i = 0; i < parts; i++)
2810 if (++dst[i] != 0)
2811 break;
2812
2813 return i == parts;
2814}
2815
2816/* Set the least significant BITS bits of a bignum, clear the
2817 rest. */
2818void
2819APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2820 unsigned int bits)
2821{
2822 unsigned int i;
2823
2824 i = 0;
2825 while (bits > integerPartWidth) {
2826 dst[i++] = ~(integerPart) 0;
2827 bits -= integerPartWidth;
2828 }
2829
2830 if (bits)
2831 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2832
2833 while (i < parts)
2834 dst[i++] = 0;
2835}