blob: 6b637ba20cbbd86cc73fb75454cdb2c1933c2656 [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
Reid Spencer5d0d05c2007-02-25 19:32:03 +000039/// A utility function for allocating memory and checking for allocation
40/// 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
Chris Lattner455e9ab2009-01-21 18:09:24 +000047void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000048 pVal = getClearedMemory(getNumWords());
49 pVal[0] = val;
50 if (isSigned && int64_t(val) < 0)
51 for (unsigned i = 1; i < getNumWords(); ++i)
52 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000053}
54
Chris Lattner119c30b2008-10-11 22:07:19 +000055void APInt::initSlowCase(const APInt& that) {
56 pVal = getMemory(getNumWords());
57 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
58}
59
60
Chris Lattner455e9ab2009-01-21 18:09:24 +000061APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Chris Lattner944fac72008-08-23 22:23:09 +000062 : BitWidth(numBits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000063 assert(BitWidth && "Bitwidth too small");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000064 assert(bigVal && "Null pointer detected!");
65 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000066 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000067 else {
Reid Spencer610fad82007-02-24 10:01:42 +000068 // Get memory, cleared to 0
69 pVal = getClearedMemory(getNumWords());
70 // Calculate the number of words to copy
Chris Lattner455e9ab2009-01-21 18:09:24 +000071 unsigned words = std::min<unsigned>(numWords, getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +000072 // Copy the words from bigVal to pVal
73 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +000074 }
Reid Spencer610fad82007-02-24 10:01:42 +000075 // Make sure unused high bits are cleared
76 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +000077}
78
Daniel Dunbar689ad6e2009-08-13 02:33:34 +000079APInt::APInt(unsigned numbits, const StringRef& Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +000080 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000081 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +000082 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +000083}
84
Chris Lattner98f8ccf2008-08-20 17:02:31 +000085APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +000086 // Don't do anything for X = X
87 if (this == &RHS)
88 return *this;
89
Reid Spencer9ac44112007-02-26 23:38:21 +000090 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000091 // assume same bit-width single-word case is already handled
92 assert(!isSingleWord());
93 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer9ac44112007-02-26 23:38:21 +000094 return *this;
95 }
96
Chris Lattner98f8ccf2008-08-20 17:02:31 +000097 if (isSingleWord()) {
98 // assume case where both are single words is already handled
99 assert(!RHS.isSingleWord());
100 VAL = 0;
101 pVal = getMemory(RHS.getNumWords());
102 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
103 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000104 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
105 else if (RHS.isSingleWord()) {
106 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000107 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000108 } else {
109 delete [] pVal;
110 pVal = getMemory(RHS.getNumWords());
111 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
112 }
113 BitWidth = RHS.BitWidth;
114 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000115}
116
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000117APInt& APInt::operator=(uint64_t RHS) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000118 if (isSingleWord())
119 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000120 else {
121 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000122 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000123 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000124 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000125}
126
Ted Kremeneke420deb2008-01-19 04:23:33 +0000127/// Profile - This method 'profiles' an APInt for use with FoldingSet.
128void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000129 ID.AddInteger(BitWidth);
130
Ted Kremeneke420deb2008-01-19 04:23:33 +0000131 if (isSingleWord()) {
132 ID.AddInteger(VAL);
133 return;
134 }
135
Chris Lattner455e9ab2009-01-21 18:09:24 +0000136 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000137 for (unsigned i = 0; i < NumWords; ++i)
138 ID.AddInteger(pVal[i]);
139}
140
Reid Spenceraf0e9562007-02-18 18:38:44 +0000141/// add_1 - This function adds a single "digit" integer, y, to the multiple
142/// "digit" integer array, x[]. x[] is modified to reflect the addition and
143/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000144/// @returns the carry of the addition.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000145static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
146 for (unsigned i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000147 dest[i] = y + x[i];
148 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000149 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000150 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000151 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000152 break;
153 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000154 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000155 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000156}
157
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000158/// @brief Prefix increment operator. Increments the APInt by one.
159APInt& APInt::operator++() {
Reid Spencere81d2da2007-02-16 22:36:51 +0000160 if (isSingleWord())
161 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000162 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000163 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000164 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000165}
166
Reid Spenceraf0e9562007-02-18 18:38:44 +0000167/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
168/// the multi-digit integer array, x[], propagating the borrowed 1 value until
169/// no further borrowing is neeeded or it runs out of "digits" in x. The result
170/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
171/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000172/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-01-21 18:09:24 +0000173static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
174 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000175 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000176 x[i] -= y;
177 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000178 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000179 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000180 y = 0; // No need to borrow
181 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000182 }
183 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000184 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000185}
186
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000187/// @brief Prefix decrement operator. Decrements the APInt by one.
188APInt& APInt::operator--() {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000189 if (isSingleWord())
190 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000191 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000192 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000193 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000194}
195
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000196/// add - This function adds the integer array x to the integer array Y and
197/// places the result in dest.
198/// @returns the carry out from the addition
199/// @brief General addition of 64-bit integer arrays
Reid Spencer9d6c9192007-02-24 03:58:46 +0000200static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000201 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000202 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000203 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000204 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000205 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000206 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000207 }
208 return carry;
209}
210
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000211/// Adds the RHS APint to this APInt.
212/// @returns this, after addition of RHS.
213/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000214APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000215 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer54362ca2007-02-20 23:40:25 +0000216 if (isSingleWord())
217 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000218 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000219 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000220 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000221 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000222}
223
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000224/// Subtracts the integer array y from the integer array x
225/// @returns returns the borrow out.
226/// @brief Generalized subtraction of 64-bit integer arrays.
Reid Spencer9d6c9192007-02-24 03:58:46 +0000227static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000228 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000229 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000230 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000231 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
232 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
233 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000234 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000235 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000236}
237
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000238/// Subtracts the RHS APInt from this APInt
239/// @returns this, after subtraction
240/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000241APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000242 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000243 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000244 VAL -= RHS.VAL;
245 else
246 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000247 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000248}
249
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000250/// Multiplies an integer array, x by a a uint64_t integer and places the result
251/// into dest.
252/// @returns the carry out of the multiplication.
253/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000254static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000255 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000256 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000257 uint64_t carry = 0;
258
259 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000260 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000261 // Split x into high and low words
262 uint64_t lx = x[i] & 0xffffffffULL;
263 uint64_t hx = x[i] >> 32;
264 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000265 // hasCarry == 0, no carry
266 // hasCarry == 1, has carry
267 // hasCarry == 2, no carry and the calculation result == 0.
268 uint8_t hasCarry = 0;
269 dest[i] = carry + lx * ly;
270 // Determine if the add above introduces carry.
271 hasCarry = (dest[i] < carry) ? 1 : 0;
272 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
273 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
274 // (2^32 - 1) + 2^32 = 2^64.
275 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
276
277 carry += (lx * hy) & 0xffffffffULL;
278 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
279 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
280 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
281 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000282 return carry;
283}
284
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000285/// Multiplies integer array x by integer array y and stores the result into
286/// the integer array dest. Note that dest's size must be >= xlen + ylen.
287/// @brief Generalized multiplicate of integer arrays.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000288static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
289 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000290 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000291 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000292 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000293 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000294 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000295 lx = x[j] & 0xffffffffULL;
296 hx = x[j] >> 32;
297 // hasCarry - A flag to indicate if has carry.
298 // hasCarry == 0, no carry
299 // hasCarry == 1, has carry
300 // hasCarry == 2, no carry and the calculation result == 0.
301 uint8_t hasCarry = 0;
302 uint64_t resul = carry + lx * ly;
303 hasCarry = (resul < carry) ? 1 : 0;
304 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
305 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
306
307 carry += (lx * hy) & 0xffffffffULL;
308 resul = (carry << 32) | (resul & 0xffffffffULL);
309 dest[i+j] += resul;
310 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
311 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
312 ((lx * hy) >> 32) + hx * hy;
313 }
314 dest[i+xlen] = carry;
315 }
316}
317
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000318APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000319 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000320 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000321 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000322 clearUnusedBits();
323 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000324 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000325
326 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000327 unsigned lhsBits = getActiveBits();
328 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000329 if (!lhsWords)
330 // 0 * X ===> 0
331 return *this;
332
333 // Get some bit facts about RHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000334 unsigned rhsBits = RHS.getActiveBits();
335 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000336 if (!rhsWords) {
337 // X * 0 ===> 0
338 clear();
339 return *this;
340 }
341
342 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000343 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000344 uint64_t *dest = getMemory(destWords);
345
346 // Perform the long multiply
347 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
348
349 // Copy result back into *this
350 clear();
Chris Lattner455e9ab2009-01-21 18:09:24 +0000351 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000352 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
353
354 // delete dest array and return
355 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000356 return *this;
357}
358
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000359APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000360 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000361 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000362 VAL &= RHS.VAL;
363 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000364 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000365 unsigned numWords = getNumWords();
366 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000367 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000368 return *this;
369}
370
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000371APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000372 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000373 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000374 VAL |= RHS.VAL;
375 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000376 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000377 unsigned numWords = getNumWords();
378 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000379 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000380 return *this;
381}
382
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000383APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000384 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000385 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000386 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000387 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000388 return *this;
389 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000390 unsigned numWords = getNumWords();
391 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000392 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000393 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000394}
395
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000396APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000397 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000398 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000399 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000400 val[i] = pVal[i] & RHS.pVal[i];
401 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000402}
403
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000404APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000405 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000406 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000407 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000408 val[i] = pVal[i] | RHS.pVal[i];
409 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000410}
411
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000412APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000413 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000414 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000415 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000416 val[i] = pVal[i] ^ RHS.pVal[i];
417
418 // 0^0==1 so clear the high bits in case they got set.
419 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000420}
421
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000422bool APInt::operator !() const {
423 if (isSingleWord())
424 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000425
Chris Lattner455e9ab2009-01-21 18:09:24 +0000426 for (unsigned i = 0; i < getNumWords(); ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000427 if (pVal[i])
428 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000429 return true;
430}
431
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000432APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000433 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000434 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000435 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000436 APInt Result(*this);
437 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000438 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000439}
440
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000441APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000442 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000443 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000444 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000445 APInt Result(BitWidth, 0);
446 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000447 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000448}
449
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000450APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000451 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000452 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000453 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000454 APInt Result(BitWidth, 0);
455 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000456 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000457}
458
Chris Lattner455e9ab2009-01-21 18:09:24 +0000459bool APInt::operator[](unsigned bitPosition) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000460 return (maskBit(bitPosition) &
461 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000462}
463
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000464bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000465 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000466 unsigned n1 = getActiveBits();
467 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000468
469 // If the number of bits isn't the same, they aren't equal
Reid Spencer54362ca2007-02-20 23:40:25 +0000470 if (n1 != n2)
471 return false;
472
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000473 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000474 if (n1 <= APINT_BITS_PER_WORD)
475 return pVal[0] == RHS.pVal[0];
476
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000477 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000478 for (int i = whichWord(n1 - 1); i >= 0; --i)
479 if (pVal[i] != RHS.pVal[i])
480 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000481 return true;
482}
483
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000484bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000485 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000486 if (n <= APINT_BITS_PER_WORD)
487 return pVal[0] == Val;
488 else
489 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000490}
491
Reid Spencere81d2da2007-02-16 22:36:51 +0000492bool APInt::ult(const APInt& RHS) const {
493 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
494 if (isSingleWord())
495 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000496
497 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000498 unsigned n1 = getActiveBits();
499 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000500
501 // If magnitude of LHS is less than RHS, return true.
502 if (n1 < n2)
503 return true;
504
505 // If magnitude of RHS is greather than LHS, return false.
506 if (n2 < n1)
507 return false;
508
509 // If they bot fit in a word, just compare the low order word
510 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
511 return pVal[0] < RHS.pVal[0];
512
513 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000514 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000515 for (int i = topWord; i >= 0; --i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000516 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000517 return false;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000518 if (pVal[i] < RHS.pVal[i])
519 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000520 }
521 return false;
522}
523
Reid Spencere81d2da2007-02-16 22:36:51 +0000524bool APInt::slt(const APInt& RHS) const {
525 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000526 if (isSingleWord()) {
527 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
528 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
529 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000530 }
Reid Spencera58f0582007-02-18 20:09:41 +0000531
532 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000533 APInt rhs(RHS);
534 bool lhsNeg = isNegative();
535 bool rhsNeg = rhs.isNegative();
536 if (lhsNeg) {
537 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000538 lhs.flip();
539 lhs++;
540 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000541 if (rhsNeg) {
542 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000543 rhs.flip();
544 rhs++;
545 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000546
547 // Now we have unsigned values to compare so do the comparison if necessary
548 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000549 if (lhsNeg)
550 if (rhsNeg)
551 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000552 else
553 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000554 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000555 return false;
556 else
557 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000558}
559
Chris Lattner455e9ab2009-01-21 18:09:24 +0000560APInt& APInt::set(unsigned bitPosition) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000561 if (isSingleWord())
562 VAL |= maskBit(bitPosition);
563 else
564 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000565 return *this;
566}
567
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000568/// Set the given bit to 0 whose position is given as "bitPosition".
569/// @brief Set a given bit to 0.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000570APInt& APInt::clear(unsigned bitPosition) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000571 if (isSingleWord())
572 VAL &= ~maskBit(bitPosition);
573 else
574 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000575 return *this;
576}
577
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000578/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000579
580/// Toggle a given bit to its opposite value whose position is given
581/// as "bitPosition".
582/// @brief Toggles a given bit to its opposite value.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000583APInt& APInt::flip(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000584 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000585 if ((*this)[bitPosition]) clear(bitPosition);
586 else set(bitPosition);
587 return *this;
588}
589
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000590unsigned APInt::getBitsNeeded(const StringRef& str, uint8_t radix) {
591 assert(!str.empty() && "Invalid string length");
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000592 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
593 "Radix should be 2, 8, 10, or 16!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000594
595 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000596
597 // Each computation below needs to know if its negative
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000598 StringRef::iterator p = str.begin();
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000599 unsigned isNegative = str.front() == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000600 if (*p == '-' || *p == '+') {
601 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000602 slen--;
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000603 assert(slen && "string is only a minus!");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000604 }
605 // For radixes of power-of-two values, the bits required is accurately and
606 // easily computed
607 if (radix == 2)
608 return slen + isNegative;
609 if (radix == 8)
610 return slen * 3 + isNegative;
611 if (radix == 16)
612 return slen * 4 + isNegative;
613
614 // Otherwise it must be radix == 10, the hard case
615 assert(radix == 10 && "Invalid radix");
616
617 // This is grossly inefficient but accurate. We could probably do something
618 // with a computation of roughly slen*64/20 and then adjust by the value of
619 // the first few digits. But, I'm not sure how accurate that could be.
620
621 // Compute a sufficient number of bits that is always large enough but might
622 // be too large. This avoids the assertion in the constructor.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000623 unsigned sufficient = slen*64/18;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000624
625 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000626 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000627
628 // Compute how many bits are required.
Reid Spencer0468ab32007-04-14 00:00:10 +0000629 return isNegative + tmp.logBase2() + 1;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000630}
631
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000632// From http://www.burtleburtle.net, byBob Jenkins.
633// When targeting x86, both GCC and LLVM seem to recognize this as a
634// rotate instruction.
635#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencer794f4722007-02-26 21:02:27 +0000636
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000637// From http://www.burtleburtle.net, by Bob Jenkins.
638#define mix(a,b,c) \
639 { \
640 a -= c; a ^= rot(c, 4); c += b; \
641 b -= a; b ^= rot(a, 6); a += c; \
642 c -= b; c ^= rot(b, 8); b += a; \
643 a -= c; a ^= rot(c,16); c += b; \
644 b -= a; b ^= rot(a,19); a += c; \
645 c -= b; c ^= rot(b, 4); b += a; \
646 }
647
648// From http://www.burtleburtle.net, by Bob Jenkins.
649#define final(a,b,c) \
650 { \
651 c ^= b; c -= rot(b,14); \
652 a ^= c; a -= rot(c,11); \
653 b ^= a; b -= rot(a,25); \
654 c ^= b; c -= rot(b,16); \
655 a ^= c; a -= rot(c,4); \
656 b ^= a; b -= rot(a,14); \
657 c ^= b; c -= rot(b,24); \
658 }
659
660// hashword() was adapted from http://www.burtleburtle.net, by Bob
661// Jenkins. k is a pointer to an array of uint32_t values; length is
662// the length of the key, in 32-bit chunks. This version only handles
663// keys that are a multiple of 32 bits in size.
664static inline uint32_t hashword(const uint64_t *k64, size_t length)
665{
666 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
667 uint32_t a,b,c;
668
669 /* Set up the internal state */
670 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
671
672 /*------------------------------------------------- handle most of the key */
673 while (length > 3)
674 {
675 a += k[0];
676 b += k[1];
677 c += k[2];
678 mix(a,b,c);
679 length -= 3;
680 k += 3;
681 }
682
683 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-05-13 23:23:20 +0000684 switch (length) { /* all the case statements fall through */
685 case 3 : c+=k[2];
686 case 2 : b+=k[1];
687 case 1 : a+=k[0];
688 final(a,b,c);
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000689 case 0: /* case 0: nothing left to add */
690 break;
691 }
692 /*------------------------------------------------------ report the result */
693 return c;
694}
695
696// hashword8() was adapted from http://www.burtleburtle.net, by Bob
697// Jenkins. This computes a 32-bit hash from one 64-bit word. When
698// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
699// function into about 35 instructions when inlined.
700static inline uint32_t hashword8(const uint64_t k64)
701{
702 uint32_t a,b,c;
703 a = b = c = 0xdeadbeef + 4;
704 b += k64 >> 32;
705 a += k64 & 0xffffffff;
706 final(a,b,c);
707 return c;
708}
709#undef final
710#undef mix
711#undef rot
712
713uint64_t APInt::getHashValue() const {
714 uint64_t hash;
Reid Spencer794f4722007-02-26 21:02:27 +0000715 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000716 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000717 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000718 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000719 return hash;
720}
721
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000722/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000723APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000724 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000725}
726
727/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000728APInt APInt::getLoBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000729 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
730 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000731}
732
Reid Spencere81d2da2007-02-16 22:36:51 +0000733bool APInt::isPowerOf2() const {
734 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
735}
736
Chris Lattner455e9ab2009-01-21 18:09:24 +0000737unsigned APInt::countLeadingZerosSlowCase() const {
738 unsigned Count = 0;
739 for (unsigned i = getNumWords(); i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000740 if (pVal[i-1] == 0)
741 Count += APINT_BITS_PER_WORD;
742 else {
743 Count += CountLeadingZeros_64(pVal[i-1]);
744 break;
Reid Spencere549c492007-02-21 00:29:48 +0000745 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000746 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000747 unsigned remainder = BitWidth % APINT_BITS_PER_WORD;
Reid Spencerab2b2c82007-02-22 00:22:00 +0000748 if (remainder)
749 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner9e513ac2007-11-23 22:42:31 +0000750 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000751}
752
Chris Lattner455e9ab2009-01-21 18:09:24 +0000753static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
754 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000755 if (skip)
756 V <<= skip;
757 while (V && (V & (1ULL << 63))) {
758 Count++;
759 V <<= 1;
760 }
761 return Count;
762}
763
Chris Lattner455e9ab2009-01-21 18:09:24 +0000764unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000765 if (isSingleWord())
766 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
767
Chris Lattner455e9ab2009-01-21 18:09:24 +0000768 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000769 unsigned shift;
770 if (!highWordBits) {
771 highWordBits = APINT_BITS_PER_WORD;
772 shift = 0;
773 } else {
774 shift = APINT_BITS_PER_WORD - highWordBits;
775 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000776 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000777 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000778 if (Count == highWordBits) {
779 for (i--; i >= 0; --i) {
780 if (pVal[i] == -1ULL)
781 Count += APINT_BITS_PER_WORD;
782 else {
783 Count += countLeadingOnes_64(pVal[i], 0);
784 break;
785 }
786 }
787 }
788 return Count;
789}
790
Chris Lattner455e9ab2009-01-21 18:09:24 +0000791unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000792 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000793 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
794 unsigned Count = 0;
795 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000796 for (; i < getNumWords() && pVal[i] == 0; ++i)
797 Count += APINT_BITS_PER_WORD;
798 if (i < getNumWords())
799 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000800 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000801}
802
Chris Lattner455e9ab2009-01-21 18:09:24 +0000803unsigned APInt::countTrailingOnesSlowCase() const {
804 unsigned Count = 0;
805 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000806 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000807 Count += APINT_BITS_PER_WORD;
808 if (i < getNumWords())
809 Count += CountTrailingOnes_64(pVal[i]);
810 return std::min(Count, BitWidth);
811}
812
Chris Lattner455e9ab2009-01-21 18:09:24 +0000813unsigned APInt::countPopulationSlowCase() const {
814 unsigned Count = 0;
815 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000816 Count += CountPopulation_64(pVal[i]);
817 return Count;
818}
819
Reid Spencere81d2da2007-02-16 22:36:51 +0000820APInt APInt::byteSwap() const {
821 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
822 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000823 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000824 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000825 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000826 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000827 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000828 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000829 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000830 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000831 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000832 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000833 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000834 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000835 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000836 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000837 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000838 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000839 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
840 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000841 }
842 return Result;
843 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000844}
845
Zhou Sheng0b706b12007-02-08 14:35:19 +0000846APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
847 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000848 APInt A = API1, B = API2;
849 while (!!B) {
850 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000851 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000852 A = T;
853 }
854 return A;
855}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000856
Chris Lattner455e9ab2009-01-21 18:09:24 +0000857APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000858 union {
859 double D;
860 uint64_t I;
861 } T;
862 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000863
864 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000865 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000866
867 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000868 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000869
870 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000871 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000872 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000873
874 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
875 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
876
877 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000878 if (exp < 52)
Reid Spencer1fa111e2007-02-27 18:23:40 +0000879 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
880 APInt(width, mantissa >> (52 - exp));
881
882 // If the client didn't provide enough bits for us to shift the mantissa into
883 // then the result is undefined, just return 0
884 if (width <= exp - 52)
885 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000886
887 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000888 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000889 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000890 return isNeg ? -Tmp : Tmp;
891}
892
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000893/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000894/// The layout for double is as following (IEEE Standard 754):
895/// --------------------------------------
896/// | Sign Exponent Fraction Bias |
897/// |-------------------------------------- |
898/// | 1[63] 11[62-52] 52[51-00] 1023 |
899/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000900double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000901
902 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000903 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000904 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
905 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000906 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000907 return double(sext);
908 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000909 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000910 }
911
Reid Spencer9c0696f2007-02-20 08:51:03 +0000912 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000913 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000914
915 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000916 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000917
918 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000919 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000920
Reid Spencer9c0696f2007-02-20 08:51:03 +0000921 // The exponent (without bias normalization) is just the number of bits
922 // we are using. Note that the sign bit is gone since we constructed the
923 // absolute value.
924 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000925
Reid Spencer9c0696f2007-02-20 08:51:03 +0000926 // Return infinity for exponent overflow
927 if (exp > 1023) {
928 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000929 return std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000930 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000931 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000932 }
933 exp += 1023; // Increment for 1023 bias
934
935 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
936 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000937 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000938 unsigned hiWord = whichWord(n-1);
939 if (hiWord == 0) {
940 mantissa = Tmp.pVal[0];
941 if (n > 52)
942 mantissa >>= n - 52; // shift down, we want the top 52 bits.
943 } else {
944 assert(hiWord > 0 && "huh?");
945 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
946 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
947 mantissa = hibits | lobits;
948 }
949
Zhou Shengd93f00c2007-02-12 20:02:55 +0000950 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000951 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000952 union {
953 double D;
954 uint64_t I;
955 } T;
956 T.I = sign | (exp << 52) | mantissa;
957 return T.D;
958}
959
Reid Spencere81d2da2007-02-16 22:36:51 +0000960// Truncate to new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000961APInt &APInt::trunc(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000962 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000963 assert(width && "Can't truncate to 0 bits");
Chris Lattner455e9ab2009-01-21 18:09:24 +0000964 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +0000965 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000966 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +0000967 if (wordsBefore != wordsAfter) {
968 if (wordsAfter == 1) {
969 uint64_t *tmp = pVal;
970 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +0000971 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +0000972 } else {
973 uint64_t *newVal = getClearedMemory(wordsAfter);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000974 for (unsigned i = 0; i < wordsAfter; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +0000975 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +0000976 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +0000977 pVal = newVal;
978 }
979 }
Reid Spencer94900772007-02-28 17:34:32 +0000980 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +0000981}
982
983// Sign extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000984APInt &APInt::sext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000985 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9eec2412007-02-25 23:44:53 +0000986 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000987 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +0000988 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +0000989 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +0000990 }
991
992 // The sign bit is set. First, get some facts
Chris Lattner455e9ab2009-01-21 18:09:24 +0000993 unsigned wordsBefore = getNumWords();
994 unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +0000995 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000996 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +0000997
998 // Mask the high order word appropriately
999 if (wordsBefore == wordsAfter) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001000 unsigned newWordBits = width % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001001 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +00001002 uint64_t mask = ~0ULL;
1003 if (newWordBits)
1004 mask >>= APINT_BITS_PER_WORD - newWordBits;
1005 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001006 if (wordsBefore == 1)
1007 VAL |= mask;
1008 else
1009 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001010 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001011 }
1012
Reid Spencerf30b1882007-02-25 23:54:00 +00001013 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001014 uint64_t *newVal = getMemory(wordsAfter);
1015 if (wordsBefore == 1)
1016 newVal[0] = VAL | mask;
1017 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001018 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001019 newVal[i] = pVal[i];
1020 newVal[wordsBefore-1] |= mask;
1021 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001022 for (unsigned i = wordsBefore; i < wordsAfter; i++)
Reid Spencer9eec2412007-02-25 23:44:53 +00001023 newVal[i] = -1ULL;
1024 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001025 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001026 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001027 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001028}
1029
1030// Zero extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001031APInt &APInt::zext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001032 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001033 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001034 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001035 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001036 if (wordsBefore != wordsAfter) {
1037 uint64_t *newVal = getClearedMemory(wordsAfter);
1038 if (wordsBefore == 1)
1039 newVal[0] = VAL;
1040 else
Chris Lattner455e9ab2009-01-21 18:09:24 +00001041 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001042 newVal[i] = pVal[i];
1043 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001044 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001045 pVal = newVal;
1046 }
Reid Spencer94900772007-02-28 17:34:32 +00001047 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001048}
1049
Chris Lattner455e9ab2009-01-21 18:09:24 +00001050APInt &APInt::zextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001051 if (BitWidth < width)
1052 return zext(width);
1053 if (BitWidth > width)
1054 return trunc(width);
1055 return *this;
1056}
1057
Chris Lattner455e9ab2009-01-21 18:09:24 +00001058APInt &APInt::sextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001059 if (BitWidth < width)
1060 return sext(width);
1061 if (BitWidth > width)
1062 return trunc(width);
1063 return *this;
1064}
1065
Zhou Shengff4304f2007-02-09 07:48:24 +00001066/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001067/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001068APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001069 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001070}
1071
1072/// Arithmetic right-shift this APInt by shiftAmt.
1073/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001074APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001075 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001076 // Handle a degenerate case
1077 if (shiftAmt == 0)
1078 return *this;
1079
1080 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001081 if (isSingleWord()) {
1082 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001083 return APInt(BitWidth, 0); // undefined
1084 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001085 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001086 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001087 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1088 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001089 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001090
Reid Spencer46f9c942007-03-02 22:39:11 +00001091 // If all the bits were shifted out, the result is, technically, undefined.
1092 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1093 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001094 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001095 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001096 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001097 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001098 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001099 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001100
1101 // Create some space for the result.
1102 uint64_t * val = new uint64_t[getNumWords()];
1103
Reid Spencer46f9c942007-03-02 22:39:11 +00001104 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001105 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1106 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1107 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1108 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001109 if (bitsInWord == 0)
1110 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001111
1112 // If we are shifting whole words, just move whole words
1113 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001114 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001115 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001116 val[i] = pVal[i+offset]; // move whole word
1117
1118 // Adjust the top significant word for sign bit fill, if negative
1119 if (isNegative())
1120 if (bitsInWord < APINT_BITS_PER_WORD)
1121 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1122 } else {
1123 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001124 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001125 // This combines the shifted corresponding word with the low bits from
1126 // the next word (shifted into this word's high bits).
1127 val[i] = (pVal[i+offset] >> wordShift) |
1128 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1129 }
1130
1131 // Shift the break word. In this case there are no bits from the next word
1132 // to include in this word.
1133 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1134
1135 // Deal with sign extenstion in the break word, and possibly the word before
1136 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001137 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001138 if (wordShift > bitsInWord) {
1139 if (breakWord > 0)
1140 val[breakWord-1] |=
1141 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1142 val[breakWord] |= ~0ULL;
1143 } else
1144 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001145 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001146 }
1147
Reid Spencer46f9c942007-03-02 22:39:11 +00001148 // Remaining words are 0 or -1, just assign them.
1149 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001150 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001151 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001152 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001153}
1154
Zhou Shengff4304f2007-02-09 07:48:24 +00001155/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001156/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001157APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001158 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001159}
1160
1161/// Logical right-shift this APInt by shiftAmt.
1162/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001163APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001164 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001165 if (shiftAmt == BitWidth)
1166 return APInt(BitWidth, 0);
1167 else
1168 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001169 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001170
Reid Spencerba81c2b2007-02-26 01:19:48 +00001171 // If all the bits were shifted out, the result is 0. This avoids issues
1172 // with shifting by the size of the integer type, which produces undefined
1173 // results. We define these "undefined results" to always be 0.
1174 if (shiftAmt == BitWidth)
1175 return APInt(BitWidth, 0);
1176
Reid Spencer02ae8b72007-05-17 06:26:29 +00001177 // If none of the bits are shifted out, the result is *this. This avoids
Nick Lewycky4bd47872009-01-19 17:42:33 +00001178 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001179 // undefined results in the code below. This is also an optimization.
1180 if (shiftAmt == 0)
1181 return *this;
1182
Reid Spencerba81c2b2007-02-26 01:19:48 +00001183 // Create some space for the result.
1184 uint64_t * val = new uint64_t[getNumWords()];
1185
1186 // If we are shifting less than a word, compute the shift with a simple carry
1187 if (shiftAmt < APINT_BITS_PER_WORD) {
1188 uint64_t carry = 0;
1189 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001190 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001191 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1192 }
1193 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001194 }
1195
Reid Spencerba81c2b2007-02-26 01:19:48 +00001196 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001197 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1198 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001199
1200 // If we are shifting whole words, just move whole words
1201 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001202 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001203 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001204 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001205 val[i] = 0;
1206 return APInt(val,BitWidth).clearUnusedBits();
1207 }
1208
1209 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001210 unsigned breakWord = getNumWords() - offset -1;
1211 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001212 val[i] = (pVal[i+offset] >> wordShift) |
1213 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001214 // Shift the break word.
1215 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1216
1217 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001218 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001219 val[i] = 0;
1220 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001221}
1222
Zhou Shengff4304f2007-02-09 07:48:24 +00001223/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001224/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001225APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001226 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001227 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001228}
1229
Chris Lattner455e9ab2009-01-21 18:09:24 +00001230APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001231 // If all the bits were shifted out, the result is 0. This avoids issues
1232 // with shifting by the size of the integer type, which produces undefined
1233 // results. We define these "undefined results" to always be 0.
1234 if (shiftAmt == BitWidth)
1235 return APInt(BitWidth, 0);
1236
Reid Spencer92c72832007-05-12 18:01:57 +00001237 // If none of the bits are shifted out, the result is *this. This avoids a
1238 // lshr by the words size in the loop below which can produce incorrect
1239 // results. It also avoids the expensive computation below for a common case.
1240 if (shiftAmt == 0)
1241 return *this;
1242
Reid Spencer87553802007-02-25 00:56:44 +00001243 // Create some space for the result.
1244 uint64_t * val = new uint64_t[getNumWords()];
1245
1246 // If we are shifting less than a word, do it the easy way
1247 if (shiftAmt < APINT_BITS_PER_WORD) {
1248 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001249 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001250 val[i] = pVal[i] << shiftAmt | carry;
1251 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1252 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001253 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001254 }
1255
Reid Spencer87553802007-02-25 00:56:44 +00001256 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001257 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1258 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001259
1260 // If we are shifting whole words, just move whole words
1261 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001262 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001263 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001264 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001265 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001266 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001267 }
Reid Spencer87553802007-02-25 00:56:44 +00001268
1269 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001270 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001271 for (; i > offset; --i)
1272 val[i] = pVal[i-offset] << wordShift |
1273 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001274 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001275 for (i = 0; i < offset; ++i)
1276 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001277 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001278}
1279
Dan Gohmancf609572008-02-29 01:40:47 +00001280APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001281 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001282}
1283
Chris Lattner455e9ab2009-01-21 18:09:24 +00001284APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001285 if (rotateAmt == 0)
1286 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001287 // Don't get too fancy, just use existing shift/or facilities
1288 APInt hi(*this);
1289 APInt lo(*this);
1290 hi.shl(rotateAmt);
1291 lo.lshr(BitWidth - rotateAmt);
1292 return hi | lo;
1293}
1294
Dan Gohmancf609572008-02-29 01:40:47 +00001295APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001296 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001297}
1298
Chris Lattner455e9ab2009-01-21 18:09:24 +00001299APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001300 if (rotateAmt == 0)
1301 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001302 // Don't get too fancy, just use existing shift/or facilities
1303 APInt hi(*this);
1304 APInt lo(*this);
1305 lo.lshr(rotateAmt);
1306 hi.shl(BitWidth - rotateAmt);
1307 return hi | lo;
1308}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001309
1310// Square Root - this method computes and returns the square root of "this".
1311// Three mechanisms are used for computation. For small values (<= 5 bits),
1312// a table lookup is done. This gets some performance for common cases. For
1313// values using less than 52 bits, the value is converted to double and then
1314// the libc sqrt function is called. The result is rounded and then converted
1315// back to a uint64_t which is then used to construct the result. Finally,
1316// the Babylonian method for computing square roots is used.
1317APInt APInt::sqrt() const {
1318
1319 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001320 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001321
1322 // Use a fast table for some small values. This also gets rid of some
1323 // rounding errors in libc sqrt for small values.
1324 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001325 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001326 /* 0 */ 0,
1327 /* 1- 2 */ 1, 1,
1328 /* 3- 6 */ 2, 2, 2, 2,
1329 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1330 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1331 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1332 /* 31 */ 6
1333 };
1334 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001335 }
1336
1337 // If the magnitude of the value fits in less than 52 bits (the precision of
1338 // an IEEE double precision floating point value), then we can use the
1339 // libc sqrt function which will probably use a hardware sqrt computation.
1340 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001341 if (magnitude < 52) {
1342#ifdef _MSC_VER
1343 // Amazingly, VC++ doesn't have round().
1344 return APInt(BitWidth,
1345 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1346#else
Reid Spenceraf8fb192007-03-01 05:39:56 +00001347 return APInt(BitWidth,
1348 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001349#endif
1350 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001351
1352 // Okay, all the short cuts are exhausted. We must compute it. The following
1353 // is a classical Babylonian method for computing the square root. This code
1354 // was adapted to APINt from a wikipedia article on such computations.
1355 // See http://www.wikipedia.org/ and go to the page named
1356 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001357 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001358 APInt testy(BitWidth, 16);
1359 APInt x_old(BitWidth, 1);
1360 APInt x_new(BitWidth, 0);
1361 APInt two(BitWidth, 2);
1362
1363 // Select a good starting value using binary logarithms.
1364 for (;; i += 2, testy = testy.shl(2))
1365 if (i >= nbits || this->ule(testy)) {
1366 x_old = x_old.shl(i / 2);
1367 break;
1368 }
1369
1370 // Use the Babylonian method to arrive at the integer square root:
1371 for (;;) {
1372 x_new = (this->udiv(x_old) + x_old).udiv(two);
1373 if (x_old.ule(x_new))
1374 break;
1375 x_old = x_new;
1376 }
1377
1378 // Make sure we return the closest approximation
Reid Spencerf09aef72007-03-02 04:21:55 +00001379 // NOTE: The rounding calculation below is correct. It will produce an
1380 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
1381 // determined to be a rounding issue with pari/gp as it begins to use a
1382 // floating point representation after 192 bits. There are no discrepancies
1383 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001384 APInt square(x_old * x_old);
1385 APInt nextSquare((x_old + 1) * (x_old +1));
1386 if (this->ult(square))
1387 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001388 else if (this->ule(nextSquare)) {
1389 APInt midpoint((nextSquare - square).udiv(two));
1390 APInt offset(*this - square);
1391 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001392 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001393 else
1394 return x_old + 1;
1395 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001396 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001397 return x_old + 1;
1398}
1399
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001400/// Computes the multiplicative inverse of this APInt for a given modulo. The
1401/// iterative extended Euclidean algorithm is used to solve for this value,
1402/// however we simplify it to speed up calculating only the inverse, and take
1403/// advantage of div+rem calculations. We also use some tricks to avoid copying
1404/// (potentially large) APInts around.
1405APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1406 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1407
1408 // Using the properties listed at the following web page (accessed 06/21/08):
1409 // http://www.numbertheory.org/php/euclid.html
1410 // (especially the properties numbered 3, 4 and 9) it can be proved that
1411 // BitWidth bits suffice for all the computations in the algorithm implemented
1412 // below. More precisely, this number of bits suffice if the multiplicative
1413 // inverse exists, but may not suffice for the general extended Euclidean
1414 // algorithm.
1415
1416 APInt r[2] = { modulo, *this };
1417 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1418 APInt q(BitWidth, 0);
1419
1420 unsigned i;
1421 for (i = 0; r[i^1] != 0; i ^= 1) {
1422 // An overview of the math without the confusing bit-flipping:
1423 // q = r[i-2] / r[i-1]
1424 // r[i] = r[i-2] % r[i-1]
1425 // t[i] = t[i-2] - t[i-1] * q
1426 udivrem(r[i], r[i^1], q, r[i]);
1427 t[i] -= t[i^1] * q;
1428 }
1429
1430 // If this APInt and the modulo are not coprime, there is no multiplicative
1431 // inverse, so return 0. We check this by looking at the next-to-last
1432 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1433 // algorithm.
1434 if (r[i] != 1)
1435 return APInt(BitWidth, 0);
1436
1437 // The next-to-last t is the multiplicative inverse. However, we are
1438 // interested in a positive inverse. Calcuate a positive one from a negative
1439 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001440 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001441 return t[i].isNegative() ? t[i] + modulo : t[i];
1442}
1443
Jay Foad4e5ea552009-04-30 10:15:35 +00001444/// Calculate the magic numbers required to implement a signed integer division
1445/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1446/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1447/// Warren, Jr., chapter 10.
1448APInt::ms APInt::magic() const {
1449 const APInt& d = *this;
1450 unsigned p;
1451 APInt ad, anc, delta, q1, r1, q2, r2, t;
1452 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1453 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1454 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1455 struct ms mag;
1456
1457 ad = d.abs();
1458 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1459 anc = t - 1 - t.urem(ad); // absolute value of nc
1460 p = d.getBitWidth() - 1; // initialize p
1461 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1462 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1463 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1464 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1465 do {
1466 p = p + 1;
1467 q1 = q1<<1; // update q1 = 2p/abs(nc)
1468 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1469 if (r1.uge(anc)) { // must be unsigned comparison
1470 q1 = q1 + 1;
1471 r1 = r1 - anc;
1472 }
1473 q2 = q2<<1; // update q2 = 2p/abs(d)
1474 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1475 if (r2.uge(ad)) { // must be unsigned comparison
1476 q2 = q2 + 1;
1477 r2 = r2 - ad;
1478 }
1479 delta = ad - r2;
1480 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
1481
1482 mag.m = q2 + 1;
1483 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1484 mag.s = p - d.getBitWidth(); // resulting shift
1485 return mag;
1486}
1487
1488/// Calculate the magic numbers required to implement an unsigned integer
1489/// division by a constant as a sequence of multiplies, adds and shifts.
1490/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1491/// S. Warren, Jr., chapter 10.
1492APInt::mu APInt::magicu() const {
1493 const APInt& d = *this;
1494 unsigned p;
1495 APInt nc, delta, q1, r1, q2, r2;
1496 struct mu magu;
1497 magu.a = 0; // initialize "add" indicator
1498 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1499 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1500 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1501
1502 nc = allOnes - (-d).urem(d);
1503 p = d.getBitWidth() - 1; // initialize p
1504 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1505 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1506 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1507 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1508 do {
1509 p = p + 1;
1510 if (r1.uge(nc - r1)) {
1511 q1 = q1 + q1 + 1; // update q1
1512 r1 = r1 + r1 - nc; // update r1
1513 }
1514 else {
1515 q1 = q1+q1; // update q1
1516 r1 = r1+r1; // update r1
1517 }
1518 if ((r2 + 1).uge(d - r2)) {
1519 if (q2.uge(signedMax)) magu.a = 1;
1520 q2 = q2+q2 + 1; // update q2
1521 r2 = r2+r2 + 1 - d; // update r2
1522 }
1523 else {
1524 if (q2.uge(signedMin)) magu.a = 1;
1525 q2 = q2+q2; // update q2
1526 r2 = r2+r2 + 1; // update r2
1527 }
1528 delta = d - 1 - r2;
1529 } while (p < d.getBitWidth()*2 &&
1530 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1531 magu.m = q2 + 1; // resulting magic number
1532 magu.s = p - d.getBitWidth(); // resulting shift
1533 return magu;
1534}
1535
Reid Spencer9c0696f2007-02-20 08:51:03 +00001536/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1537/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1538/// variables here have the same names as in the algorithm. Comments explain
1539/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001540static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1541 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001542 assert(u && "Must provide dividend");
1543 assert(v && "Must provide divisor");
1544 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001545 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001546 assert(n>1 && "n must be > 1");
1547
1548 // Knuth uses the value b as the base of the number system. In our case b
1549 // is 2^31 so we just set it to -1u.
1550 uint64_t b = uint64_t(1) << 32;
1551
Chris Lattnerfad86b02008-08-17 07:19:36 +00001552#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001553 DEBUG(errs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1554 DEBUG(errs() << "KnuthDiv: original:");
1555 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1556 DEBUG(errs() << " by");
1557 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1558 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001559#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001560 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1561 // u and v by d. Note that we have taken Knuth's advice here to use a power
1562 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1563 // 2 allows us to shift instead of multiply and it is easy to determine the
1564 // shift amount from the leading zeros. We are basically normalizing the u
1565 // and v so that its high bits are shifted to the top of v's range without
1566 // overflow. Note that this can require an extra word in u so that u must
1567 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001568 unsigned shift = CountLeadingZeros_32(v[n-1]);
1569 unsigned v_carry = 0;
1570 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001571 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001572 for (unsigned i = 0; i < m+n; ++i) {
1573 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001574 u[i] = (u[i] << shift) | u_carry;
1575 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001576 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001577 for (unsigned i = 0; i < n; ++i) {
1578 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001579 v[i] = (v[i] << shift) | v_carry;
1580 v_carry = v_tmp;
1581 }
1582 }
1583 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001584#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001585 DEBUG(errs() << "KnuthDiv: normal:");
1586 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1587 DEBUG(errs() << " by");
1588 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1589 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001590#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001591
1592 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1593 int j = m;
1594 do {
Daniel Dunbara53902b2009-07-13 05:27:30 +00001595 DEBUG(errs() << "KnuthDiv: quotient digit #" << j << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001596 // D3. [Calculate q'.].
1597 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1598 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1599 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1600 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1601 // on v[n-2] determines at high speed most of the cases in which the trial
1602 // value qp is one too large, and it eliminates all cases where qp is two
1603 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001604 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Daniel Dunbara53902b2009-07-13 05:27:30 +00001605 DEBUG(errs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001606 uint64_t qp = dividend / v[n-1];
1607 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001608 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1609 qp--;
1610 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001611 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001612 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001613 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001614 DEBUG(errs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001615
Reid Spencer92904632007-02-23 01:57:13 +00001616 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1617 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1618 // consists of a simple multiplication by a one-place number, combined with
Reid Spencer610fad82007-02-24 10:01:42 +00001619 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001620 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001621 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001622 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001623 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001624 bool borrow = subtrahend > u_tmp;
Daniel Dunbara53902b2009-07-13 05:27:30 +00001625 DEBUG(errs() << "KnuthDiv: u_tmp == " << u_tmp
1626 << ", subtrahend == " << subtrahend
1627 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001628
Reid Spencer610fad82007-02-24 10:01:42 +00001629 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001630 unsigned k = j + i;
1631 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1632 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001633 while (borrow && k <= m+n) { // deal with borrow to the left
1634 borrow = u[k] == 0;
1635 u[k]--;
1636 k++;
1637 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001638 isNeg |= borrow;
Daniel Dunbara53902b2009-07-13 05:27:30 +00001639 DEBUG(errs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Reid Spencer610fad82007-02-24 10:01:42 +00001640 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001641 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001642 DEBUG(errs() << "KnuthDiv: after subtraction:");
1643 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1644 DEBUG(errs() << '\n');
Reid Spencer610fad82007-02-24 10:01:42 +00001645 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1646 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1647 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001648 // the true value, and a "borrow" to the left should be remembered.
1649 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001650 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001651 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001652 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001653 u[i] = ~u[i] + carry; // b's complement
1654 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001655 }
Reid Spencer92904632007-02-23 01:57:13 +00001656 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001657 DEBUG(errs() << "KnuthDiv: after complement:");
1658 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1659 DEBUG(errs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001660
1661 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
1662 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001663 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001664 if (isNeg) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001665 // D6. [Add back]. The probability that this step is necessary is very
1666 // small, on the order of only 2/b. Make sure that test data accounts for
Reid Spencer92904632007-02-23 01:57:13 +00001667 // this possibility. Decrease q[j] by 1
1668 q[j]--;
1669 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1670 // A carry will occur to the left of u[j+n], and it should be ignored
1671 // since it cancels with the borrow that occurred in D4.
1672 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001673 for (unsigned i = 0; i < n; i++) {
1674 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001675 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001676 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001677 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001678 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001679 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001680 DEBUG(errs() << "KnuthDiv: after correction:");
1681 DEBUG(for (int i = m+n; i >=0; i--) errs() <<" " << u[i]);
1682 DEBUG(errs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001683
Reid Spencer92904632007-02-23 01:57:13 +00001684 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1685 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001686
Daniel Dunbara53902b2009-07-13 05:27:30 +00001687 DEBUG(errs() << "KnuthDiv: quotient:");
1688 DEBUG(for (int i = m; i >=0; i--) errs() <<" " << q[i]);
1689 DEBUG(errs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001690
Reid Spencer9c0696f2007-02-20 08:51:03 +00001691 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1692 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1693 // compute the remainder (urem uses this).
1694 if (r) {
1695 // The value d is expressed by the "shift" value above since we avoided
1696 // multiplication by d by using a shift left. So, all we have to do is
1697 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001698 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001699 unsigned carry = 0;
Daniel Dunbara53902b2009-07-13 05:27:30 +00001700 DEBUG(errs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001701 for (int i = n-1; i >= 0; i--) {
1702 r[i] = (u[i] >> shift) | carry;
1703 carry = u[i] << (32 - shift);
Daniel Dunbara53902b2009-07-13 05:27:30 +00001704 DEBUG(errs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001705 }
1706 } else {
1707 for (int i = n-1; i >= 0; i--) {
1708 r[i] = u[i];
Daniel Dunbara53902b2009-07-13 05:27:30 +00001709 DEBUG(errs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001710 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001711 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001712 DEBUG(errs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001713 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001714#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001715 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001716#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001717}
1718
Chris Lattner455e9ab2009-01-21 18:09:24 +00001719void APInt::divide(const APInt LHS, unsigned lhsWords,
1720 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001721 APInt *Quotient, APInt *Remainder)
1722{
1723 assert(lhsWords >= rhsWords && "Fractional result");
1724
1725 // First, compose the values into an array of 32-bit words instead of
1726 // 64-bit words. This is a necessity of both the "short division" algorithm
1727 // and the the Knuth "classical algorithm" which requires there to be native
1728 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1729 // can't use 64-bit operands here because we don't have native results of
Duncan Sandsbf5836b2009-03-19 11:37:15 +00001730 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001731 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001732 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001733 unsigned n = rhsWords * 2;
1734 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001735
1736 // Allocate space for the temporary values we need either on the stack, if
1737 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001738 unsigned SPACE[128];
1739 unsigned *U = 0;
1740 unsigned *V = 0;
1741 unsigned *Q = 0;
1742 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001743 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1744 U = &SPACE[0];
1745 V = &SPACE[m+n+1];
1746 Q = &SPACE[(m+n+1) + n];
1747 if (Remainder)
1748 R = &SPACE[(m+n+1) + n + (m+n)];
1749 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001750 U = new unsigned[m + n + 1];
1751 V = new unsigned[n];
1752 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001753 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001754 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001755 }
1756
1757 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001758 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001759 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001760 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001761 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001762 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001763 }
1764 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1765
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001766 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001767 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001768 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001769 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001770 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001771 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001772 }
1773
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001774 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001775 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001776 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001777 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001778
1779 // Now, adjust m and n for the Knuth division. n is the number of words in
1780 // the divisor. m is the number of words by which the dividend exceeds the
1781 // divisor (i.e. m+n is the length of the dividend). These sizes must not
1782 // contain any zero words or the Knuth algorithm fails.
1783 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1784 n--;
1785 m++;
1786 }
1787 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1788 m--;
1789
1790 // If we're left with only a single word for the divisor, Knuth doesn't work
1791 // so we implement the short division algorithm here. This is much simpler
1792 // and faster because we are certain that we can divide a 64-bit quantity
1793 // by a 32-bit quantity at hardware speed and short division is simply a
1794 // series of such operations. This is just like doing short division but we
1795 // are using base 2^32 instead of base 10.
1796 assert(n != 0 && "Divide by zero?");
1797 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001798 unsigned divisor = V[0];
1799 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001800 for (int i = m+n-1; i >= 0; i--) {
1801 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1802 if (partial_dividend == 0) {
1803 Q[i] = 0;
1804 remainder = 0;
1805 } else if (partial_dividend < divisor) {
1806 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001807 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001808 } else if (partial_dividend == divisor) {
1809 Q[i] = 1;
1810 remainder = 0;
1811 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001812 Q[i] = (unsigned)(partial_dividend / divisor);
1813 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001814 }
1815 }
1816 if (R)
1817 R[0] = remainder;
1818 } else {
1819 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1820 // case n > 1.
1821 KnuthDiv(U, V, Q, R, m, n);
1822 }
1823
1824 // If the caller wants the quotient
1825 if (Quotient) {
1826 // Set up the Quotient value's memory.
1827 if (Quotient->BitWidth != LHS.BitWidth) {
1828 if (Quotient->isSingleWord())
1829 Quotient->VAL = 0;
1830 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001831 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001832 Quotient->BitWidth = LHS.BitWidth;
1833 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001834 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001835 } else
1836 Quotient->clear();
1837
1838 // The quotient is in Q. Reconstitute the quotient into Quotient's low
1839 // order words.
1840 if (lhsWords == 1) {
1841 uint64_t tmp =
1842 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1843 if (Quotient->isSingleWord())
1844 Quotient->VAL = tmp;
1845 else
1846 Quotient->pVal[0] = tmp;
1847 } else {
1848 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1849 for (unsigned i = 0; i < lhsWords; ++i)
1850 Quotient->pVal[i] =
1851 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1852 }
1853 }
1854
1855 // If the caller wants the remainder
1856 if (Remainder) {
1857 // Set up the Remainder value's memory.
1858 if (Remainder->BitWidth != RHS.BitWidth) {
1859 if (Remainder->isSingleWord())
1860 Remainder->VAL = 0;
1861 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001862 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001863 Remainder->BitWidth = RHS.BitWidth;
1864 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001865 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001866 } else
1867 Remainder->clear();
1868
1869 // The remainder is in R. Reconstitute the remainder into Remainder's low
1870 // order words.
1871 if (rhsWords == 1) {
1872 uint64_t tmp =
1873 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1874 if (Remainder->isSingleWord())
1875 Remainder->VAL = tmp;
1876 else
1877 Remainder->pVal[0] = tmp;
1878 } else {
1879 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1880 for (unsigned i = 0; i < rhsWords; ++i)
1881 Remainder->pVal[i] =
1882 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1883 }
1884 }
1885
1886 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001887 if (U != &SPACE[0]) {
1888 delete [] U;
1889 delete [] V;
1890 delete [] Q;
1891 delete [] R;
1892 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001893}
1894
Reid Spencere81d2da2007-02-16 22:36:51 +00001895APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001896 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001897
1898 // First, deal with the easy case
1899 if (isSingleWord()) {
1900 assert(RHS.VAL != 0 && "Divide by zero?");
1901 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001902 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001903
Reid Spencer71bd08f2007-02-17 02:07:07 +00001904 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001905 unsigned rhsBits = RHS.getActiveBits();
1906 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001907 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001908 unsigned lhsBits = this->getActiveBits();
1909 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001910
1911 // Deal with some degenerate cases
1912 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001913 // 0 / X ===> 0
1914 return APInt(BitWidth, 0);
1915 else if (lhsWords < rhsWords || this->ult(RHS)) {
1916 // X / Y ===> 0, iff X < Y
1917 return APInt(BitWidth, 0);
1918 } else if (*this == RHS) {
1919 // X / X ===> 1
1920 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001921 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001922 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001923 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001924 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001925
1926 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1927 APInt Quotient(1,0); // to hold result.
1928 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1929 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001930}
1931
Reid Spencere81d2da2007-02-16 22:36:51 +00001932APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001933 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001934 if (isSingleWord()) {
1935 assert(RHS.VAL != 0 && "Remainder 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 Spencere0cdd332007-02-21 08:21:52 +00001939 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001940 unsigned lhsBits = getActiveBits();
1941 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001942
1943 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001944 unsigned rhsBits = RHS.getActiveBits();
1945 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001946 assert(rhsWords && "Performing remainder operation by zero ???");
1947
Reid Spencer71bd08f2007-02-17 02:07:07 +00001948 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001949 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001950 // 0 % Y ===> 0
1951 return APInt(BitWidth, 0);
1952 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1953 // X % Y ===> X, iff X < Y
1954 return *this;
1955 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001956 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001957 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001958 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001959 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001960 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001961 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001962
Reid Spencer19dc32a2007-05-13 23:44:59 +00001963 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001964 APInt Remainder(1,0);
1965 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1966 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001967}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001968
Reid Spencer19dc32a2007-05-13 23:44:59 +00001969void APInt::udivrem(const APInt &LHS, const APInt &RHS,
1970 APInt &Quotient, APInt &Remainder) {
1971 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001972 unsigned lhsBits = LHS.getActiveBits();
1973 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1974 unsigned rhsBits = RHS.getActiveBits();
1975 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001976
1977 // Check the degenerate cases
1978 if (lhsWords == 0) {
1979 Quotient = 0; // 0 / Y ===> 0
1980 Remainder = 0; // 0 % Y ===> 0
1981 return;
1982 }
1983
1984 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1985 Quotient = 0; // X / Y ===> 0, iff X < Y
1986 Remainder = LHS; // X % Y ===> X, iff X < Y
1987 return;
1988 }
1989
1990 if (LHS == RHS) {
1991 Quotient = 1; // X / X ===> 1
1992 Remainder = 0; // X % X ===> 0;
1993 return;
1994 }
1995
1996 if (lhsWords == 1 && rhsWords == 1) {
1997 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001998 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1999 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2000 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2001 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002002 return;
2003 }
2004
2005 // Okay, lets do it the long way
2006 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2007}
2008
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002009void APInt::fromString(unsigned numbits, const StringRef& str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002010 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002011 assert(!str.empty() && "Invalid string length");
Reid Spencer5e0a8512007-02-17 03:16:00 +00002012 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2013 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002014
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002015 StringRef::iterator p = str.begin();
2016 size_t slen = str.size();
2017 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002018 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002019 p++;
2020 slen--;
2021 assert(slen && "string is only a minus!");
2022 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002023 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002024 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2025 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
2026 assert((((slen-1)*64)/22 <= numbits || radix != 10) && "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002027
2028 // Allocate memory
2029 if (!isSingleWord())
2030 pVal = getClearedMemory(getNumWords());
2031
2032 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002033 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002034
2035 // Set up an APInt for the digit to add outside the loop so we don't
2036 // constantly construct/destruct it.
2037 APInt apdigit(getBitWidth(), 0);
2038 APInt apradix(getBitWidth(), radix);
2039
2040 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002041 for (StringRef::iterator e = str.end(); p != e; ++p) {
Reid Spencer385f7542007-02-21 03:55:44 +00002042 // Get a digit
Chris Lattner455e9ab2009-01-21 18:09:24 +00002043 unsigned digit = 0;
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002044 char cdigit = *p;
Reid Spencer6551dcd2007-05-16 19:18:22 +00002045 if (radix == 16) {
2046 if (!isxdigit(cdigit))
Torok Edwinc23197a2009-07-14 16:55:14 +00002047 llvm_unreachable("Invalid hex digit in string");
Reid Spencer6551dcd2007-05-16 19:18:22 +00002048 if (isdigit(cdigit))
2049 digit = cdigit - '0';
2050 else if (cdigit >= 'a')
Reid Spencer385f7542007-02-21 03:55:44 +00002051 digit = cdigit - 'a' + 10;
2052 else if (cdigit >= 'A')
2053 digit = cdigit - 'A' + 10;
2054 else
Torok Edwinc23197a2009-07-14 16:55:14 +00002055 llvm_unreachable("huh? we shouldn't get here");
Reid Spencer6551dcd2007-05-16 19:18:22 +00002056 } else if (isdigit(cdigit)) {
2057 digit = cdigit - '0';
Bill Wendlingf7a91e62008-03-16 20:05:52 +00002058 assert((radix == 10 ||
2059 (radix == 8 && digit != 8 && digit != 9) ||
2060 (radix == 2 && (digit == 0 || digit == 1))) &&
2061 "Invalid digit in string for given radix");
Reid Spencer6551dcd2007-05-16 19:18:22 +00002062 } else {
Torok Edwinc23197a2009-07-14 16:55:14 +00002063 llvm_unreachable("Invalid character in digit string");
Reid Spencer6551dcd2007-05-16 19:18:22 +00002064 }
Reid Spencer385f7542007-02-21 03:55:44 +00002065
Reid Spencer6551dcd2007-05-16 19:18:22 +00002066 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002067 if (slen > 1) {
2068 if (shift)
2069 *this <<= shift;
2070 else
2071 *this *= apradix;
2072 }
Reid Spencer385f7542007-02-21 03:55:44 +00002073
2074 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002075 if (apdigit.isSingleWord())
2076 apdigit.VAL = digit;
2077 else
2078 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002079 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002080 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002081 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002082 if (isNeg) {
2083 (*this)--;
Reid Spencer9eec2412007-02-25 23:44:53 +00002084 this->flip();
Reid Spencer9eec2412007-02-25 23:44:53 +00002085 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002086}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002087
Chris Lattnerfad86b02008-08-17 07:19:36 +00002088void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2089 bool Signed) const {
2090 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002091 "Radix should be 2, 8, 10, or 16!");
Chris Lattnerfad86b02008-08-17 07:19:36 +00002092
2093 // First, check for a zero value and just short circuit the logic below.
2094 if (*this == 0) {
2095 Str.push_back('0');
2096 return;
2097 }
2098
2099 static const char Digits[] = "0123456789ABCDEF";
2100
Reid Spencer9c0696f2007-02-20 08:51:03 +00002101 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002102 char Buffer[65];
2103 char *BufPtr = Buffer+65;
2104
2105 uint64_t N;
2106 if (Signed) {
2107 int64_t I = getSExtValue();
2108 if (I < 0) {
2109 Str.push_back('-');
2110 I = -I;
2111 }
2112 N = I;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002113 } else {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002114 N = getZExtValue();
Reid Spencer9c0696f2007-02-20 08:51:03 +00002115 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00002116
2117 while (N) {
2118 *--BufPtr = Digits[N % Radix];
2119 N /= Radix;
2120 }
2121 Str.append(BufPtr, Buffer+65);
2122 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002123 }
2124
Chris Lattnerfad86b02008-08-17 07:19:36 +00002125 APInt Tmp(*this);
2126
2127 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002128 // They want to print the signed version and it is a negative value
2129 // Flip the bits and add one to turn it into the equivalent positive
2130 // value and put a '-' in the result.
Chris Lattnerfad86b02008-08-17 07:19:36 +00002131 Tmp.flip();
2132 Tmp++;
2133 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002134 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00002135
2136 // We insert the digits backward, then reverse them to get the right order.
2137 unsigned StartDig = Str.size();
2138
2139 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2140 // because the number of bits per digit (1, 3 and 4 respectively) divides
2141 // equaly. We just shift until the value is zero.
2142 if (Radix != 10) {
2143 // Just shift tmp right for each digit width until it becomes zero
2144 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2145 unsigned MaskAmt = Radix - 1;
2146
2147 while (Tmp != 0) {
2148 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2149 Str.push_back(Digits[Digit]);
2150 Tmp = Tmp.lshr(ShiftAmt);
2151 }
2152 } else {
2153 APInt divisor(4, 10);
2154 while (Tmp != 0) {
2155 APInt APdigit(1, 0);
2156 APInt tmp2(Tmp.getBitWidth(), 0);
2157 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
2158 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002159 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002160 assert(Digit < Radix && "divide failed");
2161 Str.push_back(Digits[Digit]);
2162 Tmp = tmp2;
2163 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002164 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00002165
2166 // Reverse the digits before returning.
2167 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002168}
2169
Chris Lattnerfad86b02008-08-17 07:19:36 +00002170/// toString - This returns the APInt as a std::string. Note that this is an
2171/// inefficient method. It is better to pass in a SmallVector/SmallString
2172/// to the methods above.
2173std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2174 SmallString<40> S;
2175 toString(S, Radix, Signed);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002176 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002177}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002178
Chris Lattnerfad86b02008-08-17 07:19:36 +00002179
2180void APInt::dump() const {
2181 SmallString<40> S, U;
2182 this->toStringUnsigned(U);
2183 this->toStringSigned(S);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002184 errs() << "APInt(" << BitWidth << "b, "
2185 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002186}
2187
Chris Lattner944fac72008-08-23 22:23:09 +00002188void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002189 SmallString<40> S;
2190 this->toString(S, 10, isSigned);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002191 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002192}
2193
Dan Gohman38a253d2009-06-30 20:10:56 +00002194std::ostream &llvm::operator<<(std::ostream &o, const APInt &I) {
2195 raw_os_ostream OS(o);
2196 OS << I;
2197 return o;
2198}
2199
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002200// This implements a variety of operations on a representation of
2201// arbitrary precision, two's-complement, bignum integer values.
2202
2203/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2204 and unrestricting assumption. */
Chris Lattner9f17eb02008-08-17 04:58:58 +00002205#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002206COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002207
2208/* Some handy functions local to this file. */
2209namespace {
2210
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002211 /* Returns the integer part with the least significant BITS set.
2212 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002213 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002214 lowBitMask(unsigned int bits)
2215 {
2216 assert (bits != 0 && bits <= integerPartWidth);
2217
2218 return ~(integerPart) 0 >> (integerPartWidth - bits);
2219 }
2220
Neil Booth055c0b32007-10-06 00:43:45 +00002221 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002222 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002223 lowHalf(integerPart part)
2224 {
2225 return part & lowBitMask(integerPartWidth / 2);
2226 }
2227
Neil Booth055c0b32007-10-06 00:43:45 +00002228 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002229 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002230 highHalf(integerPart part)
2231 {
2232 return part >> (integerPartWidth / 2);
2233 }
2234
Neil Booth055c0b32007-10-06 00:43:45 +00002235 /* Returns the bit number of the most significant set bit of a part.
2236 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002237 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002238 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002239 {
2240 unsigned int n, msb;
2241
2242 if (value == 0)
2243 return -1U;
2244
2245 n = integerPartWidth / 2;
2246
2247 msb = 0;
2248 do {
2249 if (value >> n) {
2250 value >>= n;
2251 msb += n;
2252 }
2253
2254 n >>= 1;
2255 } while (n);
2256
2257 return msb;
2258 }
2259
Neil Booth055c0b32007-10-06 00:43:45 +00002260 /* Returns the bit number of the least significant set bit of a
2261 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002262 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002263 partLSB(integerPart value)
2264 {
2265 unsigned int n, lsb;
2266
2267 if (value == 0)
2268 return -1U;
2269
2270 lsb = integerPartWidth - 1;
2271 n = integerPartWidth / 2;
2272
2273 do {
2274 if (value << n) {
2275 value <<= n;
2276 lsb -= n;
2277 }
2278
2279 n >>= 1;
2280 } while (n);
2281
2282 return lsb;
2283 }
2284}
2285
2286/* Sets the least significant part of a bignum to the input value, and
2287 zeroes out higher parts. */
2288void
2289APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2290{
2291 unsigned int i;
2292
Neil Booth68e53ad2007-10-08 13:47:12 +00002293 assert (parts > 0);
2294
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002295 dst[0] = part;
2296 for(i = 1; i < parts; i++)
2297 dst[i] = 0;
2298}
2299
2300/* Assign one bignum to another. */
2301void
2302APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2303{
2304 unsigned int i;
2305
2306 for(i = 0; i < parts; i++)
2307 dst[i] = src[i];
2308}
2309
2310/* Returns true if a bignum is zero, false otherwise. */
2311bool
2312APInt::tcIsZero(const integerPart *src, unsigned int parts)
2313{
2314 unsigned int i;
2315
2316 for(i = 0; i < parts; i++)
2317 if (src[i])
2318 return false;
2319
2320 return true;
2321}
2322
2323/* Extract the given bit of a bignum; returns 0 or 1. */
2324int
2325APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2326{
2327 return(parts[bit / integerPartWidth]
2328 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2329}
2330
2331/* Set the given bit of a bignum. */
2332void
2333APInt::tcSetBit(integerPart *parts, unsigned int bit)
2334{
2335 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2336}
2337
Neil Booth055c0b32007-10-06 00:43:45 +00002338/* Returns the bit number of the least significant set bit of a
2339 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002340unsigned int
2341APInt::tcLSB(const integerPart *parts, unsigned int n)
2342{
2343 unsigned int i, lsb;
2344
2345 for(i = 0; i < n; i++) {
2346 if (parts[i] != 0) {
2347 lsb = partLSB(parts[i]);
2348
2349 return lsb + i * integerPartWidth;
2350 }
2351 }
2352
2353 return -1U;
2354}
2355
Neil Booth055c0b32007-10-06 00:43:45 +00002356/* Returns the bit number of the most significant set bit of a number.
2357 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002358unsigned int
2359APInt::tcMSB(const integerPart *parts, unsigned int n)
2360{
2361 unsigned int msb;
2362
2363 do {
2364 --n;
2365
2366 if (parts[n] != 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002367 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002368
2369 return msb + n * integerPartWidth;
2370 }
2371 } while (n);
2372
2373 return -1U;
2374}
2375
Neil Booth68e53ad2007-10-08 13:47:12 +00002376/* Copy the bit vector of width srcBITS from SRC, starting at bit
2377 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2378 the least significant bit of DST. All high bits above srcBITS in
2379 DST are zero-filled. */
2380void
Evan Chengcf69a742009-05-21 23:47:47 +00002381APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002382 unsigned int srcBits, unsigned int srcLSB)
2383{
2384 unsigned int firstSrcPart, dstParts, shift, n;
2385
2386 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2387 assert (dstParts <= dstCount);
2388
2389 firstSrcPart = srcLSB / integerPartWidth;
2390 tcAssign (dst, src + firstSrcPart, dstParts);
2391
2392 shift = srcLSB % integerPartWidth;
2393 tcShiftRight (dst, dstParts, shift);
2394
2395 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2396 in DST. If this is less that srcBits, append the rest, else
2397 clear the high bits. */
2398 n = dstParts * integerPartWidth - shift;
2399 if (n < srcBits) {
2400 integerPart mask = lowBitMask (srcBits - n);
2401 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2402 << n % integerPartWidth);
2403 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002404 if (srcBits % integerPartWidth)
2405 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002406 }
2407
2408 /* Clear high parts. */
2409 while (dstParts < dstCount)
2410 dst[dstParts++] = 0;
2411}
2412
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002413/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2414integerPart
2415APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2416 integerPart c, unsigned int parts)
2417{
2418 unsigned int i;
2419
2420 assert(c <= 1);
2421
2422 for(i = 0; i < parts; i++) {
2423 integerPart l;
2424
2425 l = dst[i];
2426 if (c) {
2427 dst[i] += rhs[i] + 1;
2428 c = (dst[i] <= l);
2429 } else {
2430 dst[i] += rhs[i];
2431 c = (dst[i] < l);
2432 }
2433 }
2434
2435 return c;
2436}
2437
2438/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2439integerPart
2440APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2441 integerPart c, unsigned int parts)
2442{
2443 unsigned int i;
2444
2445 assert(c <= 1);
2446
2447 for(i = 0; i < parts; i++) {
2448 integerPart l;
2449
2450 l = dst[i];
2451 if (c) {
2452 dst[i] -= rhs[i] + 1;
2453 c = (dst[i] >= l);
2454 } else {
2455 dst[i] -= rhs[i];
2456 c = (dst[i] > l);
2457 }
2458 }
2459
2460 return c;
2461}
2462
2463/* Negate a bignum in-place. */
2464void
2465APInt::tcNegate(integerPart *dst, unsigned int parts)
2466{
2467 tcComplement(dst, parts);
2468 tcIncrement(dst, parts);
2469}
2470
Neil Booth055c0b32007-10-06 00:43:45 +00002471/* DST += SRC * MULTIPLIER + CARRY if add is true
2472 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002473
2474 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2475 they must start at the same point, i.e. DST == SRC.
2476
2477 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2478 returned. Otherwise DST is filled with the least significant
2479 DSTPARTS parts of the result, and if all of the omitted higher
2480 parts were zero return zero, otherwise overflow occurred and
2481 return one. */
2482int
2483APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2484 integerPart multiplier, integerPart carry,
2485 unsigned int srcParts, unsigned int dstParts,
2486 bool add)
2487{
2488 unsigned int i, n;
2489
2490 /* Otherwise our writes of DST kill our later reads of SRC. */
2491 assert(dst <= src || dst >= src + srcParts);
2492 assert(dstParts <= srcParts + 1);
2493
2494 /* N loops; minimum of dstParts and srcParts. */
2495 n = dstParts < srcParts ? dstParts: srcParts;
2496
2497 for(i = 0; i < n; i++) {
2498 integerPart low, mid, high, srcPart;
2499
2500 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2501
2502 This cannot overflow, because
2503
2504 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2505
2506 which is less than n^2. */
2507
2508 srcPart = src[i];
2509
2510 if (multiplier == 0 || srcPart == 0) {
2511 low = carry;
2512 high = 0;
2513 } else {
2514 low = lowHalf(srcPart) * lowHalf(multiplier);
2515 high = highHalf(srcPart) * highHalf(multiplier);
2516
2517 mid = lowHalf(srcPart) * highHalf(multiplier);
2518 high += highHalf(mid);
2519 mid <<= integerPartWidth / 2;
2520 if (low + mid < low)
2521 high++;
2522 low += mid;
2523
2524 mid = highHalf(srcPart) * lowHalf(multiplier);
2525 high += highHalf(mid);
2526 mid <<= integerPartWidth / 2;
2527 if (low + mid < low)
2528 high++;
2529 low += mid;
2530
2531 /* Now add carry. */
2532 if (low + carry < low)
2533 high++;
2534 low += carry;
2535 }
2536
2537 if (add) {
2538 /* And now DST[i], and store the new low part there. */
2539 if (low + dst[i] < low)
2540 high++;
2541 dst[i] += low;
2542 } else
2543 dst[i] = low;
2544
2545 carry = high;
2546 }
2547
2548 if (i < dstParts) {
2549 /* Full multiplication, there is no overflow. */
2550 assert(i + 1 == dstParts);
2551 dst[i] = carry;
2552 return 0;
2553 } else {
2554 /* We overflowed if there is carry. */
2555 if (carry)
2556 return 1;
2557
2558 /* We would overflow if any significant unwritten parts would be
2559 non-zero. This is true if any remaining src parts are non-zero
2560 and the multiplier is non-zero. */
2561 if (multiplier)
2562 for(; i < srcParts; i++)
2563 if (src[i])
2564 return 1;
2565
2566 /* We fitted in the narrow destination. */
2567 return 0;
2568 }
2569}
2570
2571/* DST = LHS * RHS, where DST has the same width as the operands and
2572 is filled with the least significant parts of the result. Returns
2573 one if overflow occurred, otherwise zero. DST must be disjoint
2574 from both operands. */
2575int
2576APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2577 const integerPart *rhs, unsigned int parts)
2578{
2579 unsigned int i;
2580 int overflow;
2581
2582 assert(dst != lhs && dst != rhs);
2583
2584 overflow = 0;
2585 tcSet(dst, 0, parts);
2586
2587 for(i = 0; i < parts; i++)
2588 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2589 parts - i, true);
2590
2591 return overflow;
2592}
2593
Neil Booth978661d2007-10-06 00:24:48 +00002594/* DST = LHS * RHS, where DST has width the sum of the widths of the
2595 operands. No overflow occurs. DST must be disjoint from both
2596 operands. Returns the number of parts required to hold the
2597 result. */
2598unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002599APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002600 const integerPart *rhs, unsigned int lhsParts,
2601 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002602{
Neil Booth978661d2007-10-06 00:24:48 +00002603 /* Put the narrower number on the LHS for less loops below. */
2604 if (lhsParts > rhsParts) {
2605 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2606 } else {
2607 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002608
Neil Booth978661d2007-10-06 00:24:48 +00002609 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002610
Neil Booth978661d2007-10-06 00:24:48 +00002611 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002612
Neil Booth978661d2007-10-06 00:24:48 +00002613 for(n = 0; n < lhsParts; n++)
2614 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002615
Neil Booth978661d2007-10-06 00:24:48 +00002616 n = lhsParts + rhsParts;
2617
2618 return n - (dst[n - 1] == 0);
2619 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002620}
2621
2622/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2623 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2624 set REMAINDER to the remainder, return zero. i.e.
2625
2626 OLD_LHS = RHS * LHS + REMAINDER
2627
2628 SCRATCH is a bignum of the same size as the operands and result for
2629 use by the routine; its contents need not be initialized and are
2630 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2631*/
2632int
2633APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2634 integerPart *remainder, integerPart *srhs,
2635 unsigned int parts)
2636{
2637 unsigned int n, shiftCount;
2638 integerPart mask;
2639
2640 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2641
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002642 shiftCount = tcMSB(rhs, parts) + 1;
2643 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002644 return true;
2645
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002646 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002647 n = shiftCount / integerPartWidth;
2648 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2649
2650 tcAssign(srhs, rhs, parts);
2651 tcShiftLeft(srhs, parts, shiftCount);
2652 tcAssign(remainder, lhs, parts);
2653 tcSet(lhs, 0, parts);
2654
2655 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2656 the total. */
2657 for(;;) {
2658 int compare;
2659
2660 compare = tcCompare(remainder, srhs, parts);
2661 if (compare >= 0) {
2662 tcSubtract(remainder, srhs, 0, parts);
2663 lhs[n] |= mask;
2664 }
2665
2666 if (shiftCount == 0)
2667 break;
2668 shiftCount--;
2669 tcShiftRight(srhs, parts, 1);
2670 if ((mask >>= 1) == 0)
2671 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2672 }
2673
2674 return false;
2675}
2676
2677/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2678 There are no restrictions on COUNT. */
2679void
2680APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2681{
Neil Booth68e53ad2007-10-08 13:47:12 +00002682 if (count) {
2683 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002684
Neil Booth68e53ad2007-10-08 13:47:12 +00002685 /* Jump is the inter-part jump; shift is is intra-part shift. */
2686 jump = count / integerPartWidth;
2687 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002688
Neil Booth68e53ad2007-10-08 13:47:12 +00002689 while (parts > jump) {
2690 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002691
Neil Booth68e53ad2007-10-08 13:47:12 +00002692 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002693
Neil Booth68e53ad2007-10-08 13:47:12 +00002694 /* dst[i] comes from the two parts src[i - jump] and, if we have
2695 an intra-part shift, src[i - jump - 1]. */
2696 part = dst[parts - jump];
2697 if (shift) {
2698 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002699 if (parts >= jump + 1)
2700 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2701 }
2702
Neil Booth68e53ad2007-10-08 13:47:12 +00002703 dst[parts] = part;
2704 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002705
Neil Booth68e53ad2007-10-08 13:47:12 +00002706 while (parts > 0)
2707 dst[--parts] = 0;
2708 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002709}
2710
2711/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2712 zero. There are no restrictions on COUNT. */
2713void
2714APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2715{
Neil Booth68e53ad2007-10-08 13:47:12 +00002716 if (count) {
2717 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002718
Neil Booth68e53ad2007-10-08 13:47:12 +00002719 /* Jump is the inter-part jump; shift is is intra-part shift. */
2720 jump = count / integerPartWidth;
2721 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002722
Neil Booth68e53ad2007-10-08 13:47:12 +00002723 /* Perform the shift. This leaves the most significant COUNT bits
2724 of the result at zero. */
2725 for(i = 0; i < parts; i++) {
2726 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002727
Neil Booth68e53ad2007-10-08 13:47:12 +00002728 if (i + jump >= parts) {
2729 part = 0;
2730 } else {
2731 part = dst[i + jump];
2732 if (shift) {
2733 part >>= shift;
2734 if (i + jump + 1 < parts)
2735 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2736 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002737 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002738
Neil Booth68e53ad2007-10-08 13:47:12 +00002739 dst[i] = part;
2740 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002741 }
2742}
2743
2744/* Bitwise and of two bignums. */
2745void
2746APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2747{
2748 unsigned int i;
2749
2750 for(i = 0; i < parts; i++)
2751 dst[i] &= rhs[i];
2752}
2753
2754/* Bitwise inclusive or of two bignums. */
2755void
2756APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2757{
2758 unsigned int i;
2759
2760 for(i = 0; i < parts; i++)
2761 dst[i] |= rhs[i];
2762}
2763
2764/* Bitwise exclusive or of two bignums. */
2765void
2766APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2767{
2768 unsigned int i;
2769
2770 for(i = 0; i < parts; i++)
2771 dst[i] ^= rhs[i];
2772}
2773
2774/* Complement a bignum in-place. */
2775void
2776APInt::tcComplement(integerPart *dst, unsigned int parts)
2777{
2778 unsigned int i;
2779
2780 for(i = 0; i < parts; i++)
2781 dst[i] = ~dst[i];
2782}
2783
2784/* Comparison (unsigned) of two bignums. */
2785int
2786APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2787 unsigned int parts)
2788{
2789 while (parts) {
2790 parts--;
2791 if (lhs[parts] == rhs[parts])
2792 continue;
2793
2794 if (lhs[parts] > rhs[parts])
2795 return 1;
2796 else
2797 return -1;
2798 }
2799
2800 return 0;
2801}
2802
2803/* Increment a bignum in-place, return the carry flag. */
2804integerPart
2805APInt::tcIncrement(integerPart *dst, unsigned int parts)
2806{
2807 unsigned int i;
2808
2809 for(i = 0; i < parts; i++)
2810 if (++dst[i] != 0)
2811 break;
2812
2813 return i == parts;
2814}
2815
2816/* Set the least significant BITS bits of a bignum, clear the
2817 rest. */
2818void
2819APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2820 unsigned int bits)
2821{
2822 unsigned int i;
2823
2824 i = 0;
2825 while (bits > integerPartWidth) {
2826 dst[i++] = ~(integerPart) 0;
2827 bits -= integerPartWidth;
2828 }
2829
2830 if (bits)
2831 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2832
2833 while (i < parts)
2834 dst[i++] = 0;
2835}