blob: 6943d279767f23a3a729d97ff2c2580f5d4341eb [file] [log] [blame]
Zhou Shengfd43dcf2007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Zhou Shengfd43dcf2007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencer5d0d05c2007-02-25 19:32:03 +000010// This file implements a class to represent arbitrary precision integer
11// constant values and provide a variety of arithmetic operations on them.
Zhou Shengfd43dcf2007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer9d6c9192007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
Daniel Dunbar689ad6e2009-08-13 02:33:34 +000017#include "llvm/ADT/StringRef.h"
Ted Kremeneke420deb2008-01-19 04:23:33 +000018#include "llvm/ADT/FoldingSet.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000020#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000021#include "llvm/Support/ErrorHandling.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000022#include "llvm/Support/MathExtras.h"
Chris Lattner944fac72008-08-23 22:23:09 +000023#include "llvm/Support/raw_ostream.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000024#include <cmath>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000025#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000026#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000027#include <cstdlib>
28using namespace llvm;
29
Reid Spencer5d0d05c2007-02-25 19:32:03 +000030/// A utility function for allocating memory, checking for allocation failures,
31/// and ensuring the contents are zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000032inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +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;
Zhou Sheng353815d2007-02-06 06:04:53 +000037}
38
Eric Christopherd37eda82009-08-21 04:06:45 +000039/// A utility function for allocating memory and checking for allocation
Reid Spencer5d0d05c2007-02-25 19:32:03 +000040/// failure. The content is not zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000041inline static uint64_t* getMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000042 uint64_t * result = new uint64_t[numWords];
43 assert(result && "APInt memory allocation fails!");
44 return result;
45}
46
Erick Tryzelaarae8f78d2009-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 Lattner455e9ab2009-01-21 18:09:24 +000076void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000077 pVal = getClearedMemory(getNumWords());
78 pVal[0] = val;
Eric Christopherd37eda82009-08-21 04:06:45 +000079 if (isSigned && int64_t(val) < 0)
Chris Lattner98f8ccf2008-08-20 17:02:31 +000080 for (unsigned i = 1; i < getNumWords(); ++i)
81 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000082}
83
Chris Lattner119c30b2008-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 Lattner455e9ab2009-01-21 18:09:24 +000090APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Chris Lattner944fac72008-08-23 22:23:09 +000091 : BitWidth(numBits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000092 assert(BitWidth && "Bitwidth too small");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000093 assert(bigVal && "Null pointer detected!");
94 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000095 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000096 else {
Reid Spencer610fad82007-02-24 10:01:42 +000097 // Get memory, cleared to 0
98 pVal = getClearedMemory(getNumWords());
99 // Calculate the number of words to copy
Chris Lattner455e9ab2009-01-21 18:09:24 +0000100 unsigned words = std::min<unsigned>(numWords, getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +0000101 // Copy the words from bigVal to pVal
102 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000103 }
Reid Spencer610fad82007-02-24 10:01:42 +0000104 // Make sure unused high bits are cleared
105 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000106}
107
Eric Christopherd37eda82009-08-21 04:06:45 +0000108APInt::APInt(unsigned numbits, const StringRef& Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +0000109 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000110 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000111 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000112}
113
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000114APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000115 // Don't do anything for X = X
116 if (this == &RHS)
117 return *this;
118
Reid Spencer9ac44112007-02-26 23:38:21 +0000119 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-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);
Reid Spencer9ac44112007-02-26 23:38:21 +0000123 return *this;
124 }
125
Chris Lattner98f8ccf2008-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);
Eric Christopherd37eda82009-08-21 04:06:45 +0000132 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000133 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
134 else if (RHS.isSingleWord()) {
135 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000136 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000137 } 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();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000144}
145
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000146APInt& APInt::operator=(uint64_t RHS) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000147 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000148 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000149 else {
150 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000151 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000152 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000153 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000154}
155
Ted Kremeneke420deb2008-01-19 04:23:33 +0000156/// Profile - This method 'profiles' an APInt for use with FoldingSet.
157void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000158 ID.AddInteger(BitWidth);
Eric Christopherd37eda82009-08-21 04:06:45 +0000159
Ted Kremeneke420deb2008-01-19 04:23:33 +0000160 if (isSingleWord()) {
161 ID.AddInteger(VAL);
162 return;
163 }
164
Chris Lattner455e9ab2009-01-21 18:09:24 +0000165 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000166 for (unsigned i = 0; i < NumWords; ++i)
167 ID.AddInteger(pVal[i]);
168}
169
Eric Christopherd37eda82009-08-21 04:06:45 +0000170/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spenceraf0e9562007-02-18 18:38:44 +0000171/// "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.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000173/// @returns the carry of the addition.
Chris Lattner455e9ab2009-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) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000176 dest[i] = y + x[i];
177 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000178 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000179 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000180 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000181 break;
182 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000183 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000184 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000185}
186
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000187/// @brief Prefix increment operator. Increments the APInt by one.
188APInt& APInt::operator++() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000189 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000190 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000191 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000192 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000193 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000194}
195
Eric Christopherd37eda82009-08-21 04:06:45 +0000196/// 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
Reid Spenceraf0e9562007-02-18 18:38:44 +0000198/// 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.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000201/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-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) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000204 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000205 x[i] -= y;
Eric Christopherd37eda82009-08-21 04:06:45 +0000206 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000207 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000208 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000209 y = 0; // No need to borrow
210 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000211 }
212 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000213 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000214}
215
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000216/// @brief Prefix decrement operator. Decrements the APInt by one.
217APInt& APInt::operator--() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000218 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000219 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000220 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000221 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000222 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000223}
224
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000225/// add - This function adds the integer array x to the integer array Y and
Eric Christopherd37eda82009-08-21 04:06:45 +0000226/// places the result in dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000227/// @returns the carry out from the addition
228/// @brief General addition of 64-bit integer arrays
Eric Christopherd37eda82009-08-21 04:06:45 +0000229static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000230 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000231 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000232 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000233 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000234 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000235 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000236 }
237 return carry;
238}
239
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000240/// Adds the RHS APint to this APInt.
241/// @returns this, after addition of RHS.
Eric Christopherd37eda82009-08-21 04:06:45 +0000242/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000243APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000244 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000245 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000246 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000247 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000248 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000249 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000250 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000251}
252
Eric Christopherd37eda82009-08-21 04:06:45 +0000253/// Subtracts the integer array y from the integer array x
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000254/// @returns returns the borrow out.
255/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopherd37eda82009-08-21 04:06:45 +0000256static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000257 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000258 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000259 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +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];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000263 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000264 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000265}
266
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000267/// Subtracts the RHS APInt from this APInt
268/// @returns this, after subtraction
Eric Christopherd37eda82009-08-21 04:06:45 +0000269/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000270APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000271 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000272 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000273 VAL -= RHS.VAL;
274 else
275 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000276 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000277}
278
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000279/// Multiplies an integer array, x by a a uint64_t integer and places the result
Eric Christopherd37eda82009-08-21 04:06:45 +0000280/// into dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000281/// @returns the carry out of the multiplication.
282/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000283static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000284 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000285 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000286 uint64_t carry = 0;
287
288 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000289 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +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.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000294 // 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);
Eric Christopherd37eda82009-08-21 04:06:45 +0000302 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000303 // (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);
Eric Christopherd37eda82009-08-21 04:06:45 +0000308 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000309 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
310 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000311 return carry;
312}
313
Eric Christopherd37eda82009-08-21 04:06:45 +0000314/// Multiplies integer array x by integer array y and stores the result into
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000315/// the integer array dest. Note that dest's size must be >= xlen + ylen.
316/// @brief Generalized multiplicate of integer arrays.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000317static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
318 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000319 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000320 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000321 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000322 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000323 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +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)+
Eric Christopherd37eda82009-08-21 04:06:45 +0000340 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000341 ((lx * hy) >> 32) + hx * hy;
342 }
343 dest[i+xlen] = carry;
344 }
345}
346
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000347APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000348 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000349 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000350 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000351 clearUnusedBits();
352 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000353 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000354
355 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000356 unsigned lhsBits = getActiveBits();
357 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopherd37eda82009-08-21 04:06:45 +0000358 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +0000359 // 0 * X ===> 0
360 return *this;
361
362 // Get some bit facts about RHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000363 unsigned rhsBits = RHS.getActiveBits();
364 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000365 if (!rhsWords) {
366 // X * 0 ===> 0
367 clear();
368 return *this;
369 }
370
371 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000372 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-02-21 08:21:52 +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 Lattner455e9ab2009-01-21 18:09:24 +0000380 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000381 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
382
383 // delete dest array and return
384 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000385 return *this;
386}
387
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000388APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000389 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000390 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000391 VAL &= RHS.VAL;
392 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000393 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000394 unsigned numWords = getNumWords();
395 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000396 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000397 return *this;
398}
399
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000400APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000401 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000402 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000403 VAL |= RHS.VAL;
404 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000405 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000406 unsigned numWords = getNumWords();
407 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000408 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000409 return *this;
410}
411
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000412APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000413 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000414 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000415 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000416 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000417 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000418 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000419 unsigned numWords = getNumWords();
420 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000421 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000422 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000423}
424
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000425APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000426 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000427 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000428 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000429 val[i] = pVal[i] & RHS.pVal[i];
430 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000431}
432
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000433APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000434 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000435 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000436 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000437 val[i] = pVal[i] | RHS.pVal[i];
438 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000439}
440
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000441APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000442 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000443 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000444 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +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();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000449}
450
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000451bool APInt::operator !() const {
452 if (isSingleWord())
453 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000454
Chris Lattner455e9ab2009-01-21 18:09:24 +0000455 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000456 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000457 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000458 return true;
459}
460
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000461APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000462 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000463 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000464 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000465 APInt Result(*this);
466 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000467 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000468}
469
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000470APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000471 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000472 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000473 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000474 APInt Result(BitWidth, 0);
475 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000476 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000477}
478
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000479APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000480 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000481 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000482 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000483 APInt Result(BitWidth, 0);
484 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000485 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000486}
487
Chris Lattner455e9ab2009-01-21 18:09:24 +0000488bool APInt::operator[](unsigned bitPosition) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000489 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000490 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000491}
492
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000493bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000494 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000495 unsigned n1 = getActiveBits();
496 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000497
498 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000499 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000500 return false;
501
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000502 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000503 if (n1 <= APINT_BITS_PER_WORD)
504 return pVal[0] == RHS.pVal[0];
505
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000506 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000507 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000508 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000509 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000510 return true;
511}
512
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000513bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000514 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000515 if (n <= APINT_BITS_PER_WORD)
516 return pVal[0] == Val;
517 else
518 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000519}
520
Reid Spencere81d2da2007-02-16 22:36:51 +0000521bool 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;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000525
526 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000527 unsigned n1 = getActiveBits();
528 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +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 Lattner455e9ab2009-01-21 18:09:24 +0000543 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000544 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000545 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000546 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000547 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000548 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000549 }
550 return false;
551}
552
Reid Spencere81d2da2007-02-16 22:36:51 +0000553bool APInt::slt(const APInt& RHS) const {
554 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000555 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;
Reid Spencere81d2da2007-02-16 22:36:51 +0000559 }
Reid Spencera58f0582007-02-18 20:09:41 +0000560
561 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000562 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
Reid Spencera58f0582007-02-18 20:09:41 +0000567 lhs.flip();
568 lhs++;
569 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000570 if (rhsNeg) {
571 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000572 rhs.flip();
573 rhs++;
574 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000575
576 // Now we have unsigned values to compare so do the comparison if necessary
577 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000578 if (lhsNeg)
579 if (rhsNeg)
580 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000581 else
582 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000583 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000584 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000585 else
Reid Spencera58f0582007-02-18 20:09:41 +0000586 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000587}
588
Chris Lattner455e9ab2009-01-21 18:09:24 +0000589APInt& APInt::set(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000590 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000591 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000592 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000593 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000594 return *this;
595}
596
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000597/// Set the given bit to 0 whose position is given as "bitPosition".
598/// @brief Set a given bit to 0.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000599APInt& APInt::clear(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000600 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000601 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000602 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000603 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000604 return *this;
605}
606
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000607/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000608
Eric Christopherd37eda82009-08-21 04:06:45 +0000609/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000610/// as "bitPosition".
611/// @brief Toggles a given bit to its opposite value.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000612APInt& APInt::flip(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000613 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000614 if ((*this)[bitPosition]) clear(bitPosition);
615 else set(bitPosition);
616 return *this;
617}
618
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000619unsigned APInt::getBitsNeeded(const StringRef& str, uint8_t radix) {
620 assert(!str.empty() && "Invalid string length");
Erick Tryzelaarbb975312009-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 Dunbar689ad6e2009-08-13 02:33:34 +0000623
624 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000625
Eric Christophere250f2a2009-08-21 04:10:31 +0000626 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000627 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000628 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000629 if (*p == '-' || *p == '+') {
630 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000631 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000632 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000633 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000634
Reid Spencer57ae4f52007-04-13 19:19:07 +0000635 // For radixes of power-of-two values, the bits required is accurately and
636 // easily computed
637 if (radix == 2)
638 return slen + isNegative;
639 if (radix == 8)
640 return slen * 3 + isNegative;
641 if (radix == 16)
642 return slen * 4 + isNegative;
643
Reid Spencer57ae4f52007-04-13 19:19:07 +0000644 // This is grossly inefficient but accurate. We could probably do something
645 // with a computation of roughly slen*64/20 and then adjust by the value of
646 // the first few digits. But, I'm not sure how accurate that could be.
647
648 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000649 // be too large. This avoids the assertion in the constructor. This
650 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
651 // bits in that case.
652 unsigned sufficient = slen == 1 ? 4 : slen * 64/18;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000653
654 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000655 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000656
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000657 // Compute how many bits are required. If the log is infinite, assume we need
658 // just bit.
659 unsigned log = tmp.logBase2();
660 if (log == (unsigned)-1) {
661 return isNegative + 1;
662 } else {
663 return isNegative + log + 1;
664 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000665}
666
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000667// From http://www.burtleburtle.net, byBob Jenkins.
668// When targeting x86, both GCC and LLVM seem to recognize this as a
669// rotate instruction.
670#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencer794f4722007-02-26 21:02:27 +0000671
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000672// From http://www.burtleburtle.net, by Bob Jenkins.
673#define mix(a,b,c) \
674 { \
675 a -= c; a ^= rot(c, 4); c += b; \
676 b -= a; b ^= rot(a, 6); a += c; \
677 c -= b; c ^= rot(b, 8); b += a; \
678 a -= c; a ^= rot(c,16); c += b; \
679 b -= a; b ^= rot(a,19); a += c; \
680 c -= b; c ^= rot(b, 4); b += a; \
681 }
682
683// From http://www.burtleburtle.net, by Bob Jenkins.
684#define final(a,b,c) \
685 { \
686 c ^= b; c -= rot(b,14); \
687 a ^= c; a -= rot(c,11); \
688 b ^= a; b -= rot(a,25); \
689 c ^= b; c -= rot(b,16); \
690 a ^= c; a -= rot(c,4); \
691 b ^= a; b -= rot(a,14); \
692 c ^= b; c -= rot(b,24); \
693 }
694
695// hashword() was adapted from http://www.burtleburtle.net, by Bob
696// Jenkins. k is a pointer to an array of uint32_t values; length is
697// the length of the key, in 32-bit chunks. This version only handles
698// keys that are a multiple of 32 bits in size.
699static inline uint32_t hashword(const uint64_t *k64, size_t length)
700{
701 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
702 uint32_t a,b,c;
703
704 /* Set up the internal state */
705 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
706
707 /*------------------------------------------------- handle most of the key */
708 while (length > 3)
709 {
710 a += k[0];
711 b += k[1];
712 c += k[2];
713 mix(a,b,c);
714 length -= 3;
715 k += 3;
716 }
717
718 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-05-13 23:23:20 +0000719 switch (length) { /* all the case statements fall through */
720 case 3 : c+=k[2];
721 case 2 : b+=k[1];
722 case 1 : a+=k[0];
723 final(a,b,c);
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000724 case 0: /* case 0: nothing left to add */
725 break;
726 }
727 /*------------------------------------------------------ report the result */
728 return c;
729}
730
731// hashword8() was adapted from http://www.burtleburtle.net, by Bob
732// Jenkins. This computes a 32-bit hash from one 64-bit word. When
733// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
734// function into about 35 instructions when inlined.
735static inline uint32_t hashword8(const uint64_t k64)
736{
737 uint32_t a,b,c;
738 a = b = c = 0xdeadbeef + 4;
739 b += k64 >> 32;
740 a += k64 & 0xffffffff;
741 final(a,b,c);
742 return c;
743}
744#undef final
745#undef mix
746#undef rot
747
748uint64_t APInt::getHashValue() const {
749 uint64_t hash;
Reid Spencer794f4722007-02-26 21:02:27 +0000750 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000751 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000752 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000753 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000754 return hash;
755}
756
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000757/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000758APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000759 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000760}
761
762/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000763APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000764 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000765 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000766}
767
Reid Spencere81d2da2007-02-16 22:36:51 +0000768bool APInt::isPowerOf2() const {
769 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
770}
771
Chris Lattner455e9ab2009-01-21 18:09:24 +0000772unsigned APInt::countLeadingZerosSlowCase() const {
773 unsigned Count = 0;
774 for (unsigned i = getNumWords(); i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000775 if (pVal[i-1] == 0)
776 Count += APINT_BITS_PER_WORD;
777 else {
778 Count += CountLeadingZeros_64(pVal[i-1]);
779 break;
Reid Spencere549c492007-02-21 00:29:48 +0000780 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000781 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000782 unsigned remainder = BitWidth % APINT_BITS_PER_WORD;
Reid Spencerab2b2c82007-02-22 00:22:00 +0000783 if (remainder)
784 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner9e513ac2007-11-23 22:42:31 +0000785 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000786}
787
Chris Lattner455e9ab2009-01-21 18:09:24 +0000788static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
789 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000790 if (skip)
791 V <<= skip;
792 while (V && (V & (1ULL << 63))) {
793 Count++;
794 V <<= 1;
795 }
796 return Count;
797}
798
Chris Lattner455e9ab2009-01-21 18:09:24 +0000799unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000800 if (isSingleWord())
801 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
802
Chris Lattner455e9ab2009-01-21 18:09:24 +0000803 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000804 unsigned shift;
805 if (!highWordBits) {
806 highWordBits = APINT_BITS_PER_WORD;
807 shift = 0;
808 } else {
809 shift = APINT_BITS_PER_WORD - highWordBits;
810 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000811 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000812 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000813 if (Count == highWordBits) {
814 for (i--; i >= 0; --i) {
815 if (pVal[i] == -1ULL)
816 Count += APINT_BITS_PER_WORD;
817 else {
818 Count += countLeadingOnes_64(pVal[i], 0);
819 break;
820 }
821 }
822 }
823 return Count;
824}
825
Chris Lattner455e9ab2009-01-21 18:09:24 +0000826unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000827 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000828 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
829 unsigned Count = 0;
830 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000831 for (; i < getNumWords() && pVal[i] == 0; ++i)
832 Count += APINT_BITS_PER_WORD;
833 if (i < getNumWords())
834 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000835 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000836}
837
Chris Lattner455e9ab2009-01-21 18:09:24 +0000838unsigned APInt::countTrailingOnesSlowCase() const {
839 unsigned Count = 0;
840 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000841 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000842 Count += APINT_BITS_PER_WORD;
843 if (i < getNumWords())
844 Count += CountTrailingOnes_64(pVal[i]);
845 return std::min(Count, BitWidth);
846}
847
Chris Lattner455e9ab2009-01-21 18:09:24 +0000848unsigned APInt::countPopulationSlowCase() const {
849 unsigned Count = 0;
850 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000851 Count += CountPopulation_64(pVal[i]);
852 return Count;
853}
854
Reid Spencere81d2da2007-02-16 22:36:51 +0000855APInt APInt::byteSwap() const {
856 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
857 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000858 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000859 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000860 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000861 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000862 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000863 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000864 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000865 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000866 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000867 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000868 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000869 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000870 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000871 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000872 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000873 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000874 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
875 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000876 }
877 return Result;
878 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000879}
880
Eric Christopherd37eda82009-08-21 04:06:45 +0000881APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000882 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000883 APInt A = API1, B = API2;
884 while (!!B) {
885 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000886 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000887 A = T;
888 }
889 return A;
890}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000891
Chris Lattner455e9ab2009-01-21 18:09:24 +0000892APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000893 union {
894 double D;
895 uint64_t I;
896 } T;
897 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000898
899 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000900 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000901
902 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000903 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000904
905 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000906 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000907 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000908
909 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
910 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
911
912 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000913 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000914 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000915 APInt(width, mantissa >> (52 - exp));
916
917 // If the client didn't provide enough bits for us to shift the mantissa into
918 // then the result is undefined, just return 0
919 if (width <= exp - 52)
920 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000921
922 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000923 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000924 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000925 return isNeg ? -Tmp : Tmp;
926}
927
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000928/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000929/// The layout for double is as following (IEEE Standard 754):
930/// --------------------------------------
931/// | Sign Exponent Fraction Bias |
932/// |-------------------------------------- |
933/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000934/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000935double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000936
937 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000938 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000939 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
940 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000941 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000942 return double(sext);
943 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000944 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000945 }
946
Reid Spencer9c0696f2007-02-20 08:51:03 +0000947 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000948 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000949
950 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000951 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000952
953 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000954 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000955
Reid Spencer9c0696f2007-02-20 08:51:03 +0000956 // The exponent (without bias normalization) is just the number of bits
957 // we are using. Note that the sign bit is gone since we constructed the
958 // absolute value.
959 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000960
Reid Spencer9c0696f2007-02-20 08:51:03 +0000961 // Return infinity for exponent overflow
962 if (exp > 1023) {
963 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000964 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000965 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000966 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000967 }
968 exp += 1023; // Increment for 1023 bias
969
970 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
971 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000972 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000973 unsigned hiWord = whichWord(n-1);
974 if (hiWord == 0) {
975 mantissa = Tmp.pVal[0];
976 if (n > 52)
977 mantissa >>= n - 52; // shift down, we want the top 52 bits.
978 } else {
979 assert(hiWord > 0 && "huh?");
980 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
981 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
982 mantissa = hibits | lobits;
983 }
984
Zhou Shengd93f00c2007-02-12 20:02:55 +0000985 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000986 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000987 union {
988 double D;
989 uint64_t I;
990 } T;
991 T.I = sign | (exp << 52) | mantissa;
992 return T.D;
993}
994
Reid Spencere81d2da2007-02-16 22:36:51 +0000995// Truncate to new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000996APInt &APInt::trunc(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000997 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000998 assert(width && "Can't truncate to 0 bits");
Chris Lattner455e9ab2009-01-21 18:09:24 +0000999 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001000 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001001 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001002 if (wordsBefore != wordsAfter) {
1003 if (wordsAfter == 1) {
1004 uint64_t *tmp = pVal;
1005 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +00001006 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +00001007 } else {
1008 uint64_t *newVal = getClearedMemory(wordsAfter);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001009 for (unsigned i = 0; i < wordsAfter; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001010 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +00001011 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001012 pVal = newVal;
1013 }
1014 }
Reid Spencer94900772007-02-28 17:34:32 +00001015 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001016}
1017
1018// Sign extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001019APInt &APInt::sext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001020 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9eec2412007-02-25 23:44:53 +00001021 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001022 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +00001023 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +00001024 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +00001025 }
1026
1027 // The sign bit is set. First, get some facts
Chris Lattner455e9ab2009-01-21 18:09:24 +00001028 unsigned wordsBefore = getNumWords();
1029 unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001030 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001031 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001032
1033 // Mask the high order word appropriately
1034 if (wordsBefore == wordsAfter) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001035 unsigned newWordBits = width % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001036 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +00001037 uint64_t mask = ~0ULL;
1038 if (newWordBits)
1039 mask >>= APINT_BITS_PER_WORD - newWordBits;
1040 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001041 if (wordsBefore == 1)
1042 VAL |= mask;
1043 else
1044 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001045 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001046 }
1047
Reid Spencerf30b1882007-02-25 23:54:00 +00001048 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001049 uint64_t *newVal = getMemory(wordsAfter);
1050 if (wordsBefore == 1)
1051 newVal[0] = VAL | mask;
1052 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001053 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001054 newVal[i] = pVal[i];
1055 newVal[wordsBefore-1] |= mask;
1056 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001057 for (unsigned i = wordsBefore; i < wordsAfter; i++)
Reid Spencer9eec2412007-02-25 23:44:53 +00001058 newVal[i] = -1ULL;
1059 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001060 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001061 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001062 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001063}
1064
1065// Zero extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001066APInt &APInt::zext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001067 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001068 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001069 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001070 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001071 if (wordsBefore != wordsAfter) {
1072 uint64_t *newVal = getClearedMemory(wordsAfter);
1073 if (wordsBefore == 1)
1074 newVal[0] = VAL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001075 else
Chris Lattner455e9ab2009-01-21 18:09:24 +00001076 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001077 newVal[i] = pVal[i];
1078 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001079 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001080 pVal = newVal;
1081 }
Reid Spencer94900772007-02-28 17:34:32 +00001082 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001083}
1084
Chris Lattner455e9ab2009-01-21 18:09:24 +00001085APInt &APInt::zextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001086 if (BitWidth < width)
1087 return zext(width);
1088 if (BitWidth > width)
1089 return trunc(width);
1090 return *this;
1091}
1092
Chris Lattner455e9ab2009-01-21 18:09:24 +00001093APInt &APInt::sextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001094 if (BitWidth < width)
1095 return sext(width);
1096 if (BitWidth > width)
1097 return trunc(width);
1098 return *this;
1099}
1100
Zhou Shengff4304f2007-02-09 07:48:24 +00001101/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001102/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001103APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001104 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001105}
1106
1107/// Arithmetic right-shift this APInt by shiftAmt.
1108/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001109APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001110 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001111 // Handle a degenerate case
1112 if (shiftAmt == 0)
1113 return *this;
1114
1115 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001116 if (isSingleWord()) {
1117 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001118 return APInt(BitWidth, 0); // undefined
1119 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001120 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001121 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001122 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1123 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001124 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001125
Reid Spencer46f9c942007-03-02 22:39:11 +00001126 // If all the bits were shifted out, the result is, technically, undefined.
1127 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1128 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001129 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001130 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001131 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001132 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001133 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001134 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001135
1136 // Create some space for the result.
1137 uint64_t * val = new uint64_t[getNumWords()];
1138
Reid Spencer46f9c942007-03-02 22:39:11 +00001139 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001140 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1141 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1142 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1143 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001144 if (bitsInWord == 0)
1145 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001146
1147 // If we are shifting whole words, just move whole words
1148 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001149 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001150 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001151 val[i] = pVal[i+offset]; // move whole word
1152
1153 // Adjust the top significant word for sign bit fill, if negative
1154 if (isNegative())
1155 if (bitsInWord < APINT_BITS_PER_WORD)
1156 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1157 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001158 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001159 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001160 // This combines the shifted corresponding word with the low bits from
1161 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001162 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001163 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1164 }
1165
1166 // Shift the break word. In this case there are no bits from the next word
1167 // to include in this word.
1168 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1169
1170 // Deal with sign extenstion in the break word, and possibly the word before
1171 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001172 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001173 if (wordShift > bitsInWord) {
1174 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001175 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001176 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1177 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001178 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001179 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001180 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001181 }
1182
Reid Spencer46f9c942007-03-02 22:39:11 +00001183 // Remaining words are 0 or -1, just assign them.
1184 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001185 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001186 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001187 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001188}
1189
Zhou Shengff4304f2007-02-09 07:48:24 +00001190/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001191/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001192APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001193 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001194}
1195
1196/// Logical right-shift this APInt by shiftAmt.
1197/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001198APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001199 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001200 if (shiftAmt == BitWidth)
1201 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001202 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001203 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001204 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001205
Reid Spencerba81c2b2007-02-26 01:19:48 +00001206 // If all the bits were shifted out, the result is 0. This avoids issues
1207 // with shifting by the size of the integer type, which produces undefined
1208 // results. We define these "undefined results" to always be 0.
1209 if (shiftAmt == BitWidth)
1210 return APInt(BitWidth, 0);
1211
Reid Spencer02ae8b72007-05-17 06:26:29 +00001212 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001213 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001214 // undefined results in the code below. This is also an optimization.
1215 if (shiftAmt == 0)
1216 return *this;
1217
Reid Spencerba81c2b2007-02-26 01:19:48 +00001218 // Create some space for the result.
1219 uint64_t * val = new uint64_t[getNumWords()];
1220
1221 // If we are shifting less than a word, compute the shift with a simple carry
1222 if (shiftAmt < APINT_BITS_PER_WORD) {
1223 uint64_t carry = 0;
1224 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001225 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001226 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1227 }
1228 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001229 }
1230
Reid Spencerba81c2b2007-02-26 01:19:48 +00001231 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001232 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1233 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001234
1235 // If we are shifting whole words, just move whole words
1236 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001237 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001238 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001239 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001240 val[i] = 0;
1241 return APInt(val,BitWidth).clearUnusedBits();
1242 }
1243
Eric Christopherd37eda82009-08-21 04:06:45 +00001244 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001245 unsigned breakWord = getNumWords() - offset -1;
1246 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001247 val[i] = (pVal[i+offset] >> wordShift) |
1248 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001249 // Shift the break word.
1250 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1251
1252 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001253 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001254 val[i] = 0;
1255 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001256}
1257
Zhou Shengff4304f2007-02-09 07:48:24 +00001258/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001259/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001260APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001261 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001262 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001263}
1264
Chris Lattner455e9ab2009-01-21 18:09:24 +00001265APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001266 // If all the bits were shifted out, the result is 0. This avoids issues
1267 // with shifting by the size of the integer type, which produces undefined
1268 // results. We define these "undefined results" to always be 0.
1269 if (shiftAmt == BitWidth)
1270 return APInt(BitWidth, 0);
1271
Reid Spencer92c72832007-05-12 18:01:57 +00001272 // If none of the bits are shifted out, the result is *this. This avoids a
1273 // lshr by the words size in the loop below which can produce incorrect
1274 // results. It also avoids the expensive computation below for a common case.
1275 if (shiftAmt == 0)
1276 return *this;
1277
Reid Spencer87553802007-02-25 00:56:44 +00001278 // Create some space for the result.
1279 uint64_t * val = new uint64_t[getNumWords()];
1280
1281 // If we are shifting less than a word, do it the easy way
1282 if (shiftAmt < APINT_BITS_PER_WORD) {
1283 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001284 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001285 val[i] = pVal[i] << shiftAmt | carry;
1286 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1287 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001288 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001289 }
1290
Reid Spencer87553802007-02-25 00:56:44 +00001291 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001292 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1293 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001294
1295 // If we are shifting whole words, just move whole words
1296 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001297 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001298 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001299 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001300 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001301 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001302 }
Reid Spencer87553802007-02-25 00:56:44 +00001303
1304 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001305 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001306 for (; i > offset; --i)
1307 val[i] = pVal[i-offset] << wordShift |
1308 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001309 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001310 for (i = 0; i < offset; ++i)
1311 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001312 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001313}
1314
Dan Gohmancf609572008-02-29 01:40:47 +00001315APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001316 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001317}
1318
Chris Lattner455e9ab2009-01-21 18:09:24 +00001319APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001320 if (rotateAmt == 0)
1321 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001322 // Don't get too fancy, just use existing shift/or facilities
1323 APInt hi(*this);
1324 APInt lo(*this);
1325 hi.shl(rotateAmt);
1326 lo.lshr(BitWidth - rotateAmt);
1327 return hi | lo;
1328}
1329
Dan Gohmancf609572008-02-29 01:40:47 +00001330APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001331 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001332}
1333
Chris Lattner455e9ab2009-01-21 18:09:24 +00001334APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001335 if (rotateAmt == 0)
1336 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001337 // Don't get too fancy, just use existing shift/or facilities
1338 APInt hi(*this);
1339 APInt lo(*this);
1340 lo.lshr(rotateAmt);
1341 hi.shl(BitWidth - rotateAmt);
1342 return hi | lo;
1343}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001344
1345// Square Root - this method computes and returns the square root of "this".
1346// Three mechanisms are used for computation. For small values (<= 5 bits),
1347// a table lookup is done. This gets some performance for common cases. For
1348// values using less than 52 bits, the value is converted to double and then
1349// the libc sqrt function is called. The result is rounded and then converted
1350// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001351// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001352APInt APInt::sqrt() const {
1353
1354 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001355 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001356
1357 // Use a fast table for some small values. This also gets rid of some
1358 // rounding errors in libc sqrt for small values.
1359 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001360 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001361 /* 0 */ 0,
1362 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001363 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001364 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1365 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1366 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1367 /* 31 */ 6
1368 };
1369 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001370 }
1371
1372 // If the magnitude of the value fits in less than 52 bits (the precision of
1373 // an IEEE double precision floating point value), then we can use the
1374 // libc sqrt function which will probably use a hardware sqrt computation.
1375 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001376 if (magnitude < 52) {
1377#ifdef _MSC_VER
1378 // Amazingly, VC++ doesn't have round().
Eric Christopherd37eda82009-08-21 04:06:45 +00001379 return APInt(BitWidth,
Jeff Cohenca5183d2007-03-05 00:00:42 +00001380 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1381#else
Eric Christopherd37eda82009-08-21 04:06:45 +00001382 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001383 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001384#endif
1385 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001386
1387 // Okay, all the short cuts are exhausted. We must compute it. The following
1388 // is a classical Babylonian method for computing the square root. This code
1389 // was adapted to APINt from a wikipedia article on such computations.
1390 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001391 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001392 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001393 APInt testy(BitWidth, 16);
1394 APInt x_old(BitWidth, 1);
1395 APInt x_new(BitWidth, 0);
1396 APInt two(BitWidth, 2);
1397
1398 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001399 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001400 if (i >= nbits || this->ule(testy)) {
1401 x_old = x_old.shl(i / 2);
1402 break;
1403 }
1404
Eric Christopherd37eda82009-08-21 04:06:45 +00001405 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001406 for (;;) {
1407 x_new = (this->udiv(x_old) + x_old).udiv(two);
1408 if (x_old.ule(x_new))
1409 break;
1410 x_old = x_new;
1411 }
1412
1413 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001414 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001415 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001416 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001417 // floating point representation after 192 bits. There are no discrepancies
1418 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001419 APInt square(x_old * x_old);
1420 APInt nextSquare((x_old + 1) * (x_old +1));
1421 if (this->ult(square))
1422 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001423 else if (this->ule(nextSquare)) {
1424 APInt midpoint((nextSquare - square).udiv(two));
1425 APInt offset(*this - square);
1426 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001427 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001428 else
1429 return x_old + 1;
1430 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001431 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001432 return x_old + 1;
1433}
1434
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001435/// Computes the multiplicative inverse of this APInt for a given modulo. The
1436/// iterative extended Euclidean algorithm is used to solve for this value,
1437/// however we simplify it to speed up calculating only the inverse, and take
1438/// advantage of div+rem calculations. We also use some tricks to avoid copying
1439/// (potentially large) APInts around.
1440APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1441 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1442
1443 // Using the properties listed at the following web page (accessed 06/21/08):
1444 // http://www.numbertheory.org/php/euclid.html
1445 // (especially the properties numbered 3, 4 and 9) it can be proved that
1446 // BitWidth bits suffice for all the computations in the algorithm implemented
1447 // below. More precisely, this number of bits suffice if the multiplicative
1448 // inverse exists, but may not suffice for the general extended Euclidean
1449 // algorithm.
1450
1451 APInt r[2] = { modulo, *this };
1452 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1453 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001454
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001455 unsigned i;
1456 for (i = 0; r[i^1] != 0; i ^= 1) {
1457 // An overview of the math without the confusing bit-flipping:
1458 // q = r[i-2] / r[i-1]
1459 // r[i] = r[i-2] % r[i-1]
1460 // t[i] = t[i-2] - t[i-1] * q
1461 udivrem(r[i], r[i^1], q, r[i]);
1462 t[i] -= t[i^1] * q;
1463 }
1464
1465 // If this APInt and the modulo are not coprime, there is no multiplicative
1466 // inverse, so return 0. We check this by looking at the next-to-last
1467 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1468 // algorithm.
1469 if (r[i] != 1)
1470 return APInt(BitWidth, 0);
1471
1472 // The next-to-last t is the multiplicative inverse. However, we are
1473 // interested in a positive inverse. Calcuate a positive one from a negative
1474 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001475 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001476 return t[i].isNegative() ? t[i] + modulo : t[i];
1477}
1478
Jay Foad4e5ea552009-04-30 10:15:35 +00001479/// Calculate the magic numbers required to implement a signed integer division
1480/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1481/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1482/// Warren, Jr., chapter 10.
1483APInt::ms APInt::magic() const {
1484 const APInt& d = *this;
1485 unsigned p;
1486 APInt ad, anc, delta, q1, r1, q2, r2, t;
1487 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1488 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1489 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1490 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001491
Jay Foad4e5ea552009-04-30 10:15:35 +00001492 ad = d.abs();
1493 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1494 anc = t - 1 - t.urem(ad); // absolute value of nc
1495 p = d.getBitWidth() - 1; // initialize p
1496 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1497 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1498 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1499 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1500 do {
1501 p = p + 1;
1502 q1 = q1<<1; // update q1 = 2p/abs(nc)
1503 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1504 if (r1.uge(anc)) { // must be unsigned comparison
1505 q1 = q1 + 1;
1506 r1 = r1 - anc;
1507 }
1508 q2 = q2<<1; // update q2 = 2p/abs(d)
1509 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1510 if (r2.uge(ad)) { // must be unsigned comparison
1511 q2 = q2 + 1;
1512 r2 = r2 - ad;
1513 }
1514 delta = ad - r2;
1515 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001516
Jay Foad4e5ea552009-04-30 10:15:35 +00001517 mag.m = q2 + 1;
1518 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1519 mag.s = p - d.getBitWidth(); // resulting shift
1520 return mag;
1521}
1522
1523/// Calculate the magic numbers required to implement an unsigned integer
1524/// division by a constant as a sequence of multiplies, adds and shifts.
1525/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1526/// S. Warren, Jr., chapter 10.
1527APInt::mu APInt::magicu() const {
1528 const APInt& d = *this;
1529 unsigned p;
1530 APInt nc, delta, q1, r1, q2, r2;
1531 struct mu magu;
1532 magu.a = 0; // initialize "add" indicator
1533 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1534 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1535 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1536
1537 nc = allOnes - (-d).urem(d);
1538 p = d.getBitWidth() - 1; // initialize p
1539 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1540 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1541 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1542 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1543 do {
1544 p = p + 1;
1545 if (r1.uge(nc - r1)) {
1546 q1 = q1 + q1 + 1; // update q1
1547 r1 = r1 + r1 - nc; // update r1
1548 }
1549 else {
1550 q1 = q1+q1; // update q1
1551 r1 = r1+r1; // update r1
1552 }
1553 if ((r2 + 1).uge(d - r2)) {
1554 if (q2.uge(signedMax)) magu.a = 1;
1555 q2 = q2+q2 + 1; // update q2
1556 r2 = r2+r2 + 1 - d; // update r2
1557 }
1558 else {
1559 if (q2.uge(signedMin)) magu.a = 1;
1560 q2 = q2+q2; // update q2
1561 r2 = r2+r2 + 1; // update r2
1562 }
1563 delta = d - 1 - r2;
1564 } while (p < d.getBitWidth()*2 &&
1565 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1566 magu.m = q2 + 1; // resulting magic number
1567 magu.s = p - d.getBitWidth(); // resulting shift
1568 return magu;
1569}
1570
Reid Spencer9c0696f2007-02-20 08:51:03 +00001571/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1572/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1573/// variables here have the same names as in the algorithm. Comments explain
1574/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001575static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1576 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001577 assert(u && "Must provide dividend");
1578 assert(v && "Must provide divisor");
1579 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001580 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001581 assert(n>1 && "n must be > 1");
1582
1583 // Knuth uses the value b as the base of the number system. In our case b
1584 // is 2^31 so we just set it to -1u.
1585 uint64_t b = uint64_t(1) << 32;
1586
Chris Lattnerfad86b02008-08-17 07:19:36 +00001587#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001588 DEBUG(errs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1589 DEBUG(errs() << "KnuthDiv: original:");
1590 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1591 DEBUG(errs() << " by");
1592 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1593 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001594#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001595 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1596 // u and v by d. Note that we have taken Knuth's advice here to use a power
1597 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1598 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001599 // shift amount from the leading zeros. We are basically normalizing the u
1600 // and v so that its high bits are shifted to the top of v's range without
1601 // overflow. Note that this can require an extra word in u so that u must
1602 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001603 unsigned shift = CountLeadingZeros_32(v[n-1]);
1604 unsigned v_carry = 0;
1605 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001606 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001607 for (unsigned i = 0; i < m+n; ++i) {
1608 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001609 u[i] = (u[i] << shift) | u_carry;
1610 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001611 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001612 for (unsigned i = 0; i < n; ++i) {
1613 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001614 v[i] = (v[i] << shift) | v_carry;
1615 v_carry = v_tmp;
1616 }
1617 }
1618 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001619#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001620 DEBUG(errs() << "KnuthDiv: normal:");
1621 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1622 DEBUG(errs() << " by");
1623 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1624 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001625#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001626
1627 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1628 int j = m;
1629 do {
Daniel Dunbara53902b2009-07-13 05:27:30 +00001630 DEBUG(errs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001631 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001632 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1633 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1634 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1635 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1636 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001637 // value qp is one too large, and it eliminates all cases where qp is two
1638 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001639 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Daniel Dunbara53902b2009-07-13 05:27:30 +00001640 DEBUG(errs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001641 uint64_t qp = dividend / v[n-1];
1642 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001643 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1644 qp--;
1645 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001646 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001647 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001648 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001649 DEBUG(errs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001650
Reid Spencer92904632007-02-23 01:57:13 +00001651 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1652 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1653 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001654 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001655 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001656 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001657 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001658 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001659 bool borrow = subtrahend > u_tmp;
Eric Christopherd37eda82009-08-21 04:06:45 +00001660 DEBUG(errs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001661 << ", subtrahend == " << subtrahend
1662 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001663
Reid Spencer610fad82007-02-24 10:01:42 +00001664 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001665 unsigned k = j + i;
1666 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1667 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001668 while (borrow && k <= m+n) { // deal with borrow to the left
1669 borrow = u[k] == 0;
1670 u[k]--;
1671 k++;
1672 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001673 isNeg |= borrow;
Eric Christopherd37eda82009-08-21 04:06:45 +00001674 DEBUG(errs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
1675 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001676 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001677 DEBUG(errs() << "KnuthDiv: after subtraction:");
1678 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1679 DEBUG(errs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001680 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1681 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001682 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001683 // the true value, and a "borrow" to the left should be remembered.
1684 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001685 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001686 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001687 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001688 u[i] = ~u[i] + carry; // b's complement
1689 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001690 }
Reid Spencer92904632007-02-23 01:57:13 +00001691 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001692 DEBUG(errs() << "KnuthDiv: after complement:");
1693 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1694 DEBUG(errs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001695
Eric Christopherd37eda82009-08-21 04:06:45 +00001696 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001697 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001698 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001699 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001700 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001701 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001702 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001703 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001704 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1705 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001706 // since it cancels with the borrow that occurred in D4.
1707 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001708 for (unsigned i = 0; i < n; i++) {
1709 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001710 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001711 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001712 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001713 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001714 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001715 DEBUG(errs() << "KnuthDiv: after correction:");
1716 DEBUG(for (int i = m+n; i >=0; i--) errs() <<" " << u[i]);
1717 DEBUG(errs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001718
Reid Spencer92904632007-02-23 01:57:13 +00001719 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1720 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001721
Daniel Dunbara53902b2009-07-13 05:27:30 +00001722 DEBUG(errs() << "KnuthDiv: quotient:");
1723 DEBUG(for (int i = m; i >=0; i--) errs() <<" " << q[i]);
1724 DEBUG(errs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001725
Reid Spencer9c0696f2007-02-20 08:51:03 +00001726 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1727 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1728 // compute the remainder (urem uses this).
1729 if (r) {
1730 // The value d is expressed by the "shift" value above since we avoided
1731 // multiplication by d by using a shift left. So, all we have to do is
1732 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001733 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001734 unsigned carry = 0;
Daniel Dunbara53902b2009-07-13 05:27:30 +00001735 DEBUG(errs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001736 for (int i = n-1; i >= 0; i--) {
1737 r[i] = (u[i] >> shift) | carry;
1738 carry = u[i] << (32 - shift);
Daniel Dunbara53902b2009-07-13 05:27:30 +00001739 DEBUG(errs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001740 }
1741 } else {
1742 for (int i = n-1; i >= 0; i--) {
1743 r[i] = u[i];
Daniel Dunbara53902b2009-07-13 05:27:30 +00001744 DEBUG(errs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001745 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001746 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001747 DEBUG(errs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001748 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001749#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001750 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001751#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001752}
1753
Chris Lattner455e9ab2009-01-21 18:09:24 +00001754void APInt::divide(const APInt LHS, unsigned lhsWords,
1755 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001756 APInt *Quotient, APInt *Remainder)
1757{
1758 assert(lhsWords >= rhsWords && "Fractional result");
1759
Eric Christopherd37eda82009-08-21 04:06:45 +00001760 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001761 // 64-bit words. This is a necessity of both the "short division" algorithm
Eric Christopherd37eda82009-08-21 04:06:45 +00001762 // and the the Knuth "classical algorithm" which requires there to be native
1763 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1764 // can't use 64-bit operands here because we don't have native results of
1765 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001766 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001767 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001768 unsigned n = rhsWords * 2;
1769 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001770
1771 // Allocate space for the temporary values we need either on the stack, if
1772 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001773 unsigned SPACE[128];
1774 unsigned *U = 0;
1775 unsigned *V = 0;
1776 unsigned *Q = 0;
1777 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001778 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1779 U = &SPACE[0];
1780 V = &SPACE[m+n+1];
1781 Q = &SPACE[(m+n+1) + n];
1782 if (Remainder)
1783 R = &SPACE[(m+n+1) + n + (m+n)];
1784 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001785 U = new unsigned[m + n + 1];
1786 V = new unsigned[n];
1787 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001788 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001789 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001790 }
1791
1792 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001793 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001794 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001795 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001796 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001797 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001798 }
1799 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1800
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001801 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001802 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001803 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001804 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001805 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001806 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001807 }
1808
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001809 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001810 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001811 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001812 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001813
Eric Christopherd37eda82009-08-21 04:06:45 +00001814 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001815 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001816 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001817 // contain any zero words or the Knuth algorithm fails.
1818 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1819 n--;
1820 m++;
1821 }
1822 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1823 m--;
1824
1825 // If we're left with only a single word for the divisor, Knuth doesn't work
1826 // so we implement the short division algorithm here. This is much simpler
1827 // and faster because we are certain that we can divide a 64-bit quantity
1828 // by a 32-bit quantity at hardware speed and short division is simply a
1829 // series of such operations. This is just like doing short division but we
1830 // are using base 2^32 instead of base 10.
1831 assert(n != 0 && "Divide by zero?");
1832 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001833 unsigned divisor = V[0];
1834 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001835 for (int i = m+n-1; i >= 0; i--) {
1836 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1837 if (partial_dividend == 0) {
1838 Q[i] = 0;
1839 remainder = 0;
1840 } else if (partial_dividend < divisor) {
1841 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001842 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001843 } else if (partial_dividend == divisor) {
1844 Q[i] = 1;
1845 remainder = 0;
1846 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001847 Q[i] = (unsigned)(partial_dividend / divisor);
1848 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001849 }
1850 }
1851 if (R)
1852 R[0] = remainder;
1853 } else {
1854 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1855 // case n > 1.
1856 KnuthDiv(U, V, Q, R, m, n);
1857 }
1858
1859 // If the caller wants the quotient
1860 if (Quotient) {
1861 // Set up the Quotient value's memory.
1862 if (Quotient->BitWidth != LHS.BitWidth) {
1863 if (Quotient->isSingleWord())
1864 Quotient->VAL = 0;
1865 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001866 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001867 Quotient->BitWidth = LHS.BitWidth;
1868 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001869 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001870 } else
1871 Quotient->clear();
1872
Eric Christopherd37eda82009-08-21 04:06:45 +00001873 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001874 // order words.
1875 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001876 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001877 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1878 if (Quotient->isSingleWord())
1879 Quotient->VAL = tmp;
1880 else
1881 Quotient->pVal[0] = tmp;
1882 } else {
1883 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1884 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001885 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001886 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1887 }
1888 }
1889
1890 // If the caller wants the remainder
1891 if (Remainder) {
1892 // Set up the Remainder value's memory.
1893 if (Remainder->BitWidth != RHS.BitWidth) {
1894 if (Remainder->isSingleWord())
1895 Remainder->VAL = 0;
1896 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001897 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001898 Remainder->BitWidth = RHS.BitWidth;
1899 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001900 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001901 } else
1902 Remainder->clear();
1903
1904 // The remainder is in R. Reconstitute the remainder into Remainder's low
1905 // order words.
1906 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001907 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001908 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1909 if (Remainder->isSingleWord())
1910 Remainder->VAL = tmp;
1911 else
1912 Remainder->pVal[0] = tmp;
1913 } else {
1914 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1915 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001916 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001917 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1918 }
1919 }
1920
1921 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001922 if (U != &SPACE[0]) {
1923 delete [] U;
1924 delete [] V;
1925 delete [] Q;
1926 delete [] R;
1927 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001928}
1929
Reid Spencere81d2da2007-02-16 22:36:51 +00001930APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001931 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001932
1933 // First, deal with the easy case
1934 if (isSingleWord()) {
1935 assert(RHS.VAL != 0 && "Divide by zero?");
1936 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001937 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001938
Reid Spencer71bd08f2007-02-17 02:07:07 +00001939 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001940 unsigned rhsBits = RHS.getActiveBits();
1941 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001942 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001943 unsigned lhsBits = this->getActiveBits();
1944 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001945
1946 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001947 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001948 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001949 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001950 else if (lhsWords < rhsWords || this->ult(RHS)) {
1951 // X / Y ===> 0, iff X < Y
1952 return APInt(BitWidth, 0);
1953 } else if (*this == RHS) {
1954 // X / X ===> 1
1955 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001956 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001957 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001958 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001959 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001960
1961 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1962 APInt Quotient(1,0); // to hold result.
1963 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1964 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001965}
1966
Reid Spencere81d2da2007-02-16 22:36:51 +00001967APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001968 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001969 if (isSingleWord()) {
1970 assert(RHS.VAL != 0 && "Remainder by zero?");
1971 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001972 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001973
Reid Spencere0cdd332007-02-21 08:21:52 +00001974 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001975 unsigned lhsBits = getActiveBits();
1976 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001977
1978 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001979 unsigned rhsBits = RHS.getActiveBits();
1980 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001981 assert(rhsWords && "Performing remainder operation by zero ???");
1982
Reid Spencer71bd08f2007-02-17 02:07:07 +00001983 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001984 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001985 // 0 % Y ===> 0
1986 return APInt(BitWidth, 0);
1987 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1988 // X % Y ===> X, iff X < Y
1989 return *this;
1990 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001991 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001992 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001993 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001994 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001995 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001996 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001997
Reid Spencer19dc32a2007-05-13 23:44:59 +00001998 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001999 APInt Remainder(1,0);
2000 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2001 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002002}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002003
Eric Christopherd37eda82009-08-21 04:06:45 +00002004void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002005 APInt &Quotient, APInt &Remainder) {
2006 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002007 unsigned lhsBits = LHS.getActiveBits();
2008 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2009 unsigned rhsBits = RHS.getActiveBits();
2010 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002011
2012 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002013 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002014 Quotient = 0; // 0 / Y ===> 0
2015 Remainder = 0; // 0 % Y ===> 0
2016 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002017 }
2018
2019 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002020 Quotient = 0; // X / Y ===> 0, iff X < Y
2021 Remainder = LHS; // X % Y ===> X, iff X < Y
2022 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002023 }
2024
Reid Spencer19dc32a2007-05-13 23:44:59 +00002025 if (LHS == RHS) {
2026 Quotient = 1; // X / X ===> 1
2027 Remainder = 0; // X % X ===> 0;
2028 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002029 }
2030
Reid Spencer19dc32a2007-05-13 23:44:59 +00002031 if (lhsWords == 1 && rhsWords == 1) {
2032 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002033 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2034 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2035 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2036 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002037 return;
2038 }
2039
2040 // Okay, lets do it the long way
2041 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2042}
2043
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002044void APInt::fromString(unsigned numbits, const StringRef& str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002045 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002046 assert(!str.empty() && "Invalid string length");
Reid Spencer5e0a8512007-02-17 03:16:00 +00002047 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2048 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002049
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002050 StringRef::iterator p = str.begin();
2051 size_t slen = str.size();
2052 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002053 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002054 p++;
2055 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002056 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002057 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002058 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002059 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2060 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Eric Christopherd37eda82009-08-21 04:06:45 +00002061 assert((((slen-1)*64)/22 <= numbits || radix != 10)
2062 && "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002063
2064 // Allocate memory
2065 if (!isSingleWord())
2066 pVal = getClearedMemory(getNumWords());
2067
2068 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002069 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002070
2071 // Set up an APInt for the digit to add outside the loop so we don't
2072 // constantly construct/destruct it.
2073 APInt apdigit(getBitWidth(), 0);
2074 APInt apradix(getBitWidth(), radix);
2075
2076 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002077 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002078 unsigned digit = getDigit(*p, radix);
Reid Spencer385f7542007-02-21 03:55:44 +00002079
Reid Spencer6551dcd2007-05-16 19:18:22 +00002080 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002081 if (slen > 1) {
2082 if (shift)
2083 *this <<= shift;
2084 else
2085 *this *= apradix;
2086 }
Reid Spencer385f7542007-02-21 03:55:44 +00002087
2088 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002089 if (apdigit.isSingleWord())
2090 apdigit.VAL = digit;
2091 else
2092 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002093 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002094 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002095 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002096 if (isNeg) {
2097 (*this)--;
Reid Spencer9eec2412007-02-25 23:44:53 +00002098 this->flip();
Reid Spencer9eec2412007-02-25 23:44:53 +00002099 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002100}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002101
Chris Lattnerfad86b02008-08-17 07:19:36 +00002102void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2103 bool Signed) const {
2104 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002105 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002106
Chris Lattnerfad86b02008-08-17 07:19:36 +00002107 // First, check for a zero value and just short circuit the logic below.
2108 if (*this == 0) {
2109 Str.push_back('0');
2110 return;
2111 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002112
Chris Lattnerfad86b02008-08-17 07:19:36 +00002113 static const char Digits[] = "0123456789ABCDEF";
Eric Christopherd37eda82009-08-21 04:06:45 +00002114
Reid Spencer9c0696f2007-02-20 08:51:03 +00002115 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002116 char Buffer[65];
2117 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002118
Chris Lattnerfad86b02008-08-17 07:19:36 +00002119 uint64_t N;
2120 if (Signed) {
2121 int64_t I = getSExtValue();
2122 if (I < 0) {
2123 Str.push_back('-');
2124 I = -I;
2125 }
2126 N = I;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002127 } else {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002128 N = getZExtValue();
Reid Spencer9c0696f2007-02-20 08:51:03 +00002129 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002130
Chris Lattnerfad86b02008-08-17 07:19:36 +00002131 while (N) {
2132 *--BufPtr = Digits[N % Radix];
2133 N /= Radix;
2134 }
2135 Str.append(BufPtr, Buffer+65);
2136 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002137 }
2138
Chris Lattnerfad86b02008-08-17 07:19:36 +00002139 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002140
Chris Lattnerfad86b02008-08-17 07:19:36 +00002141 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002142 // They want to print the signed version and it is a negative value
2143 // Flip the bits and add one to turn it into the equivalent positive
2144 // value and put a '-' in the result.
Chris Lattnerfad86b02008-08-17 07:19:36 +00002145 Tmp.flip();
2146 Tmp++;
2147 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002148 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002149
Chris Lattnerfad86b02008-08-17 07:19:36 +00002150 // We insert the digits backward, then reverse them to get the right order.
2151 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002152
2153 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2154 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002155 // equaly. We just shift until the value is zero.
2156 if (Radix != 10) {
2157 // Just shift tmp right for each digit width until it becomes zero
2158 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2159 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002160
Chris Lattnerfad86b02008-08-17 07:19:36 +00002161 while (Tmp != 0) {
2162 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2163 Str.push_back(Digits[Digit]);
2164 Tmp = Tmp.lshr(ShiftAmt);
2165 }
2166 } else {
2167 APInt divisor(4, 10);
2168 while (Tmp != 0) {
2169 APInt APdigit(1, 0);
2170 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002171 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002172 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002173 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002174 assert(Digit < Radix && "divide failed");
2175 Str.push_back(Digits[Digit]);
2176 Tmp = tmp2;
2177 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002178 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002179
Chris Lattnerfad86b02008-08-17 07:19:36 +00002180 // Reverse the digits before returning.
2181 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002182}
2183
Chris Lattnerfad86b02008-08-17 07:19:36 +00002184/// toString - This returns the APInt as a std::string. Note that this is an
2185/// inefficient method. It is better to pass in a SmallVector/SmallString
2186/// to the methods above.
2187std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2188 SmallString<40> S;
2189 toString(S, Radix, Signed);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002190 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002191}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002192
Chris Lattnerfad86b02008-08-17 07:19:36 +00002193
2194void APInt::dump() const {
2195 SmallString<40> S, U;
2196 this->toStringUnsigned(U);
2197 this->toStringSigned(S);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002198 errs() << "APInt(" << BitWidth << "b, "
2199 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002200}
2201
Chris Lattner944fac72008-08-23 22:23:09 +00002202void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002203 SmallString<40> S;
2204 this->toString(S, 10, isSigned);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002205 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002206}
2207
Dan Gohman38a253d2009-06-30 20:10:56 +00002208std::ostream &llvm::operator<<(std::ostream &o, const APInt &I) {
2209 raw_os_ostream OS(o);
2210 OS << I;
2211 return o;
2212}
2213
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002214// This implements a variety of operations on a representation of
2215// arbitrary precision, two's-complement, bignum integer values.
2216
2217/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2218 and unrestricting assumption. */
Chris Lattner9f17eb02008-08-17 04:58:58 +00002219#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002220COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002221
2222/* Some handy functions local to this file. */
2223namespace {
2224
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002225 /* Returns the integer part with the least significant BITS set.
2226 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002227 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002228 lowBitMask(unsigned int bits)
2229 {
2230 assert (bits != 0 && bits <= integerPartWidth);
2231
2232 return ~(integerPart) 0 >> (integerPartWidth - bits);
2233 }
2234
Neil Booth055c0b32007-10-06 00:43:45 +00002235 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002236 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002237 lowHalf(integerPart part)
2238 {
2239 return part & lowBitMask(integerPartWidth / 2);
2240 }
2241
Neil Booth055c0b32007-10-06 00:43:45 +00002242 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002243 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002244 highHalf(integerPart part)
2245 {
2246 return part >> (integerPartWidth / 2);
2247 }
2248
Neil Booth055c0b32007-10-06 00:43:45 +00002249 /* Returns the bit number of the most significant set bit of a part.
2250 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002251 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002252 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002253 {
2254 unsigned int n, msb;
2255
2256 if (value == 0)
2257 return -1U;
2258
2259 n = integerPartWidth / 2;
2260
2261 msb = 0;
2262 do {
2263 if (value >> n) {
2264 value >>= n;
2265 msb += n;
2266 }
2267
2268 n >>= 1;
2269 } while (n);
2270
2271 return msb;
2272 }
2273
Neil Booth055c0b32007-10-06 00:43:45 +00002274 /* Returns the bit number of the least significant set bit of a
2275 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002276 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002277 partLSB(integerPart value)
2278 {
2279 unsigned int n, lsb;
2280
2281 if (value == 0)
2282 return -1U;
2283
2284 lsb = integerPartWidth - 1;
2285 n = integerPartWidth / 2;
2286
2287 do {
2288 if (value << n) {
2289 value <<= n;
2290 lsb -= n;
2291 }
2292
2293 n >>= 1;
2294 } while (n);
2295
2296 return lsb;
2297 }
2298}
2299
2300/* Sets the least significant part of a bignum to the input value, and
2301 zeroes out higher parts. */
2302void
2303APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2304{
2305 unsigned int i;
2306
Neil Booth68e53ad2007-10-08 13:47:12 +00002307 assert (parts > 0);
2308
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002309 dst[0] = part;
2310 for(i = 1; i < parts; i++)
2311 dst[i] = 0;
2312}
2313
2314/* Assign one bignum to another. */
2315void
2316APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2317{
2318 unsigned int i;
2319
2320 for(i = 0; i < parts; i++)
2321 dst[i] = src[i];
2322}
2323
2324/* Returns true if a bignum is zero, false otherwise. */
2325bool
2326APInt::tcIsZero(const integerPart *src, unsigned int parts)
2327{
2328 unsigned int i;
2329
2330 for(i = 0; i < parts; i++)
2331 if (src[i])
2332 return false;
2333
2334 return true;
2335}
2336
2337/* Extract the given bit of a bignum; returns 0 or 1. */
2338int
2339APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2340{
2341 return(parts[bit / integerPartWidth]
2342 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2343}
2344
2345/* Set the given bit of a bignum. */
2346void
2347APInt::tcSetBit(integerPart *parts, unsigned int bit)
2348{
2349 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2350}
2351
Neil Booth055c0b32007-10-06 00:43:45 +00002352/* Returns the bit number of the least significant set bit of a
2353 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002354unsigned int
2355APInt::tcLSB(const integerPart *parts, unsigned int n)
2356{
2357 unsigned int i, lsb;
2358
2359 for(i = 0; i < n; i++) {
2360 if (parts[i] != 0) {
2361 lsb = partLSB(parts[i]);
2362
2363 return lsb + i * integerPartWidth;
2364 }
2365 }
2366
2367 return -1U;
2368}
2369
Neil Booth055c0b32007-10-06 00:43:45 +00002370/* Returns the bit number of the most significant set bit of a number.
2371 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002372unsigned int
2373APInt::tcMSB(const integerPart *parts, unsigned int n)
2374{
2375 unsigned int msb;
2376
2377 do {
2378 --n;
2379
2380 if (parts[n] != 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002381 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002382
2383 return msb + n * integerPartWidth;
2384 }
2385 } while (n);
2386
2387 return -1U;
2388}
2389
Neil Booth68e53ad2007-10-08 13:47:12 +00002390/* Copy the bit vector of width srcBITS from SRC, starting at bit
2391 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2392 the least significant bit of DST. All high bits above srcBITS in
2393 DST are zero-filled. */
2394void
Evan Chengcf69a742009-05-21 23:47:47 +00002395APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002396 unsigned int srcBits, unsigned int srcLSB)
2397{
2398 unsigned int firstSrcPart, dstParts, shift, n;
2399
2400 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2401 assert (dstParts <= dstCount);
2402
2403 firstSrcPart = srcLSB / integerPartWidth;
2404 tcAssign (dst, src + firstSrcPart, dstParts);
2405
2406 shift = srcLSB % integerPartWidth;
2407 tcShiftRight (dst, dstParts, shift);
2408
2409 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2410 in DST. If this is less that srcBits, append the rest, else
2411 clear the high bits. */
2412 n = dstParts * integerPartWidth - shift;
2413 if (n < srcBits) {
2414 integerPart mask = lowBitMask (srcBits - n);
2415 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2416 << n % integerPartWidth);
2417 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002418 if (srcBits % integerPartWidth)
2419 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002420 }
2421
2422 /* Clear high parts. */
2423 while (dstParts < dstCount)
2424 dst[dstParts++] = 0;
2425}
2426
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002427/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2428integerPart
2429APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2430 integerPart c, unsigned int parts)
2431{
2432 unsigned int i;
2433
2434 assert(c <= 1);
2435
2436 for(i = 0; i < parts; i++) {
2437 integerPart l;
2438
2439 l = dst[i];
2440 if (c) {
2441 dst[i] += rhs[i] + 1;
2442 c = (dst[i] <= l);
2443 } else {
2444 dst[i] += rhs[i];
2445 c = (dst[i] < l);
2446 }
2447 }
2448
2449 return c;
2450}
2451
2452/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2453integerPart
2454APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2455 integerPart c, unsigned int parts)
2456{
2457 unsigned int i;
2458
2459 assert(c <= 1);
2460
2461 for(i = 0; i < parts; i++) {
2462 integerPart l;
2463
2464 l = dst[i];
2465 if (c) {
2466 dst[i] -= rhs[i] + 1;
2467 c = (dst[i] >= l);
2468 } else {
2469 dst[i] -= rhs[i];
2470 c = (dst[i] > l);
2471 }
2472 }
2473
2474 return c;
2475}
2476
2477/* Negate a bignum in-place. */
2478void
2479APInt::tcNegate(integerPart *dst, unsigned int parts)
2480{
2481 tcComplement(dst, parts);
2482 tcIncrement(dst, parts);
2483}
2484
Neil Booth055c0b32007-10-06 00:43:45 +00002485/* DST += SRC * MULTIPLIER + CARRY if add is true
2486 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002487
2488 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2489 they must start at the same point, i.e. DST == SRC.
2490
2491 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2492 returned. Otherwise DST is filled with the least significant
2493 DSTPARTS parts of the result, and if all of the omitted higher
2494 parts were zero return zero, otherwise overflow occurred and
2495 return one. */
2496int
2497APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2498 integerPart multiplier, integerPart carry,
2499 unsigned int srcParts, unsigned int dstParts,
2500 bool add)
2501{
2502 unsigned int i, n;
2503
2504 /* Otherwise our writes of DST kill our later reads of SRC. */
2505 assert(dst <= src || dst >= src + srcParts);
2506 assert(dstParts <= srcParts + 1);
2507
2508 /* N loops; minimum of dstParts and srcParts. */
2509 n = dstParts < srcParts ? dstParts: srcParts;
2510
2511 for(i = 0; i < n; i++) {
2512 integerPart low, mid, high, srcPart;
2513
2514 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2515
2516 This cannot overflow, because
2517
2518 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2519
2520 which is less than n^2. */
2521
2522 srcPart = src[i];
2523
2524 if (multiplier == 0 || srcPart == 0) {
2525 low = carry;
2526 high = 0;
2527 } else {
2528 low = lowHalf(srcPart) * lowHalf(multiplier);
2529 high = highHalf(srcPart) * highHalf(multiplier);
2530
2531 mid = lowHalf(srcPart) * highHalf(multiplier);
2532 high += highHalf(mid);
2533 mid <<= integerPartWidth / 2;
2534 if (low + mid < low)
2535 high++;
2536 low += mid;
2537
2538 mid = highHalf(srcPart) * lowHalf(multiplier);
2539 high += highHalf(mid);
2540 mid <<= integerPartWidth / 2;
2541 if (low + mid < low)
2542 high++;
2543 low += mid;
2544
2545 /* Now add carry. */
2546 if (low + carry < low)
2547 high++;
2548 low += carry;
2549 }
2550
2551 if (add) {
2552 /* And now DST[i], and store the new low part there. */
2553 if (low + dst[i] < low)
2554 high++;
2555 dst[i] += low;
2556 } else
2557 dst[i] = low;
2558
2559 carry = high;
2560 }
2561
2562 if (i < dstParts) {
2563 /* Full multiplication, there is no overflow. */
2564 assert(i + 1 == dstParts);
2565 dst[i] = carry;
2566 return 0;
2567 } else {
2568 /* We overflowed if there is carry. */
2569 if (carry)
2570 return 1;
2571
2572 /* We would overflow if any significant unwritten parts would be
2573 non-zero. This is true if any remaining src parts are non-zero
2574 and the multiplier is non-zero. */
2575 if (multiplier)
2576 for(; i < srcParts; i++)
2577 if (src[i])
2578 return 1;
2579
2580 /* We fitted in the narrow destination. */
2581 return 0;
2582 }
2583}
2584
2585/* DST = LHS * RHS, where DST has the same width as the operands and
2586 is filled with the least significant parts of the result. Returns
2587 one if overflow occurred, otherwise zero. DST must be disjoint
2588 from both operands. */
2589int
2590APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2591 const integerPart *rhs, unsigned int parts)
2592{
2593 unsigned int i;
2594 int overflow;
2595
2596 assert(dst != lhs && dst != rhs);
2597
2598 overflow = 0;
2599 tcSet(dst, 0, parts);
2600
2601 for(i = 0; i < parts; i++)
2602 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2603 parts - i, true);
2604
2605 return overflow;
2606}
2607
Neil Booth978661d2007-10-06 00:24:48 +00002608/* DST = LHS * RHS, where DST has width the sum of the widths of the
2609 operands. No overflow occurs. DST must be disjoint from both
2610 operands. Returns the number of parts required to hold the
2611 result. */
2612unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002613APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002614 const integerPart *rhs, unsigned int lhsParts,
2615 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002616{
Neil Booth978661d2007-10-06 00:24:48 +00002617 /* Put the narrower number on the LHS for less loops below. */
2618 if (lhsParts > rhsParts) {
2619 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2620 } else {
2621 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002622
Neil Booth978661d2007-10-06 00:24:48 +00002623 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002624
Neil Booth978661d2007-10-06 00:24:48 +00002625 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002626
Neil Booth978661d2007-10-06 00:24:48 +00002627 for(n = 0; n < lhsParts; n++)
2628 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002629
Neil Booth978661d2007-10-06 00:24:48 +00002630 n = lhsParts + rhsParts;
2631
2632 return n - (dst[n - 1] == 0);
2633 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002634}
2635
2636/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2637 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2638 set REMAINDER to the remainder, return zero. i.e.
2639
2640 OLD_LHS = RHS * LHS + REMAINDER
2641
2642 SCRATCH is a bignum of the same size as the operands and result for
2643 use by the routine; its contents need not be initialized and are
2644 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2645*/
2646int
2647APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2648 integerPart *remainder, integerPart *srhs,
2649 unsigned int parts)
2650{
2651 unsigned int n, shiftCount;
2652 integerPart mask;
2653
2654 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2655
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002656 shiftCount = tcMSB(rhs, parts) + 1;
2657 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002658 return true;
2659
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002660 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002661 n = shiftCount / integerPartWidth;
2662 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2663
2664 tcAssign(srhs, rhs, parts);
2665 tcShiftLeft(srhs, parts, shiftCount);
2666 tcAssign(remainder, lhs, parts);
2667 tcSet(lhs, 0, parts);
2668
2669 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2670 the total. */
2671 for(;;) {
2672 int compare;
2673
2674 compare = tcCompare(remainder, srhs, parts);
2675 if (compare >= 0) {
2676 tcSubtract(remainder, srhs, 0, parts);
2677 lhs[n] |= mask;
2678 }
2679
2680 if (shiftCount == 0)
2681 break;
2682 shiftCount--;
2683 tcShiftRight(srhs, parts, 1);
2684 if ((mask >>= 1) == 0)
2685 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2686 }
2687
2688 return false;
2689}
2690
2691/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2692 There are no restrictions on COUNT. */
2693void
2694APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2695{
Neil Booth68e53ad2007-10-08 13:47:12 +00002696 if (count) {
2697 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002698
Neil Booth68e53ad2007-10-08 13:47:12 +00002699 /* Jump is the inter-part jump; shift is is intra-part shift. */
2700 jump = count / integerPartWidth;
2701 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002702
Neil Booth68e53ad2007-10-08 13:47:12 +00002703 while (parts > jump) {
2704 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002705
Neil Booth68e53ad2007-10-08 13:47:12 +00002706 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002707
Neil Booth68e53ad2007-10-08 13:47:12 +00002708 /* dst[i] comes from the two parts src[i - jump] and, if we have
2709 an intra-part shift, src[i - jump - 1]. */
2710 part = dst[parts - jump];
2711 if (shift) {
2712 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002713 if (parts >= jump + 1)
2714 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2715 }
2716
Neil Booth68e53ad2007-10-08 13:47:12 +00002717 dst[parts] = part;
2718 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002719
Neil Booth68e53ad2007-10-08 13:47:12 +00002720 while (parts > 0)
2721 dst[--parts] = 0;
2722 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002723}
2724
2725/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2726 zero. There are no restrictions on COUNT. */
2727void
2728APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2729{
Neil Booth68e53ad2007-10-08 13:47:12 +00002730 if (count) {
2731 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002732
Neil Booth68e53ad2007-10-08 13:47:12 +00002733 /* Jump is the inter-part jump; shift is is intra-part shift. */
2734 jump = count / integerPartWidth;
2735 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002736
Neil Booth68e53ad2007-10-08 13:47:12 +00002737 /* Perform the shift. This leaves the most significant COUNT bits
2738 of the result at zero. */
2739 for(i = 0; i < parts; i++) {
2740 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002741
Neil Booth68e53ad2007-10-08 13:47:12 +00002742 if (i + jump >= parts) {
2743 part = 0;
2744 } else {
2745 part = dst[i + jump];
2746 if (shift) {
2747 part >>= shift;
2748 if (i + jump + 1 < parts)
2749 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2750 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002751 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002752
Neil Booth68e53ad2007-10-08 13:47:12 +00002753 dst[i] = part;
2754 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002755 }
2756}
2757
2758/* Bitwise and of two bignums. */
2759void
2760APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2761{
2762 unsigned int i;
2763
2764 for(i = 0; i < parts; i++)
2765 dst[i] &= rhs[i];
2766}
2767
2768/* Bitwise inclusive or of two bignums. */
2769void
2770APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2771{
2772 unsigned int i;
2773
2774 for(i = 0; i < parts; i++)
2775 dst[i] |= rhs[i];
2776}
2777
2778/* Bitwise exclusive or of two bignums. */
2779void
2780APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2781{
2782 unsigned int i;
2783
2784 for(i = 0; i < parts; i++)
2785 dst[i] ^= rhs[i];
2786}
2787
2788/* Complement a bignum in-place. */
2789void
2790APInt::tcComplement(integerPart *dst, unsigned int parts)
2791{
2792 unsigned int i;
2793
2794 for(i = 0; i < parts; i++)
2795 dst[i] = ~dst[i];
2796}
2797
2798/* Comparison (unsigned) of two bignums. */
2799int
2800APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2801 unsigned int parts)
2802{
2803 while (parts) {
2804 parts--;
2805 if (lhs[parts] == rhs[parts])
2806 continue;
2807
2808 if (lhs[parts] > rhs[parts])
2809 return 1;
2810 else
2811 return -1;
2812 }
2813
2814 return 0;
2815}
2816
2817/* Increment a bignum in-place, return the carry flag. */
2818integerPart
2819APInt::tcIncrement(integerPart *dst, unsigned int parts)
2820{
2821 unsigned int i;
2822
2823 for(i = 0; i < parts; i++)
2824 if (++dst[i] != 0)
2825 break;
2826
2827 return i == parts;
2828}
2829
2830/* Set the least significant BITS bits of a bignum, clear the
2831 rest. */
2832void
2833APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2834 unsigned int bits)
2835{
2836 unsigned int i;
2837
2838 i = 0;
2839 while (bits > integerPartWidth) {
2840 dst[i++] = ~(integerPart) 0;
2841 bits -= integerPartWidth;
2842 }
2843
2844 if (bits)
2845 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2846
2847 while (i < parts)
2848 dst[i++] = 0;
2849}