blob: 1754baed0696c230acaad0662001ac277de2bdaa [file] [log] [blame]
Zhou Shengfd43dcf2007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Zhou Shengfd43dcf2007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencer5d0d05c2007-02-25 19:32:03 +000010// This file implements a class to represent arbitrary precision integer
11// constant values and provide a variety of arithmetic operations on them.
Zhou Shengfd43dcf2007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer9d6c9192007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
Daniel Dunbar689ad6e2009-08-13 02:33:34 +000017#include "llvm/ADT/StringRef.h"
Ted Kremeneke420deb2008-01-19 04:23:33 +000018#include "llvm/ADT/FoldingSet.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000020#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000021#include "llvm/Support/ErrorHandling.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000022#include "llvm/Support/MathExtras.h"
Chris Lattner944fac72008-08-23 22:23:09 +000023#include "llvm/Support/raw_ostream.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000024#include <cmath>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000025#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000026#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000027#include <cstdlib>
28using namespace llvm;
29
Reid Spencer5d0d05c2007-02-25 19:32:03 +000030/// A utility function for allocating memory, checking for allocation failures,
31/// and ensuring the contents are zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000032inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000033 uint64_t * result = new uint64_t[numWords];
34 assert(result && "APInt memory allocation fails!");
35 memset(result, 0, numWords * sizeof(uint64_t));
36 return result;
Zhou Sheng353815d2007-02-06 06:04:53 +000037}
38
Eric Christopherd37eda82009-08-21 04:06:45 +000039/// A utility function for allocating memory and checking for allocation
Reid Spencer5d0d05c2007-02-25 19:32:03 +000040/// failure. The content is not zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000041inline static uint64_t* getMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000042 uint64_t * result = new uint64_t[numWords];
43 assert(result && "APInt memory allocation fails!");
44 return result;
45}
46
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000047/// A utility function that converts a character to a digit.
48inline static unsigned getDigit(char cdigit, uint8_t radix) {
49 // Get a digit
50 unsigned digit = 0;
51 if (radix == 16) {
52 if (!isxdigit(cdigit))
53 llvm_unreachable("Invalid hex digit in string");
54 if (isdigit(cdigit))
55 digit = cdigit - '0';
56 else if (cdigit >= 'a')
57 digit = cdigit - 'a' + 10;
58 else if (cdigit >= 'A')
59 digit = cdigit - 'A' + 10;
60 else
61 llvm_unreachable("huh? we shouldn't get here");
62 } else if (isdigit(cdigit)) {
63 digit = cdigit - '0';
64 assert((radix == 10 ||
65 (radix == 8 && digit != 8 && digit != 9) ||
66 (radix == 2 && (digit == 0 || digit == 1))) &&
67 "Invalid digit in string for given radix");
68 } else {
69 llvm_unreachable("Invalid character in digit string");
70 }
71
72 return digit;
73}
74
75
Chris Lattner455e9ab2009-01-21 18:09:24 +000076void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000077 pVal = getClearedMemory(getNumWords());
78 pVal[0] = val;
Eric Christopherd37eda82009-08-21 04:06:45 +000079 if (isSigned && int64_t(val) < 0)
Chris Lattner98f8ccf2008-08-20 17:02:31 +000080 for (unsigned i = 1; i < getNumWords(); ++i)
81 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000082}
83
Chris Lattner119c30b2008-10-11 22:07:19 +000084void APInt::initSlowCase(const APInt& that) {
85 pVal = getMemory(getNumWords());
86 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
87}
88
89
Chris Lattner455e9ab2009-01-21 18:09:24 +000090APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Chris Lattner944fac72008-08-23 22:23:09 +000091 : BitWidth(numBits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000092 assert(BitWidth && "Bitwidth too small");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000093 assert(bigVal && "Null pointer detected!");
94 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000095 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000096 else {
Reid Spencer610fad82007-02-24 10:01:42 +000097 // Get memory, cleared to 0
98 pVal = getClearedMemory(getNumWords());
99 // Calculate the number of words to copy
Chris Lattner455e9ab2009-01-21 18:09:24 +0000100 unsigned words = std::min<unsigned>(numWords, getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +0000101 // Copy the words from bigVal to pVal
102 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000103 }
Reid Spencer610fad82007-02-24 10:01:42 +0000104 // Make sure unused high bits are cleared
105 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000106}
107
Eric Christopherd37eda82009-08-21 04:06:45 +0000108APInt::APInt(unsigned numbits, const StringRef& Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +0000109 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000110 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000111 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000112}
113
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000114APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000115 // Don't do anything for X = X
116 if (this == &RHS)
117 return *this;
118
Reid Spencer9ac44112007-02-26 23:38:21 +0000119 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000120 // assume same bit-width single-word case is already handled
121 assert(!isSingleWord());
122 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer9ac44112007-02-26 23:38:21 +0000123 return *this;
124 }
125
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000126 if (isSingleWord()) {
127 // assume case where both are single words is already handled
128 assert(!RHS.isSingleWord());
129 VAL = 0;
130 pVal = getMemory(RHS.getNumWords());
131 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopherd37eda82009-08-21 04:06:45 +0000132 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000133 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
134 else if (RHS.isSingleWord()) {
135 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000136 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000137 } else {
138 delete [] pVal;
139 pVal = getMemory(RHS.getNumWords());
140 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
141 }
142 BitWidth = RHS.BitWidth;
143 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000144}
145
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000146APInt& APInt::operator=(uint64_t RHS) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000147 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000148 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000149 else {
150 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000151 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000152 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000153 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000154}
155
Ted Kremeneke420deb2008-01-19 04:23:33 +0000156/// Profile - This method 'profiles' an APInt for use with FoldingSet.
157void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000158 ID.AddInteger(BitWidth);
Eric Christopherd37eda82009-08-21 04:06:45 +0000159
Ted Kremeneke420deb2008-01-19 04:23:33 +0000160 if (isSingleWord()) {
161 ID.AddInteger(VAL);
162 return;
163 }
164
Chris Lattner455e9ab2009-01-21 18:09:24 +0000165 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000166 for (unsigned i = 0; i < NumWords; ++i)
167 ID.AddInteger(pVal[i]);
168}
169
Eric Christopherd37eda82009-08-21 04:06:45 +0000170/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spenceraf0e9562007-02-18 18:38:44 +0000171/// "digit" integer array, x[]. x[] is modified to reflect the addition and
172/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000173/// @returns the carry of the addition.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000174static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
175 for (unsigned i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000176 dest[i] = y + x[i];
177 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000178 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000179 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000180 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000181 break;
182 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000183 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000184 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000185}
186
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000187/// @brief Prefix increment operator. Increments the APInt by one.
188APInt& APInt::operator++() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000189 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000190 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000191 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000192 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000193 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000194}
195
Eric Christopherd37eda82009-08-21 04:06:45 +0000196/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
197/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spenceraf0e9562007-02-18 18:38:44 +0000198/// no further borrowing is neeeded or it runs out of "digits" in x. The result
199/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
200/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000201/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-01-21 18:09:24 +0000202static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
203 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000204 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000205 x[i] -= y;
Eric Christopherd37eda82009-08-21 04:06:45 +0000206 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000207 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000208 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000209 y = 0; // No need to borrow
210 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000211 }
212 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000213 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000214}
215
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000216/// @brief Prefix decrement operator. Decrements the APInt by one.
217APInt& APInt::operator--() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000218 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000219 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000220 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000221 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000222 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000223}
224
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000225/// add - This function adds the integer array x to the integer array Y and
Eric Christopherd37eda82009-08-21 04:06:45 +0000226/// places the result in dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000227/// @returns the carry out from the addition
228/// @brief General addition of 64-bit integer arrays
Eric Christopherd37eda82009-08-21 04:06:45 +0000229static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000230 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000231 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000232 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000233 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000234 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000235 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000236 }
237 return carry;
238}
239
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000240/// Adds the RHS APint to this APInt.
241/// @returns this, after addition of RHS.
Eric Christopherd37eda82009-08-21 04:06:45 +0000242/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000243APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000244 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000245 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000246 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000247 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000248 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000249 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000250 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000251}
252
Eric Christopherd37eda82009-08-21 04:06:45 +0000253/// Subtracts the integer array y from the integer array x
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000254/// @returns returns the borrow out.
255/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopherd37eda82009-08-21 04:06:45 +0000256static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000257 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000258 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000259 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000260 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
261 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
262 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000263 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000264 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000265}
266
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000267/// Subtracts the RHS APInt from this APInt
268/// @returns this, after subtraction
Eric Christopherd37eda82009-08-21 04:06:45 +0000269/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000270APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000271 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000272 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000273 VAL -= RHS.VAL;
274 else
275 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000276 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000277}
278
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000279/// Multiplies an integer array, x by a a uint64_t integer and places the result
Eric Christopherd37eda82009-08-21 04:06:45 +0000280/// into dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000281/// @returns the carry out of the multiplication.
282/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000283static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000284 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000285 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000286 uint64_t carry = 0;
287
288 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000289 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000290 // Split x into high and low words
291 uint64_t lx = x[i] & 0xffffffffULL;
292 uint64_t hx = x[i] >> 32;
293 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000294 // hasCarry == 0, no carry
295 // hasCarry == 1, has carry
296 // hasCarry == 2, no carry and the calculation result == 0.
297 uint8_t hasCarry = 0;
298 dest[i] = carry + lx * ly;
299 // Determine if the add above introduces carry.
300 hasCarry = (dest[i] < carry) ? 1 : 0;
301 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopherd37eda82009-08-21 04:06:45 +0000302 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000303 // (2^32 - 1) + 2^32 = 2^64.
304 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
305
306 carry += (lx * hy) & 0xffffffffULL;
307 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopherd37eda82009-08-21 04:06:45 +0000308 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000309 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
310 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000311 return carry;
312}
313
Eric Christopherd37eda82009-08-21 04:06:45 +0000314/// Multiplies integer array x by integer array y and stores the result into
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000315/// the integer array dest. Note that dest's size must be >= xlen + ylen.
316/// @brief Generalized multiplicate of integer arrays.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000317static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
318 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000319 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000320 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000321 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000322 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000323 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000324 lx = x[j] & 0xffffffffULL;
325 hx = x[j] >> 32;
326 // hasCarry - A flag to indicate if has carry.
327 // hasCarry == 0, no carry
328 // hasCarry == 1, has carry
329 // hasCarry == 2, no carry and the calculation result == 0.
330 uint8_t hasCarry = 0;
331 uint64_t resul = carry + lx * ly;
332 hasCarry = (resul < carry) ? 1 : 0;
333 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
334 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
335
336 carry += (lx * hy) & 0xffffffffULL;
337 resul = (carry << 32) | (resul & 0xffffffffULL);
338 dest[i+j] += resul;
339 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopherd37eda82009-08-21 04:06:45 +0000340 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000341 ((lx * hy) >> 32) + hx * hy;
342 }
343 dest[i+xlen] = carry;
344 }
345}
346
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000347APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000348 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000349 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000350 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000351 clearUnusedBits();
352 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000353 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000354
355 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000356 unsigned lhsBits = getActiveBits();
357 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopherd37eda82009-08-21 04:06:45 +0000358 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +0000359 // 0 * X ===> 0
360 return *this;
361
362 // Get some bit facts about RHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000363 unsigned rhsBits = RHS.getActiveBits();
364 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000365 if (!rhsWords) {
366 // X * 0 ===> 0
367 clear();
368 return *this;
369 }
370
371 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000372 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000373 uint64_t *dest = getMemory(destWords);
374
375 // Perform the long multiply
376 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
377
378 // Copy result back into *this
379 clear();
Chris Lattner455e9ab2009-01-21 18:09:24 +0000380 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000381 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
382
383 // delete dest array and return
384 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000385 return *this;
386}
387
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000388APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000389 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000390 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000391 VAL &= RHS.VAL;
392 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000393 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000394 unsigned numWords = getNumWords();
395 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000396 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000397 return *this;
398}
399
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000400APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000401 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000402 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000403 VAL |= RHS.VAL;
404 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000405 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000406 unsigned numWords = getNumWords();
407 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000408 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000409 return *this;
410}
411
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000412APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000413 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000414 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000415 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000416 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000417 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000418 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000419 unsigned numWords = getNumWords();
420 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000421 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000422 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000423}
424
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000425APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000426 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000427 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000428 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000429 val[i] = pVal[i] & RHS.pVal[i];
430 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000431}
432
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000433APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000434 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000435 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000436 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000437 val[i] = pVal[i] | RHS.pVal[i];
438 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000439}
440
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000441APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000442 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000443 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000444 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000445 val[i] = pVal[i] ^ RHS.pVal[i];
446
447 // 0^0==1 so clear the high bits in case they got set.
448 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000449}
450
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000451bool APInt::operator !() const {
452 if (isSingleWord())
453 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000454
Chris Lattner455e9ab2009-01-21 18:09:24 +0000455 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000456 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000457 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000458 return true;
459}
460
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000461APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000462 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000463 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000464 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000465 APInt Result(*this);
466 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000467 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000468}
469
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000470APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000471 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000472 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000473 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000474 APInt Result(BitWidth, 0);
475 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000476 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000477}
478
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000479APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000480 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000481 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000482 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000483 APInt Result(BitWidth, 0);
484 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000485 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000486}
487
Chris Lattner455e9ab2009-01-21 18:09:24 +0000488bool APInt::operator[](unsigned bitPosition) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000489 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000490 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000491}
492
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000493bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000494 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000495 unsigned n1 = getActiveBits();
496 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000497
498 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000499 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000500 return false;
501
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000502 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000503 if (n1 <= APINT_BITS_PER_WORD)
504 return pVal[0] == RHS.pVal[0];
505
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000506 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000507 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000508 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000509 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000510 return true;
511}
512
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000513bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000514 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000515 if (n <= APINT_BITS_PER_WORD)
516 return pVal[0] == Val;
517 else
518 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000519}
520
Reid Spencere81d2da2007-02-16 22:36:51 +0000521bool APInt::ult(const APInt& RHS) const {
522 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
523 if (isSingleWord())
524 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000525
526 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000527 unsigned n1 = getActiveBits();
528 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000529
530 // If magnitude of LHS is less than RHS, return true.
531 if (n1 < n2)
532 return true;
533
534 // If magnitude of RHS is greather than LHS, return false.
535 if (n2 < n1)
536 return false;
537
538 // If they bot fit in a word, just compare the low order word
539 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
540 return pVal[0] < RHS.pVal[0];
541
542 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000543 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000544 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000545 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000546 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000547 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000548 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000549 }
550 return false;
551}
552
Reid Spencere81d2da2007-02-16 22:36:51 +0000553bool APInt::slt(const APInt& RHS) const {
554 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000555 if (isSingleWord()) {
556 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
557 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
558 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000559 }
Reid Spencera58f0582007-02-18 20:09:41 +0000560
561 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000562 APInt rhs(RHS);
563 bool lhsNeg = isNegative();
564 bool rhsNeg = rhs.isNegative();
565 if (lhsNeg) {
566 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000567 lhs.flip();
568 lhs++;
569 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000570 if (rhsNeg) {
571 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000572 rhs.flip();
573 rhs++;
574 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000575
576 // Now we have unsigned values to compare so do the comparison if necessary
577 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000578 if (lhsNeg)
579 if (rhsNeg)
580 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000581 else
582 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000583 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000584 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000585 else
Reid Spencera58f0582007-02-18 20:09:41 +0000586 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000587}
588
Chris Lattner455e9ab2009-01-21 18:09:24 +0000589APInt& APInt::set(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000590 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000591 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000592 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000593 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000594 return *this;
595}
596
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000597/// Set the given bit to 0 whose position is given as "bitPosition".
598/// @brief Set a given bit to 0.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000599APInt& APInt::clear(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000600 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000601 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000602 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000603 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000604 return *this;
605}
606
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000607/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000608
Eric Christopherd37eda82009-08-21 04:06:45 +0000609/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000610/// as "bitPosition".
611/// @brief Toggles a given bit to its opposite value.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000612APInt& APInt::flip(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000613 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000614 if ((*this)[bitPosition]) clear(bitPosition);
615 else set(bitPosition);
616 return *this;
617}
618
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000619unsigned APInt::getBitsNeeded(const StringRef& str, uint8_t radix) {
620 assert(!str.empty() && "Invalid string length");
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000621 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
622 "Radix should be 2, 8, 10, or 16!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000623
624 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000625
626 // Each computation below needs to know if its negative
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000627 StringRef::iterator p = str.begin();
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000628 unsigned isNegative = str.front() == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000629 if (*p == '-' || *p == '+') {
630 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000631 slen--;
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000632 assert(slen && "string is only a minus!");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000633 }
634 // For radixes of power-of-two values, the bits required is accurately and
635 // easily computed
636 if (radix == 2)
637 return slen + isNegative;
638 if (radix == 8)
639 return slen * 3 + isNegative;
640 if (radix == 16)
641 return slen * 4 + isNegative;
642
Reid Spencer57ae4f52007-04-13 19:19:07 +0000643 // This is grossly inefficient but accurate. We could probably do something
644 // with a computation of roughly slen*64/20 and then adjust by the value of
645 // the first few digits. But, I'm not sure how accurate that could be.
646
647 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000648 // be too large. This avoids the assertion in the constructor. This
649 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
650 // bits in that case.
651 unsigned sufficient = slen == 1 ? 4 : slen * 64/18;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000652
653 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000654 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000655
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000656 // Compute how many bits are required. If the log is infinite, assume we need
657 // just bit.
658 unsigned log = tmp.logBase2();
659 if (log == (unsigned)-1) {
660 return isNegative + 1;
661 } else {
662 return isNegative + log + 1;
663 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000664}
665
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000666// From http://www.burtleburtle.net, byBob Jenkins.
667// When targeting x86, both GCC and LLVM seem to recognize this as a
668// rotate instruction.
669#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencer794f4722007-02-26 21:02:27 +0000670
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000671// From http://www.burtleburtle.net, by Bob Jenkins.
672#define mix(a,b,c) \
673 { \
674 a -= c; a ^= rot(c, 4); c += b; \
675 b -= a; b ^= rot(a, 6); a += c; \
676 c -= b; c ^= rot(b, 8); b += a; \
677 a -= c; a ^= rot(c,16); c += b; \
678 b -= a; b ^= rot(a,19); a += c; \
679 c -= b; c ^= rot(b, 4); b += a; \
680 }
681
682// From http://www.burtleburtle.net, by Bob Jenkins.
683#define final(a,b,c) \
684 { \
685 c ^= b; c -= rot(b,14); \
686 a ^= c; a -= rot(c,11); \
687 b ^= a; b -= rot(a,25); \
688 c ^= b; c -= rot(b,16); \
689 a ^= c; a -= rot(c,4); \
690 b ^= a; b -= rot(a,14); \
691 c ^= b; c -= rot(b,24); \
692 }
693
694// hashword() was adapted from http://www.burtleburtle.net, by Bob
695// Jenkins. k is a pointer to an array of uint32_t values; length is
696// the length of the key, in 32-bit chunks. This version only handles
697// keys that are a multiple of 32 bits in size.
698static inline uint32_t hashword(const uint64_t *k64, size_t length)
699{
700 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
701 uint32_t a,b,c;
702
703 /* Set up the internal state */
704 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
705
706 /*------------------------------------------------- handle most of the key */
707 while (length > 3)
708 {
709 a += k[0];
710 b += k[1];
711 c += k[2];
712 mix(a,b,c);
713 length -= 3;
714 k += 3;
715 }
716
717 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-05-13 23:23:20 +0000718 switch (length) { /* all the case statements fall through */
719 case 3 : c+=k[2];
720 case 2 : b+=k[1];
721 case 1 : a+=k[0];
722 final(a,b,c);
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000723 case 0: /* case 0: nothing left to add */
724 break;
725 }
726 /*------------------------------------------------------ report the result */
727 return c;
728}
729
730// hashword8() was adapted from http://www.burtleburtle.net, by Bob
731// Jenkins. This computes a 32-bit hash from one 64-bit word. When
732// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
733// function into about 35 instructions when inlined.
734static inline uint32_t hashword8(const uint64_t k64)
735{
736 uint32_t a,b,c;
737 a = b = c = 0xdeadbeef + 4;
738 b += k64 >> 32;
739 a += k64 & 0xffffffff;
740 final(a,b,c);
741 return c;
742}
743#undef final
744#undef mix
745#undef rot
746
747uint64_t APInt::getHashValue() const {
748 uint64_t hash;
Reid Spencer794f4722007-02-26 21:02:27 +0000749 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000750 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000751 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000752 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000753 return hash;
754}
755
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000756/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000757APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000758 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000759}
760
761/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000762APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000763 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000764 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000765}
766
Reid Spencere81d2da2007-02-16 22:36:51 +0000767bool APInt::isPowerOf2() const {
768 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
769}
770
Chris Lattner455e9ab2009-01-21 18:09:24 +0000771unsigned APInt::countLeadingZerosSlowCase() const {
772 unsigned Count = 0;
773 for (unsigned i = getNumWords(); i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000774 if (pVal[i-1] == 0)
775 Count += APINT_BITS_PER_WORD;
776 else {
777 Count += CountLeadingZeros_64(pVal[i-1]);
778 break;
Reid Spencere549c492007-02-21 00:29:48 +0000779 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000780 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000781 unsigned remainder = BitWidth % APINT_BITS_PER_WORD;
Reid Spencerab2b2c82007-02-22 00:22:00 +0000782 if (remainder)
783 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner9e513ac2007-11-23 22:42:31 +0000784 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000785}
786
Chris Lattner455e9ab2009-01-21 18:09:24 +0000787static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
788 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000789 if (skip)
790 V <<= skip;
791 while (V && (V & (1ULL << 63))) {
792 Count++;
793 V <<= 1;
794 }
795 return Count;
796}
797
Chris Lattner455e9ab2009-01-21 18:09:24 +0000798unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000799 if (isSingleWord())
800 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
801
Chris Lattner455e9ab2009-01-21 18:09:24 +0000802 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000803 unsigned shift;
804 if (!highWordBits) {
805 highWordBits = APINT_BITS_PER_WORD;
806 shift = 0;
807 } else {
808 shift = APINT_BITS_PER_WORD - highWordBits;
809 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000810 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000811 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000812 if (Count == highWordBits) {
813 for (i--; i >= 0; --i) {
814 if (pVal[i] == -1ULL)
815 Count += APINT_BITS_PER_WORD;
816 else {
817 Count += countLeadingOnes_64(pVal[i], 0);
818 break;
819 }
820 }
821 }
822 return Count;
823}
824
Chris Lattner455e9ab2009-01-21 18:09:24 +0000825unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000826 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000827 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
828 unsigned Count = 0;
829 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000830 for (; i < getNumWords() && pVal[i] == 0; ++i)
831 Count += APINT_BITS_PER_WORD;
832 if (i < getNumWords())
833 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000834 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000835}
836
Chris Lattner455e9ab2009-01-21 18:09:24 +0000837unsigned APInt::countTrailingOnesSlowCase() const {
838 unsigned Count = 0;
839 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000840 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000841 Count += APINT_BITS_PER_WORD;
842 if (i < getNumWords())
843 Count += CountTrailingOnes_64(pVal[i]);
844 return std::min(Count, BitWidth);
845}
846
Chris Lattner455e9ab2009-01-21 18:09:24 +0000847unsigned APInt::countPopulationSlowCase() const {
848 unsigned Count = 0;
849 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000850 Count += CountPopulation_64(pVal[i]);
851 return Count;
852}
853
Reid Spencere81d2da2007-02-16 22:36:51 +0000854APInt APInt::byteSwap() const {
855 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
856 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000857 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000858 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000859 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000860 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000861 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000862 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000863 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000864 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000865 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000866 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000867 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000868 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000869 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000870 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000871 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000872 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000873 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
874 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000875 }
876 return Result;
877 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000878}
879
Eric Christopherd37eda82009-08-21 04:06:45 +0000880APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000881 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000882 APInt A = API1, B = API2;
883 while (!!B) {
884 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000885 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000886 A = T;
887 }
888 return A;
889}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000890
Chris Lattner455e9ab2009-01-21 18:09:24 +0000891APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000892 union {
893 double D;
894 uint64_t I;
895 } T;
896 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000897
898 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000899 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000900
901 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000902 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000903
904 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000905 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000906 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000907
908 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
909 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
910
911 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000912 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000913 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000914 APInt(width, mantissa >> (52 - exp));
915
916 // If the client didn't provide enough bits for us to shift the mantissa into
917 // then the result is undefined, just return 0
918 if (width <= exp - 52)
919 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000920
921 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000922 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000923 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000924 return isNeg ? -Tmp : Tmp;
925}
926
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000927/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000928/// The layout for double is as following (IEEE Standard 754):
929/// --------------------------------------
930/// | Sign Exponent Fraction Bias |
931/// |-------------------------------------- |
932/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000933/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000934double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000935
936 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000937 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000938 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
939 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000940 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000941 return double(sext);
942 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000943 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000944 }
945
Reid Spencer9c0696f2007-02-20 08:51:03 +0000946 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000947 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000948
949 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000950 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000951
952 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000953 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000954
Reid Spencer9c0696f2007-02-20 08:51:03 +0000955 // The exponent (without bias normalization) is just the number of bits
956 // we are using. Note that the sign bit is gone since we constructed the
957 // absolute value.
958 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000959
Reid Spencer9c0696f2007-02-20 08:51:03 +0000960 // Return infinity for exponent overflow
961 if (exp > 1023) {
962 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000963 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000964 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000965 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000966 }
967 exp += 1023; // Increment for 1023 bias
968
969 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
970 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000971 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000972 unsigned hiWord = whichWord(n-1);
973 if (hiWord == 0) {
974 mantissa = Tmp.pVal[0];
975 if (n > 52)
976 mantissa >>= n - 52; // shift down, we want the top 52 bits.
977 } else {
978 assert(hiWord > 0 && "huh?");
979 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
980 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
981 mantissa = hibits | lobits;
982 }
983
Zhou Shengd93f00c2007-02-12 20:02:55 +0000984 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000985 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000986 union {
987 double D;
988 uint64_t I;
989 } T;
990 T.I = sign | (exp << 52) | mantissa;
991 return T.D;
992}
993
Reid Spencere81d2da2007-02-16 22:36:51 +0000994// Truncate to new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000995APInt &APInt::trunc(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000996 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000997 assert(width && "Can't truncate to 0 bits");
Chris Lattner455e9ab2009-01-21 18:09:24 +0000998 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +0000999 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001000 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001001 if (wordsBefore != wordsAfter) {
1002 if (wordsAfter == 1) {
1003 uint64_t *tmp = pVal;
1004 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +00001005 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +00001006 } else {
1007 uint64_t *newVal = getClearedMemory(wordsAfter);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001008 for (unsigned i = 0; i < wordsAfter; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001009 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +00001010 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001011 pVal = newVal;
1012 }
1013 }
Reid Spencer94900772007-02-28 17:34:32 +00001014 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001015}
1016
1017// Sign extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001018APInt &APInt::sext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001019 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9eec2412007-02-25 23:44:53 +00001020 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001021 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +00001022 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +00001023 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +00001024 }
1025
1026 // The sign bit is set. First, get some facts
Chris Lattner455e9ab2009-01-21 18:09:24 +00001027 unsigned wordsBefore = getNumWords();
1028 unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001029 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001030 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001031
1032 // Mask the high order word appropriately
1033 if (wordsBefore == wordsAfter) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001034 unsigned newWordBits = width % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001035 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +00001036 uint64_t mask = ~0ULL;
1037 if (newWordBits)
1038 mask >>= APINT_BITS_PER_WORD - newWordBits;
1039 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001040 if (wordsBefore == 1)
1041 VAL |= mask;
1042 else
1043 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001044 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001045 }
1046
Reid Spencerf30b1882007-02-25 23:54:00 +00001047 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001048 uint64_t *newVal = getMemory(wordsAfter);
1049 if (wordsBefore == 1)
1050 newVal[0] = VAL | mask;
1051 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001052 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001053 newVal[i] = pVal[i];
1054 newVal[wordsBefore-1] |= mask;
1055 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001056 for (unsigned i = wordsBefore; i < wordsAfter; i++)
Reid Spencer9eec2412007-02-25 23:44:53 +00001057 newVal[i] = -1ULL;
1058 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001059 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001060 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001061 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001062}
1063
1064// Zero extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001065APInt &APInt::zext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001066 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001067 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001068 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001069 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001070 if (wordsBefore != wordsAfter) {
1071 uint64_t *newVal = getClearedMemory(wordsAfter);
1072 if (wordsBefore == 1)
1073 newVal[0] = VAL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001074 else
Chris Lattner455e9ab2009-01-21 18:09:24 +00001075 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001076 newVal[i] = pVal[i];
1077 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001078 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001079 pVal = newVal;
1080 }
Reid Spencer94900772007-02-28 17:34:32 +00001081 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001082}
1083
Chris Lattner455e9ab2009-01-21 18:09:24 +00001084APInt &APInt::zextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001085 if (BitWidth < width)
1086 return zext(width);
1087 if (BitWidth > width)
1088 return trunc(width);
1089 return *this;
1090}
1091
Chris Lattner455e9ab2009-01-21 18:09:24 +00001092APInt &APInt::sextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001093 if (BitWidth < width)
1094 return sext(width);
1095 if (BitWidth > width)
1096 return trunc(width);
1097 return *this;
1098}
1099
Zhou Shengff4304f2007-02-09 07:48:24 +00001100/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001101/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001102APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001103 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001104}
1105
1106/// Arithmetic right-shift this APInt by shiftAmt.
1107/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001108APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001109 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001110 // Handle a degenerate case
1111 if (shiftAmt == 0)
1112 return *this;
1113
1114 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001115 if (isSingleWord()) {
1116 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001117 return APInt(BitWidth, 0); // undefined
1118 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001119 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001120 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001121 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1122 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001123 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001124
Reid Spencer46f9c942007-03-02 22:39:11 +00001125 // If all the bits were shifted out, the result is, technically, undefined.
1126 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1127 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001128 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001129 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001130 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001131 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001132 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001133 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001134
1135 // Create some space for the result.
1136 uint64_t * val = new uint64_t[getNumWords()];
1137
Reid Spencer46f9c942007-03-02 22:39:11 +00001138 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001139 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1140 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1141 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1142 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001143 if (bitsInWord == 0)
1144 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001145
1146 // If we are shifting whole words, just move whole words
1147 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001148 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001149 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001150 val[i] = pVal[i+offset]; // move whole word
1151
1152 // Adjust the top significant word for sign bit fill, if negative
1153 if (isNegative())
1154 if (bitsInWord < APINT_BITS_PER_WORD)
1155 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1156 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001157 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001158 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001159 // This combines the shifted corresponding word with the low bits from
1160 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001161 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001162 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1163 }
1164
1165 // Shift the break word. In this case there are no bits from the next word
1166 // to include in this word.
1167 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1168
1169 // Deal with sign extenstion in the break word, and possibly the word before
1170 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001171 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001172 if (wordShift > bitsInWord) {
1173 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001174 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001175 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1176 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001177 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001178 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001179 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001180 }
1181
Reid Spencer46f9c942007-03-02 22:39:11 +00001182 // Remaining words are 0 or -1, just assign them.
1183 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001184 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001185 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001186 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001187}
1188
Zhou Shengff4304f2007-02-09 07:48:24 +00001189/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001190/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001191APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001192 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001193}
1194
1195/// Logical right-shift this APInt by shiftAmt.
1196/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001197APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001198 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001199 if (shiftAmt == BitWidth)
1200 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001201 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001202 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001203 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001204
Reid Spencerba81c2b2007-02-26 01:19:48 +00001205 // If all the bits were shifted out, the result is 0. This avoids issues
1206 // with shifting by the size of the integer type, which produces undefined
1207 // results. We define these "undefined results" to always be 0.
1208 if (shiftAmt == BitWidth)
1209 return APInt(BitWidth, 0);
1210
Reid Spencer02ae8b72007-05-17 06:26:29 +00001211 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001212 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001213 // undefined results in the code below. This is also an optimization.
1214 if (shiftAmt == 0)
1215 return *this;
1216
Reid Spencerba81c2b2007-02-26 01:19:48 +00001217 // Create some space for the result.
1218 uint64_t * val = new uint64_t[getNumWords()];
1219
1220 // If we are shifting less than a word, compute the shift with a simple carry
1221 if (shiftAmt < APINT_BITS_PER_WORD) {
1222 uint64_t carry = 0;
1223 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001224 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001225 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1226 }
1227 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001228 }
1229
Reid Spencerba81c2b2007-02-26 01:19:48 +00001230 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001231 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1232 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001233
1234 // If we are shifting whole words, just move whole words
1235 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001236 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001237 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001238 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001239 val[i] = 0;
1240 return APInt(val,BitWidth).clearUnusedBits();
1241 }
1242
Eric Christopherd37eda82009-08-21 04:06:45 +00001243 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001244 unsigned breakWord = getNumWords() - offset -1;
1245 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001246 val[i] = (pVal[i+offset] >> wordShift) |
1247 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001248 // Shift the break word.
1249 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1250
1251 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001252 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001253 val[i] = 0;
1254 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001255}
1256
Zhou Shengff4304f2007-02-09 07:48:24 +00001257/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001258/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001259APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001260 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001261 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001262}
1263
Chris Lattner455e9ab2009-01-21 18:09:24 +00001264APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001265 // If all the bits were shifted out, the result is 0. This avoids issues
1266 // with shifting by the size of the integer type, which produces undefined
1267 // results. We define these "undefined results" to always be 0.
1268 if (shiftAmt == BitWidth)
1269 return APInt(BitWidth, 0);
1270
Reid Spencer92c72832007-05-12 18:01:57 +00001271 // If none of the bits are shifted out, the result is *this. This avoids a
1272 // lshr by the words size in the loop below which can produce incorrect
1273 // results. It also avoids the expensive computation below for a common case.
1274 if (shiftAmt == 0)
1275 return *this;
1276
Reid Spencer87553802007-02-25 00:56:44 +00001277 // Create some space for the result.
1278 uint64_t * val = new uint64_t[getNumWords()];
1279
1280 // If we are shifting less than a word, do it the easy way
1281 if (shiftAmt < APINT_BITS_PER_WORD) {
1282 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001283 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001284 val[i] = pVal[i] << shiftAmt | carry;
1285 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1286 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001287 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001288 }
1289
Reid Spencer87553802007-02-25 00:56:44 +00001290 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001291 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1292 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001293
1294 // If we are shifting whole words, just move whole words
1295 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001296 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001297 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001298 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001299 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001300 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001301 }
Reid Spencer87553802007-02-25 00:56:44 +00001302
1303 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001304 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001305 for (; i > offset; --i)
1306 val[i] = pVal[i-offset] << wordShift |
1307 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001308 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001309 for (i = 0; i < offset; ++i)
1310 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001311 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001312}
1313
Dan Gohmancf609572008-02-29 01:40:47 +00001314APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001315 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001316}
1317
Chris Lattner455e9ab2009-01-21 18:09:24 +00001318APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001319 if (rotateAmt == 0)
1320 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001321 // Don't get too fancy, just use existing shift/or facilities
1322 APInt hi(*this);
1323 APInt lo(*this);
1324 hi.shl(rotateAmt);
1325 lo.lshr(BitWidth - rotateAmt);
1326 return hi | lo;
1327}
1328
Dan Gohmancf609572008-02-29 01:40:47 +00001329APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001330 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001331}
1332
Chris Lattner455e9ab2009-01-21 18:09:24 +00001333APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001334 if (rotateAmt == 0)
1335 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001336 // Don't get too fancy, just use existing shift/or facilities
1337 APInt hi(*this);
1338 APInt lo(*this);
1339 lo.lshr(rotateAmt);
1340 hi.shl(BitWidth - rotateAmt);
1341 return hi | lo;
1342}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001343
1344// Square Root - this method computes and returns the square root of "this".
1345// Three mechanisms are used for computation. For small values (<= 5 bits),
1346// a table lookup is done. This gets some performance for common cases. For
1347// values using less than 52 bits, the value is converted to double and then
1348// the libc sqrt function is called. The result is rounded and then converted
1349// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001350// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001351APInt APInt::sqrt() const {
1352
1353 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001354 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001355
1356 // Use a fast table for some small values. This also gets rid of some
1357 // rounding errors in libc sqrt for small values.
1358 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001359 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001360 /* 0 */ 0,
1361 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001362 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001363 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1364 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1365 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1366 /* 31 */ 6
1367 };
1368 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001369 }
1370
1371 // If the magnitude of the value fits in less than 52 bits (the precision of
1372 // an IEEE double precision floating point value), then we can use the
1373 // libc sqrt function which will probably use a hardware sqrt computation.
1374 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001375 if (magnitude < 52) {
1376#ifdef _MSC_VER
1377 // Amazingly, VC++ doesn't have round().
Eric Christopherd37eda82009-08-21 04:06:45 +00001378 return APInt(BitWidth,
Jeff Cohenca5183d2007-03-05 00:00:42 +00001379 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1380#else
Eric Christopherd37eda82009-08-21 04:06:45 +00001381 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001382 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001383#endif
1384 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001385
1386 // Okay, all the short cuts are exhausted. We must compute it. The following
1387 // is a classical Babylonian method for computing the square root. This code
1388 // was adapted to APINt from a wikipedia article on such computations.
1389 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001390 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001391 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001392 APInt testy(BitWidth, 16);
1393 APInt x_old(BitWidth, 1);
1394 APInt x_new(BitWidth, 0);
1395 APInt two(BitWidth, 2);
1396
1397 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001398 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001399 if (i >= nbits || this->ule(testy)) {
1400 x_old = x_old.shl(i / 2);
1401 break;
1402 }
1403
Eric Christopherd37eda82009-08-21 04:06:45 +00001404 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001405 for (;;) {
1406 x_new = (this->udiv(x_old) + x_old).udiv(two);
1407 if (x_old.ule(x_new))
1408 break;
1409 x_old = x_new;
1410 }
1411
1412 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001413 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001414 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001415 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001416 // floating point representation after 192 bits. There are no discrepancies
1417 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001418 APInt square(x_old * x_old);
1419 APInt nextSquare((x_old + 1) * (x_old +1));
1420 if (this->ult(square))
1421 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001422 else if (this->ule(nextSquare)) {
1423 APInt midpoint((nextSquare - square).udiv(two));
1424 APInt offset(*this - square);
1425 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001426 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001427 else
1428 return x_old + 1;
1429 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001430 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001431 return x_old + 1;
1432}
1433
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001434/// Computes the multiplicative inverse of this APInt for a given modulo. The
1435/// iterative extended Euclidean algorithm is used to solve for this value,
1436/// however we simplify it to speed up calculating only the inverse, and take
1437/// advantage of div+rem calculations. We also use some tricks to avoid copying
1438/// (potentially large) APInts around.
1439APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1440 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1441
1442 // Using the properties listed at the following web page (accessed 06/21/08):
1443 // http://www.numbertheory.org/php/euclid.html
1444 // (especially the properties numbered 3, 4 and 9) it can be proved that
1445 // BitWidth bits suffice for all the computations in the algorithm implemented
1446 // below. More precisely, this number of bits suffice if the multiplicative
1447 // inverse exists, but may not suffice for the general extended Euclidean
1448 // algorithm.
1449
1450 APInt r[2] = { modulo, *this };
1451 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1452 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001453
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001454 unsigned i;
1455 for (i = 0; r[i^1] != 0; i ^= 1) {
1456 // An overview of the math without the confusing bit-flipping:
1457 // q = r[i-2] / r[i-1]
1458 // r[i] = r[i-2] % r[i-1]
1459 // t[i] = t[i-2] - t[i-1] * q
1460 udivrem(r[i], r[i^1], q, r[i]);
1461 t[i] -= t[i^1] * q;
1462 }
1463
1464 // If this APInt and the modulo are not coprime, there is no multiplicative
1465 // inverse, so return 0. We check this by looking at the next-to-last
1466 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1467 // algorithm.
1468 if (r[i] != 1)
1469 return APInt(BitWidth, 0);
1470
1471 // The next-to-last t is the multiplicative inverse. However, we are
1472 // interested in a positive inverse. Calcuate a positive one from a negative
1473 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001474 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001475 return t[i].isNegative() ? t[i] + modulo : t[i];
1476}
1477
Jay Foad4e5ea552009-04-30 10:15:35 +00001478/// Calculate the magic numbers required to implement a signed integer division
1479/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1480/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1481/// Warren, Jr., chapter 10.
1482APInt::ms APInt::magic() const {
1483 const APInt& d = *this;
1484 unsigned p;
1485 APInt ad, anc, delta, q1, r1, q2, r2, t;
1486 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1487 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1488 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1489 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001490
Jay Foad4e5ea552009-04-30 10:15:35 +00001491 ad = d.abs();
1492 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1493 anc = t - 1 - t.urem(ad); // absolute value of nc
1494 p = d.getBitWidth() - 1; // initialize p
1495 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1496 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1497 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1498 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1499 do {
1500 p = p + 1;
1501 q1 = q1<<1; // update q1 = 2p/abs(nc)
1502 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1503 if (r1.uge(anc)) { // must be unsigned comparison
1504 q1 = q1 + 1;
1505 r1 = r1 - anc;
1506 }
1507 q2 = q2<<1; // update q2 = 2p/abs(d)
1508 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1509 if (r2.uge(ad)) { // must be unsigned comparison
1510 q2 = q2 + 1;
1511 r2 = r2 - ad;
1512 }
1513 delta = ad - r2;
1514 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001515
Jay Foad4e5ea552009-04-30 10:15:35 +00001516 mag.m = q2 + 1;
1517 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1518 mag.s = p - d.getBitWidth(); // resulting shift
1519 return mag;
1520}
1521
1522/// Calculate the magic numbers required to implement an unsigned integer
1523/// division by a constant as a sequence of multiplies, adds and shifts.
1524/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1525/// S. Warren, Jr., chapter 10.
1526APInt::mu APInt::magicu() const {
1527 const APInt& d = *this;
1528 unsigned p;
1529 APInt nc, delta, q1, r1, q2, r2;
1530 struct mu magu;
1531 magu.a = 0; // initialize "add" indicator
1532 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1533 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1534 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1535
1536 nc = allOnes - (-d).urem(d);
1537 p = d.getBitWidth() - 1; // initialize p
1538 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1539 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1540 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1541 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1542 do {
1543 p = p + 1;
1544 if (r1.uge(nc - r1)) {
1545 q1 = q1 + q1 + 1; // update q1
1546 r1 = r1 + r1 - nc; // update r1
1547 }
1548 else {
1549 q1 = q1+q1; // update q1
1550 r1 = r1+r1; // update r1
1551 }
1552 if ((r2 + 1).uge(d - r2)) {
1553 if (q2.uge(signedMax)) magu.a = 1;
1554 q2 = q2+q2 + 1; // update q2
1555 r2 = r2+r2 + 1 - d; // update r2
1556 }
1557 else {
1558 if (q2.uge(signedMin)) magu.a = 1;
1559 q2 = q2+q2; // update q2
1560 r2 = r2+r2 + 1; // update r2
1561 }
1562 delta = d - 1 - r2;
1563 } while (p < d.getBitWidth()*2 &&
1564 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1565 magu.m = q2 + 1; // resulting magic number
1566 magu.s = p - d.getBitWidth(); // resulting shift
1567 return magu;
1568}
1569
Reid Spencer9c0696f2007-02-20 08:51:03 +00001570/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1571/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1572/// variables here have the same names as in the algorithm. Comments explain
1573/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001574static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1575 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001576 assert(u && "Must provide dividend");
1577 assert(v && "Must provide divisor");
1578 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001579 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001580 assert(n>1 && "n must be > 1");
1581
1582 // Knuth uses the value b as the base of the number system. In our case b
1583 // is 2^31 so we just set it to -1u.
1584 uint64_t b = uint64_t(1) << 32;
1585
Chris Lattnerfad86b02008-08-17 07:19:36 +00001586#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001587 DEBUG(errs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1588 DEBUG(errs() << "KnuthDiv: original:");
1589 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1590 DEBUG(errs() << " by");
1591 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1592 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001593#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001594 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1595 // u and v by d. Note that we have taken Knuth's advice here to use a power
1596 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1597 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001598 // shift amount from the leading zeros. We are basically normalizing the u
1599 // and v so that its high bits are shifted to the top of v's range without
1600 // overflow. Note that this can require an extra word in u so that u must
1601 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001602 unsigned shift = CountLeadingZeros_32(v[n-1]);
1603 unsigned v_carry = 0;
1604 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001605 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001606 for (unsigned i = 0; i < m+n; ++i) {
1607 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001608 u[i] = (u[i] << shift) | u_carry;
1609 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001610 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001611 for (unsigned i = 0; i < n; ++i) {
1612 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001613 v[i] = (v[i] << shift) | v_carry;
1614 v_carry = v_tmp;
1615 }
1616 }
1617 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001618#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001619 DEBUG(errs() << "KnuthDiv: normal:");
1620 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1621 DEBUG(errs() << " by");
1622 DEBUG(for (int i = n; i >0; i--) errs() << " " << v[i-1]);
1623 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001624#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001625
1626 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1627 int j = m;
1628 do {
Daniel Dunbara53902b2009-07-13 05:27:30 +00001629 DEBUG(errs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001630 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001631 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1632 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1633 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1634 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1635 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001636 // value qp is one too large, and it eliminates all cases where qp is two
1637 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001638 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Daniel Dunbara53902b2009-07-13 05:27:30 +00001639 DEBUG(errs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001640 uint64_t qp = dividend / v[n-1];
1641 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001642 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1643 qp--;
1644 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001645 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001646 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001647 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001648 DEBUG(errs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001649
Reid Spencer92904632007-02-23 01:57:13 +00001650 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1651 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1652 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001653 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001654 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001655 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001656 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001657 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001658 bool borrow = subtrahend > u_tmp;
Eric Christopherd37eda82009-08-21 04:06:45 +00001659 DEBUG(errs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001660 << ", subtrahend == " << subtrahend
1661 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001662
Reid Spencer610fad82007-02-24 10:01:42 +00001663 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001664 unsigned k = j + i;
1665 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1666 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001667 while (borrow && k <= m+n) { // deal with borrow to the left
1668 borrow = u[k] == 0;
1669 u[k]--;
1670 k++;
1671 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001672 isNeg |= borrow;
Eric Christopherd37eda82009-08-21 04:06:45 +00001673 DEBUG(errs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
1674 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001675 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001676 DEBUG(errs() << "KnuthDiv: after subtraction:");
1677 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1678 DEBUG(errs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001679 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1680 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001681 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001682 // the true value, and a "borrow" to the left should be remembered.
1683 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001684 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001685 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001686 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001687 u[i] = ~u[i] + carry; // b's complement
1688 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001689 }
Reid Spencer92904632007-02-23 01:57:13 +00001690 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001691 DEBUG(errs() << "KnuthDiv: after complement:");
1692 DEBUG(for (int i = m+n; i >=0; i--) errs() << " " << u[i]);
1693 DEBUG(errs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001694
Eric Christopherd37eda82009-08-21 04:06:45 +00001695 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001696 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001697 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001698 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001699 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001700 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001701 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001702 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001703 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1704 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001705 // since it cancels with the borrow that occurred in D4.
1706 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001707 for (unsigned i = 0; i < n; i++) {
1708 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001709 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001710 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001711 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001712 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001713 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001714 DEBUG(errs() << "KnuthDiv: after correction:");
1715 DEBUG(for (int i = m+n; i >=0; i--) errs() <<" " << u[i]);
1716 DEBUG(errs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001717
Reid Spencer92904632007-02-23 01:57:13 +00001718 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1719 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001720
Daniel Dunbara53902b2009-07-13 05:27:30 +00001721 DEBUG(errs() << "KnuthDiv: quotient:");
1722 DEBUG(for (int i = m; i >=0; i--) errs() <<" " << q[i]);
1723 DEBUG(errs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001724
Reid Spencer9c0696f2007-02-20 08:51:03 +00001725 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1726 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1727 // compute the remainder (urem uses this).
1728 if (r) {
1729 // The value d is expressed by the "shift" value above since we avoided
1730 // multiplication by d by using a shift left. So, all we have to do is
1731 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001732 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001733 unsigned carry = 0;
Daniel Dunbara53902b2009-07-13 05:27:30 +00001734 DEBUG(errs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001735 for (int i = n-1; i >= 0; i--) {
1736 r[i] = (u[i] >> shift) | carry;
1737 carry = u[i] << (32 - shift);
Daniel Dunbara53902b2009-07-13 05:27:30 +00001738 DEBUG(errs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001739 }
1740 } else {
1741 for (int i = n-1; i >= 0; i--) {
1742 r[i] = u[i];
Daniel Dunbara53902b2009-07-13 05:27:30 +00001743 DEBUG(errs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001744 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001745 }
Daniel Dunbara53902b2009-07-13 05:27:30 +00001746 DEBUG(errs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001747 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001748#if 0
Daniel Dunbara53902b2009-07-13 05:27:30 +00001749 DEBUG(errs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001750#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001751}
1752
Chris Lattner455e9ab2009-01-21 18:09:24 +00001753void APInt::divide(const APInt LHS, unsigned lhsWords,
1754 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001755 APInt *Quotient, APInt *Remainder)
1756{
1757 assert(lhsWords >= rhsWords && "Fractional result");
1758
Eric Christopherd37eda82009-08-21 04:06:45 +00001759 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001760 // 64-bit words. This is a necessity of both the "short division" algorithm
Eric Christopherd37eda82009-08-21 04:06:45 +00001761 // and the the Knuth "classical algorithm" which requires there to be native
1762 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1763 // can't use 64-bit operands here because we don't have native results of
1764 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001765 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001766 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001767 unsigned n = rhsWords * 2;
1768 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001769
1770 // Allocate space for the temporary values we need either on the stack, if
1771 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001772 unsigned SPACE[128];
1773 unsigned *U = 0;
1774 unsigned *V = 0;
1775 unsigned *Q = 0;
1776 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001777 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1778 U = &SPACE[0];
1779 V = &SPACE[m+n+1];
1780 Q = &SPACE[(m+n+1) + n];
1781 if (Remainder)
1782 R = &SPACE[(m+n+1) + n + (m+n)];
1783 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001784 U = new unsigned[m + n + 1];
1785 V = new unsigned[n];
1786 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001787 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001788 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001789 }
1790
1791 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001792 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001793 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001794 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001795 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001796 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001797 }
1798 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1799
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001800 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001801 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001802 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001803 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001804 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001805 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 }
1807
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001808 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001809 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001810 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001811 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001812
Eric Christopherd37eda82009-08-21 04:06:45 +00001813 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001814 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001815 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001816 // contain any zero words or the Knuth algorithm fails.
1817 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1818 n--;
1819 m++;
1820 }
1821 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1822 m--;
1823
1824 // If we're left with only a single word for the divisor, Knuth doesn't work
1825 // so we implement the short division algorithm here. This is much simpler
1826 // and faster because we are certain that we can divide a 64-bit quantity
1827 // by a 32-bit quantity at hardware speed and short division is simply a
1828 // series of such operations. This is just like doing short division but we
1829 // are using base 2^32 instead of base 10.
1830 assert(n != 0 && "Divide by zero?");
1831 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001832 unsigned divisor = V[0];
1833 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001834 for (int i = m+n-1; i >= 0; i--) {
1835 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1836 if (partial_dividend == 0) {
1837 Q[i] = 0;
1838 remainder = 0;
1839 } else if (partial_dividend < divisor) {
1840 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001841 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001842 } else if (partial_dividend == divisor) {
1843 Q[i] = 1;
1844 remainder = 0;
1845 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001846 Q[i] = (unsigned)(partial_dividend / divisor);
1847 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001848 }
1849 }
1850 if (R)
1851 R[0] = remainder;
1852 } else {
1853 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1854 // case n > 1.
1855 KnuthDiv(U, V, Q, R, m, n);
1856 }
1857
1858 // If the caller wants the quotient
1859 if (Quotient) {
1860 // Set up the Quotient value's memory.
1861 if (Quotient->BitWidth != LHS.BitWidth) {
1862 if (Quotient->isSingleWord())
1863 Quotient->VAL = 0;
1864 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001865 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001866 Quotient->BitWidth = LHS.BitWidth;
1867 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001868 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001869 } else
1870 Quotient->clear();
1871
Eric Christopherd37eda82009-08-21 04:06:45 +00001872 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001873 // order words.
1874 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001875 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001876 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1877 if (Quotient->isSingleWord())
1878 Quotient->VAL = tmp;
1879 else
1880 Quotient->pVal[0] = tmp;
1881 } else {
1882 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1883 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001884 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001885 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1886 }
1887 }
1888
1889 // If the caller wants the remainder
1890 if (Remainder) {
1891 // Set up the Remainder value's memory.
1892 if (Remainder->BitWidth != RHS.BitWidth) {
1893 if (Remainder->isSingleWord())
1894 Remainder->VAL = 0;
1895 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001896 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001897 Remainder->BitWidth = RHS.BitWidth;
1898 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001899 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001900 } else
1901 Remainder->clear();
1902
1903 // The remainder is in R. Reconstitute the remainder into Remainder's low
1904 // order words.
1905 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001906 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001907 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1908 if (Remainder->isSingleWord())
1909 Remainder->VAL = tmp;
1910 else
1911 Remainder->pVal[0] = tmp;
1912 } else {
1913 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1914 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001915 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001916 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1917 }
1918 }
1919
1920 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001921 if (U != &SPACE[0]) {
1922 delete [] U;
1923 delete [] V;
1924 delete [] Q;
1925 delete [] R;
1926 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001927}
1928
Reid Spencere81d2da2007-02-16 22:36:51 +00001929APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001930 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001931
1932 // First, deal with the easy case
1933 if (isSingleWord()) {
1934 assert(RHS.VAL != 0 && "Divide by zero?");
1935 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001936 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001937
Reid Spencer71bd08f2007-02-17 02:07:07 +00001938 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001939 unsigned rhsBits = RHS.getActiveBits();
1940 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001941 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001942 unsigned lhsBits = this->getActiveBits();
1943 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001944
1945 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001946 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001947 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001948 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001949 else if (lhsWords < rhsWords || this->ult(RHS)) {
1950 // X / Y ===> 0, iff X < Y
1951 return APInt(BitWidth, 0);
1952 } else if (*this == RHS) {
1953 // X / X ===> 1
1954 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001955 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001956 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001957 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001958 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001959
1960 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1961 APInt Quotient(1,0); // to hold result.
1962 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1963 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001964}
1965
Reid Spencere81d2da2007-02-16 22:36:51 +00001966APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001967 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001968 if (isSingleWord()) {
1969 assert(RHS.VAL != 0 && "Remainder by zero?");
1970 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001971 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001972
Reid Spencere0cdd332007-02-21 08:21:52 +00001973 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001974 unsigned lhsBits = getActiveBits();
1975 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001976
1977 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001978 unsigned rhsBits = RHS.getActiveBits();
1979 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001980 assert(rhsWords && "Performing remainder operation by zero ???");
1981
Reid Spencer71bd08f2007-02-17 02:07:07 +00001982 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001983 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001984 // 0 % Y ===> 0
1985 return APInt(BitWidth, 0);
1986 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1987 // X % Y ===> X, iff X < Y
1988 return *this;
1989 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001990 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001991 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001992 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001993 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001994 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001995 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001996
Reid Spencer19dc32a2007-05-13 23:44:59 +00001997 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001998 APInt Remainder(1,0);
1999 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2000 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002001}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002002
Eric Christopherd37eda82009-08-21 04:06:45 +00002003void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002004 APInt &Quotient, APInt &Remainder) {
2005 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002006 unsigned lhsBits = LHS.getActiveBits();
2007 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2008 unsigned rhsBits = RHS.getActiveBits();
2009 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002010
2011 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002012 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002013 Quotient = 0; // 0 / Y ===> 0
2014 Remainder = 0; // 0 % Y ===> 0
2015 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002016 }
2017
2018 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002019 Quotient = 0; // X / Y ===> 0, iff X < Y
2020 Remainder = LHS; // X % Y ===> X, iff X < Y
2021 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002022 }
2023
Reid Spencer19dc32a2007-05-13 23:44:59 +00002024 if (LHS == RHS) {
2025 Quotient = 1; // X / X ===> 1
2026 Remainder = 0; // X % X ===> 0;
2027 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002028 }
2029
Reid Spencer19dc32a2007-05-13 23:44:59 +00002030 if (lhsWords == 1 && rhsWords == 1) {
2031 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002032 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2033 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2034 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2035 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002036 return;
2037 }
2038
2039 // Okay, lets do it the long way
2040 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2041}
2042
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002043void APInt::fromString(unsigned numbits, const StringRef& str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002044 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002045 assert(!str.empty() && "Invalid string length");
Reid Spencer5e0a8512007-02-17 03:16:00 +00002046 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2047 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002048
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002049 StringRef::iterator p = str.begin();
2050 size_t slen = str.size();
2051 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002052 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002053 p++;
2054 slen--;
2055 assert(slen && "string is only a minus!");
2056 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002057 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002058 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2059 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Eric Christopherd37eda82009-08-21 04:06:45 +00002060 assert((((slen-1)*64)/22 <= numbits || radix != 10)
2061 && "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002062
2063 // Allocate memory
2064 if (!isSingleWord())
2065 pVal = getClearedMemory(getNumWords());
2066
2067 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002068 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002069
2070 // Set up an APInt for the digit to add outside the loop so we don't
2071 // constantly construct/destruct it.
2072 APInt apdigit(getBitWidth(), 0);
2073 APInt apradix(getBitWidth(), radix);
2074
2075 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002076 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002077 unsigned digit = getDigit(*p, radix);
Reid Spencer385f7542007-02-21 03:55:44 +00002078
Reid Spencer6551dcd2007-05-16 19:18:22 +00002079 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002080 if (slen > 1) {
2081 if (shift)
2082 *this <<= shift;
2083 else
2084 *this *= apradix;
2085 }
Reid Spencer385f7542007-02-21 03:55:44 +00002086
2087 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002088 if (apdigit.isSingleWord())
2089 apdigit.VAL = digit;
2090 else
2091 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002092 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002093 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002094 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002095 if (isNeg) {
2096 (*this)--;
Reid Spencer9eec2412007-02-25 23:44:53 +00002097 this->flip();
Reid Spencer9eec2412007-02-25 23:44:53 +00002098 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002099}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002100
Chris Lattnerfad86b02008-08-17 07:19:36 +00002101void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2102 bool Signed) const {
2103 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002104 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002105
Chris Lattnerfad86b02008-08-17 07:19:36 +00002106 // First, check for a zero value and just short circuit the logic below.
2107 if (*this == 0) {
2108 Str.push_back('0');
2109 return;
2110 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002111
Chris Lattnerfad86b02008-08-17 07:19:36 +00002112 static const char Digits[] = "0123456789ABCDEF";
Eric Christopherd37eda82009-08-21 04:06:45 +00002113
Reid Spencer9c0696f2007-02-20 08:51:03 +00002114 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002115 char Buffer[65];
2116 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002117
Chris Lattnerfad86b02008-08-17 07:19:36 +00002118 uint64_t N;
2119 if (Signed) {
2120 int64_t I = getSExtValue();
2121 if (I < 0) {
2122 Str.push_back('-');
2123 I = -I;
2124 }
2125 N = I;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002126 } else {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002127 N = getZExtValue();
Reid Spencer9c0696f2007-02-20 08:51:03 +00002128 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002129
Chris Lattnerfad86b02008-08-17 07:19:36 +00002130 while (N) {
2131 *--BufPtr = Digits[N % Radix];
2132 N /= Radix;
2133 }
2134 Str.append(BufPtr, Buffer+65);
2135 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002136 }
2137
Chris Lattnerfad86b02008-08-17 07:19:36 +00002138 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002139
Chris Lattnerfad86b02008-08-17 07:19:36 +00002140 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002141 // They want to print the signed version and it is a negative value
2142 // Flip the bits and add one to turn it into the equivalent positive
2143 // value and put a '-' in the result.
Chris Lattnerfad86b02008-08-17 07:19:36 +00002144 Tmp.flip();
2145 Tmp++;
2146 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002147 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002148
Chris Lattnerfad86b02008-08-17 07:19:36 +00002149 // We insert the digits backward, then reverse them to get the right order.
2150 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002151
2152 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2153 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002154 // equaly. We just shift until the value is zero.
2155 if (Radix != 10) {
2156 // Just shift tmp right for each digit width until it becomes zero
2157 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2158 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002159
Chris Lattnerfad86b02008-08-17 07:19:36 +00002160 while (Tmp != 0) {
2161 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2162 Str.push_back(Digits[Digit]);
2163 Tmp = Tmp.lshr(ShiftAmt);
2164 }
2165 } else {
2166 APInt divisor(4, 10);
2167 while (Tmp != 0) {
2168 APInt APdigit(1, 0);
2169 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002170 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002171 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002172 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002173 assert(Digit < Radix && "divide failed");
2174 Str.push_back(Digits[Digit]);
2175 Tmp = tmp2;
2176 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002177 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002178
Chris Lattnerfad86b02008-08-17 07:19:36 +00002179 // Reverse the digits before returning.
2180 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002181}
2182
Chris Lattnerfad86b02008-08-17 07:19:36 +00002183/// toString - This returns the APInt as a std::string. Note that this is an
2184/// inefficient method. It is better to pass in a SmallVector/SmallString
2185/// to the methods above.
2186std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2187 SmallString<40> S;
2188 toString(S, Radix, Signed);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002189 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002190}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002191
Chris Lattnerfad86b02008-08-17 07:19:36 +00002192
2193void APInt::dump() const {
2194 SmallString<40> S, U;
2195 this->toStringUnsigned(U);
2196 this->toStringSigned(S);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002197 errs() << "APInt(" << BitWidth << "b, "
2198 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002199}
2200
Chris Lattner944fac72008-08-23 22:23:09 +00002201void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002202 SmallString<40> S;
2203 this->toString(S, 10, isSigned);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002204 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002205}
2206
Dan Gohman38a253d2009-06-30 20:10:56 +00002207std::ostream &llvm::operator<<(std::ostream &o, const APInt &I) {
2208 raw_os_ostream OS(o);
2209 OS << I;
2210 return o;
2211}
2212
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002213// This implements a variety of operations on a representation of
2214// arbitrary precision, two's-complement, bignum integer values.
2215
2216/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2217 and unrestricting assumption. */
Chris Lattner9f17eb02008-08-17 04:58:58 +00002218#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002219COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002220
2221/* Some handy functions local to this file. */
2222namespace {
2223
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002224 /* Returns the integer part with the least significant BITS set.
2225 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002226 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002227 lowBitMask(unsigned int bits)
2228 {
2229 assert (bits != 0 && bits <= integerPartWidth);
2230
2231 return ~(integerPart) 0 >> (integerPartWidth - bits);
2232 }
2233
Neil Booth055c0b32007-10-06 00:43:45 +00002234 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002235 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002236 lowHalf(integerPart part)
2237 {
2238 return part & lowBitMask(integerPartWidth / 2);
2239 }
2240
Neil Booth055c0b32007-10-06 00:43:45 +00002241 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002242 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002243 highHalf(integerPart part)
2244 {
2245 return part >> (integerPartWidth / 2);
2246 }
2247
Neil Booth055c0b32007-10-06 00:43:45 +00002248 /* Returns the bit number of the most significant set bit of a part.
2249 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002250 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002251 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002252 {
2253 unsigned int n, msb;
2254
2255 if (value == 0)
2256 return -1U;
2257
2258 n = integerPartWidth / 2;
2259
2260 msb = 0;
2261 do {
2262 if (value >> n) {
2263 value >>= n;
2264 msb += n;
2265 }
2266
2267 n >>= 1;
2268 } while (n);
2269
2270 return msb;
2271 }
2272
Neil Booth055c0b32007-10-06 00:43:45 +00002273 /* Returns the bit number of the least significant set bit of a
2274 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002275 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002276 partLSB(integerPart value)
2277 {
2278 unsigned int n, lsb;
2279
2280 if (value == 0)
2281 return -1U;
2282
2283 lsb = integerPartWidth - 1;
2284 n = integerPartWidth / 2;
2285
2286 do {
2287 if (value << n) {
2288 value <<= n;
2289 lsb -= n;
2290 }
2291
2292 n >>= 1;
2293 } while (n);
2294
2295 return lsb;
2296 }
2297}
2298
2299/* Sets the least significant part of a bignum to the input value, and
2300 zeroes out higher parts. */
2301void
2302APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2303{
2304 unsigned int i;
2305
Neil Booth68e53ad2007-10-08 13:47:12 +00002306 assert (parts > 0);
2307
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002308 dst[0] = part;
2309 for(i = 1; i < parts; i++)
2310 dst[i] = 0;
2311}
2312
2313/* Assign one bignum to another. */
2314void
2315APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2316{
2317 unsigned int i;
2318
2319 for(i = 0; i < parts; i++)
2320 dst[i] = src[i];
2321}
2322
2323/* Returns true if a bignum is zero, false otherwise. */
2324bool
2325APInt::tcIsZero(const integerPart *src, unsigned int parts)
2326{
2327 unsigned int i;
2328
2329 for(i = 0; i < parts; i++)
2330 if (src[i])
2331 return false;
2332
2333 return true;
2334}
2335
2336/* Extract the given bit of a bignum; returns 0 or 1. */
2337int
2338APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2339{
2340 return(parts[bit / integerPartWidth]
2341 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2342}
2343
2344/* Set the given bit of a bignum. */
2345void
2346APInt::tcSetBit(integerPart *parts, unsigned int bit)
2347{
2348 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2349}
2350
Neil Booth055c0b32007-10-06 00:43:45 +00002351/* Returns the bit number of the least significant set bit of a
2352 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002353unsigned int
2354APInt::tcLSB(const integerPart *parts, unsigned int n)
2355{
2356 unsigned int i, lsb;
2357
2358 for(i = 0; i < n; i++) {
2359 if (parts[i] != 0) {
2360 lsb = partLSB(parts[i]);
2361
2362 return lsb + i * integerPartWidth;
2363 }
2364 }
2365
2366 return -1U;
2367}
2368
Neil Booth055c0b32007-10-06 00:43:45 +00002369/* Returns the bit number of the most significant set bit of a number.
2370 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002371unsigned int
2372APInt::tcMSB(const integerPart *parts, unsigned int n)
2373{
2374 unsigned int msb;
2375
2376 do {
2377 --n;
2378
2379 if (parts[n] != 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002380 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002381
2382 return msb + n * integerPartWidth;
2383 }
2384 } while (n);
2385
2386 return -1U;
2387}
2388
Neil Booth68e53ad2007-10-08 13:47:12 +00002389/* Copy the bit vector of width srcBITS from SRC, starting at bit
2390 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2391 the least significant bit of DST. All high bits above srcBITS in
2392 DST are zero-filled. */
2393void
Evan Chengcf69a742009-05-21 23:47:47 +00002394APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002395 unsigned int srcBits, unsigned int srcLSB)
2396{
2397 unsigned int firstSrcPart, dstParts, shift, n;
2398
2399 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2400 assert (dstParts <= dstCount);
2401
2402 firstSrcPart = srcLSB / integerPartWidth;
2403 tcAssign (dst, src + firstSrcPart, dstParts);
2404
2405 shift = srcLSB % integerPartWidth;
2406 tcShiftRight (dst, dstParts, shift);
2407
2408 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2409 in DST. If this is less that srcBits, append the rest, else
2410 clear the high bits. */
2411 n = dstParts * integerPartWidth - shift;
2412 if (n < srcBits) {
2413 integerPart mask = lowBitMask (srcBits - n);
2414 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2415 << n % integerPartWidth);
2416 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002417 if (srcBits % integerPartWidth)
2418 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002419 }
2420
2421 /* Clear high parts. */
2422 while (dstParts < dstCount)
2423 dst[dstParts++] = 0;
2424}
2425
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002426/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2427integerPart
2428APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2429 integerPart c, unsigned int parts)
2430{
2431 unsigned int i;
2432
2433 assert(c <= 1);
2434
2435 for(i = 0; i < parts; i++) {
2436 integerPart l;
2437
2438 l = dst[i];
2439 if (c) {
2440 dst[i] += rhs[i] + 1;
2441 c = (dst[i] <= l);
2442 } else {
2443 dst[i] += rhs[i];
2444 c = (dst[i] < l);
2445 }
2446 }
2447
2448 return c;
2449}
2450
2451/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2452integerPart
2453APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2454 integerPart c, unsigned int parts)
2455{
2456 unsigned int i;
2457
2458 assert(c <= 1);
2459
2460 for(i = 0; i < parts; i++) {
2461 integerPart l;
2462
2463 l = dst[i];
2464 if (c) {
2465 dst[i] -= rhs[i] + 1;
2466 c = (dst[i] >= l);
2467 } else {
2468 dst[i] -= rhs[i];
2469 c = (dst[i] > l);
2470 }
2471 }
2472
2473 return c;
2474}
2475
2476/* Negate a bignum in-place. */
2477void
2478APInt::tcNegate(integerPart *dst, unsigned int parts)
2479{
2480 tcComplement(dst, parts);
2481 tcIncrement(dst, parts);
2482}
2483
Neil Booth055c0b32007-10-06 00:43:45 +00002484/* DST += SRC * MULTIPLIER + CARRY if add is true
2485 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002486
2487 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2488 they must start at the same point, i.e. DST == SRC.
2489
2490 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2491 returned. Otherwise DST is filled with the least significant
2492 DSTPARTS parts of the result, and if all of the omitted higher
2493 parts were zero return zero, otherwise overflow occurred and
2494 return one. */
2495int
2496APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2497 integerPart multiplier, integerPart carry,
2498 unsigned int srcParts, unsigned int dstParts,
2499 bool add)
2500{
2501 unsigned int i, n;
2502
2503 /* Otherwise our writes of DST kill our later reads of SRC. */
2504 assert(dst <= src || dst >= src + srcParts);
2505 assert(dstParts <= srcParts + 1);
2506
2507 /* N loops; minimum of dstParts and srcParts. */
2508 n = dstParts < srcParts ? dstParts: srcParts;
2509
2510 for(i = 0; i < n; i++) {
2511 integerPart low, mid, high, srcPart;
2512
2513 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2514
2515 This cannot overflow, because
2516
2517 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2518
2519 which is less than n^2. */
2520
2521 srcPart = src[i];
2522
2523 if (multiplier == 0 || srcPart == 0) {
2524 low = carry;
2525 high = 0;
2526 } else {
2527 low = lowHalf(srcPart) * lowHalf(multiplier);
2528 high = highHalf(srcPart) * highHalf(multiplier);
2529
2530 mid = lowHalf(srcPart) * highHalf(multiplier);
2531 high += highHalf(mid);
2532 mid <<= integerPartWidth / 2;
2533 if (low + mid < low)
2534 high++;
2535 low += mid;
2536
2537 mid = highHalf(srcPart) * lowHalf(multiplier);
2538 high += highHalf(mid);
2539 mid <<= integerPartWidth / 2;
2540 if (low + mid < low)
2541 high++;
2542 low += mid;
2543
2544 /* Now add carry. */
2545 if (low + carry < low)
2546 high++;
2547 low += carry;
2548 }
2549
2550 if (add) {
2551 /* And now DST[i], and store the new low part there. */
2552 if (low + dst[i] < low)
2553 high++;
2554 dst[i] += low;
2555 } else
2556 dst[i] = low;
2557
2558 carry = high;
2559 }
2560
2561 if (i < dstParts) {
2562 /* Full multiplication, there is no overflow. */
2563 assert(i + 1 == dstParts);
2564 dst[i] = carry;
2565 return 0;
2566 } else {
2567 /* We overflowed if there is carry. */
2568 if (carry)
2569 return 1;
2570
2571 /* We would overflow if any significant unwritten parts would be
2572 non-zero. This is true if any remaining src parts are non-zero
2573 and the multiplier is non-zero. */
2574 if (multiplier)
2575 for(; i < srcParts; i++)
2576 if (src[i])
2577 return 1;
2578
2579 /* We fitted in the narrow destination. */
2580 return 0;
2581 }
2582}
2583
2584/* DST = LHS * RHS, where DST has the same width as the operands and
2585 is filled with the least significant parts of the result. Returns
2586 one if overflow occurred, otherwise zero. DST must be disjoint
2587 from both operands. */
2588int
2589APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2590 const integerPart *rhs, unsigned int parts)
2591{
2592 unsigned int i;
2593 int overflow;
2594
2595 assert(dst != lhs && dst != rhs);
2596
2597 overflow = 0;
2598 tcSet(dst, 0, parts);
2599
2600 for(i = 0; i < parts; i++)
2601 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2602 parts - i, true);
2603
2604 return overflow;
2605}
2606
Neil Booth978661d2007-10-06 00:24:48 +00002607/* DST = LHS * RHS, where DST has width the sum of the widths of the
2608 operands. No overflow occurs. DST must be disjoint from both
2609 operands. Returns the number of parts required to hold the
2610 result. */
2611unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002612APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002613 const integerPart *rhs, unsigned int lhsParts,
2614 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002615{
Neil Booth978661d2007-10-06 00:24:48 +00002616 /* Put the narrower number on the LHS for less loops below. */
2617 if (lhsParts > rhsParts) {
2618 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2619 } else {
2620 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002621
Neil Booth978661d2007-10-06 00:24:48 +00002622 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002623
Neil Booth978661d2007-10-06 00:24:48 +00002624 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002625
Neil Booth978661d2007-10-06 00:24:48 +00002626 for(n = 0; n < lhsParts; n++)
2627 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002628
Neil Booth978661d2007-10-06 00:24:48 +00002629 n = lhsParts + rhsParts;
2630
2631 return n - (dst[n - 1] == 0);
2632 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002633}
2634
2635/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2636 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2637 set REMAINDER to the remainder, return zero. i.e.
2638
2639 OLD_LHS = RHS * LHS + REMAINDER
2640
2641 SCRATCH is a bignum of the same size as the operands and result for
2642 use by the routine; its contents need not be initialized and are
2643 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2644*/
2645int
2646APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2647 integerPart *remainder, integerPart *srhs,
2648 unsigned int parts)
2649{
2650 unsigned int n, shiftCount;
2651 integerPart mask;
2652
2653 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2654
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002655 shiftCount = tcMSB(rhs, parts) + 1;
2656 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002657 return true;
2658
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002659 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002660 n = shiftCount / integerPartWidth;
2661 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2662
2663 tcAssign(srhs, rhs, parts);
2664 tcShiftLeft(srhs, parts, shiftCount);
2665 tcAssign(remainder, lhs, parts);
2666 tcSet(lhs, 0, parts);
2667
2668 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2669 the total. */
2670 for(;;) {
2671 int compare;
2672
2673 compare = tcCompare(remainder, srhs, parts);
2674 if (compare >= 0) {
2675 tcSubtract(remainder, srhs, 0, parts);
2676 lhs[n] |= mask;
2677 }
2678
2679 if (shiftCount == 0)
2680 break;
2681 shiftCount--;
2682 tcShiftRight(srhs, parts, 1);
2683 if ((mask >>= 1) == 0)
2684 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2685 }
2686
2687 return false;
2688}
2689
2690/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2691 There are no restrictions on COUNT. */
2692void
2693APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2694{
Neil Booth68e53ad2007-10-08 13:47:12 +00002695 if (count) {
2696 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002697
Neil Booth68e53ad2007-10-08 13:47:12 +00002698 /* Jump is the inter-part jump; shift is is intra-part shift. */
2699 jump = count / integerPartWidth;
2700 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002701
Neil Booth68e53ad2007-10-08 13:47:12 +00002702 while (parts > jump) {
2703 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002704
Neil Booth68e53ad2007-10-08 13:47:12 +00002705 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002706
Neil Booth68e53ad2007-10-08 13:47:12 +00002707 /* dst[i] comes from the two parts src[i - jump] and, if we have
2708 an intra-part shift, src[i - jump - 1]. */
2709 part = dst[parts - jump];
2710 if (shift) {
2711 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002712 if (parts >= jump + 1)
2713 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2714 }
2715
Neil Booth68e53ad2007-10-08 13:47:12 +00002716 dst[parts] = part;
2717 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002718
Neil Booth68e53ad2007-10-08 13:47:12 +00002719 while (parts > 0)
2720 dst[--parts] = 0;
2721 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002722}
2723
2724/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2725 zero. There are no restrictions on COUNT. */
2726void
2727APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2728{
Neil Booth68e53ad2007-10-08 13:47:12 +00002729 if (count) {
2730 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002731
Neil Booth68e53ad2007-10-08 13:47:12 +00002732 /* Jump is the inter-part jump; shift is is intra-part shift. */
2733 jump = count / integerPartWidth;
2734 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002735
Neil Booth68e53ad2007-10-08 13:47:12 +00002736 /* Perform the shift. This leaves the most significant COUNT bits
2737 of the result at zero. */
2738 for(i = 0; i < parts; i++) {
2739 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002740
Neil Booth68e53ad2007-10-08 13:47:12 +00002741 if (i + jump >= parts) {
2742 part = 0;
2743 } else {
2744 part = dst[i + jump];
2745 if (shift) {
2746 part >>= shift;
2747 if (i + jump + 1 < parts)
2748 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2749 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002750 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002751
Neil Booth68e53ad2007-10-08 13:47:12 +00002752 dst[i] = part;
2753 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002754 }
2755}
2756
2757/* Bitwise and of two bignums. */
2758void
2759APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2760{
2761 unsigned int i;
2762
2763 for(i = 0; i < parts; i++)
2764 dst[i] &= rhs[i];
2765}
2766
2767/* Bitwise inclusive or of two bignums. */
2768void
2769APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2770{
2771 unsigned int i;
2772
2773 for(i = 0; i < parts; i++)
2774 dst[i] |= rhs[i];
2775}
2776
2777/* Bitwise exclusive or of two bignums. */
2778void
2779APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2780{
2781 unsigned int i;
2782
2783 for(i = 0; i < parts; i++)
2784 dst[i] ^= rhs[i];
2785}
2786
2787/* Complement a bignum in-place. */
2788void
2789APInt::tcComplement(integerPart *dst, unsigned int parts)
2790{
2791 unsigned int i;
2792
2793 for(i = 0; i < parts; i++)
2794 dst[i] = ~dst[i];
2795}
2796
2797/* Comparison (unsigned) of two bignums. */
2798int
2799APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2800 unsigned int parts)
2801{
2802 while (parts) {
2803 parts--;
2804 if (lhs[parts] == rhs[parts])
2805 continue;
2806
2807 if (lhs[parts] > rhs[parts])
2808 return 1;
2809 else
2810 return -1;
2811 }
2812
2813 return 0;
2814}
2815
2816/* Increment a bignum in-place, return the carry flag. */
2817integerPart
2818APInt::tcIncrement(integerPart *dst, unsigned int parts)
2819{
2820 unsigned int i;
2821
2822 for(i = 0; i < parts; i++)
2823 if (++dst[i] != 0)
2824 break;
2825
2826 return i == parts;
2827}
2828
2829/* Set the least significant BITS bits of a bignum, clear the
2830 rest. */
2831void
2832APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2833 unsigned int bits)
2834{
2835 unsigned int i;
2836
2837 i = 0;
2838 while (bits > integerPartWidth) {
2839 dst[i++] = ~(integerPart) 0;
2840 bits -= integerPartWidth;
2841 }
2842
2843 if (bits)
2844 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2845
2846 while (i < parts)
2847 dst[i++] = 0;
2848}