blob: b4e94c91849840a568a5b3ac1b3f0bddfe38315f [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
Erick Tryzelaar15a448f2009-08-21 03:15:28 +000047/// A utility function that converts a character to a digit.
48inline static unsigned getDigit(char cdigit, uint8_t radix) {
49 // Get a digit
50 unsigned digit = 0;
51 if (radix == 16) {
52 if (!isxdigit(cdigit))
53 llvm_unreachable("Invalid hex digit in string");
54 if (isdigit(cdigit))
55 digit = cdigit - '0';
56 else if (cdigit >= 'a')
57 digit = cdigit - 'a' + 10;
58 else if (cdigit >= 'A')
59 digit = cdigit - 'A' + 10;
60 else
61 llvm_unreachable("huh? we shouldn't get here");
62 } else if (isdigit(cdigit)) {
63 digit = cdigit - '0';
64 assert((radix == 10 ||
65 (radix == 8 && digit != 8 && digit != 9) ||
66 (radix == 2 && (digit == 0 || digit == 1))) &&
67 "Invalid digit in string for given radix");
68 } else {
69 llvm_unreachable("Invalid character in digit string");
70 }
71
72 return digit;
73}
74
75
Chris Lattneree5417c2009-01-21 18:09:24 +000076void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner84886852008-08-20 17:02:31 +000077 pVal = getClearedMemory(getNumWords());
78 pVal[0] = val;
79 if (isSigned && int64_t(val) < 0)
80 for (unsigned i = 1; i < getNumWords(); ++i)
81 pVal[i] = -1ULL;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000082}
83
Chris Lattnera1f63bb2008-10-11 22:07:19 +000084void APInt::initSlowCase(const APInt& that) {
85 pVal = getMemory(getNumWords());
86 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
87}
88
89
Chris Lattneree5417c2009-01-21 18:09:24 +000090APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Chris Lattner1fefaac2008-08-23 22:23:09 +000091 : BitWidth(numBits), VAL(0) {
Erick Tryzelaara3c44c92009-08-21 03:15:14 +000092 assert(BitWidth && "Bitwidth too small");
Dan Gohmanf17a25c2007-07-18 16:29:46 +000093 assert(bigVal && "Null pointer detected!");
94 if (isSingleWord())
95 VAL = bigVal[0];
96 else {
97 // Get memory, cleared to 0
98 pVal = getClearedMemory(getNumWords());
99 // Calculate the number of words to copy
Chris Lattneree5417c2009-01-21 18:09:24 +0000100 unsigned words = std::min<unsigned>(numWords, getNumWords());
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000101 // Copy the words from bigVal to pVal
102 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
103 }
104 // Make sure unused high bits are cleared
105 clearUnusedBits();
106}
107
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000108APInt::APInt(unsigned numbits, const StringRef& Str, uint8_t radix)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000109 : BitWidth(numbits), VAL(0) {
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000110 assert(BitWidth && "Bitwidth too small");
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000111 fromString(numbits, Str, radix);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000112}
113
Chris Lattner84886852008-08-20 17:02:31 +0000114APInt& APInt::AssignSlowCase(const APInt& RHS) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000115 // Don't do anything for X = X
116 if (this == &RHS)
117 return *this;
118
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000119 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner84886852008-08-20 17:02:31 +0000120 // assume same bit-width single-word case is already handled
121 assert(!isSingleWord());
122 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000123 return *this;
124 }
125
Chris Lattner84886852008-08-20 17:02:31 +0000126 if (isSingleWord()) {
127 // assume case where both are single words is already handled
128 assert(!RHS.isSingleWord());
129 VAL = 0;
130 pVal = getMemory(RHS.getNumWords());
131 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
132 } else if (getNumWords() == RHS.getNumWords())
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000133 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
134 else if (RHS.isSingleWord()) {
135 delete [] pVal;
136 VAL = RHS.VAL;
137 } else {
138 delete [] pVal;
139 pVal = getMemory(RHS.getNumWords());
140 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
141 }
142 BitWidth = RHS.BitWidth;
143 return clearUnusedBits();
144}
145
146APInt& APInt::operator=(uint64_t RHS) {
147 if (isSingleWord())
148 VAL = RHS;
149 else {
150 pVal[0] = RHS;
151 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
152 }
153 return clearUnusedBits();
154}
155
Ted Kremenek109de0d2008-01-19 04:23:33 +0000156/// Profile - This method 'profiles' an APInt for use with FoldingSet.
157void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek79f65912008-02-19 20:50:41 +0000158 ID.AddInteger(BitWidth);
159
Ted Kremenek109de0d2008-01-19 04:23:33 +0000160 if (isSingleWord()) {
161 ID.AddInteger(VAL);
162 return;
163 }
164
Chris Lattneree5417c2009-01-21 18:09:24 +0000165 unsigned NumWords = getNumWords();
Ted Kremenek109de0d2008-01-19 04:23:33 +0000166 for (unsigned i = 0; i < NumWords; ++i)
167 ID.AddInteger(pVal[i]);
168}
169
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000170/// add_1 - This function adds a single "digit" integer, y, to the multiple
171/// "digit" integer array, x[]. x[] is modified to reflect the addition and
172/// 1 is returned if there is a carry out, otherwise 0 is returned.
173/// @returns the carry of the addition.
Chris Lattneree5417c2009-01-21 18:09:24 +0000174static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
175 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000176 dest[i] = y + x[i];
177 if (dest[i] < y)
178 y = 1; // Carry one to next digit.
179 else {
180 y = 0; // No need to carry so exit early
181 break;
182 }
183 }
184 return y;
185}
186
187/// @brief Prefix increment operator. Increments the APInt by one.
188APInt& APInt::operator++() {
189 if (isSingleWord())
190 ++VAL;
191 else
192 add_1(pVal, pVal, getNumWords(), 1);
193 return clearUnusedBits();
194}
195
196/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
197/// the multi-digit integer array, x[], propagating the borrowed 1 value until
198/// no further borrowing is neeeded or it runs out of "digits" in x. The result
199/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
200/// In other words, if y > x then this function returns 1, otherwise 0.
201/// @returns the borrow out of the subtraction
Chris Lattneree5417c2009-01-21 18:09:24 +0000202static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
203 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000204 uint64_t X = x[i];
205 x[i] -= y;
206 if (y > X)
207 y = 1; // We have to "borrow 1" from next "digit"
208 else {
209 y = 0; // No need to borrow
210 break; // Remaining digits are unchanged so exit early
211 }
212 }
213 return bool(y);
214}
215
216/// @brief Prefix decrement operator. Decrements the APInt by one.
217APInt& APInt::operator--() {
218 if (isSingleWord())
219 --VAL;
220 else
221 sub_1(pVal, getNumWords(), 1);
222 return clearUnusedBits();
223}
224
225/// add - This function adds the integer array x to the integer array Y and
226/// places the result in dest.
227/// @returns the carry out from the addition
228/// @brief General addition of 64-bit integer arrays
229static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattneree5417c2009-01-21 18:09:24 +0000230 unsigned len) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000231 bool carry = false;
Chris Lattneree5417c2009-01-21 18:09:24 +0000232 for (unsigned i = 0; i< len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000233 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
234 dest[i] = x[i] + y[i] + carry;
235 carry = dest[i] < limit || (carry && dest[i] == limit);
236 }
237 return carry;
238}
239
240/// Adds the RHS APint to this APInt.
241/// @returns this, after addition of RHS.
242/// @brief Addition assignment operator.
243APInt& APInt::operator+=(const APInt& RHS) {
244 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
245 if (isSingleWord())
246 VAL += RHS.VAL;
247 else {
248 add(pVal, pVal, RHS.pVal, getNumWords());
249 }
250 return clearUnusedBits();
251}
252
253/// Subtracts the integer array y from the integer array x
254/// @returns returns the borrow out.
255/// @brief Generalized subtraction of 64-bit integer arrays.
256static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattneree5417c2009-01-21 18:09:24 +0000257 unsigned len) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000258 bool borrow = false;
Chris Lattneree5417c2009-01-21 18:09:24 +0000259 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000260 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
261 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
262 dest[i] = x_tmp - y[i];
263 }
264 return borrow;
265}
266
267/// Subtracts the RHS APInt from this APInt
268/// @returns this, after subtraction
269/// @brief Subtraction assignment operator.
270APInt& APInt::operator-=(const APInt& RHS) {
271 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
272 if (isSingleWord())
273 VAL -= RHS.VAL;
274 else
275 sub(pVal, pVal, RHS.pVal, getNumWords());
276 return clearUnusedBits();
277}
278
279/// Multiplies an integer array, x by a a uint64_t integer and places the result
280/// into dest.
281/// @returns the carry out of the multiplication.
282/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattneree5417c2009-01-21 18:09:24 +0000283static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000284 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
285 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
286 uint64_t carry = 0;
287
288 // For each digit of x.
Chris Lattneree5417c2009-01-21 18:09:24 +0000289 for (unsigned i = 0; i < len; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000290 // Split x into high and low words
291 uint64_t lx = x[i] & 0xffffffffULL;
292 uint64_t hx = x[i] >> 32;
293 // hasCarry - A flag to indicate if there is a carry to the next digit.
294 // hasCarry == 0, no carry
295 // hasCarry == 1, has carry
296 // hasCarry == 2, no carry and the calculation result == 0.
297 uint8_t hasCarry = 0;
298 dest[i] = carry + lx * ly;
299 // Determine if the add above introduces carry.
300 hasCarry = (dest[i] < carry) ? 1 : 0;
301 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
302 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
303 // (2^32 - 1) + 2^32 = 2^64.
304 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
305
306 carry += (lx * hy) & 0xffffffffULL;
307 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
308 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
309 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
310 }
311 return carry;
312}
313
314/// Multiplies integer array x by integer array y and stores the result into
315/// the integer array dest. Note that dest's size must be >= xlen + ylen.
316/// @brief Generalized multiplicate of integer arrays.
Chris Lattneree5417c2009-01-21 18:09:24 +0000317static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
318 unsigned ylen) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000319 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattneree5417c2009-01-21 18:09:24 +0000320 for (unsigned i = 1; i < ylen; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000321 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
322 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +0000323 for (unsigned j = 0; j < xlen; ++j) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000324 lx = x[j] & 0xffffffffULL;
325 hx = x[j] >> 32;
326 // hasCarry - A flag to indicate if has carry.
327 // hasCarry == 0, no carry
328 // hasCarry == 1, has carry
329 // hasCarry == 2, no carry and the calculation result == 0.
330 uint8_t hasCarry = 0;
331 uint64_t resul = carry + lx * ly;
332 hasCarry = (resul < carry) ? 1 : 0;
333 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
334 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
335
336 carry += (lx * hy) & 0xffffffffULL;
337 resul = (carry << 32) | (resul & 0xffffffffULL);
338 dest[i+j] += resul;
339 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
340 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
341 ((lx * hy) >> 32) + hx * hy;
342 }
343 dest[i+xlen] = carry;
344 }
345}
346
347APInt& APInt::operator*=(const APInt& RHS) {
348 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
349 if (isSingleWord()) {
350 VAL *= RHS.VAL;
351 clearUnusedBits();
352 return *this;
353 }
354
355 // Get some bit facts about LHS and check for zero
Chris Lattneree5417c2009-01-21 18:09:24 +0000356 unsigned lhsBits = getActiveBits();
357 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000358 if (!lhsWords)
359 // 0 * X ===> 0
360 return *this;
361
362 // Get some bit facts about RHS and check for zero
Chris Lattneree5417c2009-01-21 18:09:24 +0000363 unsigned rhsBits = RHS.getActiveBits();
364 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000365 if (!rhsWords) {
366 // X * 0 ===> 0
367 clear();
368 return *this;
369 }
370
371 // Allocate space for the result
Chris Lattneree5417c2009-01-21 18:09:24 +0000372 unsigned destWords = rhsWords + lhsWords;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000373 uint64_t *dest = getMemory(destWords);
374
375 // Perform the long multiply
376 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
377
378 // Copy result back into *this
379 clear();
Chris Lattneree5417c2009-01-21 18:09:24 +0000380 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000381 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
382
383 // delete dest array and return
384 delete[] dest;
385 return *this;
386}
387
388APInt& APInt::operator&=(const APInt& RHS) {
389 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
390 if (isSingleWord()) {
391 VAL &= RHS.VAL;
392 return *this;
393 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000394 unsigned numWords = getNumWords();
395 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000396 pVal[i] &= RHS.pVal[i];
397 return *this;
398}
399
400APInt& APInt::operator|=(const APInt& RHS) {
401 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
402 if (isSingleWord()) {
403 VAL |= RHS.VAL;
404 return *this;
405 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000406 unsigned numWords = getNumWords();
407 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000408 pVal[i] |= RHS.pVal[i];
409 return *this;
410}
411
412APInt& APInt::operator^=(const APInt& RHS) {
413 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
414 if (isSingleWord()) {
415 VAL ^= RHS.VAL;
416 this->clearUnusedBits();
417 return *this;
418 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000419 unsigned numWords = getNumWords();
420 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000421 pVal[i] ^= RHS.pVal[i];
422 return clearUnusedBits();
423}
424
Chris Lattner84886852008-08-20 17:02:31 +0000425APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000426 unsigned numWords = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000427 uint64_t* val = getMemory(numWords);
Chris Lattneree5417c2009-01-21 18:09:24 +0000428 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000429 val[i] = pVal[i] & RHS.pVal[i];
430 return APInt(val, getBitWidth());
431}
432
Chris Lattner84886852008-08-20 17:02:31 +0000433APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000434 unsigned numWords = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000435 uint64_t *val = getMemory(numWords);
Chris Lattneree5417c2009-01-21 18:09:24 +0000436 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000437 val[i] = pVal[i] | RHS.pVal[i];
438 return APInt(val, getBitWidth());
439}
440
Chris Lattner84886852008-08-20 17:02:31 +0000441APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000442 unsigned numWords = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000443 uint64_t *val = getMemory(numWords);
Chris Lattneree5417c2009-01-21 18:09:24 +0000444 for (unsigned i = 0; i < numWords; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000445 val[i] = pVal[i] ^ RHS.pVal[i];
446
447 // 0^0==1 so clear the high bits in case they got set.
448 return APInt(val, getBitWidth()).clearUnusedBits();
449}
450
451bool APInt::operator !() const {
452 if (isSingleWord())
453 return !VAL;
454
Chris Lattneree5417c2009-01-21 18:09:24 +0000455 for (unsigned i = 0; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000456 if (pVal[i])
457 return false;
458 return true;
459}
460
461APInt APInt::operator*(const APInt& RHS) const {
462 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
463 if (isSingleWord())
464 return APInt(BitWidth, VAL * RHS.VAL);
465 APInt Result(*this);
466 Result *= RHS;
467 return Result.clearUnusedBits();
468}
469
470APInt APInt::operator+(const APInt& RHS) const {
471 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
472 if (isSingleWord())
473 return APInt(BitWidth, VAL + RHS.VAL);
474 APInt Result(BitWidth, 0);
475 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
476 return Result.clearUnusedBits();
477}
478
479APInt APInt::operator-(const APInt& RHS) const {
480 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
481 if (isSingleWord())
482 return APInt(BitWidth, VAL - RHS.VAL);
483 APInt Result(BitWidth, 0);
484 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
485 return Result.clearUnusedBits();
486}
487
Chris Lattneree5417c2009-01-21 18:09:24 +0000488bool APInt::operator[](unsigned bitPosition) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000489 return (maskBit(bitPosition) &
490 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
491}
492
Chris Lattner84886852008-08-20 17:02:31 +0000493bool APInt::EqualSlowCase(const APInt& RHS) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000494 // Get some facts about the number of bits used in the two operands.
Chris Lattneree5417c2009-01-21 18:09:24 +0000495 unsigned n1 = getActiveBits();
496 unsigned n2 = RHS.getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000497
498 // If the number of bits isn't the same, they aren't equal
499 if (n1 != n2)
500 return false;
501
502 // If the number of bits fits in a word, we only need to compare the low word.
503 if (n1 <= APINT_BITS_PER_WORD)
504 return pVal[0] == RHS.pVal[0];
505
506 // Otherwise, compare everything
507 for (int i = whichWord(n1 - 1); i >= 0; --i)
508 if (pVal[i] != RHS.pVal[i])
509 return false;
510 return true;
511}
512
Chris Lattner84886852008-08-20 17:02:31 +0000513bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattneree5417c2009-01-21 18:09:24 +0000514 unsigned n = getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000515 if (n <= APINT_BITS_PER_WORD)
516 return pVal[0] == Val;
517 else
518 return false;
519}
520
521bool APInt::ult(const APInt& RHS) const {
522 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
523 if (isSingleWord())
524 return VAL < RHS.VAL;
525
526 // Get active bit length of both operands
Chris Lattneree5417c2009-01-21 18:09:24 +0000527 unsigned n1 = getActiveBits();
528 unsigned n2 = RHS.getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000529
530 // If magnitude of LHS is less than RHS, return true.
531 if (n1 < n2)
532 return true;
533
534 // If magnitude of RHS is greather than LHS, return false.
535 if (n2 < n1)
536 return false;
537
538 // If they bot fit in a word, just compare the low order word
539 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
540 return pVal[0] < RHS.pVal[0];
541
542 // Otherwise, compare all words
Chris Lattneree5417c2009-01-21 18:09:24 +0000543 unsigned topWord = whichWord(std::max(n1,n2)-1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000544 for (int i = topWord; i >= 0; --i) {
545 if (pVal[i] > RHS.pVal[i])
546 return false;
547 if (pVal[i] < RHS.pVal[i])
548 return true;
549 }
550 return false;
551}
552
553bool APInt::slt(const APInt& RHS) const {
554 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
555 if (isSingleWord()) {
556 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
557 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
558 return lhsSext < rhsSext;
559 }
560
561 APInt lhs(*this);
562 APInt rhs(RHS);
563 bool lhsNeg = isNegative();
564 bool rhsNeg = rhs.isNegative();
565 if (lhsNeg) {
566 // Sign bit is set so perform two's complement to make it positive
567 lhs.flip();
568 lhs++;
569 }
570 if (rhsNeg) {
571 // Sign bit is set so perform two's complement to make it positive
572 rhs.flip();
573 rhs++;
574 }
575
576 // Now we have unsigned values to compare so do the comparison if necessary
577 // based on the negativeness of the values.
578 if (lhsNeg)
579 if (rhsNeg)
580 return lhs.ugt(rhs);
581 else
582 return true;
583 else if (rhsNeg)
584 return false;
585 else
586 return lhs.ult(rhs);
587}
588
Chris Lattneree5417c2009-01-21 18:09:24 +0000589APInt& APInt::set(unsigned bitPosition) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000590 if (isSingleWord())
591 VAL |= maskBit(bitPosition);
592 else
593 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
594 return *this;
595}
596
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000597/// Set the given bit to 0 whose position is given as "bitPosition".
598/// @brief Set a given bit to 0.
Chris Lattneree5417c2009-01-21 18:09:24 +0000599APInt& APInt::clear(unsigned bitPosition) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000600 if (isSingleWord())
601 VAL &= ~maskBit(bitPosition);
602 else
603 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
604 return *this;
605}
606
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000607/// @brief Toggle every bit to its opposite value.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000608
609/// Toggle a given bit to its opposite value whose position is given
610/// as "bitPosition".
611/// @brief Toggles a given bit to its opposite value.
Chris Lattneree5417c2009-01-21 18:09:24 +0000612APInt& APInt::flip(unsigned bitPosition) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000613 assert(bitPosition < BitWidth && "Out of the bit-width range!");
614 if ((*this)[bitPosition]) clear(bitPosition);
615 else set(bitPosition);
616 return *this;
617}
618
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000619unsigned APInt::getBitsNeeded(const StringRef& str, uint8_t radix) {
620 assert(!str.empty() && "Invalid string length");
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000621 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
622 "Radix should be 2, 8, 10, or 16!");
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000623
624 size_t slen = str.size();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000625
626 // Each computation below needs to know if its negative
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000627 StringRef::iterator p = str.begin();
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000628 unsigned isNegative = str.front() == '-';
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000629 if (*p == '-' || *p == '+') {
630 p++;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000631 slen--;
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +0000632 assert(slen && "string is only a minus!");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000633 }
634 // For radixes of power-of-two values, the bits required is accurately and
635 // easily computed
636 if (radix == 2)
637 return slen + isNegative;
638 if (radix == 8)
639 return slen * 3 + isNegative;
640 if (radix == 16)
641 return slen * 4 + isNegative;
642
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000643 // This is grossly inefficient but accurate. We could probably do something
644 // with a computation of roughly slen*64/20 and then adjust by the value of
645 // the first few digits. But, I'm not sure how accurate that could be.
646
647 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaar15a448f2009-08-21 03:15:28 +0000648 // be too large. This avoids the assertion in the constructor. This
649 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
650 // bits in that case.
651 unsigned sufficient = slen == 1 ? 4 : slen * 64/18;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000652
653 // Convert to the actual binary value.
Erick Tryzelaara3c44c92009-08-21 03:15:14 +0000654 APInt tmp(sufficient, StringRef(p, slen), radix);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000655
Erick Tryzelaar15a448f2009-08-21 03:15:28 +0000656 // Compute how many bits are required. If the log is infinite, assume we need
657 // just bit.
658 unsigned log = tmp.logBase2();
659 if (log == (unsigned)-1) {
660 return isNegative + 1;
661 } else {
662 return isNegative + log + 1;
663 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000664}
665
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000666// From http://www.burtleburtle.net, byBob Jenkins.
667// When targeting x86, both GCC and LLVM seem to recognize this as a
668// rotate instruction.
669#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000670
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000671// From http://www.burtleburtle.net, by Bob Jenkins.
672#define mix(a,b,c) \
673 { \
674 a -= c; a ^= rot(c, 4); c += b; \
675 b -= a; b ^= rot(a, 6); a += c; \
676 c -= b; c ^= rot(b, 8); b += a; \
677 a -= c; a ^= rot(c,16); c += b; \
678 b -= a; b ^= rot(a,19); a += c; \
679 c -= b; c ^= rot(b, 4); b += a; \
680 }
681
682// From http://www.burtleburtle.net, by Bob Jenkins.
683#define final(a,b,c) \
684 { \
685 c ^= b; c -= rot(b,14); \
686 a ^= c; a -= rot(c,11); \
687 b ^= a; b -= rot(a,25); \
688 c ^= b; c -= rot(b,16); \
689 a ^= c; a -= rot(c,4); \
690 b ^= a; b -= rot(a,14); \
691 c ^= b; c -= rot(b,24); \
692 }
693
694// hashword() was adapted from http://www.burtleburtle.net, by Bob
695// Jenkins. k is a pointer to an array of uint32_t values; length is
696// the length of the key, in 32-bit chunks. This version only handles
697// keys that are a multiple of 32 bits in size.
698static inline uint32_t hashword(const uint64_t *k64, size_t length)
699{
700 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
701 uint32_t a,b,c;
702
703 /* Set up the internal state */
704 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
705
706 /*------------------------------------------------- handle most of the key */
707 while (length > 3)
708 {
709 a += k[0];
710 b += k[1];
711 c += k[2];
712 mix(a,b,c);
713 length -= 3;
714 k += 3;
715 }
716
717 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stump7134bb52009-05-13 23:23:20 +0000718 switch (length) { /* all the case statements fall through */
719 case 3 : c+=k[2];
720 case 2 : b+=k[1];
721 case 1 : a+=k[0];
722 final(a,b,c);
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000723 case 0: /* case 0: nothing left to add */
724 break;
725 }
726 /*------------------------------------------------------ report the result */
727 return c;
728}
729
730// hashword8() was adapted from http://www.burtleburtle.net, by Bob
731// Jenkins. This computes a 32-bit hash from one 64-bit word. When
732// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
733// function into about 35 instructions when inlined.
734static inline uint32_t hashword8(const uint64_t k64)
735{
736 uint32_t a,b,c;
737 a = b = c = 0xdeadbeef + 4;
738 b += k64 >> 32;
739 a += k64 & 0xffffffff;
740 final(a,b,c);
741 return c;
742}
743#undef final
744#undef mix
745#undef rot
746
747uint64_t APInt::getHashValue() const {
748 uint64_t hash;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000749 if (isSingleWord())
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000750 hash = hashword8(VAL);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000751 else
Stuart Hastings6698f2e2009-03-13 21:51:13 +0000752 hash = hashword(pVal, getNumWords()*2);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000753 return hash;
754}
755
756/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattneree5417c2009-01-21 18:09:24 +0000757APInt APInt::getHiBits(unsigned numBits) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000758 return APIntOps::lshr(*this, BitWidth - numBits);
759}
760
761/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattneree5417c2009-01-21 18:09:24 +0000762APInt APInt::getLoBits(unsigned numBits) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000763 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
764 BitWidth - numBits);
765}
766
767bool APInt::isPowerOf2() const {
768 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
769}
770
Chris Lattneree5417c2009-01-21 18:09:24 +0000771unsigned APInt::countLeadingZerosSlowCase() const {
772 unsigned Count = 0;
773 for (unsigned i = getNumWords(); i > 0u; --i) {
Chris Lattner84886852008-08-20 17:02:31 +0000774 if (pVal[i-1] == 0)
775 Count += APINT_BITS_PER_WORD;
776 else {
777 Count += CountLeadingZeros_64(pVal[i-1]);
778 break;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000779 }
780 }
Chris Lattneree5417c2009-01-21 18:09:24 +0000781 unsigned remainder = BitWidth % APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000782 if (remainder)
783 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner00b08ce2007-11-23 22:42:31 +0000784 return std::min(Count, BitWidth);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000785}
786
Chris Lattneree5417c2009-01-21 18:09:24 +0000787static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
788 unsigned Count = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000789 if (skip)
790 V <<= skip;
791 while (V && (V & (1ULL << 63))) {
792 Count++;
793 V <<= 1;
794 }
795 return Count;
796}
797
Chris Lattneree5417c2009-01-21 18:09:24 +0000798unsigned APInt::countLeadingOnes() const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000799 if (isSingleWord())
800 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
801
Chris Lattneree5417c2009-01-21 18:09:24 +0000802 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
edwinb95462a2009-01-27 18:06:03 +0000803 unsigned shift;
804 if (!highWordBits) {
805 highWordBits = APINT_BITS_PER_WORD;
806 shift = 0;
807 } else {
808 shift = APINT_BITS_PER_WORD - highWordBits;
809 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000810 int i = getNumWords() - 1;
Chris Lattneree5417c2009-01-21 18:09:24 +0000811 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000812 if (Count == highWordBits) {
813 for (i--; i >= 0; --i) {
814 if (pVal[i] == -1ULL)
815 Count += APINT_BITS_PER_WORD;
816 else {
817 Count += countLeadingOnes_64(pVal[i], 0);
818 break;
819 }
820 }
821 }
822 return Count;
823}
824
Chris Lattneree5417c2009-01-21 18:09:24 +0000825unsigned APInt::countTrailingZeros() const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000826 if (isSingleWord())
Chris Lattneree5417c2009-01-21 18:09:24 +0000827 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
828 unsigned Count = 0;
829 unsigned i = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000830 for (; i < getNumWords() && pVal[i] == 0; ++i)
831 Count += APINT_BITS_PER_WORD;
832 if (i < getNumWords())
833 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner9ee26cf2007-11-23 22:36:25 +0000834 return std::min(Count, BitWidth);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000835}
836
Chris Lattneree5417c2009-01-21 18:09:24 +0000837unsigned APInt::countTrailingOnesSlowCase() const {
838 unsigned Count = 0;
839 unsigned i = 0;
Dan Gohmane4428412008-02-14 22:38:45 +0000840 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohmanf550d412008-02-13 21:11:05 +0000841 Count += APINT_BITS_PER_WORD;
842 if (i < getNumWords())
843 Count += CountTrailingOnes_64(pVal[i]);
844 return std::min(Count, BitWidth);
845}
846
Chris Lattneree5417c2009-01-21 18:09:24 +0000847unsigned APInt::countPopulationSlowCase() const {
848 unsigned Count = 0;
849 for (unsigned i = 0; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000850 Count += CountPopulation_64(pVal[i]);
851 return Count;
852}
853
854APInt APInt::byteSwap() const {
855 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
856 if (BitWidth == 16)
857 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
858 else if (BitWidth == 32)
Chris Lattneree5417c2009-01-21 18:09:24 +0000859 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000860 else if (BitWidth == 48) {
Chris Lattneree5417c2009-01-21 18:09:24 +0000861 unsigned Tmp1 = unsigned(VAL >> 16);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000862 Tmp1 = ByteSwap_32(Tmp1);
863 uint16_t Tmp2 = uint16_t(VAL);
864 Tmp2 = ByteSwap_16(Tmp2);
865 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
866 } else if (BitWidth == 64)
867 return APInt(BitWidth, ByteSwap_64(VAL));
868 else {
869 APInt Result(BitWidth, 0);
870 char *pByte = (char*)Result.pVal;
Chris Lattneree5417c2009-01-21 18:09:24 +0000871 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000872 char Tmp = pByte[i];
873 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
874 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
875 }
876 return Result;
877 }
878}
879
880APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
881 const APInt& API2) {
882 APInt A = API1, B = API2;
883 while (!!B) {
884 APInt T = B;
885 B = APIntOps::urem(A, B);
886 A = T;
887 }
888 return A;
889}
890
Chris Lattneree5417c2009-01-21 18:09:24 +0000891APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000892 union {
893 double D;
894 uint64_t I;
895 } T;
896 T.D = Double;
897
898 // Get the sign bit from the highest order bit
899 bool isNeg = T.I >> 63;
900
901 // Get the 11-bit exponent and adjust for the 1023 bit bias
902 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
903
904 // If the exponent is negative, the value is < 0 so just return 0.
905 if (exp < 0)
906 return APInt(width, 0u);
907
908 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
909 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
910
911 // If the exponent doesn't shift all bits out of the mantissa
912 if (exp < 52)
913 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
914 APInt(width, mantissa >> (52 - exp));
915
916 // If the client didn't provide enough bits for us to shift the mantissa into
917 // then the result is undefined, just return 0
918 if (width <= exp - 52)
919 return APInt(width, 0);
920
921 // Otherwise, we have to shift the mantissa bits up to the right location
922 APInt Tmp(width, mantissa);
Chris Lattneree5417c2009-01-21 18:09:24 +0000923 Tmp = Tmp.shl((unsigned)exp - 52);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000924 return isNeg ? -Tmp : Tmp;
925}
926
Dale Johannesene326f252009-08-12 18:04:11 +0000927/// RoundToDouble - This function converts this APInt to a double.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000928/// The layout for double is as following (IEEE Standard 754):
929/// --------------------------------------
930/// | Sign Exponent Fraction Bias |
931/// |-------------------------------------- |
932/// | 1[63] 11[62-52] 52[51-00] 1023 |
933/// --------------------------------------
934double APInt::roundToDouble(bool isSigned) const {
935
936 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesene326f252009-08-12 18:04:11 +0000937 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000938 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
939 if (isSigned) {
Dale Johannesen25210cd2009-08-12 17:42:34 +0000940 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000941 return double(sext);
942 } else
Dale Johannesen25210cd2009-08-12 17:42:34 +0000943 return double(getWord(0));
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000944 }
945
946 // Determine if the value is negative.
947 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
948
949 // Construct the absolute value if we're negative.
950 APInt Tmp(isNeg ? -(*this) : (*this));
951
952 // Figure out how many bits we're using.
Chris Lattneree5417c2009-01-21 18:09:24 +0000953 unsigned n = Tmp.getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000954
955 // The exponent (without bias normalization) is just the number of bits
956 // we are using. Note that the sign bit is gone since we constructed the
957 // absolute value.
958 uint64_t exp = n;
959
960 // Return infinity for exponent overflow
961 if (exp > 1023) {
962 if (!isSigned || !isNeg)
963 return std::numeric_limits<double>::infinity();
964 else
965 return -std::numeric_limits<double>::infinity();
966 }
967 exp += 1023; // Increment for 1023 bias
968
969 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
970 // extract the high 52 bits from the correct words in pVal.
971 uint64_t mantissa;
972 unsigned hiWord = whichWord(n-1);
973 if (hiWord == 0) {
974 mantissa = Tmp.pVal[0];
975 if (n > 52)
976 mantissa >>= n - 52; // shift down, we want the top 52 bits.
977 } else {
978 assert(hiWord > 0 && "huh?");
979 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
980 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
981 mantissa = hibits | lobits;
982 }
983
984 // The leading bit of mantissa is implicit, so get rid of it.
985 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
986 union {
987 double D;
988 uint64_t I;
989 } T;
990 T.I = sign | (exp << 52) | mantissa;
991 return T.D;
992}
993
994// Truncate to new width.
Chris Lattneree5417c2009-01-21 18:09:24 +0000995APInt &APInt::trunc(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000996 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner84886852008-08-20 17:02:31 +0000997 assert(width && "Can't truncate to 0 bits");
Chris Lattneree5417c2009-01-21 18:09:24 +0000998 unsigned wordsBefore = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000999 BitWidth = width;
Chris Lattneree5417c2009-01-21 18:09:24 +00001000 unsigned wordsAfter = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001001 if (wordsBefore != wordsAfter) {
1002 if (wordsAfter == 1) {
1003 uint64_t *tmp = pVal;
1004 VAL = pVal[0];
1005 delete [] tmp;
1006 } else {
1007 uint64_t *newVal = getClearedMemory(wordsAfter);
Chris Lattneree5417c2009-01-21 18:09:24 +00001008 for (unsigned i = 0; i < wordsAfter; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001009 newVal[i] = pVal[i];
1010 delete [] pVal;
1011 pVal = newVal;
1012 }
1013 }
1014 return clearUnusedBits();
1015}
1016
1017// Sign extend to a new width.
Chris Lattneree5417c2009-01-21 18:09:24 +00001018APInt &APInt::sext(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001019 assert(width > BitWidth && "Invalid APInt SignExtend request");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001020 // If the sign bit isn't set, this is the same as zext.
1021 if (!isNegative()) {
1022 zext(width);
1023 return *this;
1024 }
1025
1026 // The sign bit is set. First, get some facts
Chris Lattneree5417c2009-01-21 18:09:24 +00001027 unsigned wordsBefore = getNumWords();
1028 unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001029 BitWidth = width;
Chris Lattneree5417c2009-01-21 18:09:24 +00001030 unsigned wordsAfter = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001031
1032 // Mask the high order word appropriately
1033 if (wordsBefore == wordsAfter) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001034 unsigned newWordBits = width % APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001035 // The extension is contained to the wordsBefore-1th word.
1036 uint64_t mask = ~0ULL;
1037 if (newWordBits)
1038 mask >>= APINT_BITS_PER_WORD - newWordBits;
1039 mask <<= wordBits;
1040 if (wordsBefore == 1)
1041 VAL |= mask;
1042 else
1043 pVal[wordsBefore-1] |= mask;
1044 return clearUnusedBits();
1045 }
1046
1047 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
1048 uint64_t *newVal = getMemory(wordsAfter);
1049 if (wordsBefore == 1)
1050 newVal[0] = VAL | mask;
1051 else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001052 for (unsigned i = 0; i < wordsBefore; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001053 newVal[i] = pVal[i];
1054 newVal[wordsBefore-1] |= mask;
1055 }
Chris Lattneree5417c2009-01-21 18:09:24 +00001056 for (unsigned i = wordsBefore; i < wordsAfter; i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001057 newVal[i] = -1ULL;
1058 if (wordsBefore != 1)
1059 delete [] pVal;
1060 pVal = newVal;
1061 return clearUnusedBits();
1062}
1063
1064// Zero extend to a new width.
Chris Lattneree5417c2009-01-21 18:09:24 +00001065APInt &APInt::zext(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001066 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Chris Lattneree5417c2009-01-21 18:09:24 +00001067 unsigned wordsBefore = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001068 BitWidth = width;
Chris Lattneree5417c2009-01-21 18:09:24 +00001069 unsigned wordsAfter = getNumWords();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001070 if (wordsBefore != wordsAfter) {
1071 uint64_t *newVal = getClearedMemory(wordsAfter);
1072 if (wordsBefore == 1)
1073 newVal[0] = VAL;
1074 else
Chris Lattneree5417c2009-01-21 18:09:24 +00001075 for (unsigned i = 0; i < wordsBefore; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001076 newVal[i] = pVal[i];
1077 if (wordsBefore != 1)
1078 delete [] pVal;
1079 pVal = newVal;
1080 }
1081 return *this;
1082}
1083
Chris Lattneree5417c2009-01-21 18:09:24 +00001084APInt &APInt::zextOrTrunc(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001085 if (BitWidth < width)
1086 return zext(width);
1087 if (BitWidth > width)
1088 return trunc(width);
1089 return *this;
1090}
1091
Chris Lattneree5417c2009-01-21 18:09:24 +00001092APInt &APInt::sextOrTrunc(unsigned width) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001093 if (BitWidth < width)
1094 return sext(width);
1095 if (BitWidth > width)
1096 return trunc(width);
1097 return *this;
1098}
1099
1100/// Arithmetic right-shift this APInt by shiftAmt.
1101/// @brief Arithmetic right-shift function.
Dan Gohman625ff8d2008-02-29 01:40:47 +00001102APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001103 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001104}
1105
1106/// Arithmetic right-shift this APInt by shiftAmt.
1107/// @brief Arithmetic right-shift function.
Chris Lattneree5417c2009-01-21 18:09:24 +00001108APInt APInt::ashr(unsigned shiftAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001109 assert(shiftAmt <= BitWidth && "Invalid shift amount");
1110 // Handle a degenerate case
1111 if (shiftAmt == 0)
1112 return *this;
1113
1114 // Handle single word shifts with built-in ashr
1115 if (isSingleWord()) {
1116 if (shiftAmt == BitWidth)
1117 return APInt(BitWidth, 0); // undefined
1118 else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001119 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001120 return APInt(BitWidth,
1121 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1122 }
1123 }
1124
1125 // If all the bits were shifted out, the result is, technically, undefined.
1126 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1127 // issues in the algorithm below.
1128 if (shiftAmt == BitWidth) {
1129 if (isNegative())
Zhou Sheng3f7ab5c2008-06-05 13:27:38 +00001130 return APInt(BitWidth, -1ULL, true);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001131 else
1132 return APInt(BitWidth, 0);
1133 }
1134
1135 // Create some space for the result.
1136 uint64_t * val = new uint64_t[getNumWords()];
1137
1138 // Compute some values needed by the following shift algorithms
Chris Lattneree5417c2009-01-21 18:09:24 +00001139 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1140 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1141 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1142 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001143 if (bitsInWord == 0)
1144 bitsInWord = APINT_BITS_PER_WORD;
1145
1146 // If we are shifting whole words, just move whole words
1147 if (wordShift == 0) {
1148 // Move the words containing significant bits
Chris Lattneree5417c2009-01-21 18:09:24 +00001149 for (unsigned i = 0; i <= breakWord; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001150 val[i] = pVal[i+offset]; // move whole word
1151
1152 // Adjust the top significant word for sign bit fill, if negative
1153 if (isNegative())
1154 if (bitsInWord < APINT_BITS_PER_WORD)
1155 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1156 } else {
1157 // Shift the low order words
Chris Lattneree5417c2009-01-21 18:09:24 +00001158 for (unsigned i = 0; i < breakWord; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001159 // This combines the shifted corresponding word with the low bits from
1160 // the next word (shifted into this word's high bits).
1161 val[i] = (pVal[i+offset] >> wordShift) |
1162 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1163 }
1164
1165 // Shift the break word. In this case there are no bits from the next word
1166 // to include in this word.
1167 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1168
1169 // Deal with sign extenstion in the break word, and possibly the word before
1170 // it.
1171 if (isNegative()) {
1172 if (wordShift > bitsInWord) {
1173 if (breakWord > 0)
1174 val[breakWord-1] |=
1175 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1176 val[breakWord] |= ~0ULL;
1177 } else
1178 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
1179 }
1180 }
1181
1182 // Remaining words are 0 or -1, just assign them.
1183 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattneree5417c2009-01-21 18:09:24 +00001184 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001185 val[i] = fillValue;
1186 return APInt(val, BitWidth).clearUnusedBits();
1187}
1188
1189/// Logical right-shift this APInt by shiftAmt.
1190/// @brief Logical right-shift function.
Dan Gohman625ff8d2008-02-29 01:40:47 +00001191APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001192 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001193}
1194
1195/// Logical right-shift this APInt by shiftAmt.
1196/// @brief Logical right-shift function.
Chris Lattneree5417c2009-01-21 18:09:24 +00001197APInt APInt::lshr(unsigned shiftAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001198 if (isSingleWord()) {
1199 if (shiftAmt == BitWidth)
1200 return APInt(BitWidth, 0);
1201 else
1202 return APInt(BitWidth, this->VAL >> shiftAmt);
1203 }
1204
1205 // If all the bits were shifted out, the result is 0. This avoids issues
1206 // with shifting by the size of the integer type, which produces undefined
1207 // results. We define these "undefined results" to always be 0.
1208 if (shiftAmt == BitWidth)
1209 return APInt(BitWidth, 0);
1210
1211 // If none of the bits are shifted out, the result is *this. This avoids
Nick Lewycky11df0fc2009-01-19 17:42:33 +00001212 // issues with shifting by the size of the integer type, which produces
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001213 // undefined results in the code below. This is also an optimization.
1214 if (shiftAmt == 0)
1215 return *this;
1216
1217 // Create some space for the result.
1218 uint64_t * val = new uint64_t[getNumWords()];
1219
1220 // If we are shifting less than a word, compute the shift with a simple carry
1221 if (shiftAmt < APINT_BITS_PER_WORD) {
1222 uint64_t carry = 0;
1223 for (int i = getNumWords()-1; i >= 0; --i) {
1224 val[i] = (pVal[i] >> shiftAmt) | carry;
1225 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1226 }
1227 return APInt(val, BitWidth).clearUnusedBits();
1228 }
1229
1230 // Compute some values needed by the remaining shift algorithms
Chris Lattneree5417c2009-01-21 18:09:24 +00001231 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1232 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001233
1234 // If we are shifting whole words, just move whole words
1235 if (wordShift == 0) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001236 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001237 val[i] = pVal[i+offset];
Chris Lattneree5417c2009-01-21 18:09:24 +00001238 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001239 val[i] = 0;
1240 return APInt(val,BitWidth).clearUnusedBits();
1241 }
1242
1243 // Shift the low order words
Chris Lattneree5417c2009-01-21 18:09:24 +00001244 unsigned breakWord = getNumWords() - offset -1;
1245 for (unsigned i = 0; i < breakWord; ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001246 val[i] = (pVal[i+offset] >> wordShift) |
1247 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1248 // Shift the break word.
1249 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1250
1251 // Remaining words are 0
Chris Lattneree5417c2009-01-21 18:09:24 +00001252 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001253 val[i] = 0;
1254 return APInt(val, BitWidth).clearUnusedBits();
1255}
1256
1257/// Left-shift this APInt by shiftAmt.
1258/// @brief Left-shift function.
Dan Gohman625ff8d2008-02-29 01:40:47 +00001259APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky11df0fc2009-01-19 17:42:33 +00001260 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattneree5417c2009-01-21 18:09:24 +00001261 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001262}
1263
Chris Lattneree5417c2009-01-21 18:09:24 +00001264APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001265 // If all the bits were shifted out, the result is 0. This avoids issues
1266 // with shifting by the size of the integer type, which produces undefined
1267 // results. We define these "undefined results" to always be 0.
1268 if (shiftAmt == BitWidth)
1269 return APInt(BitWidth, 0);
1270
1271 // If none of the bits are shifted out, the result is *this. This avoids a
1272 // lshr by the words size in the loop below which can produce incorrect
1273 // results. It also avoids the expensive computation below for a common case.
1274 if (shiftAmt == 0)
1275 return *this;
1276
1277 // Create some space for the result.
1278 uint64_t * val = new uint64_t[getNumWords()];
1279
1280 // If we are shifting less than a word, do it the easy way
1281 if (shiftAmt < APINT_BITS_PER_WORD) {
1282 uint64_t carry = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +00001283 for (unsigned i = 0; i < getNumWords(); i++) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001284 val[i] = pVal[i] << shiftAmt | carry;
1285 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1286 }
1287 return APInt(val, BitWidth).clearUnusedBits();
1288 }
1289
1290 // Compute some values needed by the remaining shift algorithms
Chris Lattneree5417c2009-01-21 18:09:24 +00001291 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1292 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001293
1294 // If we are shifting whole words, just move whole words
1295 if (wordShift == 0) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001296 for (unsigned i = 0; i < offset; i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001297 val[i] = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +00001298 for (unsigned i = offset; i < getNumWords(); i++)
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001299 val[i] = pVal[i-offset];
1300 return APInt(val,BitWidth).clearUnusedBits();
1301 }
1302
1303 // Copy whole words from this to Result.
Chris Lattneree5417c2009-01-21 18:09:24 +00001304 unsigned i = getNumWords() - 1;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001305 for (; i > offset; --i)
1306 val[i] = pVal[i-offset] << wordShift |
1307 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
1308 val[offset] = pVal[0] << wordShift;
1309 for (i = 0; i < offset; ++i)
1310 val[i] = 0;
1311 return APInt(val, BitWidth).clearUnusedBits();
1312}
1313
Dan Gohman625ff8d2008-02-29 01:40:47 +00001314APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001315 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001316}
1317
Chris Lattneree5417c2009-01-21 18:09:24 +00001318APInt APInt::rotl(unsigned rotateAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001319 if (rotateAmt == 0)
1320 return *this;
1321 // Don't get too fancy, just use existing shift/or facilities
1322 APInt hi(*this);
1323 APInt lo(*this);
1324 hi.shl(rotateAmt);
1325 lo.lshr(BitWidth - rotateAmt);
1326 return hi | lo;
1327}
1328
Dan Gohman625ff8d2008-02-29 01:40:47 +00001329APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattneree5417c2009-01-21 18:09:24 +00001330 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman625ff8d2008-02-29 01:40:47 +00001331}
1332
Chris Lattneree5417c2009-01-21 18:09:24 +00001333APInt APInt::rotr(unsigned rotateAmt) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001334 if (rotateAmt == 0)
1335 return *this;
1336 // Don't get too fancy, just use existing shift/or facilities
1337 APInt hi(*this);
1338 APInt lo(*this);
1339 lo.lshr(rotateAmt);
1340 hi.shl(BitWidth - rotateAmt);
1341 return hi | lo;
1342}
1343
1344// Square Root - this method computes and returns the square root of "this".
1345// Three mechanisms are used for computation. For small values (<= 5 bits),
1346// a table lookup is done. This gets some performance for common cases. For
1347// values using less than 52 bits, the value is converted to double and then
1348// the libc sqrt function is called. The result is rounded and then converted
1349// back to a uint64_t which is then used to construct the result. Finally,
1350// the Babylonian method for computing square roots is used.
1351APInt APInt::sqrt() const {
1352
1353 // Determine the magnitude of the value.
Chris Lattneree5417c2009-01-21 18:09:24 +00001354 unsigned magnitude = getActiveBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001355
1356 // Use a fast table for some small values. This also gets rid of some
1357 // rounding errors in libc sqrt for small values.
1358 if (magnitude <= 5) {
1359 static const uint8_t results[32] = {
1360 /* 0 */ 0,
1361 /* 1- 2 */ 1, 1,
1362 /* 3- 6 */ 2, 2, 2, 2,
1363 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1364 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1365 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1366 /* 31 */ 6
1367 };
1368 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
1369 }
1370
1371 // If the magnitude of the value fits in less than 52 bits (the precision of
1372 // an IEEE double precision floating point value), then we can use the
1373 // libc sqrt function which will probably use a hardware sqrt computation.
1374 // This should be faster than the algorithm below.
1375 if (magnitude < 52) {
1376#ifdef _MSC_VER
1377 // Amazingly, VC++ doesn't have round().
1378 return APInt(BitWidth,
1379 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1380#else
1381 return APInt(BitWidth,
1382 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
1383#endif
1384 }
1385
1386 // Okay, all the short cuts are exhausted. We must compute it. The following
1387 // is a classical Babylonian method for computing the square root. This code
1388 // was adapted to APINt from a wikipedia article on such computations.
1389 // See http://www.wikipedia.org/ and go to the page named
1390 // Calculate_an_integer_square_root.
Chris Lattneree5417c2009-01-21 18:09:24 +00001391 unsigned nbits = BitWidth, i = 4;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001392 APInt testy(BitWidth, 16);
1393 APInt x_old(BitWidth, 1);
1394 APInt x_new(BitWidth, 0);
1395 APInt two(BitWidth, 2);
1396
1397 // Select a good starting value using binary logarithms.
1398 for (;; i += 2, testy = testy.shl(2))
1399 if (i >= nbits || this->ule(testy)) {
1400 x_old = x_old.shl(i / 2);
1401 break;
1402 }
1403
1404 // Use the Babylonian method to arrive at the integer square root:
1405 for (;;) {
1406 x_new = (this->udiv(x_old) + x_old).udiv(two);
1407 if (x_old.ule(x_new))
1408 break;
1409 x_old = x_new;
1410 }
1411
1412 // Make sure we return the closest approximation
1413 // NOTE: The rounding calculation below is correct. It will produce an
1414 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
1415 // determined to be a rounding issue with pari/gp as it begins to use a
1416 // floating point representation after 192 bits. There are no discrepancies
1417 // between this algorithm and pari/gp for bit widths < 192 bits.
1418 APInt square(x_old * x_old);
1419 APInt nextSquare((x_old + 1) * (x_old +1));
1420 if (this->ult(square))
1421 return x_old;
1422 else if (this->ule(nextSquare)) {
1423 APInt midpoint((nextSquare - square).udiv(two));
1424 APInt offset(*this - square);
1425 if (offset.ult(midpoint))
1426 return x_old;
1427 else
1428 return x_old + 1;
1429 } else
Edwin Törökbd448e32009-07-14 16:55:14 +00001430 llvm_unreachable("Error in APInt::sqrt computation");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001431 return x_old + 1;
1432}
1433
Wojciech Matyjewicz1f1e0882008-06-23 19:39:50 +00001434/// Computes the multiplicative inverse of this APInt for a given modulo. The
1435/// iterative extended Euclidean algorithm is used to solve for this value,
1436/// however we simplify it to speed up calculating only the inverse, and take
1437/// advantage of div+rem calculations. We also use some tricks to avoid copying
1438/// (potentially large) APInts around.
1439APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1440 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1441
1442 // Using the properties listed at the following web page (accessed 06/21/08):
1443 // http://www.numbertheory.org/php/euclid.html
1444 // (especially the properties numbered 3, 4 and 9) it can be proved that
1445 // BitWidth bits suffice for all the computations in the algorithm implemented
1446 // below. More precisely, this number of bits suffice if the multiplicative
1447 // inverse exists, but may not suffice for the general extended Euclidean
1448 // algorithm.
1449
1450 APInt r[2] = { modulo, *this };
1451 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1452 APInt q(BitWidth, 0);
1453
1454 unsigned i;
1455 for (i = 0; r[i^1] != 0; i ^= 1) {
1456 // An overview of the math without the confusing bit-flipping:
1457 // q = r[i-2] / r[i-1]
1458 // r[i] = r[i-2] % r[i-1]
1459 // t[i] = t[i-2] - t[i-1] * q
1460 udivrem(r[i], r[i^1], q, r[i]);
1461 t[i] -= t[i^1] * q;
1462 }
1463
1464 // If this APInt and the modulo are not coprime, there is no multiplicative
1465 // inverse, so return 0. We check this by looking at the next-to-last
1466 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1467 // algorithm.
1468 if (r[i] != 1)
1469 return APInt(BitWidth, 0);
1470
1471 // The next-to-last t is the multiplicative inverse. However, we are
1472 // interested in a positive inverse. Calcuate a positive one from a negative
1473 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewicz961b34c2008-07-20 15:55:14 +00001474 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz1f1e0882008-06-23 19:39:50 +00001475 return t[i].isNegative() ? t[i] + modulo : t[i];
1476}
1477
Jay Foad56b11f92009-04-30 10:15:35 +00001478/// Calculate the magic numbers required to implement a signed integer division
1479/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1480/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1481/// Warren, Jr., chapter 10.
1482APInt::ms APInt::magic() const {
1483 const APInt& d = *this;
1484 unsigned p;
1485 APInt ad, anc, delta, q1, r1, q2, r2, t;
1486 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1487 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1488 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1489 struct ms mag;
1490
1491 ad = d.abs();
1492 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1493 anc = t - 1 - t.urem(ad); // absolute value of nc
1494 p = d.getBitWidth() - 1; // initialize p
1495 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1496 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1497 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1498 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1499 do {
1500 p = p + 1;
1501 q1 = q1<<1; // update q1 = 2p/abs(nc)
1502 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1503 if (r1.uge(anc)) { // must be unsigned comparison
1504 q1 = q1 + 1;
1505 r1 = r1 - anc;
1506 }
1507 q2 = q2<<1; // update q2 = 2p/abs(d)
1508 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1509 if (r2.uge(ad)) { // must be unsigned comparison
1510 q2 = q2 + 1;
1511 r2 = r2 - ad;
1512 }
1513 delta = ad - r2;
1514 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
1515
1516 mag.m = q2 + 1;
1517 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1518 mag.s = p - d.getBitWidth(); // resulting shift
1519 return mag;
1520}
1521
1522/// Calculate the magic numbers required to implement an unsigned integer
1523/// division by a constant as a sequence of multiplies, adds and shifts.
1524/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1525/// S. Warren, Jr., chapter 10.
1526APInt::mu APInt::magicu() const {
1527 const APInt& d = *this;
1528 unsigned p;
1529 APInt nc, delta, q1, r1, q2, r2;
1530 struct mu magu;
1531 magu.a = 0; // initialize "add" indicator
1532 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1533 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1534 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1535
1536 nc = allOnes - (-d).urem(d);
1537 p = d.getBitWidth() - 1; // initialize p
1538 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1539 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1540 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1541 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1542 do {
1543 p = p + 1;
1544 if (r1.uge(nc - r1)) {
1545 q1 = q1 + q1 + 1; // update q1
1546 r1 = r1 + r1 - nc; // update r1
1547 }
1548 else {
1549 q1 = q1+q1; // update q1
1550 r1 = r1+r1; // update r1
1551 }
1552 if ((r2 + 1).uge(d - r2)) {
1553 if (q2.uge(signedMax)) magu.a = 1;
1554 q2 = q2+q2 + 1; // update q2
1555 r2 = r2+r2 + 1 - d; // update r2
1556 }
1557 else {
1558 if (q2.uge(signedMin)) magu.a = 1;
1559 q2 = q2+q2; // update q2
1560 r2 = r2+r2 + 1; // update r2
1561 }
1562 delta = d - 1 - r2;
1563 } while (p < d.getBitWidth()*2 &&
1564 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1565 magu.m = q2 + 1; // resulting magic number
1566 magu.s = p - d.getBitWidth(); // resulting shift
1567 return magu;
1568}
1569
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001570/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1571/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1572/// variables here have the same names as in the algorithm. Comments explain
1573/// the algorithm and any deviation from it.
Chris Lattneree5417c2009-01-21 18:09:24 +00001574static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1575 unsigned m, unsigned n) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001576 assert(u && "Must provide dividend");
1577 assert(v && "Must provide divisor");
1578 assert(q && "Must provide quotient");
1579 assert(u != v && u != q && v != q && "Must us different memory");
1580 assert(n>1 && "n must be > 1");
1581
1582 // Knuth uses the value b as the base of the number system. In our case b
1583 // is 2^31 so we just set it to -1u.
1584 uint64_t b = uint64_t(1) << 32;
1585
Chris Lattner89b36582008-08-17 07:19:36 +00001586#if 0
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001587 DEBUG(errs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1588 DEBUG(errs() << "KnuthDiv: original:");
1589 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1590 DEBUG(errs() << " by");
1591 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1592 DEBUG(errs() << '\n');
Chris Lattner89b36582008-08-17 07:19:36 +00001593#endif
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001594 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1595 // u and v by d. Note that we have taken Knuth's advice here to use a power
1596 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1597 // 2 allows us to shift instead of multiply and it is easy to determine the
1598 // shift amount from the leading zeros. We are basically normalizing the u
1599 // and v so that its high bits are shifted to the top of v's range without
1600 // overflow. Note that this can require an extra word in u so that u must
1601 // be of length m+n+1.
Chris Lattneree5417c2009-01-21 18:09:24 +00001602 unsigned shift = CountLeadingZeros_32(v[n-1]);
1603 unsigned v_carry = 0;
1604 unsigned u_carry = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001605 if (shift) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001606 for (unsigned i = 0; i < m+n; ++i) {
1607 unsigned u_tmp = u[i] >> (32 - shift);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001608 u[i] = (u[i] << shift) | u_carry;
1609 u_carry = u_tmp;
1610 }
Chris Lattneree5417c2009-01-21 18:09:24 +00001611 for (unsigned i = 0; i < n; ++i) {
1612 unsigned v_tmp = v[i] >> (32 - shift);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001613 v[i] = (v[i] << shift) | v_carry;
1614 v_carry = v_tmp;
1615 }
1616 }
1617 u[m+n] = u_carry;
Chris Lattner89b36582008-08-17 07:19:36 +00001618#if 0
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001619 DEBUG(errs() << "KnuthDiv: normal:");
1620 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1621 DEBUG(errs() << " by");
1622 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1623 DEBUG(errs() << '\n');
Chris Lattner89b36582008-08-17 07:19:36 +00001624#endif
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001625
1626 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1627 int j = m;
1628 do {
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001629 DEBUG(errs() << "KnuthDiv: quotient digit #" << j << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001630 // D3. [Calculate q'.].
1631 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1632 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1633 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1634 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1635 // on v[n-2] determines at high speed most of the cases in which the trial
1636 // value qp is one too large, and it eliminates all cases where qp is two
1637 // too large.
1638 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001639 DEBUG(errs() << "KnuthDiv: dividend == " << dividend << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001640 uint64_t qp = dividend / v[n-1];
1641 uint64_t rp = dividend % v[n-1];
1642 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1643 qp--;
1644 rp += v[n-1];
1645 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
1646 qp--;
1647 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001648 DEBUG(errs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001649
1650 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1651 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1652 // consists of a simple multiplication by a one-place number, combined with
1653 // a subtraction.
1654 bool isNeg = false;
Chris Lattneree5417c2009-01-21 18:09:24 +00001655 for (unsigned i = 0; i < n; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001656 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
1657 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
1658 bool borrow = subtrahend > u_tmp;
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001659 DEBUG(errs() << "KnuthDiv: u_tmp == " << u_tmp
1660 << ", subtrahend == " << subtrahend
1661 << ", borrow = " << borrow << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001662
1663 uint64_t result = u_tmp - subtrahend;
Chris Lattneree5417c2009-01-21 18:09:24 +00001664 unsigned k = j + i;
1665 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1666 u[k++] = (unsigned)(result >> 32); // subtract high word
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001667 while (borrow && k <= m+n) { // deal with borrow to the left
1668 borrow = u[k] == 0;
1669 u[k]--;
1670 k++;
1671 }
1672 isNeg |= borrow;
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001673 DEBUG(errs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001674 u[j+i+1] << '\n');
1675 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001676 DEBUG(errs() << "KnuthDiv: after subtraction:");
1677 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1678 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001679 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1680 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1681 // true value plus b**(n+1), namely as the b's complement of
1682 // the true value, and a "borrow" to the left should be remembered.
1683 //
1684 if (isNeg) {
1685 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattneree5417c2009-01-21 18:09:24 +00001686 for (unsigned i = 0; i <= m+n; ++i) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001687 u[i] = ~u[i] + carry; // b's complement
1688 carry = carry && u[i] == 0;
1689 }
1690 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001691 DEBUG(errs() << "KnuthDiv: after complement:");
1692 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1693 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001694
1695 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
1696 // negative, go to step D6; otherwise go on to step D7.
Chris Lattneree5417c2009-01-21 18:09:24 +00001697 q[j] = (unsigned)qp;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001698 if (isNeg) {
1699 // D6. [Add back]. The probability that this step is necessary is very
1700 // small, on the order of only 2/b. Make sure that test data accounts for
1701 // this possibility. Decrease q[j] by 1
1702 q[j]--;
1703 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1704 // A carry will occur to the left of u[j+n], and it should be ignored
1705 // since it cancels with the borrow that occurred in D4.
1706 bool carry = false;
Chris Lattneree5417c2009-01-21 18:09:24 +00001707 for (unsigned i = 0; i < n; i++) {
1708 unsigned limit = std::min(u[j+i],v[i]);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001709 u[j+i] += v[i] + carry;
1710 carry = u[j+i] < limit || (carry && u[j+i] == limit);
1711 }
1712 u[j+n] += carry;
1713 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001714 DEBUG(errs() << "KnuthDiv: after correction:");
1715 DEBUG(for (int i = m+n; i >=0; i--) errs() <<" " << u[i]);
1716 DEBUG(errs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001717
1718 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1719 } while (--j >= 0);
1720
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001721 DEBUG(errs() << "KnuthDiv: quotient:");
1722 DEBUG(for (int i = m; i >=0; i--) errs() <<" " << q[i]);
1723 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001724
1725 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1726 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1727 // compute the remainder (urem uses this).
1728 if (r) {
1729 // The value d is expressed by the "shift" value above since we avoided
1730 // multiplication by d by using a shift left. So, all we have to do is
1731 // shift right here. In order to mak
1732 if (shift) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001733 unsigned carry = 0;
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001734 DEBUG(errs() << "KnuthDiv: remainder:");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001735 for (int i = n-1; i >= 0; i--) {
1736 r[i] = (u[i] >> shift) | carry;
1737 carry = u[i] << (32 - shift);
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001738 DEBUG(errs() << " " << r[i]);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001739 }
1740 } else {
1741 for (int i = n-1; i >= 0; i--) {
1742 r[i] = u[i];
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001743 DEBUG(errs() << " " << r[i]);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001744 }
1745 }
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001746 DEBUG(errs() << '\n');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001747 }
Chris Lattner89b36582008-08-17 07:19:36 +00001748#if 0
Daniel Dunbard80d44a2009-07-13 05:27:30 +00001749 DEBUG(errs() << '\n');
Chris Lattner89b36582008-08-17 07:19:36 +00001750#endif
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001751}
1752
Chris Lattneree5417c2009-01-21 18:09:24 +00001753void APInt::divide(const APInt LHS, unsigned lhsWords,
1754 const APInt &RHS, unsigned rhsWords,
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001755 APInt *Quotient, APInt *Remainder)
1756{
1757 assert(lhsWords >= rhsWords && "Fractional result");
1758
1759 // First, compose the values into an array of 32-bit words instead of
1760 // 64-bit words. This is a necessity of both the "short division" algorithm
1761 // and the the Knuth "classical algorithm" which requires there to be native
1762 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1763 // can't use 64-bit operands here because we don't have native results of
Duncan Sandsf3a74072009-03-19 11:37:15 +00001764 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001765 // work on large-endian machines.
Dan Gohmand06cad62009-04-01 18:45:54 +00001766 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattneree5417c2009-01-21 18:09:24 +00001767 unsigned n = rhsWords * 2;
1768 unsigned m = (lhsWords * 2) - n;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001769
1770 // Allocate space for the temporary values we need either on the stack, if
1771 // it will fit, or on the heap if it won't.
Chris Lattneree5417c2009-01-21 18:09:24 +00001772 unsigned SPACE[128];
1773 unsigned *U = 0;
1774 unsigned *V = 0;
1775 unsigned *Q = 0;
1776 unsigned *R = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001777 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1778 U = &SPACE[0];
1779 V = &SPACE[m+n+1];
1780 Q = &SPACE[(m+n+1) + n];
1781 if (Remainder)
1782 R = &SPACE[(m+n+1) + n + (m+n)];
1783 } else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001784 U = new unsigned[m + n + 1];
1785 V = new unsigned[n];
1786 Q = new unsigned[m+n];
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001787 if (Remainder)
Chris Lattneree5417c2009-01-21 18:09:24 +00001788 R = new unsigned[n];
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001789 }
1790
1791 // Initialize the dividend
Chris Lattneree5417c2009-01-21 18:09:24 +00001792 memset(U, 0, (m+n+1)*sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001793 for (unsigned i = 0; i < lhsWords; ++i) {
1794 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattneree5417c2009-01-21 18:09:24 +00001795 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmand06cad62009-04-01 18:45:54 +00001796 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001797 }
1798 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1799
1800 // Initialize the divisor
Chris Lattneree5417c2009-01-21 18:09:24 +00001801 memset(V, 0, (n)*sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001802 for (unsigned i = 0; i < rhsWords; ++i) {
1803 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattneree5417c2009-01-21 18:09:24 +00001804 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmand06cad62009-04-01 18:45:54 +00001805 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001806 }
1807
1808 // initialize the quotient and remainder
Chris Lattneree5417c2009-01-21 18:09:24 +00001809 memset(Q, 0, (m+n) * sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001810 if (Remainder)
Chris Lattneree5417c2009-01-21 18:09:24 +00001811 memset(R, 0, n * sizeof(unsigned));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001812
1813 // Now, adjust m and n for the Knuth division. n is the number of words in
1814 // the divisor. m is the number of words by which the dividend exceeds the
1815 // divisor (i.e. m+n is the length of the dividend). These sizes must not
1816 // contain any zero words or the Knuth algorithm fails.
1817 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1818 n--;
1819 m++;
1820 }
1821 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1822 m--;
1823
1824 // If we're left with only a single word for the divisor, Knuth doesn't work
1825 // so we implement the short division algorithm here. This is much simpler
1826 // and faster because we are certain that we can divide a 64-bit quantity
1827 // by a 32-bit quantity at hardware speed and short division is simply a
1828 // series of such operations. This is just like doing short division but we
1829 // are using base 2^32 instead of base 10.
1830 assert(n != 0 && "Divide by zero?");
1831 if (n == 1) {
Chris Lattneree5417c2009-01-21 18:09:24 +00001832 unsigned divisor = V[0];
1833 unsigned remainder = 0;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001834 for (int i = m+n-1; i >= 0; i--) {
1835 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1836 if (partial_dividend == 0) {
1837 Q[i] = 0;
1838 remainder = 0;
1839 } else if (partial_dividend < divisor) {
1840 Q[i] = 0;
Chris Lattneree5417c2009-01-21 18:09:24 +00001841 remainder = (unsigned)partial_dividend;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001842 } else if (partial_dividend == divisor) {
1843 Q[i] = 1;
1844 remainder = 0;
1845 } else {
Chris Lattneree5417c2009-01-21 18:09:24 +00001846 Q[i] = (unsigned)(partial_dividend / divisor);
1847 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001848 }
1849 }
1850 if (R)
1851 R[0] = remainder;
1852 } else {
1853 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1854 // case n > 1.
1855 KnuthDiv(U, V, Q, R, m, n);
1856 }
1857
1858 // If the caller wants the quotient
1859 if (Quotient) {
1860 // Set up the Quotient value's memory.
1861 if (Quotient->BitWidth != LHS.BitWidth) {
1862 if (Quotient->isSingleWord())
1863 Quotient->VAL = 0;
1864 else
1865 delete [] Quotient->pVal;
1866 Quotient->BitWidth = LHS.BitWidth;
1867 if (!Quotient->isSingleWord())
1868 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
1869 } else
1870 Quotient->clear();
1871
1872 // The quotient is in Q. Reconstitute the quotient into Quotient's low
1873 // order words.
1874 if (lhsWords == 1) {
1875 uint64_t tmp =
1876 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1877 if (Quotient->isSingleWord())
1878 Quotient->VAL = tmp;
1879 else
1880 Quotient->pVal[0] = tmp;
1881 } else {
1882 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1883 for (unsigned i = 0; i < lhsWords; ++i)
1884 Quotient->pVal[i] =
1885 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1886 }
1887 }
1888
1889 // If the caller wants the remainder
1890 if (Remainder) {
1891 // Set up the Remainder value's memory.
1892 if (Remainder->BitWidth != RHS.BitWidth) {
1893 if (Remainder->isSingleWord())
1894 Remainder->VAL = 0;
1895 else
1896 delete [] Remainder->pVal;
1897 Remainder->BitWidth = RHS.BitWidth;
1898 if (!Remainder->isSingleWord())
1899 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
1900 } else
1901 Remainder->clear();
1902
1903 // The remainder is in R. Reconstitute the remainder into Remainder's low
1904 // order words.
1905 if (rhsWords == 1) {
1906 uint64_t tmp =
1907 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1908 if (Remainder->isSingleWord())
1909 Remainder->VAL = tmp;
1910 else
1911 Remainder->pVal[0] = tmp;
1912 } else {
1913 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1914 for (unsigned i = 0; i < rhsWords; ++i)
1915 Remainder->pVal[i] =
1916 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1917 }
1918 }
1919
1920 // Clean up the memory we allocated.
1921 if (U != &SPACE[0]) {
1922 delete [] U;
1923 delete [] V;
1924 delete [] Q;
1925 delete [] R;
1926 }
1927}
1928
1929APInt APInt::udiv(const APInt& RHS) const {
1930 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
1931
1932 // First, deal with the easy case
1933 if (isSingleWord()) {
1934 assert(RHS.VAL != 0 && "Divide by zero?");
1935 return APInt(BitWidth, VAL / RHS.VAL);
1936 }
1937
1938 // Get some facts about the LHS and RHS number of bits and words
Chris Lattneree5417c2009-01-21 18:09:24 +00001939 unsigned rhsBits = RHS.getActiveBits();
1940 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001941 assert(rhsWords && "Divided by zero???");
Chris Lattneree5417c2009-01-21 18:09:24 +00001942 unsigned lhsBits = this->getActiveBits();
1943 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001944
1945 // Deal with some degenerate cases
1946 if (!lhsWords)
1947 // 0 / X ===> 0
1948 return APInt(BitWidth, 0);
1949 else if (lhsWords < rhsWords || this->ult(RHS)) {
1950 // X / Y ===> 0, iff X < Y
1951 return APInt(BitWidth, 0);
1952 } else if (*this == RHS) {
1953 // X / X ===> 1
1954 return APInt(BitWidth, 1);
1955 } else if (lhsWords == 1 && rhsWords == 1) {
1956 // All high words are zero, just use native divide
1957 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
1958 }
1959
1960 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1961 APInt Quotient(1,0); // to hold result.
1962 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1963 return Quotient;
1964}
1965
1966APInt APInt::urem(const APInt& RHS) const {
1967 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
1968 if (isSingleWord()) {
1969 assert(RHS.VAL != 0 && "Remainder by zero?");
1970 return APInt(BitWidth, VAL % RHS.VAL);
1971 }
1972
1973 // Get some facts about the LHS
Chris Lattneree5417c2009-01-21 18:09:24 +00001974 unsigned lhsBits = getActiveBits();
1975 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001976
1977 // Get some facts about the RHS
Chris Lattneree5417c2009-01-21 18:09:24 +00001978 unsigned rhsBits = RHS.getActiveBits();
1979 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001980 assert(rhsWords && "Performing remainder operation by zero ???");
1981
1982 // Check the degenerate cases
1983 if (lhsWords == 0) {
1984 // 0 % Y ===> 0
1985 return APInt(BitWidth, 0);
1986 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1987 // X % Y ===> X, iff X < Y
1988 return *this;
1989 } else if (*this == RHS) {
1990 // X % X == 0;
1991 return APInt(BitWidth, 0);
1992 } else if (lhsWords == 1) {
1993 // All high words are zero, just use native remainder
1994 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
1995 }
1996
1997 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1998 APInt Remainder(1,0);
1999 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2000 return Remainder;
2001}
2002
2003void APInt::udivrem(const APInt &LHS, const APInt &RHS,
2004 APInt &Quotient, APInt &Remainder) {
2005 // Get some size facts about the dividend and divisor
Chris Lattneree5417c2009-01-21 18:09:24 +00002006 unsigned lhsBits = LHS.getActiveBits();
2007 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2008 unsigned rhsBits = RHS.getActiveBits();
2009 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002010
2011 // Check the degenerate cases
2012 if (lhsWords == 0) {
2013 Quotient = 0; // 0 / Y ===> 0
2014 Remainder = 0; // 0 % Y ===> 0
2015 return;
2016 }
2017
2018 if (lhsWords < rhsWords || LHS.ult(RHS)) {
2019 Quotient = 0; // X / Y ===> 0, iff X < Y
2020 Remainder = LHS; // X % Y ===> X, iff X < Y
2021 return;
2022 }
2023
2024 if (LHS == RHS) {
2025 Quotient = 1; // X / X ===> 1
2026 Remainder = 0; // X % X ===> 0;
2027 return;
2028 }
2029
2030 if (lhsWords == 1 && rhsWords == 1) {
2031 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz1f1e0882008-06-23 19:39:50 +00002032 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2033 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2034 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2035 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002036 return;
2037 }
2038
2039 // Okay, lets do it the long way
2040 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2041}
2042
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002043void APInt::fromString(unsigned numbits, const StringRef& str, uint8_t radix) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002044 // Check our assumptions here
Erick Tryzelaara3c44c92009-08-21 03:15:14 +00002045 assert(!str.empty() && "Invalid string length");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002046 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2047 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaara3c44c92009-08-21 03:15:14 +00002048
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002049 StringRef::iterator p = str.begin();
2050 size_t slen = str.size();
2051 bool isNeg = *p == '-';
Erick Tryzelaara3c44c92009-08-21 03:15:14 +00002052 if (*p == '-' || *p == '+') {
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002053 p++;
2054 slen--;
2055 assert(slen && "string is only a minus!");
2056 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002057 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner981440e2009-04-25 18:34:04 +00002058 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2059 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
2060 assert((((slen-1)*64)/22 <= numbits || radix != 10) && "Insufficient bit width");
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002061
2062 // Allocate memory
2063 if (!isSingleWord())
2064 pVal = getClearedMemory(getNumWords());
2065
2066 // Figure out if we can shift instead of multiply
Chris Lattneree5417c2009-01-21 18:09:24 +00002067 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002068
2069 // Set up an APInt for the digit to add outside the loop so we don't
2070 // constantly construct/destruct it.
2071 APInt apdigit(getBitWidth(), 0);
2072 APInt apradix(getBitWidth(), radix);
2073
2074 // Enter digit traversal loop
Daniel Dunbarfcdc8fe2009-08-13 02:33:34 +00002075 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaar15a448f2009-08-21 03:15:28 +00002076 unsigned digit = getDigit(*p, radix);
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002077
2078 // Shift or multiply the value by the radix
Chris Lattner981440e2009-04-25 18:34:04 +00002079 if (slen > 1) {
2080 if (shift)
2081 *this <<= shift;
2082 else
2083 *this *= apradix;
2084 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002085
2086 // Add in the digit we just interpreted
2087 if (apdigit.isSingleWord())
2088 apdigit.VAL = digit;
2089 else
2090 apdigit.pVal[0] = digit;
2091 *this += apdigit;
2092 }
2093 // If its negative, put it in two's complement form
2094 if (isNeg) {
2095 (*this)--;
2096 this->flip();
2097 }
2098}
2099
Chris Lattner89b36582008-08-17 07:19:36 +00002100void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2101 bool Signed) const {
2102 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002103 "Radix should be 2, 8, 10, or 16!");
Chris Lattner89b36582008-08-17 07:19:36 +00002104
2105 // First, check for a zero value and just short circuit the logic below.
2106 if (*this == 0) {
2107 Str.push_back('0');
2108 return;
2109 }
2110
2111 static const char Digits[] = "0123456789ABCDEF";
2112
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002113 if (isSingleWord()) {
Chris Lattner89b36582008-08-17 07:19:36 +00002114 char Buffer[65];
2115 char *BufPtr = Buffer+65;
2116
2117 uint64_t N;
2118 if (Signed) {
2119 int64_t I = getSExtValue();
2120 if (I < 0) {
2121 Str.push_back('-');
2122 I = -I;
2123 }
2124 N = I;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002125 } else {
Chris Lattner89b36582008-08-17 07:19:36 +00002126 N = getZExtValue();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002127 }
Chris Lattner89b36582008-08-17 07:19:36 +00002128
2129 while (N) {
2130 *--BufPtr = Digits[N % Radix];
2131 N /= Radix;
2132 }
2133 Str.append(BufPtr, Buffer+65);
2134 return;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002135 }
2136
Chris Lattner89b36582008-08-17 07:19:36 +00002137 APInt Tmp(*this);
2138
2139 if (Signed && isNegative()) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002140 // They want to print the signed version and it is a negative value
2141 // Flip the bits and add one to turn it into the equivalent positive
2142 // value and put a '-' in the result.
Chris Lattner89b36582008-08-17 07:19:36 +00002143 Tmp.flip();
2144 Tmp++;
2145 Str.push_back('-');
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002146 }
Chris Lattner89b36582008-08-17 07:19:36 +00002147
2148 // We insert the digits backward, then reverse them to get the right order.
2149 unsigned StartDig = Str.size();
2150
2151 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2152 // because the number of bits per digit (1, 3 and 4 respectively) divides
2153 // equaly. We just shift until the value is zero.
2154 if (Radix != 10) {
2155 // Just shift tmp right for each digit width until it becomes zero
2156 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2157 unsigned MaskAmt = Radix - 1;
2158
2159 while (Tmp != 0) {
2160 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2161 Str.push_back(Digits[Digit]);
2162 Tmp = Tmp.lshr(ShiftAmt);
2163 }
2164 } else {
2165 APInt divisor(4, 10);
2166 while (Tmp != 0) {
2167 APInt APdigit(1, 0);
2168 APInt tmp2(Tmp.getBitWidth(), 0);
2169 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
2170 &APdigit);
Chris Lattneree5417c2009-01-21 18:09:24 +00002171 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner89b36582008-08-17 07:19:36 +00002172 assert(Digit < Radix && "divide failed");
2173 Str.push_back(Digits[Digit]);
2174 Tmp = tmp2;
2175 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002176 }
Chris Lattner89b36582008-08-17 07:19:36 +00002177
2178 // Reverse the digits before returning.
2179 std::reverse(Str.begin()+StartDig, Str.end());
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002180}
2181
Chris Lattner89b36582008-08-17 07:19:36 +00002182/// toString - This returns the APInt as a std::string. Note that this is an
2183/// inefficient method. It is better to pass in a SmallVector/SmallString
2184/// to the methods above.
2185std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2186 SmallString<40> S;
2187 toString(S, Radix, Signed);
Daniel Dunbar768e97d2009-08-19 20:07:03 +00002188 return S.str();
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002189}
Chris Lattner73cde982007-08-16 15:56:55 +00002190
Chris Lattner89b36582008-08-17 07:19:36 +00002191
2192void APInt::dump() const {
2193 SmallString<40> S, U;
2194 this->toStringUnsigned(U);
2195 this->toStringSigned(S);
Daniel Dunbar768e97d2009-08-19 20:07:03 +00002196 errs() << "APInt(" << BitWidth << "b, "
2197 << U.str() << "u " << S.str() << "s)";
Chris Lattner89b36582008-08-17 07:19:36 +00002198}
2199
Chris Lattner1fefaac2008-08-23 22:23:09 +00002200void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner89b36582008-08-17 07:19:36 +00002201 SmallString<40> S;
2202 this->toString(S, 10, isSigned);
Daniel Dunbar768e97d2009-08-19 20:07:03 +00002203 OS << S.str();
Chris Lattner89b36582008-08-17 07:19:36 +00002204}
2205
Dan Gohman5d84bee2009-06-30 20:10:56 +00002206std::ostream &llvm::operator<<(std::ostream &o, const APInt &I) {
2207 raw_os_ostream OS(o);
2208 OS << I;
2209 return o;
2210}
2211
Chris Lattner73cde982007-08-16 15:56:55 +00002212// This implements a variety of operations on a representation of
2213// arbitrary precision, two's-complement, bignum integer values.
2214
2215/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2216 and unrestricting assumption. */
Chris Lattner12e44312008-08-17 04:58:58 +00002217#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerdb80e212007-08-20 22:49:32 +00002218COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattner73cde982007-08-16 15:56:55 +00002219
2220/* Some handy functions local to this file. */
2221namespace {
2222
Chris Lattnerdb80e212007-08-20 22:49:32 +00002223 /* Returns the integer part with the least significant BITS set.
2224 BITS cannot be zero. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002225 static inline integerPart
Chris Lattnerdb80e212007-08-20 22:49:32 +00002226 lowBitMask(unsigned int bits)
2227 {
2228 assert (bits != 0 && bits <= integerPartWidth);
2229
2230 return ~(integerPart) 0 >> (integerPartWidth - bits);
2231 }
2232
Neil Booth58ffb232007-10-06 00:43:45 +00002233 /* Returns the value of the lower half of PART. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002234 static inline integerPart
Chris Lattnerdb80e212007-08-20 22:49:32 +00002235 lowHalf(integerPart part)
2236 {
2237 return part & lowBitMask(integerPartWidth / 2);
2238 }
2239
Neil Booth58ffb232007-10-06 00:43:45 +00002240 /* Returns the value of the upper half of PART. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002241 static inline integerPart
Chris Lattnerdb80e212007-08-20 22:49:32 +00002242 highHalf(integerPart part)
2243 {
2244 return part >> (integerPartWidth / 2);
2245 }
2246
Neil Booth58ffb232007-10-06 00:43:45 +00002247 /* Returns the bit number of the most significant set bit of a part.
2248 If the input number has no bits set -1U is returned. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002249 static unsigned int
Chris Lattnerdb80e212007-08-20 22:49:32 +00002250 partMSB(integerPart value)
Chris Lattner73cde982007-08-16 15:56:55 +00002251 {
2252 unsigned int n, msb;
2253
2254 if (value == 0)
2255 return -1U;
2256
2257 n = integerPartWidth / 2;
2258
2259 msb = 0;
2260 do {
2261 if (value >> n) {
2262 value >>= n;
2263 msb += n;
2264 }
2265
2266 n >>= 1;
2267 } while (n);
2268
2269 return msb;
2270 }
2271
Neil Booth58ffb232007-10-06 00:43:45 +00002272 /* Returns the bit number of the least significant set bit of a
2273 part. If the input number has no bits set -1U is returned. */
Dan Gohmanffc2f032008-04-10 21:11:47 +00002274 static unsigned int
Chris Lattner73cde982007-08-16 15:56:55 +00002275 partLSB(integerPart value)
2276 {
2277 unsigned int n, lsb;
2278
2279 if (value == 0)
2280 return -1U;
2281
2282 lsb = integerPartWidth - 1;
2283 n = integerPartWidth / 2;
2284
2285 do {
2286 if (value << n) {
2287 value <<= n;
2288 lsb -= n;
2289 }
2290
2291 n >>= 1;
2292 } while (n);
2293
2294 return lsb;
2295 }
2296}
2297
2298/* Sets the least significant part of a bignum to the input value, and
2299 zeroes out higher parts. */
2300void
2301APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2302{
2303 unsigned int i;
2304
Neil Bootha0f524a2007-10-08 13:47:12 +00002305 assert (parts > 0);
2306
Chris Lattner73cde982007-08-16 15:56:55 +00002307 dst[0] = part;
2308 for(i = 1; i < parts; i++)
2309 dst[i] = 0;
2310}
2311
2312/* Assign one bignum to another. */
2313void
2314APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2315{
2316 unsigned int i;
2317
2318 for(i = 0; i < parts; i++)
2319 dst[i] = src[i];
2320}
2321
2322/* Returns true if a bignum is zero, false otherwise. */
2323bool
2324APInt::tcIsZero(const integerPart *src, unsigned int parts)
2325{
2326 unsigned int i;
2327
2328 for(i = 0; i < parts; i++)
2329 if (src[i])
2330 return false;
2331
2332 return true;
2333}
2334
2335/* Extract the given bit of a bignum; returns 0 or 1. */
2336int
2337APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2338{
2339 return(parts[bit / integerPartWidth]
2340 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2341}
2342
2343/* Set the given bit of a bignum. */
2344void
2345APInt::tcSetBit(integerPart *parts, unsigned int bit)
2346{
2347 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2348}
2349
Neil Booth58ffb232007-10-06 00:43:45 +00002350/* Returns the bit number of the least significant set bit of a
2351 number. If the input number has no bits set -1U is returned. */
Chris Lattner73cde982007-08-16 15:56:55 +00002352unsigned int
2353APInt::tcLSB(const integerPart *parts, unsigned int n)
2354{
2355 unsigned int i, lsb;
2356
2357 for(i = 0; i < n; i++) {
2358 if (parts[i] != 0) {
2359 lsb = partLSB(parts[i]);
2360
2361 return lsb + i * integerPartWidth;
2362 }
2363 }
2364
2365 return -1U;
2366}
2367
Neil Booth58ffb232007-10-06 00:43:45 +00002368/* Returns the bit number of the most significant set bit of a number.
2369 If the input number has no bits set -1U is returned. */
Chris Lattner73cde982007-08-16 15:56:55 +00002370unsigned int
2371APInt::tcMSB(const integerPart *parts, unsigned int n)
2372{
2373 unsigned int msb;
2374
2375 do {
2376 --n;
2377
2378 if (parts[n] != 0) {
Chris Lattnerdb80e212007-08-20 22:49:32 +00002379 msb = partMSB(parts[n]);
Chris Lattner73cde982007-08-16 15:56:55 +00002380
2381 return msb + n * integerPartWidth;
2382 }
2383 } while (n);
2384
2385 return -1U;
2386}
2387
Neil Bootha0f524a2007-10-08 13:47:12 +00002388/* Copy the bit vector of width srcBITS from SRC, starting at bit
2389 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2390 the least significant bit of DST. All high bits above srcBITS in
2391 DST are zero-filled. */
2392void
Evan Chengc257df32009-05-21 23:47:47 +00002393APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Bootha0f524a2007-10-08 13:47:12 +00002394 unsigned int srcBits, unsigned int srcLSB)
2395{
2396 unsigned int firstSrcPart, dstParts, shift, n;
2397
2398 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2399 assert (dstParts <= dstCount);
2400
2401 firstSrcPart = srcLSB / integerPartWidth;
2402 tcAssign (dst, src + firstSrcPart, dstParts);
2403
2404 shift = srcLSB % integerPartWidth;
2405 tcShiftRight (dst, dstParts, shift);
2406
2407 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2408 in DST. If this is less that srcBits, append the rest, else
2409 clear the high bits. */
2410 n = dstParts * integerPartWidth - shift;
2411 if (n < srcBits) {
2412 integerPart mask = lowBitMask (srcBits - n);
2413 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2414 << n % integerPartWidth);
2415 } else if (n > srcBits) {
Neil Booth69731ff2007-10-12 15:31:31 +00002416 if (srcBits % integerPartWidth)
2417 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Bootha0f524a2007-10-08 13:47:12 +00002418 }
2419
2420 /* Clear high parts. */
2421 while (dstParts < dstCount)
2422 dst[dstParts++] = 0;
2423}
2424
Chris Lattner73cde982007-08-16 15:56:55 +00002425/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2426integerPart
2427APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2428 integerPart c, unsigned int parts)
2429{
2430 unsigned int i;
2431
2432 assert(c <= 1);
2433
2434 for(i = 0; i < parts; i++) {
2435 integerPart l;
2436
2437 l = dst[i];
2438 if (c) {
2439 dst[i] += rhs[i] + 1;
2440 c = (dst[i] <= l);
2441 } else {
2442 dst[i] += rhs[i];
2443 c = (dst[i] < l);
2444 }
2445 }
2446
2447 return c;
2448}
2449
2450/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2451integerPart
2452APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2453 integerPart c, unsigned int parts)
2454{
2455 unsigned int i;
2456
2457 assert(c <= 1);
2458
2459 for(i = 0; i < parts; i++) {
2460 integerPart l;
2461
2462 l = dst[i];
2463 if (c) {
2464 dst[i] -= rhs[i] + 1;
2465 c = (dst[i] >= l);
2466 } else {
2467 dst[i] -= rhs[i];
2468 c = (dst[i] > l);
2469 }
2470 }
2471
2472 return c;
2473}
2474
2475/* Negate a bignum in-place. */
2476void
2477APInt::tcNegate(integerPart *dst, unsigned int parts)
2478{
2479 tcComplement(dst, parts);
2480 tcIncrement(dst, parts);
2481}
2482
Neil Booth58ffb232007-10-06 00:43:45 +00002483/* DST += SRC * MULTIPLIER + CARRY if add is true
2484 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner73cde982007-08-16 15:56:55 +00002485
2486 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2487 they must start at the same point, i.e. DST == SRC.
2488
2489 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2490 returned. Otherwise DST is filled with the least significant
2491 DSTPARTS parts of the result, and if all of the omitted higher
2492 parts were zero return zero, otherwise overflow occurred and
2493 return one. */
2494int
2495APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2496 integerPart multiplier, integerPart carry,
2497 unsigned int srcParts, unsigned int dstParts,
2498 bool add)
2499{
2500 unsigned int i, n;
2501
2502 /* Otherwise our writes of DST kill our later reads of SRC. */
2503 assert(dst <= src || dst >= src + srcParts);
2504 assert(dstParts <= srcParts + 1);
2505
2506 /* N loops; minimum of dstParts and srcParts. */
2507 n = dstParts < srcParts ? dstParts: srcParts;
2508
2509 for(i = 0; i < n; i++) {
2510 integerPart low, mid, high, srcPart;
2511
2512 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2513
2514 This cannot overflow, because
2515
2516 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2517
2518 which is less than n^2. */
2519
2520 srcPart = src[i];
2521
2522 if (multiplier == 0 || srcPart == 0) {
2523 low = carry;
2524 high = 0;
2525 } else {
2526 low = lowHalf(srcPart) * lowHalf(multiplier);
2527 high = highHalf(srcPart) * highHalf(multiplier);
2528
2529 mid = lowHalf(srcPart) * highHalf(multiplier);
2530 high += highHalf(mid);
2531 mid <<= integerPartWidth / 2;
2532 if (low + mid < low)
2533 high++;
2534 low += mid;
2535
2536 mid = highHalf(srcPart) * lowHalf(multiplier);
2537 high += highHalf(mid);
2538 mid <<= integerPartWidth / 2;
2539 if (low + mid < low)
2540 high++;
2541 low += mid;
2542
2543 /* Now add carry. */
2544 if (low + carry < low)
2545 high++;
2546 low += carry;
2547 }
2548
2549 if (add) {
2550 /* And now DST[i], and store the new low part there. */
2551 if (low + dst[i] < low)
2552 high++;
2553 dst[i] += low;
2554 } else
2555 dst[i] = low;
2556
2557 carry = high;
2558 }
2559
2560 if (i < dstParts) {
2561 /* Full multiplication, there is no overflow. */
2562 assert(i + 1 == dstParts);
2563 dst[i] = carry;
2564 return 0;
2565 } else {
2566 /* We overflowed if there is carry. */
2567 if (carry)
2568 return 1;
2569
2570 /* We would overflow if any significant unwritten parts would be
2571 non-zero. This is true if any remaining src parts are non-zero
2572 and the multiplier is non-zero. */
2573 if (multiplier)
2574 for(; i < srcParts; i++)
2575 if (src[i])
2576 return 1;
2577
2578 /* We fitted in the narrow destination. */
2579 return 0;
2580 }
2581}
2582
2583/* DST = LHS * RHS, where DST has the same width as the operands and
2584 is filled with the least significant parts of the result. Returns
2585 one if overflow occurred, otherwise zero. DST must be disjoint
2586 from both operands. */
2587int
2588APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2589 const integerPart *rhs, unsigned int parts)
2590{
2591 unsigned int i;
2592 int overflow;
2593
2594 assert(dst != lhs && dst != rhs);
2595
2596 overflow = 0;
2597 tcSet(dst, 0, parts);
2598
2599 for(i = 0; i < parts; i++)
2600 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2601 parts - i, true);
2602
2603 return overflow;
2604}
2605
Neil Booth004e9f42007-10-06 00:24:48 +00002606/* DST = LHS * RHS, where DST has width the sum of the widths of the
2607 operands. No overflow occurs. DST must be disjoint from both
2608 operands. Returns the number of parts required to hold the
2609 result. */
2610unsigned int
Chris Lattner73cde982007-08-16 15:56:55 +00002611APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth004e9f42007-10-06 00:24:48 +00002612 const integerPart *rhs, unsigned int lhsParts,
2613 unsigned int rhsParts)
Chris Lattner73cde982007-08-16 15:56:55 +00002614{
Neil Booth004e9f42007-10-06 00:24:48 +00002615 /* Put the narrower number on the LHS for less loops below. */
2616 if (lhsParts > rhsParts) {
2617 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2618 } else {
2619 unsigned int n;
Chris Lattner73cde982007-08-16 15:56:55 +00002620
Neil Booth004e9f42007-10-06 00:24:48 +00002621 assert(dst != lhs && dst != rhs);
Chris Lattner73cde982007-08-16 15:56:55 +00002622
Neil Booth004e9f42007-10-06 00:24:48 +00002623 tcSet(dst, 0, rhsParts);
Chris Lattner73cde982007-08-16 15:56:55 +00002624
Neil Booth004e9f42007-10-06 00:24:48 +00002625 for(n = 0; n < lhsParts; n++)
2626 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattner73cde982007-08-16 15:56:55 +00002627
Neil Booth004e9f42007-10-06 00:24:48 +00002628 n = lhsParts + rhsParts;
2629
2630 return n - (dst[n - 1] == 0);
2631 }
Chris Lattner73cde982007-08-16 15:56:55 +00002632}
2633
2634/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2635 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2636 set REMAINDER to the remainder, return zero. i.e.
2637
2638 OLD_LHS = RHS * LHS + REMAINDER
2639
2640 SCRATCH is a bignum of the same size as the operands and result for
2641 use by the routine; its contents need not be initialized and are
2642 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2643*/
2644int
2645APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2646 integerPart *remainder, integerPart *srhs,
2647 unsigned int parts)
2648{
2649 unsigned int n, shiftCount;
2650 integerPart mask;
2651
2652 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2653
Chris Lattnerdb80e212007-08-20 22:49:32 +00002654 shiftCount = tcMSB(rhs, parts) + 1;
2655 if (shiftCount == 0)
Chris Lattner73cde982007-08-16 15:56:55 +00002656 return true;
2657
Chris Lattnerdb80e212007-08-20 22:49:32 +00002658 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattner73cde982007-08-16 15:56:55 +00002659 n = shiftCount / integerPartWidth;
2660 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2661
2662 tcAssign(srhs, rhs, parts);
2663 tcShiftLeft(srhs, parts, shiftCount);
2664 tcAssign(remainder, lhs, parts);
2665 tcSet(lhs, 0, parts);
2666
2667 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2668 the total. */
2669 for(;;) {
2670 int compare;
2671
2672 compare = tcCompare(remainder, srhs, parts);
2673 if (compare >= 0) {
2674 tcSubtract(remainder, srhs, 0, parts);
2675 lhs[n] |= mask;
2676 }
2677
2678 if (shiftCount == 0)
2679 break;
2680 shiftCount--;
2681 tcShiftRight(srhs, parts, 1);
2682 if ((mask >>= 1) == 0)
2683 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2684 }
2685
2686 return false;
2687}
2688
2689/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2690 There are no restrictions on COUNT. */
2691void
2692APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2693{
Neil Bootha0f524a2007-10-08 13:47:12 +00002694 if (count) {
2695 unsigned int jump, shift;
Chris Lattner73cde982007-08-16 15:56:55 +00002696
Neil Bootha0f524a2007-10-08 13:47:12 +00002697 /* Jump is the inter-part jump; shift is is intra-part shift. */
2698 jump = count / integerPartWidth;
2699 shift = count % integerPartWidth;
Chris Lattner73cde982007-08-16 15:56:55 +00002700
Neil Bootha0f524a2007-10-08 13:47:12 +00002701 while (parts > jump) {
2702 integerPart part;
Chris Lattner73cde982007-08-16 15:56:55 +00002703
Neil Bootha0f524a2007-10-08 13:47:12 +00002704 parts--;
Chris Lattner73cde982007-08-16 15:56:55 +00002705
Neil Bootha0f524a2007-10-08 13:47:12 +00002706 /* dst[i] comes from the two parts src[i - jump] and, if we have
2707 an intra-part shift, src[i - jump - 1]. */
2708 part = dst[parts - jump];
2709 if (shift) {
2710 part <<= shift;
Chris Lattner73cde982007-08-16 15:56:55 +00002711 if (parts >= jump + 1)
2712 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2713 }
2714
Neil Bootha0f524a2007-10-08 13:47:12 +00002715 dst[parts] = part;
2716 }
Chris Lattner73cde982007-08-16 15:56:55 +00002717
Neil Bootha0f524a2007-10-08 13:47:12 +00002718 while (parts > 0)
2719 dst[--parts] = 0;
2720 }
Chris Lattner73cde982007-08-16 15:56:55 +00002721}
2722
2723/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2724 zero. There are no restrictions on COUNT. */
2725void
2726APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2727{
Neil Bootha0f524a2007-10-08 13:47:12 +00002728 if (count) {
2729 unsigned int i, jump, shift;
Chris Lattner73cde982007-08-16 15:56:55 +00002730
Neil Bootha0f524a2007-10-08 13:47:12 +00002731 /* Jump is the inter-part jump; shift is is intra-part shift. */
2732 jump = count / integerPartWidth;
2733 shift = count % integerPartWidth;
Chris Lattner73cde982007-08-16 15:56:55 +00002734
Neil Bootha0f524a2007-10-08 13:47:12 +00002735 /* Perform the shift. This leaves the most significant COUNT bits
2736 of the result at zero. */
2737 for(i = 0; i < parts; i++) {
2738 integerPart part;
Chris Lattner73cde982007-08-16 15:56:55 +00002739
Neil Bootha0f524a2007-10-08 13:47:12 +00002740 if (i + jump >= parts) {
2741 part = 0;
2742 } else {
2743 part = dst[i + jump];
2744 if (shift) {
2745 part >>= shift;
2746 if (i + jump + 1 < parts)
2747 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2748 }
Chris Lattner73cde982007-08-16 15:56:55 +00002749 }
Chris Lattner73cde982007-08-16 15:56:55 +00002750
Neil Bootha0f524a2007-10-08 13:47:12 +00002751 dst[i] = part;
2752 }
Chris Lattner73cde982007-08-16 15:56:55 +00002753 }
2754}
2755
2756/* Bitwise and of two bignums. */
2757void
2758APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2759{
2760 unsigned int i;
2761
2762 for(i = 0; i < parts; i++)
2763 dst[i] &= rhs[i];
2764}
2765
2766/* Bitwise inclusive or of two bignums. */
2767void
2768APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2769{
2770 unsigned int i;
2771
2772 for(i = 0; i < parts; i++)
2773 dst[i] |= rhs[i];
2774}
2775
2776/* Bitwise exclusive or of two bignums. */
2777void
2778APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2779{
2780 unsigned int i;
2781
2782 for(i = 0; i < parts; i++)
2783 dst[i] ^= rhs[i];
2784}
2785
2786/* Complement a bignum in-place. */
2787void
2788APInt::tcComplement(integerPart *dst, unsigned int parts)
2789{
2790 unsigned int i;
2791
2792 for(i = 0; i < parts; i++)
2793 dst[i] = ~dst[i];
2794}
2795
2796/* Comparison (unsigned) of two bignums. */
2797int
2798APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2799 unsigned int parts)
2800{
2801 while (parts) {
2802 parts--;
2803 if (lhs[parts] == rhs[parts])
2804 continue;
2805
2806 if (lhs[parts] > rhs[parts])
2807 return 1;
2808 else
2809 return -1;
2810 }
2811
2812 return 0;
2813}
2814
2815/* Increment a bignum in-place, return the carry flag. */
2816integerPart
2817APInt::tcIncrement(integerPart *dst, unsigned int parts)
2818{
2819 unsigned int i;
2820
2821 for(i = 0; i < parts; i++)
2822 if (++dst[i] != 0)
2823 break;
2824
2825 return i == parts;
2826}
2827
2828/* Set the least significant BITS bits of a bignum, clear the
2829 rest. */
2830void
2831APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2832 unsigned int bits)
2833{
2834 unsigned int i;
2835
2836 i = 0;
2837 while (bits > integerPartWidth) {
2838 dst[i++] = ~(integerPart) 0;
2839 bits -= integerPartWidth;
2840 }
2841
2842 if (bits)
2843 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2844
2845 while (i < parts)
2846 dst[i++] = 0;
2847}