blob: 931c885b9268f5b65da187775869619d8ed74689 [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) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000049 unsigned r;
50
Douglas Gregordcd99962011-09-14 15:54:46 +000051 if (radix == 16 || radix == 36) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000052 r = cdigit - '0';
53 if (r <= 9)
54 return r;
55
56 r = cdigit - 'A';
Douglas Gregorf83f0f82011-09-20 18:11:52 +000057 if (r <= unsigned(radix - 11U))
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000058 return r + 10;
59
60 r = cdigit - 'a';
Douglas Gregorf83f0f82011-09-20 18:11:52 +000061 if (r <= unsigned(radix - 11U))
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000062 return r + 10;
Douglas Gregorf83f0f82011-09-20 18:11:52 +000063
64 radix = 10;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000065 }
66
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000067 r = cdigit - '0';
68 if (r < radix)
69 return r;
70
71 return -1U;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000072}
73
74
Chris Lattner455e9ab2009-01-21 18:09:24 +000075void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000076 pVal = getClearedMemory(getNumWords());
77 pVal[0] = val;
Eric Christopherd37eda82009-08-21 04:06:45 +000078 if (isSigned && int64_t(val) < 0)
Chris Lattner98f8ccf2008-08-20 17:02:31 +000079 for (unsigned i = 1; i < getNumWords(); ++i)
80 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000081}
82
Chris Lattner119c30b2008-10-11 22:07:19 +000083void APInt::initSlowCase(const APInt& that) {
84 pVal = getMemory(getNumWords());
85 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
86}
87
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000088void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000089 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000090 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000091 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000092 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000093 else {
Reid Spencer610fad82007-02-24 10:01:42 +000094 // Get memory, cleared to 0
95 pVal = getClearedMemory(getNumWords());
96 // Calculate the number of words to copy
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000097 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +000098 // Copy the words from bigVal to pVal
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000099 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000100 }
Reid Spencer610fad82007-02-24 10:01:42 +0000101 // Make sure unused high bits are cleared
102 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000103}
104
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +0000105APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
106 : BitWidth(numBits), VAL(0) {
107 initFromArray(bigVal);
108}
109
110APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
111 : BitWidth(numBits), VAL(0) {
112 initFromArray(makeArrayRef(bigVal, numWords));
113}
114
Benjamin Kramer38e59892010-07-14 22:38:02 +0000115APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +0000116 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000117 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000118 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000119}
120
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000121APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000122 // Don't do anything for X = X
123 if (this == &RHS)
124 return *this;
125
Reid Spencer9ac44112007-02-26 23:38:21 +0000126 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000127 // assume same bit-width single-word case is already handled
128 assert(!isSingleWord());
129 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer9ac44112007-02-26 23:38:21 +0000130 return *this;
131 }
132
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000133 if (isSingleWord()) {
134 // assume case where both are single words is already handled
135 assert(!RHS.isSingleWord());
136 VAL = 0;
137 pVal = getMemory(RHS.getNumWords());
138 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopherd37eda82009-08-21 04:06:45 +0000139 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000140 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
141 else if (RHS.isSingleWord()) {
142 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000143 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000144 } else {
145 delete [] pVal;
146 pVal = getMemory(RHS.getNumWords());
147 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
148 }
149 BitWidth = RHS.BitWidth;
150 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000151}
152
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000153APInt& APInt::operator=(uint64_t RHS) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000154 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000155 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000156 else {
157 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000158 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000159 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000160 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000161}
162
Ted Kremeneke420deb2008-01-19 04:23:33 +0000163/// Profile - This method 'profiles' an APInt for use with FoldingSet.
164void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000165 ID.AddInteger(BitWidth);
Eric Christopherd37eda82009-08-21 04:06:45 +0000166
Ted Kremeneke420deb2008-01-19 04:23:33 +0000167 if (isSingleWord()) {
168 ID.AddInteger(VAL);
169 return;
170 }
171
Chris Lattner455e9ab2009-01-21 18:09:24 +0000172 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000173 for (unsigned i = 0; i < NumWords; ++i)
174 ID.AddInteger(pVal[i]);
175}
176
Eric Christopherd37eda82009-08-21 04:06:45 +0000177/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spenceraf0e9562007-02-18 18:38:44 +0000178/// "digit" integer array, x[]. x[] is modified to reflect the addition and
179/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000180/// @returns the carry of the addition.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000181static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
182 for (unsigned i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000183 dest[i] = y + x[i];
184 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000185 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000186 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000187 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000188 break;
189 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000190 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000191 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000192}
193
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000194/// @brief Prefix increment operator. Increments the APInt by one.
195APInt& APInt::operator++() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000196 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000197 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000198 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000199 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000200 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000201}
202
Eric Christopherd37eda82009-08-21 04:06:45 +0000203/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
204/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spenceraf0e9562007-02-18 18:38:44 +0000205/// no further borrowing is neeeded or it runs out of "digits" in x. The result
206/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
207/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000208/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-01-21 18:09:24 +0000209static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
210 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000211 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000212 x[i] -= y;
Eric Christopherd37eda82009-08-21 04:06:45 +0000213 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000214 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000215 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000216 y = 0; // No need to borrow
217 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000218 }
219 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000220 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000221}
222
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000223/// @brief Prefix decrement operator. Decrements the APInt by one.
224APInt& APInt::operator--() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000225 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000226 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000227 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000228 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000229 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000230}
231
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000232/// add - This function adds the integer array x to the integer array Y and
Eric Christopherd37eda82009-08-21 04:06:45 +0000233/// places the result in dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000234/// @returns the carry out from the addition
235/// @brief General addition of 64-bit integer arrays
Eric Christopherd37eda82009-08-21 04:06:45 +0000236static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000237 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000238 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000239 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000240 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000241 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000242 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000243 }
244 return carry;
245}
246
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000247/// Adds the RHS APint to this APInt.
248/// @returns this, after addition of RHS.
Eric Christopherd37eda82009-08-21 04:06:45 +0000249/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000250APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000251 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000252 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000253 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000254 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000255 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000256 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000257 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000258}
259
Eric Christopherd37eda82009-08-21 04:06:45 +0000260/// Subtracts the integer array y from the integer array x
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000261/// @returns returns the borrow out.
262/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopherd37eda82009-08-21 04:06:45 +0000263static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000264 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000265 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000266 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000267 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
268 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
269 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000270 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000271 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000272}
273
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000274/// Subtracts the RHS APInt from this APInt
275/// @returns this, after subtraction
Eric Christopherd37eda82009-08-21 04:06:45 +0000276/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000277APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000278 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000279 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000280 VAL -= RHS.VAL;
281 else
282 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000283 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000284}
285
Dan Gohmanf451cb82010-02-10 16:03:48 +0000286/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopherd37eda82009-08-21 04:06:45 +0000287/// into dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000288/// @returns the carry out of the multiplication.
289/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000290static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000291 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000292 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000293 uint64_t carry = 0;
294
295 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000296 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000297 // Split x into high and low words
298 uint64_t lx = x[i] & 0xffffffffULL;
299 uint64_t hx = x[i] >> 32;
300 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000301 // hasCarry == 0, no carry
302 // hasCarry == 1, has carry
303 // hasCarry == 2, no carry and the calculation result == 0.
304 uint8_t hasCarry = 0;
305 dest[i] = carry + lx * ly;
306 // Determine if the add above introduces carry.
307 hasCarry = (dest[i] < carry) ? 1 : 0;
308 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopherd37eda82009-08-21 04:06:45 +0000309 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000310 // (2^32 - 1) + 2^32 = 2^64.
311 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
312
313 carry += (lx * hy) & 0xffffffffULL;
314 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopherd37eda82009-08-21 04:06:45 +0000315 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000316 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
317 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000318 return carry;
319}
320
Eric Christopherd37eda82009-08-21 04:06:45 +0000321/// Multiplies integer array x by integer array y and stores the result into
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000322/// the integer array dest. Note that dest's size must be >= xlen + ylen.
323/// @brief Generalized multiplicate of integer arrays.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000324static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
325 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000326 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000327 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000328 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000329 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000330 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000331 lx = x[j] & 0xffffffffULL;
332 hx = x[j] >> 32;
333 // hasCarry - A flag to indicate if has carry.
334 // hasCarry == 0, no carry
335 // hasCarry == 1, has carry
336 // hasCarry == 2, no carry and the calculation result == 0.
337 uint8_t hasCarry = 0;
338 uint64_t resul = carry + lx * ly;
339 hasCarry = (resul < carry) ? 1 : 0;
340 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
341 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
342
343 carry += (lx * hy) & 0xffffffffULL;
344 resul = (carry << 32) | (resul & 0xffffffffULL);
345 dest[i+j] += resul;
346 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopherd37eda82009-08-21 04:06:45 +0000347 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000348 ((lx * hy) >> 32) + hx * hy;
349 }
350 dest[i+xlen] = carry;
351 }
352}
353
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000354APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000355 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000356 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000357 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000358 clearUnusedBits();
359 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000360 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000361
362 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000363 unsigned lhsBits = getActiveBits();
364 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopherd37eda82009-08-21 04:06:45 +0000365 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +0000366 // 0 * X ===> 0
367 return *this;
368
369 // Get some bit facts about RHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000370 unsigned rhsBits = RHS.getActiveBits();
371 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000372 if (!rhsWords) {
373 // X * 0 ===> 0
Jay Foad7a874dd2010-12-01 08:53:58 +0000374 clearAllBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000375 return *this;
376 }
377
378 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000379 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000380 uint64_t *dest = getMemory(destWords);
381
382 // Perform the long multiply
383 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
384
385 // Copy result back into *this
Jay Foad7a874dd2010-12-01 08:53:58 +0000386 clearAllBits();
Chris Lattner455e9ab2009-01-21 18:09:24 +0000387 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000388 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
389
390 // delete dest array and return
391 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000392 return *this;
393}
394
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000395APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000396 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000397 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000398 VAL &= RHS.VAL;
399 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000400 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000401 unsigned numWords = getNumWords();
402 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000403 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000404 return *this;
405}
406
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000407APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000408 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000409 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000410 VAL |= RHS.VAL;
411 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000412 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000413 unsigned numWords = getNumWords();
414 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000415 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000416 return *this;
417}
418
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000419APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000420 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000421 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000422 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000423 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000424 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000425 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000426 unsigned numWords = getNumWords();
427 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000428 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000429 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000430}
431
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000432APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000433 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000434 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000435 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000436 val[i] = pVal[i] & RHS.pVal[i];
437 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000438}
439
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000440APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000441 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000442 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000443 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000444 val[i] = pVal[i] | RHS.pVal[i];
445 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000446}
447
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000448APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000449 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000450 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000451 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000452 val[i] = pVal[i] ^ RHS.pVal[i];
453
454 // 0^0==1 so clear the high bits in case they got set.
455 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000456}
457
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000458bool APInt::operator !() const {
459 if (isSingleWord())
460 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000461
Chris Lattner455e9ab2009-01-21 18:09:24 +0000462 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000463 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000464 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000465 return true;
466}
467
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000468APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000469 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000470 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000471 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000472 APInt Result(*this);
473 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000474 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000475}
476
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000477APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000478 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000479 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000480 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000481 APInt Result(BitWidth, 0);
482 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000483 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000484}
485
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000486APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000487 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000488 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000489 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000490 APInt Result(BitWidth, 0);
491 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000492 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000493}
494
Chris Lattner455e9ab2009-01-21 18:09:24 +0000495bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman078d9672010-11-18 17:14:56 +0000496 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopherd37eda82009-08-21 04:06:45 +0000497 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000498 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000499}
500
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000501bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000502 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000503 unsigned n1 = getActiveBits();
504 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000505
506 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000507 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000508 return false;
509
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000510 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000511 if (n1 <= APINT_BITS_PER_WORD)
512 return pVal[0] == RHS.pVal[0];
513
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000514 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000515 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000516 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000517 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000518 return true;
519}
520
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000521bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000522 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000523 if (n <= APINT_BITS_PER_WORD)
524 return pVal[0] == Val;
525 else
526 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000527}
528
Reid Spencere81d2da2007-02-16 22:36:51 +0000529bool APInt::ult(const APInt& RHS) const {
530 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
531 if (isSingleWord())
532 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000533
534 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000535 unsigned n1 = getActiveBits();
536 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000537
538 // If magnitude of LHS is less than RHS, return true.
539 if (n1 < n2)
540 return true;
541
542 // If magnitude of RHS is greather than LHS, return false.
543 if (n2 < n1)
544 return false;
545
546 // If they bot fit in a word, just compare the low order word
547 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
548 return pVal[0] < RHS.pVal[0];
549
550 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000551 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000552 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000553 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000554 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000555 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000556 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000557 }
558 return false;
559}
560
Reid Spencere81d2da2007-02-16 22:36:51 +0000561bool APInt::slt(const APInt& RHS) const {
562 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000563 if (isSingleWord()) {
564 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
565 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
566 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000567 }
Reid Spencera58f0582007-02-18 20:09:41 +0000568
569 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000570 APInt rhs(RHS);
571 bool lhsNeg = isNegative();
572 bool rhsNeg = rhs.isNegative();
573 if (lhsNeg) {
574 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000575 lhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000576 lhs++;
577 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000578 if (rhsNeg) {
579 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000580 rhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000581 rhs++;
582 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000583
584 // Now we have unsigned values to compare so do the comparison if necessary
585 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000586 if (lhsNeg)
587 if (rhsNeg)
588 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000589 else
590 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000591 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000592 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000593 else
Reid Spencera58f0582007-02-18 20:09:41 +0000594 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000595}
596
Jay Foad7a874dd2010-12-01 08:53:58 +0000597void APInt::setBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000598 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000599 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000600 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000601 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000602}
603
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000604/// Set the given bit to 0 whose position is given as "bitPosition".
605/// @brief Set a given bit to 0.
Jay Foad7a874dd2010-12-01 08:53:58 +0000606void APInt::clearBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000607 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000608 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000609 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000610 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000611}
612
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000613/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000614
Eric Christopherd37eda82009-08-21 04:06:45 +0000615/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000616/// as "bitPosition".
617/// @brief Toggles a given bit to its opposite value.
Jay Foad7a874dd2010-12-01 08:53:58 +0000618void APInt::flipBit(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000619 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad7a874dd2010-12-01 08:53:58 +0000620 if ((*this)[bitPosition]) clearBit(bitPosition);
621 else setBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000622}
623
Benjamin Kramer38e59892010-07-14 22:38:02 +0000624unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000625 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +0000626 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
627 radix == 36) &&
628 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000629
630 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000631
Eric Christophere250f2a2009-08-21 04:10:31 +0000632 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000633 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000634 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000635 if (*p == '-' || *p == '+') {
636 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000637 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000638 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000639 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000640
Reid Spencer57ae4f52007-04-13 19:19:07 +0000641 // For radixes of power-of-two values, the bits required is accurately and
642 // easily computed
643 if (radix == 2)
644 return slen + isNegative;
645 if (radix == 8)
646 return slen * 3 + isNegative;
647 if (radix == 16)
648 return slen * 4 + isNegative;
649
Douglas Gregordcd99962011-09-14 15:54:46 +0000650 // FIXME: base 36
651
Reid Spencer57ae4f52007-04-13 19:19:07 +0000652 // This is grossly inefficient but accurate. We could probably do something
653 // with a computation of roughly slen*64/20 and then adjust by the value of
654 // the first few digits. But, I'm not sure how accurate that could be.
655
656 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000657 // be too large. This avoids the assertion in the constructor. This
658 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
659 // bits in that case.
Douglas Gregordcd99962011-09-14 15:54:46 +0000660 unsigned sufficient
661 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
662 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000663
664 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000665 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000666
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000667 // Compute how many bits are required. If the log is infinite, assume we need
668 // just bit.
669 unsigned log = tmp.logBase2();
670 if (log == (unsigned)-1) {
671 return isNegative + 1;
672 } else {
673 return isNegative + log + 1;
674 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000675}
676
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000677// From http://www.burtleburtle.net, byBob Jenkins.
678// When targeting x86, both GCC and LLVM seem to recognize this as a
679// rotate instruction.
680#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencer794f4722007-02-26 21:02:27 +0000681
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000682// From http://www.burtleburtle.net, by Bob Jenkins.
683#define mix(a,b,c) \
684 { \
685 a -= c; a ^= rot(c, 4); c += b; \
686 b -= a; b ^= rot(a, 6); a += c; \
687 c -= b; c ^= rot(b, 8); b += a; \
688 a -= c; a ^= rot(c,16); c += b; \
689 b -= a; b ^= rot(a,19); a += c; \
690 c -= b; c ^= rot(b, 4); b += a; \
691 }
692
693// From http://www.burtleburtle.net, by Bob Jenkins.
694#define final(a,b,c) \
695 { \
696 c ^= b; c -= rot(b,14); \
697 a ^= c; a -= rot(c,11); \
698 b ^= a; b -= rot(a,25); \
699 c ^= b; c -= rot(b,16); \
700 a ^= c; a -= rot(c,4); \
701 b ^= a; b -= rot(a,14); \
702 c ^= b; c -= rot(b,24); \
703 }
704
705// hashword() was adapted from http://www.burtleburtle.net, by Bob
706// Jenkins. k is a pointer to an array of uint32_t values; length is
707// the length of the key, in 32-bit chunks. This version only handles
708// keys that are a multiple of 32 bits in size.
709static inline uint32_t hashword(const uint64_t *k64, size_t length)
710{
711 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
712 uint32_t a,b,c;
713
714 /* Set up the internal state */
715 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
716
717 /*------------------------------------------------- handle most of the key */
Dan Gohman16e02092010-03-24 19:38:02 +0000718 while (length > 3) {
719 a += k[0];
720 b += k[1];
721 c += k[2];
722 mix(a,b,c);
723 length -= 3;
724 k += 3;
725 }
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000726
727 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-05-13 23:23:20 +0000728 switch (length) { /* all the case statements fall through */
729 case 3 : c+=k[2];
730 case 2 : b+=k[1];
731 case 1 : a+=k[0];
732 final(a,b,c);
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000733 case 0: /* case 0: nothing left to add */
734 break;
735 }
736 /*------------------------------------------------------ report the result */
737 return c;
738}
739
740// hashword8() was adapted from http://www.burtleburtle.net, by Bob
741// Jenkins. This computes a 32-bit hash from one 64-bit word. When
742// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
743// function into about 35 instructions when inlined.
744static inline uint32_t hashword8(const uint64_t k64)
745{
746 uint32_t a,b,c;
747 a = b = c = 0xdeadbeef + 4;
748 b += k64 >> 32;
749 a += k64 & 0xffffffff;
750 final(a,b,c);
751 return c;
752}
753#undef final
754#undef mix
755#undef rot
756
757uint64_t APInt::getHashValue() const {
758 uint64_t hash;
Reid Spencer794f4722007-02-26 21:02:27 +0000759 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000760 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000761 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000762 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000763 return hash;
764}
765
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000766/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000767APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000768 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000769}
770
771/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000772APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000773 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000774 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000775}
776
Chris Lattner455e9ab2009-01-21 18:09:24 +0000777unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000778 // Treat the most significand word differently because it might have
779 // meaningless bits set beyond the precision.
780 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
781 integerPart MSWMask;
782 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
783 else {
784 MSWMask = ~integerPart(0);
785 BitsInMSW = APINT_BITS_PER_WORD;
786 }
787
788 unsigned i = getNumWords();
789 integerPart MSW = pVal[i-1] & MSWMask;
790 if (MSW)
791 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
792
793 unsigned Count = BitsInMSW;
794 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000795 if (pVal[i-1] == 0)
796 Count += APINT_BITS_PER_WORD;
797 else {
798 Count += CountLeadingZeros_64(pVal[i-1]);
799 break;
Reid Spencere549c492007-02-21 00:29:48 +0000800 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000801 }
John McCall281d0512010-02-03 03:42:44 +0000802 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000803}
804
Chris Lattner455e9ab2009-01-21 18:09:24 +0000805static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
806 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000807 if (skip)
808 V <<= skip;
809 while (V && (V & (1ULL << 63))) {
810 Count++;
811 V <<= 1;
812 }
813 return Count;
814}
815
Chris Lattner455e9ab2009-01-21 18:09:24 +0000816unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000817 if (isSingleWord())
818 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
819
Chris Lattner455e9ab2009-01-21 18:09:24 +0000820 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000821 unsigned shift;
822 if (!highWordBits) {
823 highWordBits = APINT_BITS_PER_WORD;
824 shift = 0;
825 } else {
826 shift = APINT_BITS_PER_WORD - highWordBits;
827 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000828 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000829 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000830 if (Count == highWordBits) {
831 for (i--; i >= 0; --i) {
832 if (pVal[i] == -1ULL)
833 Count += APINT_BITS_PER_WORD;
834 else {
835 Count += countLeadingOnes_64(pVal[i], 0);
836 break;
837 }
838 }
839 }
840 return Count;
841}
842
Chris Lattner455e9ab2009-01-21 18:09:24 +0000843unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000844 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000845 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
846 unsigned Count = 0;
847 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000848 for (; i < getNumWords() && pVal[i] == 0; ++i)
849 Count += APINT_BITS_PER_WORD;
850 if (i < getNumWords())
851 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000852 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000853}
854
Chris Lattner455e9ab2009-01-21 18:09:24 +0000855unsigned APInt::countTrailingOnesSlowCase() const {
856 unsigned Count = 0;
857 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000858 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000859 Count += APINT_BITS_PER_WORD;
860 if (i < getNumWords())
861 Count += CountTrailingOnes_64(pVal[i]);
862 return std::min(Count, BitWidth);
863}
864
Chris Lattner455e9ab2009-01-21 18:09:24 +0000865unsigned APInt::countPopulationSlowCase() const {
866 unsigned Count = 0;
867 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000868 Count += CountPopulation_64(pVal[i]);
869 return Count;
870}
871
Reid Spencere81d2da2007-02-16 22:36:51 +0000872APInt APInt::byteSwap() const {
873 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
874 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000875 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000876 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000877 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000878 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000879 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000880 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000881 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000882 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000883 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000884 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000885 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000886 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000887 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000888 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000889 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000890 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000891 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
892 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000893 }
894 return Result;
895 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000896}
897
Eric Christopherd37eda82009-08-21 04:06:45 +0000898APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000899 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000900 APInt A = API1, B = API2;
901 while (!!B) {
902 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000903 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000904 A = T;
905 }
906 return A;
907}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000908
Chris Lattner455e9ab2009-01-21 18:09:24 +0000909APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000910 union {
911 double D;
912 uint64_t I;
913 } T;
914 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000915
916 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000917 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000918
919 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000920 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000921
922 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000923 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000924 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000925
926 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
927 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
928
929 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000930 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000931 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000932 APInt(width, mantissa >> (52 - exp));
933
934 // If the client didn't provide enough bits for us to shift the mantissa into
935 // then the result is undefined, just return 0
936 if (width <= exp - 52)
937 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000938
939 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000940 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000941 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000942 return isNeg ? -Tmp : Tmp;
943}
944
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000945/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000946/// The layout for double is as following (IEEE Standard 754):
947/// --------------------------------------
948/// | Sign Exponent Fraction Bias |
949/// |-------------------------------------- |
950/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000951/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000952double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000953
954 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000955 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000956 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
957 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000958 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000959 return double(sext);
960 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000961 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000962 }
963
Reid Spencer9c0696f2007-02-20 08:51:03 +0000964 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000965 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000966
967 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000968 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000969
970 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000971 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000972
Reid Spencer9c0696f2007-02-20 08:51:03 +0000973 // The exponent (without bias normalization) is just the number of bits
974 // we are using. Note that the sign bit is gone since we constructed the
975 // absolute value.
976 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000977
Reid Spencer9c0696f2007-02-20 08:51:03 +0000978 // Return infinity for exponent overflow
979 if (exp > 1023) {
980 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000981 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000982 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000983 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000984 }
985 exp += 1023; // Increment for 1023 bias
986
987 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
988 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000989 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000990 unsigned hiWord = whichWord(n-1);
991 if (hiWord == 0) {
992 mantissa = Tmp.pVal[0];
993 if (n > 52)
994 mantissa >>= n - 52; // shift down, we want the top 52 bits.
995 } else {
996 assert(hiWord > 0 && "huh?");
997 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
998 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
999 mantissa = hibits | lobits;
1000 }
1001
Zhou Shengd93f00c2007-02-12 20:02:55 +00001002 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +00001003 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +00001004 union {
1005 double D;
1006 uint64_t I;
1007 } T;
1008 T.I = sign | (exp << 52) | mantissa;
1009 return T.D;
1010}
1011
Reid Spencere81d2da2007-02-16 22:36:51 +00001012// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001013APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001014 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +00001015 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +00001016
1017 if (width <= APINT_BITS_PER_WORD)
1018 return APInt(width, getRawData()[0]);
1019
1020 APInt Result(getMemory(getNumWords(width)), width);
1021
1022 // Copy full words.
1023 unsigned i;
1024 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1025 Result.pVal[i] = pVal[i];
1026
1027 // Truncate and copy any partial word.
1028 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1029 if (bits != 0)
1030 Result.pVal[i] = pVal[i] << bits >> bits;
1031
1032 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001033}
1034
1035// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001036APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001037 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001038
1039 if (width <= APINT_BITS_PER_WORD) {
1040 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1041 val = (int64_t)val >> (width - BitWidth);
1042 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +00001043 }
1044
Jay Foad40f8f622010-12-07 08:25:19 +00001045 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +00001046
Jay Foad40f8f622010-12-07 08:25:19 +00001047 // Copy full words.
1048 unsigned i;
1049 uint64_t word = 0;
1050 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1051 word = getRawData()[i];
1052 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +00001053 }
1054
Jay Foad40f8f622010-12-07 08:25:19 +00001055 // Read and sign-extend any partial word.
1056 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1057 if (bits != 0)
1058 word = (int64_t)getRawData()[i] << bits >> bits;
1059 else
1060 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1061
1062 // Write remaining full words.
1063 for (; i != width / APINT_BITS_PER_WORD; i++) {
1064 Result.pVal[i] = word;
1065 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +00001066 }
Jay Foad40f8f622010-12-07 08:25:19 +00001067
1068 // Write any partial word.
1069 bits = (0 - width) % APINT_BITS_PER_WORD;
1070 if (bits != 0)
1071 Result.pVal[i] = word << bits >> bits;
1072
1073 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001074}
1075
1076// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001077APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001078 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001079
1080 if (width <= APINT_BITS_PER_WORD)
1081 return APInt(width, VAL);
1082
1083 APInt Result(getMemory(getNumWords(width)), width);
1084
1085 // Copy words.
1086 unsigned i;
1087 for (i = 0; i != getNumWords(); i++)
1088 Result.pVal[i] = getRawData()[i];
1089
1090 // Zero remaining words.
1091 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1092
1093 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001094}
1095
Jay Foad40f8f622010-12-07 08:25:19 +00001096APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001097 if (BitWidth < width)
1098 return zext(width);
1099 if (BitWidth > width)
1100 return trunc(width);
1101 return *this;
1102}
1103
Jay Foad40f8f622010-12-07 08:25:19 +00001104APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001105 if (BitWidth < width)
1106 return sext(width);
1107 if (BitWidth > width)
1108 return trunc(width);
1109 return *this;
1110}
1111
Zhou Shengff4304f2007-02-09 07:48:24 +00001112/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001113/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001114APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001115 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001116}
1117
1118/// Arithmetic right-shift this APInt by shiftAmt.
1119/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001120APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001121 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001122 // Handle a degenerate case
1123 if (shiftAmt == 0)
1124 return *this;
1125
1126 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001127 if (isSingleWord()) {
1128 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001129 return APInt(BitWidth, 0); // undefined
1130 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001131 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001132 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001133 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1134 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001135 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001136
Reid Spencer46f9c942007-03-02 22:39:11 +00001137 // If all the bits were shifted out, the result is, technically, undefined.
1138 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1139 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001140 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001141 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001142 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001143 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001144 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001145 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001146
1147 // Create some space for the result.
1148 uint64_t * val = new uint64_t[getNumWords()];
1149
Reid Spencer46f9c942007-03-02 22:39:11 +00001150 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001151 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1152 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1153 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1154 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001155 if (bitsInWord == 0)
1156 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001157
1158 // If we are shifting whole words, just move whole words
1159 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001160 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001161 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001162 val[i] = pVal[i+offset]; // move whole word
1163
1164 // Adjust the top significant word for sign bit fill, if negative
1165 if (isNegative())
1166 if (bitsInWord < APINT_BITS_PER_WORD)
1167 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1168 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001169 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001170 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001171 // This combines the shifted corresponding word with the low bits from
1172 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001173 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001174 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1175 }
1176
1177 // Shift the break word. In this case there are no bits from the next word
1178 // to include in this word.
1179 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1180
1181 // Deal with sign extenstion in the break word, and possibly the word before
1182 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001183 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001184 if (wordShift > bitsInWord) {
1185 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001186 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001187 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1188 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001189 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001190 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001191 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001192 }
1193
Reid Spencer46f9c942007-03-02 22:39:11 +00001194 // Remaining words are 0 or -1, just assign them.
1195 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001196 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001197 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001198 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001199}
1200
Zhou Shengff4304f2007-02-09 07:48:24 +00001201/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001202/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001203APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001204 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001205}
1206
1207/// Logical right-shift this APInt by shiftAmt.
1208/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001209APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001210 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001211 if (shiftAmt == BitWidth)
1212 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001213 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001214 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001215 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001216
Reid Spencerba81c2b2007-02-26 01:19:48 +00001217 // If all the bits were shifted out, the result is 0. This avoids issues
1218 // with shifting by the size of the integer type, which produces undefined
1219 // results. We define these "undefined results" to always be 0.
1220 if (shiftAmt == BitWidth)
1221 return APInt(BitWidth, 0);
1222
Reid Spencer02ae8b72007-05-17 06:26:29 +00001223 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001224 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001225 // undefined results in the code below. This is also an optimization.
1226 if (shiftAmt == 0)
1227 return *this;
1228
Reid Spencerba81c2b2007-02-26 01:19:48 +00001229 // Create some space for the result.
1230 uint64_t * val = new uint64_t[getNumWords()];
1231
1232 // If we are shifting less than a word, compute the shift with a simple carry
1233 if (shiftAmt < APINT_BITS_PER_WORD) {
1234 uint64_t carry = 0;
1235 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001236 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001237 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1238 }
1239 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001240 }
1241
Reid Spencerba81c2b2007-02-26 01:19:48 +00001242 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001243 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1244 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001245
1246 // If we are shifting whole words, just move whole words
1247 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001248 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001249 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001250 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001251 val[i] = 0;
1252 return APInt(val,BitWidth).clearUnusedBits();
1253 }
1254
Eric Christopherd37eda82009-08-21 04:06:45 +00001255 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001256 unsigned breakWord = getNumWords() - offset -1;
1257 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001258 val[i] = (pVal[i+offset] >> wordShift) |
1259 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001260 // Shift the break word.
1261 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1262
1263 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001264 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001265 val[i] = 0;
1266 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001267}
1268
Zhou Shengff4304f2007-02-09 07:48:24 +00001269/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001270/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001271APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001272 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001273 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001274}
1275
Chris Lattner455e9ab2009-01-21 18:09:24 +00001276APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001277 // If all the bits were shifted out, the result is 0. This avoids issues
1278 // with shifting by the size of the integer type, which produces undefined
1279 // results. We define these "undefined results" to always be 0.
1280 if (shiftAmt == BitWidth)
1281 return APInt(BitWidth, 0);
1282
Reid Spencer92c72832007-05-12 18:01:57 +00001283 // If none of the bits are shifted out, the result is *this. This avoids a
1284 // lshr by the words size in the loop below which can produce incorrect
1285 // results. It also avoids the expensive computation below for a common case.
1286 if (shiftAmt == 0)
1287 return *this;
1288
Reid Spencer87553802007-02-25 00:56:44 +00001289 // Create some space for the result.
1290 uint64_t * val = new uint64_t[getNumWords()];
1291
1292 // If we are shifting less than a word, do it the easy way
1293 if (shiftAmt < APINT_BITS_PER_WORD) {
1294 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001295 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001296 val[i] = pVal[i] << shiftAmt | carry;
1297 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1298 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001299 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001300 }
1301
Reid Spencer87553802007-02-25 00:56:44 +00001302 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001303 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1304 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001305
1306 // If we are shifting whole words, just move whole words
1307 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001308 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001309 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001310 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001311 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001312 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001313 }
Reid Spencer87553802007-02-25 00:56:44 +00001314
1315 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001316 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001317 for (; i > offset; --i)
1318 val[i] = pVal[i-offset] << wordShift |
1319 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001320 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001321 for (i = 0; i < offset; ++i)
1322 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001323 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001324}
1325
Dan Gohmancf609572008-02-29 01:40:47 +00001326APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001327 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001328}
1329
Chris Lattner455e9ab2009-01-21 18:09:24 +00001330APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001331 if (rotateAmt == 0)
1332 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001333 // Don't get too fancy, just use existing shift/or facilities
1334 APInt hi(*this);
1335 APInt lo(*this);
1336 hi.shl(rotateAmt);
1337 lo.lshr(BitWidth - rotateAmt);
1338 return hi | lo;
1339}
1340
Dan Gohmancf609572008-02-29 01:40:47 +00001341APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001342 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001343}
1344
Chris Lattner455e9ab2009-01-21 18:09:24 +00001345APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001346 if (rotateAmt == 0)
1347 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001348 // Don't get too fancy, just use existing shift/or facilities
1349 APInt hi(*this);
1350 APInt lo(*this);
1351 lo.lshr(rotateAmt);
1352 hi.shl(BitWidth - rotateAmt);
1353 return hi | lo;
1354}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001355
1356// Square Root - this method computes and returns the square root of "this".
1357// Three mechanisms are used for computation. For small values (<= 5 bits),
1358// a table lookup is done. This gets some performance for common cases. For
1359// values using less than 52 bits, the value is converted to double and then
1360// the libc sqrt function is called. The result is rounded and then converted
1361// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001362// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001363APInt APInt::sqrt() const {
1364
1365 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001366 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001367
1368 // Use a fast table for some small values. This also gets rid of some
1369 // rounding errors in libc sqrt for small values.
1370 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001371 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001372 /* 0 */ 0,
1373 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001374 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001375 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1376 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1377 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1378 /* 31 */ 6
1379 };
1380 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001381 }
1382
1383 // If the magnitude of the value fits in less than 52 bits (the precision of
1384 // an IEEE double precision floating point value), then we can use the
1385 // libc sqrt function which will probably use a hardware sqrt computation.
1386 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001387 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001388#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001389 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001390 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001391#else
1392 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001393 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001394#endif
1395 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001396
1397 // Okay, all the short cuts are exhausted. We must compute it. The following
1398 // is a classical Babylonian method for computing the square root. This code
1399 // was adapted to APINt from a wikipedia article on such computations.
1400 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001401 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001402 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001403 APInt testy(BitWidth, 16);
1404 APInt x_old(BitWidth, 1);
1405 APInt x_new(BitWidth, 0);
1406 APInt two(BitWidth, 2);
1407
1408 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001409 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001410 if (i >= nbits || this->ule(testy)) {
1411 x_old = x_old.shl(i / 2);
1412 break;
1413 }
1414
Eric Christopherd37eda82009-08-21 04:06:45 +00001415 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001416 for (;;) {
1417 x_new = (this->udiv(x_old) + x_old).udiv(two);
1418 if (x_old.ule(x_new))
1419 break;
1420 x_old = x_new;
1421 }
1422
1423 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001424 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001425 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001426 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001427 // floating point representation after 192 bits. There are no discrepancies
1428 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001429 APInt square(x_old * x_old);
1430 APInt nextSquare((x_old + 1) * (x_old +1));
1431 if (this->ult(square))
1432 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001433 else if (this->ule(nextSquare)) {
1434 APInt midpoint((nextSquare - square).udiv(two));
1435 APInt offset(*this - square);
1436 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001437 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001438 else
1439 return x_old + 1;
1440 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001441 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001442 return x_old + 1;
1443}
1444
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001445/// Computes the multiplicative inverse of this APInt for a given modulo. The
1446/// iterative extended Euclidean algorithm is used to solve for this value,
1447/// however we simplify it to speed up calculating only the inverse, and take
1448/// advantage of div+rem calculations. We also use some tricks to avoid copying
1449/// (potentially large) APInts around.
1450APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1451 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1452
1453 // Using the properties listed at the following web page (accessed 06/21/08):
1454 // http://www.numbertheory.org/php/euclid.html
1455 // (especially the properties numbered 3, 4 and 9) it can be proved that
1456 // BitWidth bits suffice for all the computations in the algorithm implemented
1457 // below. More precisely, this number of bits suffice if the multiplicative
1458 // inverse exists, but may not suffice for the general extended Euclidean
1459 // algorithm.
1460
1461 APInt r[2] = { modulo, *this };
1462 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1463 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001464
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001465 unsigned i;
1466 for (i = 0; r[i^1] != 0; i ^= 1) {
1467 // An overview of the math without the confusing bit-flipping:
1468 // q = r[i-2] / r[i-1]
1469 // r[i] = r[i-2] % r[i-1]
1470 // t[i] = t[i-2] - t[i-1] * q
1471 udivrem(r[i], r[i^1], q, r[i]);
1472 t[i] -= t[i^1] * q;
1473 }
1474
1475 // If this APInt and the modulo are not coprime, there is no multiplicative
1476 // inverse, so return 0. We check this by looking at the next-to-last
1477 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1478 // algorithm.
1479 if (r[i] != 1)
1480 return APInt(BitWidth, 0);
1481
1482 // The next-to-last t is the multiplicative inverse. However, we are
1483 // interested in a positive inverse. Calcuate a positive one from a negative
1484 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001485 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001486 return t[i].isNegative() ? t[i] + modulo : t[i];
1487}
1488
Jay Foad4e5ea552009-04-30 10:15:35 +00001489/// Calculate the magic numbers required to implement a signed integer division
1490/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1491/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1492/// Warren, Jr., chapter 10.
1493APInt::ms APInt::magic() const {
1494 const APInt& d = *this;
1495 unsigned p;
1496 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001497 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001498 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001499
Jay Foad4e5ea552009-04-30 10:15:35 +00001500 ad = d.abs();
1501 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1502 anc = t - 1 - t.urem(ad); // absolute value of nc
1503 p = d.getBitWidth() - 1; // initialize p
1504 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1505 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1506 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1507 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1508 do {
1509 p = p + 1;
1510 q1 = q1<<1; // update q1 = 2p/abs(nc)
1511 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1512 if (r1.uge(anc)) { // must be unsigned comparison
1513 q1 = q1 + 1;
1514 r1 = r1 - anc;
1515 }
1516 q2 = q2<<1; // update q2 = 2p/abs(d)
1517 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1518 if (r2.uge(ad)) { // must be unsigned comparison
1519 q2 = q2 + 1;
1520 r2 = r2 - ad;
1521 }
1522 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001523 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001524
Jay Foad4e5ea552009-04-30 10:15:35 +00001525 mag.m = q2 + 1;
1526 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1527 mag.s = p - d.getBitWidth(); // resulting shift
1528 return mag;
1529}
1530
1531/// Calculate the magic numbers required to implement an unsigned integer
1532/// division by a constant as a sequence of multiplies, adds and shifts.
1533/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1534/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001535/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001536/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001537APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001538 const APInt& d = *this;
1539 unsigned p;
1540 APInt nc, delta, q1, r1, q2, r2;
1541 struct mu magu;
1542 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001543 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001544 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1545 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1546
1547 nc = allOnes - (-d).urem(d);
1548 p = d.getBitWidth() - 1; // initialize p
1549 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1550 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1551 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1552 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1553 do {
1554 p = p + 1;
1555 if (r1.uge(nc - r1)) {
1556 q1 = q1 + q1 + 1; // update q1
1557 r1 = r1 + r1 - nc; // update r1
1558 }
1559 else {
1560 q1 = q1+q1; // update q1
1561 r1 = r1+r1; // update r1
1562 }
1563 if ((r2 + 1).uge(d - r2)) {
1564 if (q2.uge(signedMax)) magu.a = 1;
1565 q2 = q2+q2 + 1; // update q2
1566 r2 = r2+r2 + 1 - d; // update r2
1567 }
1568 else {
1569 if (q2.uge(signedMin)) magu.a = 1;
1570 q2 = q2+q2; // update q2
1571 r2 = r2+r2 + 1; // update r2
1572 }
1573 delta = d - 1 - r2;
1574 } while (p < d.getBitWidth()*2 &&
1575 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1576 magu.m = q2 + 1; // resulting magic number
1577 magu.s = p - d.getBitWidth(); // resulting shift
1578 return magu;
1579}
1580
Reid Spencer9c0696f2007-02-20 08:51:03 +00001581/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1582/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1583/// variables here have the same names as in the algorithm. Comments explain
1584/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001585static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1586 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001587 assert(u && "Must provide dividend");
1588 assert(v && "Must provide divisor");
1589 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001590 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001591 assert(n>1 && "n must be > 1");
1592
1593 // Knuth uses the value b as the base of the number system. In our case b
1594 // is 2^31 so we just set it to -1u.
1595 uint64_t b = uint64_t(1) << 32;
1596
Chris Lattnerfad86b02008-08-17 07:19:36 +00001597#if 0
David Greene465abed2010-01-05 01:28:52 +00001598 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1599 DEBUG(dbgs() << "KnuthDiv: original:");
1600 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1601 DEBUG(dbgs() << " by");
1602 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1603 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001604#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001605 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1606 // u and v by d. Note that we have taken Knuth's advice here to use a power
1607 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1608 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001609 // shift amount from the leading zeros. We are basically normalizing the u
1610 // and v so that its high bits are shifted to the top of v's range without
1611 // overflow. Note that this can require an extra word in u so that u must
1612 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001613 unsigned shift = CountLeadingZeros_32(v[n-1]);
1614 unsigned v_carry = 0;
1615 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001616 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001617 for (unsigned i = 0; i < m+n; ++i) {
1618 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001619 u[i] = (u[i] << shift) | u_carry;
1620 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001621 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001622 for (unsigned i = 0; i < n; ++i) {
1623 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001624 v[i] = (v[i] << shift) | v_carry;
1625 v_carry = v_tmp;
1626 }
1627 }
1628 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001629#if 0
David Greene465abed2010-01-05 01:28:52 +00001630 DEBUG(dbgs() << "KnuthDiv: normal:");
1631 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1632 DEBUG(dbgs() << " by");
1633 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1634 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001635#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001636
1637 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1638 int j = m;
1639 do {
David Greene465abed2010-01-05 01:28:52 +00001640 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001641 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001642 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1643 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1644 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1645 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1646 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001647 // value qp is one too large, and it eliminates all cases where qp is two
1648 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001649 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001650 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001651 uint64_t qp = dividend / v[n-1];
1652 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001653 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1654 qp--;
1655 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001656 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001657 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001658 }
David Greene465abed2010-01-05 01:28:52 +00001659 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001660
Reid Spencer92904632007-02-23 01:57:13 +00001661 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1662 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1663 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001664 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001665 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001666 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001667 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001668 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001669 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001670 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001671 << ", subtrahend == " << subtrahend
1672 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001673
Reid Spencer610fad82007-02-24 10:01:42 +00001674 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001675 unsigned k = j + i;
1676 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1677 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001678 while (borrow && k <= m+n) { // deal with borrow to the left
1679 borrow = u[k] == 0;
1680 u[k]--;
1681 k++;
1682 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001683 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001684 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001685 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001686 }
David Greene465abed2010-01-05 01:28:52 +00001687 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1688 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1689 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001690 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1691 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001692 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001693 // the true value, and a "borrow" to the left should be remembered.
1694 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001695 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001696 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001697 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001698 u[i] = ~u[i] + carry; // b's complement
1699 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001700 }
Reid Spencer92904632007-02-23 01:57:13 +00001701 }
David Greene465abed2010-01-05 01:28:52 +00001702 DEBUG(dbgs() << "KnuthDiv: after complement:");
1703 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1704 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001705
Eric Christopherd37eda82009-08-21 04:06:45 +00001706 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001707 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001708 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001709 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001710 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001711 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001712 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001713 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001714 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1715 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001716 // since it cancels with the borrow that occurred in D4.
1717 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001718 for (unsigned i = 0; i < n; i++) {
1719 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001720 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001721 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001722 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001723 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001724 }
David Greene465abed2010-01-05 01:28:52 +00001725 DEBUG(dbgs() << "KnuthDiv: after correction:");
1726 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1727 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001728
Reid Spencer92904632007-02-23 01:57:13 +00001729 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1730 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001731
David Greene465abed2010-01-05 01:28:52 +00001732 DEBUG(dbgs() << "KnuthDiv: quotient:");
1733 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1734 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001735
Reid Spencer9c0696f2007-02-20 08:51:03 +00001736 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1737 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1738 // compute the remainder (urem uses this).
1739 if (r) {
1740 // The value d is expressed by the "shift" value above since we avoided
1741 // multiplication by d by using a shift left. So, all we have to do is
1742 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001743 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001744 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001745 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001746 for (int i = n-1; i >= 0; i--) {
1747 r[i] = (u[i] >> shift) | carry;
1748 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001749 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001750 }
1751 } else {
1752 for (int i = n-1; i >= 0; i--) {
1753 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001754 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001755 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001756 }
David Greene465abed2010-01-05 01:28:52 +00001757 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001758 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001759#if 0
David Greene465abed2010-01-05 01:28:52 +00001760 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001761#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001762}
1763
Chris Lattner455e9ab2009-01-21 18:09:24 +00001764void APInt::divide(const APInt LHS, unsigned lhsWords,
1765 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001766 APInt *Quotient, APInt *Remainder)
1767{
1768 assert(lhsWords >= rhsWords && "Fractional result");
1769
Eric Christopherd37eda82009-08-21 04:06:45 +00001770 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001771 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001772 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001773 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1774 // can't use 64-bit operands here because we don't have native results of
1775 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001776 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001777 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001778 unsigned n = rhsWords * 2;
1779 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001780
1781 // Allocate space for the temporary values we need either on the stack, if
1782 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001783 unsigned SPACE[128];
1784 unsigned *U = 0;
1785 unsigned *V = 0;
1786 unsigned *Q = 0;
1787 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001788 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1789 U = &SPACE[0];
1790 V = &SPACE[m+n+1];
1791 Q = &SPACE[(m+n+1) + n];
1792 if (Remainder)
1793 R = &SPACE[(m+n+1) + n + (m+n)];
1794 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001795 U = new unsigned[m + n + 1];
1796 V = new unsigned[n];
1797 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001798 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001799 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001800 }
1801
1802 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001803 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001804 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001805 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001806 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001807 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001808 }
1809 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1810
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001811 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001812 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001813 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001814 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001815 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001816 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001817 }
1818
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001819 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001820 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001821 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001822 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001823
Eric Christopherd37eda82009-08-21 04:06:45 +00001824 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001825 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001826 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001827 // contain any zero words or the Knuth algorithm fails.
1828 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1829 n--;
1830 m++;
1831 }
1832 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1833 m--;
1834
1835 // If we're left with only a single word for the divisor, Knuth doesn't work
1836 // so we implement the short division algorithm here. This is much simpler
1837 // and faster because we are certain that we can divide a 64-bit quantity
1838 // by a 32-bit quantity at hardware speed and short division is simply a
1839 // series of such operations. This is just like doing short division but we
1840 // are using base 2^32 instead of base 10.
1841 assert(n != 0 && "Divide by zero?");
1842 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001843 unsigned divisor = V[0];
1844 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001845 for (int i = m+n-1; i >= 0; i--) {
1846 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1847 if (partial_dividend == 0) {
1848 Q[i] = 0;
1849 remainder = 0;
1850 } else if (partial_dividend < divisor) {
1851 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001852 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001853 } else if (partial_dividend == divisor) {
1854 Q[i] = 1;
1855 remainder = 0;
1856 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001857 Q[i] = (unsigned)(partial_dividend / divisor);
1858 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001859 }
1860 }
1861 if (R)
1862 R[0] = remainder;
1863 } else {
1864 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1865 // case n > 1.
1866 KnuthDiv(U, V, Q, R, m, n);
1867 }
1868
1869 // If the caller wants the quotient
1870 if (Quotient) {
1871 // Set up the Quotient value's memory.
1872 if (Quotient->BitWidth != LHS.BitWidth) {
1873 if (Quotient->isSingleWord())
1874 Quotient->VAL = 0;
1875 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001876 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001877 Quotient->BitWidth = LHS.BitWidth;
1878 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001879 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001880 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001881 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001882
Eric Christopherd37eda82009-08-21 04:06:45 +00001883 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001884 // order words.
1885 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001886 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001887 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1888 if (Quotient->isSingleWord())
1889 Quotient->VAL = tmp;
1890 else
1891 Quotient->pVal[0] = tmp;
1892 } else {
1893 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1894 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001895 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001896 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1897 }
1898 }
1899
1900 // If the caller wants the remainder
1901 if (Remainder) {
1902 // Set up the Remainder value's memory.
1903 if (Remainder->BitWidth != RHS.BitWidth) {
1904 if (Remainder->isSingleWord())
1905 Remainder->VAL = 0;
1906 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001907 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001908 Remainder->BitWidth = RHS.BitWidth;
1909 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001910 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001911 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001912 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001913
1914 // The remainder is in R. Reconstitute the remainder into Remainder's low
1915 // order words.
1916 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001917 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001918 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1919 if (Remainder->isSingleWord())
1920 Remainder->VAL = tmp;
1921 else
1922 Remainder->pVal[0] = tmp;
1923 } else {
1924 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1925 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001926 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001927 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1928 }
1929 }
1930
1931 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001932 if (U != &SPACE[0]) {
1933 delete [] U;
1934 delete [] V;
1935 delete [] Q;
1936 delete [] R;
1937 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001938}
1939
Reid Spencere81d2da2007-02-16 22:36:51 +00001940APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001941 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001942
1943 // First, deal with the easy case
1944 if (isSingleWord()) {
1945 assert(RHS.VAL != 0 && "Divide by zero?");
1946 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001947 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001948
Reid Spencer71bd08f2007-02-17 02:07:07 +00001949 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001950 unsigned rhsBits = RHS.getActiveBits();
1951 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001952 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001953 unsigned lhsBits = this->getActiveBits();
1954 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001955
1956 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001957 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001958 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001959 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001960 else if (lhsWords < rhsWords || this->ult(RHS)) {
1961 // X / Y ===> 0, iff X < Y
1962 return APInt(BitWidth, 0);
1963 } else if (*this == RHS) {
1964 // X / X ===> 1
1965 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001966 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001967 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001968 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001969 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001970
1971 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1972 APInt Quotient(1,0); // to hold result.
1973 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1974 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001975}
1976
Reid Spencere81d2da2007-02-16 22:36:51 +00001977APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001978 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001979 if (isSingleWord()) {
1980 assert(RHS.VAL != 0 && "Remainder by zero?");
1981 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001982 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001983
Reid Spencere0cdd332007-02-21 08:21:52 +00001984 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001985 unsigned lhsBits = getActiveBits();
1986 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001987
1988 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001989 unsigned rhsBits = RHS.getActiveBits();
1990 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001991 assert(rhsWords && "Performing remainder operation by zero ???");
1992
Reid Spencer71bd08f2007-02-17 02:07:07 +00001993 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001994 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001995 // 0 % Y ===> 0
1996 return APInt(BitWidth, 0);
1997 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1998 // X % Y ===> X, iff X < Y
1999 return *this;
2000 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00002001 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00002002 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002003 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00002004 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00002005 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00002006 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002007
Reid Spencer19dc32a2007-05-13 23:44:59 +00002008 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00002009 APInt Remainder(1,0);
2010 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2011 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002012}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002013
Eric Christopherd37eda82009-08-21 04:06:45 +00002014void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002015 APInt &Quotient, APInt &Remainder) {
2016 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002017 unsigned lhsBits = LHS.getActiveBits();
2018 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2019 unsigned rhsBits = RHS.getActiveBits();
2020 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002021
2022 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002023 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002024 Quotient = 0; // 0 / Y ===> 0
2025 Remainder = 0; // 0 % Y ===> 0
2026 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002027 }
2028
2029 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002030 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002031 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002032 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002033 }
2034
Reid Spencer19dc32a2007-05-13 23:44:59 +00002035 if (LHS == RHS) {
2036 Quotient = 1; // X / X ===> 1
2037 Remainder = 0; // X % X ===> 0;
2038 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002039 }
2040
Reid Spencer19dc32a2007-05-13 23:44:59 +00002041 if (lhsWords == 1 && rhsWords == 1) {
2042 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002043 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2044 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2045 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2046 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002047 return;
2048 }
2049
2050 // Okay, lets do it the long way
2051 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2052}
2053
Chris Lattner0a0a5852010-10-13 23:54:10 +00002054APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002055 APInt Res = *this+RHS;
2056 Overflow = isNonNegative() == RHS.isNonNegative() &&
2057 Res.isNonNegative() != isNonNegative();
2058 return Res;
2059}
2060
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002061APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2062 APInt Res = *this+RHS;
2063 Overflow = Res.ult(RHS);
2064 return Res;
2065}
2066
Chris Lattner0a0a5852010-10-13 23:54:10 +00002067APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002068 APInt Res = *this - RHS;
2069 Overflow = isNonNegative() != RHS.isNonNegative() &&
2070 Res.isNonNegative() != isNonNegative();
2071 return Res;
2072}
2073
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002074APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002075 APInt Res = *this-RHS;
2076 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002077 return Res;
2078}
2079
Chris Lattner0a0a5852010-10-13 23:54:10 +00002080APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002081 // MININT/-1 --> overflow.
2082 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2083 return sdiv(RHS);
2084}
2085
Chris Lattner0a0a5852010-10-13 23:54:10 +00002086APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002087 APInt Res = *this * RHS;
2088
2089 if (*this != 0 && RHS != 0)
2090 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2091 else
2092 Overflow = false;
2093 return Res;
2094}
2095
Frits van Bommel62086102011-03-27 14:26:13 +00002096APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2097 APInt Res = *this * RHS;
2098
2099 if (*this != 0 && RHS != 0)
2100 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2101 else
2102 Overflow = false;
2103 return Res;
2104}
2105
Chris Lattner0a0a5852010-10-13 23:54:10 +00002106APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002107 Overflow = ShAmt >= getBitWidth();
2108 if (Overflow)
2109 ShAmt = getBitWidth()-1;
2110
2111 if (isNonNegative()) // Don't allow sign change.
2112 Overflow = ShAmt >= countLeadingZeros();
2113 else
2114 Overflow = ShAmt >= countLeadingOnes();
2115
2116 return *this << ShAmt;
2117}
2118
2119
2120
2121
Benjamin Kramer38e59892010-07-14 22:38:02 +00002122void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002123 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002124 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002125 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2126 radix == 36) &&
2127 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002128
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002129 StringRef::iterator p = str.begin();
2130 size_t slen = str.size();
2131 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002132 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002133 p++;
2134 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002135 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002136 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002137 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002138 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2139 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002140 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2141 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002142
2143 // Allocate memory
2144 if (!isSingleWord())
2145 pVal = getClearedMemory(getNumWords());
2146
2147 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002148 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002149
2150 // Set up an APInt for the digit to add outside the loop so we don't
2151 // constantly construct/destruct it.
2152 APInt apdigit(getBitWidth(), 0);
2153 APInt apradix(getBitWidth(), radix);
2154
2155 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002156 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002157 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002158 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002159
Reid Spencer6551dcd2007-05-16 19:18:22 +00002160 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002161 if (slen > 1) {
2162 if (shift)
2163 *this <<= shift;
2164 else
2165 *this *= apradix;
2166 }
Reid Spencer385f7542007-02-21 03:55:44 +00002167
2168 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002169 if (apdigit.isSingleWord())
2170 apdigit.VAL = digit;
2171 else
2172 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002173 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002174 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002175 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002176 if (isNeg) {
2177 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002178 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002179 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002180}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002181
Chris Lattnerfad86b02008-08-17 07:19:36 +00002182void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002183 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002184 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2185 Radix == 36) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002186 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002187
Ted Kremenekcf886182011-06-15 00:51:55 +00002188 const char *Prefix = "";
2189 if (formatAsCLiteral) {
2190 switch (Radix) {
2191 case 2:
2192 // Binary literals are a non-standard extension added in gcc 4.3:
2193 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2194 Prefix = "0b";
2195 break;
2196 case 8:
2197 Prefix = "0";
2198 break;
2199 case 16:
2200 Prefix = "0x";
2201 break;
2202 }
2203 }
2204
Chris Lattnerfad86b02008-08-17 07:19:36 +00002205 // First, check for a zero value and just short circuit the logic below.
2206 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002207 while (*Prefix) {
2208 Str.push_back(*Prefix);
2209 ++Prefix;
2210 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002211 Str.push_back('0');
2212 return;
2213 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002214
Douglas Gregordcd99962011-09-14 15:54:46 +00002215 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002216
Reid Spencer9c0696f2007-02-20 08:51:03 +00002217 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002218 char Buffer[65];
2219 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002220
Chris Lattnerfad86b02008-08-17 07:19:36 +00002221 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002222 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002223 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002224 } else {
2225 int64_t I = getSExtValue();
2226 if (I >= 0) {
2227 N = I;
2228 } else {
2229 Str.push_back('-');
2230 N = -(uint64_t)I;
2231 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002232 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002233
Ted Kremenekcf886182011-06-15 00:51:55 +00002234 while (*Prefix) {
2235 Str.push_back(*Prefix);
2236 ++Prefix;
2237 };
2238
Chris Lattnerfad86b02008-08-17 07:19:36 +00002239 while (N) {
2240 *--BufPtr = Digits[N % Radix];
2241 N /= Radix;
2242 }
2243 Str.append(BufPtr, Buffer+65);
2244 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002245 }
2246
Chris Lattnerfad86b02008-08-17 07:19:36 +00002247 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002248
Chris Lattnerfad86b02008-08-17 07:19:36 +00002249 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002250 // They want to print the signed version and it is a negative value
2251 // Flip the bits and add one to turn it into the equivalent positive
2252 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002253 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002254 Tmp++;
2255 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002256 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002257
Ted Kremenekcf886182011-06-15 00:51:55 +00002258 while (*Prefix) {
2259 Str.push_back(*Prefix);
2260 ++Prefix;
2261 };
2262
Chris Lattnerfad86b02008-08-17 07:19:36 +00002263 // We insert the digits backward, then reverse them to get the right order.
2264 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002265
2266 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2267 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002268 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002269 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002270 // Just shift tmp right for each digit width until it becomes zero
2271 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2272 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002273
Chris Lattnerfad86b02008-08-17 07:19:36 +00002274 while (Tmp != 0) {
2275 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2276 Str.push_back(Digits[Digit]);
2277 Tmp = Tmp.lshr(ShiftAmt);
2278 }
2279 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002280 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002281 while (Tmp != 0) {
2282 APInt APdigit(1, 0);
2283 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002284 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002285 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002286 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002287 assert(Digit < Radix && "divide failed");
2288 Str.push_back(Digits[Digit]);
2289 Tmp = tmp2;
2290 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002291 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002292
Chris Lattnerfad86b02008-08-17 07:19:36 +00002293 // Reverse the digits before returning.
2294 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002295}
2296
Chris Lattnerfad86b02008-08-17 07:19:36 +00002297/// toString - This returns the APInt as a std::string. Note that this is an
2298/// inefficient method. It is better to pass in a SmallVector/SmallString
2299/// to the methods above.
2300std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2301 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002302 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002303 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002304}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002305
Chris Lattnerfad86b02008-08-17 07:19:36 +00002306
2307void APInt::dump() const {
2308 SmallString<40> S, U;
2309 this->toStringUnsigned(U);
2310 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002311 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002312 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002313}
2314
Chris Lattner944fac72008-08-23 22:23:09 +00002315void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002316 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002317 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002318 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002319}
2320
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002321// This implements a variety of operations on a representation of
2322// arbitrary precision, two's-complement, bignum integer values.
2323
Chris Lattner91021d32009-08-23 23:11:28 +00002324// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2325// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002326#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002327COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002328
2329/* Some handy functions local to this file. */
2330namespace {
2331
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002332 /* Returns the integer part with the least significant BITS set.
2333 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002334 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002335 lowBitMask(unsigned int bits)
2336 {
Dan Gohman16e02092010-03-24 19:38:02 +00002337 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002338
2339 return ~(integerPart) 0 >> (integerPartWidth - bits);
2340 }
2341
Neil Booth055c0b32007-10-06 00:43:45 +00002342 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002343 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002344 lowHalf(integerPart part)
2345 {
2346 return part & lowBitMask(integerPartWidth / 2);
2347 }
2348
Neil Booth055c0b32007-10-06 00:43:45 +00002349 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002350 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002351 highHalf(integerPart part)
2352 {
2353 return part >> (integerPartWidth / 2);
2354 }
2355
Neil Booth055c0b32007-10-06 00:43:45 +00002356 /* Returns the bit number of the most significant set bit of a part.
2357 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002358 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002359 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002360 {
2361 unsigned int n, msb;
2362
2363 if (value == 0)
2364 return -1U;
2365
2366 n = integerPartWidth / 2;
2367
2368 msb = 0;
2369 do {
2370 if (value >> n) {
2371 value >>= n;
2372 msb += n;
2373 }
2374
2375 n >>= 1;
2376 } while (n);
2377
2378 return msb;
2379 }
2380
Neil Booth055c0b32007-10-06 00:43:45 +00002381 /* Returns the bit number of the least significant set bit of a
2382 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002383 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002384 partLSB(integerPart value)
2385 {
2386 unsigned int n, lsb;
2387
2388 if (value == 0)
2389 return -1U;
2390
2391 lsb = integerPartWidth - 1;
2392 n = integerPartWidth / 2;
2393
2394 do {
2395 if (value << n) {
2396 value <<= n;
2397 lsb -= n;
2398 }
2399
2400 n >>= 1;
2401 } while (n);
2402
2403 return lsb;
2404 }
2405}
2406
2407/* Sets the least significant part of a bignum to the input value, and
2408 zeroes out higher parts. */
2409void
2410APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2411{
2412 unsigned int i;
2413
Dan Gohman16e02092010-03-24 19:38:02 +00002414 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002415
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002416 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002417 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002418 dst[i] = 0;
2419}
2420
2421/* Assign one bignum to another. */
2422void
2423APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2424{
2425 unsigned int i;
2426
Dan Gohman16e02092010-03-24 19:38:02 +00002427 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002428 dst[i] = src[i];
2429}
2430
2431/* Returns true if a bignum is zero, false otherwise. */
2432bool
2433APInt::tcIsZero(const integerPart *src, unsigned int parts)
2434{
2435 unsigned int i;
2436
Dan Gohman16e02092010-03-24 19:38:02 +00002437 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002438 if (src[i])
2439 return false;
2440
2441 return true;
2442}
2443
2444/* Extract the given bit of a bignum; returns 0 or 1. */
2445int
2446APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2447{
Dan Gohman16e02092010-03-24 19:38:02 +00002448 return (parts[bit / integerPartWidth] &
2449 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002450}
2451
John McCalle12b7382010-02-28 02:51:25 +00002452/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002453void
2454APInt::tcSetBit(integerPart *parts, unsigned int bit)
2455{
2456 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2457}
2458
John McCalle12b7382010-02-28 02:51:25 +00002459/* Clears the given bit of a bignum. */
2460void
2461APInt::tcClearBit(integerPart *parts, unsigned int bit)
2462{
2463 parts[bit / integerPartWidth] &=
2464 ~((integerPart) 1 << (bit % integerPartWidth));
2465}
2466
Neil Booth055c0b32007-10-06 00:43:45 +00002467/* Returns the bit number of the least significant set bit of a
2468 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002469unsigned int
2470APInt::tcLSB(const integerPart *parts, unsigned int n)
2471{
2472 unsigned int i, lsb;
2473
Dan Gohman16e02092010-03-24 19:38:02 +00002474 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002475 if (parts[i] != 0) {
2476 lsb = partLSB(parts[i]);
2477
2478 return lsb + i * integerPartWidth;
2479 }
2480 }
2481
2482 return -1U;
2483}
2484
Neil Booth055c0b32007-10-06 00:43:45 +00002485/* Returns the bit number of the most significant set bit of a number.
2486 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002487unsigned int
2488APInt::tcMSB(const integerPart *parts, unsigned int n)
2489{
2490 unsigned int msb;
2491
2492 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002493 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002494
Dan Gohman16e02092010-03-24 19:38:02 +00002495 if (parts[n] != 0) {
2496 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002497
Dan Gohman16e02092010-03-24 19:38:02 +00002498 return msb + n * integerPartWidth;
2499 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002500 } while (n);
2501
2502 return -1U;
2503}
2504
Neil Booth68e53ad2007-10-08 13:47:12 +00002505/* Copy the bit vector of width srcBITS from SRC, starting at bit
2506 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2507 the least significant bit of DST. All high bits above srcBITS in
2508 DST are zero-filled. */
2509void
Evan Chengcf69a742009-05-21 23:47:47 +00002510APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002511 unsigned int srcBits, unsigned int srcLSB)
2512{
2513 unsigned int firstSrcPart, dstParts, shift, n;
2514
2515 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002516 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002517
2518 firstSrcPart = srcLSB / integerPartWidth;
2519 tcAssign (dst, src + firstSrcPart, dstParts);
2520
2521 shift = srcLSB % integerPartWidth;
2522 tcShiftRight (dst, dstParts, shift);
2523
2524 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2525 in DST. If this is less that srcBits, append the rest, else
2526 clear the high bits. */
2527 n = dstParts * integerPartWidth - shift;
2528 if (n < srcBits) {
2529 integerPart mask = lowBitMask (srcBits - n);
2530 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2531 << n % integerPartWidth);
2532 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002533 if (srcBits % integerPartWidth)
2534 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002535 }
2536
2537 /* Clear high parts. */
2538 while (dstParts < dstCount)
2539 dst[dstParts++] = 0;
2540}
2541
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002542/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2543integerPart
2544APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2545 integerPart c, unsigned int parts)
2546{
2547 unsigned int i;
2548
2549 assert(c <= 1);
2550
Dan Gohman16e02092010-03-24 19:38:02 +00002551 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002552 integerPart l;
2553
2554 l = dst[i];
2555 if (c) {
2556 dst[i] += rhs[i] + 1;
2557 c = (dst[i] <= l);
2558 } else {
2559 dst[i] += rhs[i];
2560 c = (dst[i] < l);
2561 }
2562 }
2563
2564 return c;
2565}
2566
2567/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2568integerPart
2569APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2570 integerPart c, unsigned int parts)
2571{
2572 unsigned int i;
2573
2574 assert(c <= 1);
2575
Dan Gohman16e02092010-03-24 19:38:02 +00002576 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002577 integerPart l;
2578
2579 l = dst[i];
2580 if (c) {
2581 dst[i] -= rhs[i] + 1;
2582 c = (dst[i] >= l);
2583 } else {
2584 dst[i] -= rhs[i];
2585 c = (dst[i] > l);
2586 }
2587 }
2588
2589 return c;
2590}
2591
2592/* Negate a bignum in-place. */
2593void
2594APInt::tcNegate(integerPart *dst, unsigned int parts)
2595{
2596 tcComplement(dst, parts);
2597 tcIncrement(dst, parts);
2598}
2599
Neil Booth055c0b32007-10-06 00:43:45 +00002600/* DST += SRC * MULTIPLIER + CARRY if add is true
2601 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002602
2603 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2604 they must start at the same point, i.e. DST == SRC.
2605
2606 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2607 returned. Otherwise DST is filled with the least significant
2608 DSTPARTS parts of the result, and if all of the omitted higher
2609 parts were zero return zero, otherwise overflow occurred and
2610 return one. */
2611int
2612APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2613 integerPart multiplier, integerPart carry,
2614 unsigned int srcParts, unsigned int dstParts,
2615 bool add)
2616{
2617 unsigned int i, n;
2618
2619 /* Otherwise our writes of DST kill our later reads of SRC. */
2620 assert(dst <= src || dst >= src + srcParts);
2621 assert(dstParts <= srcParts + 1);
2622
2623 /* N loops; minimum of dstParts and srcParts. */
2624 n = dstParts < srcParts ? dstParts: srcParts;
2625
Dan Gohman16e02092010-03-24 19:38:02 +00002626 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002627 integerPart low, mid, high, srcPart;
2628
2629 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2630
2631 This cannot overflow, because
2632
2633 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2634
2635 which is less than n^2. */
2636
2637 srcPart = src[i];
2638
2639 if (multiplier == 0 || srcPart == 0) {
2640 low = carry;
2641 high = 0;
2642 } else {
2643 low = lowHalf(srcPart) * lowHalf(multiplier);
2644 high = highHalf(srcPart) * highHalf(multiplier);
2645
2646 mid = lowHalf(srcPart) * highHalf(multiplier);
2647 high += highHalf(mid);
2648 mid <<= integerPartWidth / 2;
2649 if (low + mid < low)
2650 high++;
2651 low += mid;
2652
2653 mid = highHalf(srcPart) * lowHalf(multiplier);
2654 high += highHalf(mid);
2655 mid <<= integerPartWidth / 2;
2656 if (low + mid < low)
2657 high++;
2658 low += mid;
2659
2660 /* Now add carry. */
2661 if (low + carry < low)
2662 high++;
2663 low += carry;
2664 }
2665
2666 if (add) {
2667 /* And now DST[i], and store the new low part there. */
2668 if (low + dst[i] < low)
2669 high++;
2670 dst[i] += low;
2671 } else
2672 dst[i] = low;
2673
2674 carry = high;
2675 }
2676
2677 if (i < dstParts) {
2678 /* Full multiplication, there is no overflow. */
2679 assert(i + 1 == dstParts);
2680 dst[i] = carry;
2681 return 0;
2682 } else {
2683 /* We overflowed if there is carry. */
2684 if (carry)
2685 return 1;
2686
2687 /* We would overflow if any significant unwritten parts would be
2688 non-zero. This is true if any remaining src parts are non-zero
2689 and the multiplier is non-zero. */
2690 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002691 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002692 if (src[i])
2693 return 1;
2694
2695 /* We fitted in the narrow destination. */
2696 return 0;
2697 }
2698}
2699
2700/* DST = LHS * RHS, where DST has the same width as the operands and
2701 is filled with the least significant parts of the result. Returns
2702 one if overflow occurred, otherwise zero. DST must be disjoint
2703 from both operands. */
2704int
2705APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2706 const integerPart *rhs, unsigned int parts)
2707{
2708 unsigned int i;
2709 int overflow;
2710
2711 assert(dst != lhs && dst != rhs);
2712
2713 overflow = 0;
2714 tcSet(dst, 0, parts);
2715
Dan Gohman16e02092010-03-24 19:38:02 +00002716 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002717 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2718 parts - i, true);
2719
2720 return overflow;
2721}
2722
Neil Booth978661d2007-10-06 00:24:48 +00002723/* DST = LHS * RHS, where DST has width the sum of the widths of the
2724 operands. No overflow occurs. DST must be disjoint from both
2725 operands. Returns the number of parts required to hold the
2726 result. */
2727unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002728APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002729 const integerPart *rhs, unsigned int lhsParts,
2730 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002731{
Neil Booth978661d2007-10-06 00:24:48 +00002732 /* Put the narrower number on the LHS for less loops below. */
2733 if (lhsParts > rhsParts) {
2734 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2735 } else {
2736 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002737
Neil Booth978661d2007-10-06 00:24:48 +00002738 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002739
Neil Booth978661d2007-10-06 00:24:48 +00002740 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002741
Dan Gohman16e02092010-03-24 19:38:02 +00002742 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002743 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002744
Neil Booth978661d2007-10-06 00:24:48 +00002745 n = lhsParts + rhsParts;
2746
2747 return n - (dst[n - 1] == 0);
2748 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002749}
2750
2751/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2752 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2753 set REMAINDER to the remainder, return zero. i.e.
2754
2755 OLD_LHS = RHS * LHS + REMAINDER
2756
2757 SCRATCH is a bignum of the same size as the operands and result for
2758 use by the routine; its contents need not be initialized and are
2759 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2760*/
2761int
2762APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2763 integerPart *remainder, integerPart *srhs,
2764 unsigned int parts)
2765{
2766 unsigned int n, shiftCount;
2767 integerPart mask;
2768
2769 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2770
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002771 shiftCount = tcMSB(rhs, parts) + 1;
2772 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002773 return true;
2774
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002775 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002776 n = shiftCount / integerPartWidth;
2777 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2778
2779 tcAssign(srhs, rhs, parts);
2780 tcShiftLeft(srhs, parts, shiftCount);
2781 tcAssign(remainder, lhs, parts);
2782 tcSet(lhs, 0, parts);
2783
2784 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2785 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002786 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002787 int compare;
2788
2789 compare = tcCompare(remainder, srhs, parts);
2790 if (compare >= 0) {
2791 tcSubtract(remainder, srhs, 0, parts);
2792 lhs[n] |= mask;
2793 }
2794
2795 if (shiftCount == 0)
2796 break;
2797 shiftCount--;
2798 tcShiftRight(srhs, parts, 1);
2799 if ((mask >>= 1) == 0)
2800 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2801 }
2802
2803 return false;
2804}
2805
2806/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2807 There are no restrictions on COUNT. */
2808void
2809APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2810{
Neil Booth68e53ad2007-10-08 13:47:12 +00002811 if (count) {
2812 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002813
Neil Booth68e53ad2007-10-08 13:47:12 +00002814 /* Jump is the inter-part jump; shift is is intra-part shift. */
2815 jump = count / integerPartWidth;
2816 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002817
Neil Booth68e53ad2007-10-08 13:47:12 +00002818 while (parts > jump) {
2819 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002820
Neil Booth68e53ad2007-10-08 13:47:12 +00002821 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002822
Neil Booth68e53ad2007-10-08 13:47:12 +00002823 /* dst[i] comes from the two parts src[i - jump] and, if we have
2824 an intra-part shift, src[i - jump - 1]. */
2825 part = dst[parts - jump];
2826 if (shift) {
2827 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002828 if (parts >= jump + 1)
2829 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2830 }
2831
Neil Booth68e53ad2007-10-08 13:47:12 +00002832 dst[parts] = part;
2833 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002834
Neil Booth68e53ad2007-10-08 13:47:12 +00002835 while (parts > 0)
2836 dst[--parts] = 0;
2837 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002838}
2839
2840/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2841 zero. There are no restrictions on COUNT. */
2842void
2843APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2844{
Neil Booth68e53ad2007-10-08 13:47:12 +00002845 if (count) {
2846 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002847
Neil Booth68e53ad2007-10-08 13:47:12 +00002848 /* Jump is the inter-part jump; shift is is intra-part shift. */
2849 jump = count / integerPartWidth;
2850 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002851
Neil Booth68e53ad2007-10-08 13:47:12 +00002852 /* Perform the shift. This leaves the most significant COUNT bits
2853 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002854 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002855 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002856
Neil Booth68e53ad2007-10-08 13:47:12 +00002857 if (i + jump >= parts) {
2858 part = 0;
2859 } else {
2860 part = dst[i + jump];
2861 if (shift) {
2862 part >>= shift;
2863 if (i + jump + 1 < parts)
2864 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2865 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002866 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002867
Neil Booth68e53ad2007-10-08 13:47:12 +00002868 dst[i] = part;
2869 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002870 }
2871}
2872
2873/* Bitwise and of two bignums. */
2874void
2875APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2876{
2877 unsigned int i;
2878
Dan Gohman16e02092010-03-24 19:38:02 +00002879 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002880 dst[i] &= rhs[i];
2881}
2882
2883/* Bitwise inclusive or of two bignums. */
2884void
2885APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2886{
2887 unsigned int i;
2888
Dan Gohman16e02092010-03-24 19:38:02 +00002889 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002890 dst[i] |= rhs[i];
2891}
2892
2893/* Bitwise exclusive or of two bignums. */
2894void
2895APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2896{
2897 unsigned int i;
2898
Dan Gohman16e02092010-03-24 19:38:02 +00002899 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002900 dst[i] ^= rhs[i];
2901}
2902
2903/* Complement a bignum in-place. */
2904void
2905APInt::tcComplement(integerPart *dst, unsigned int parts)
2906{
2907 unsigned int i;
2908
Dan Gohman16e02092010-03-24 19:38:02 +00002909 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002910 dst[i] = ~dst[i];
2911}
2912
2913/* Comparison (unsigned) of two bignums. */
2914int
2915APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2916 unsigned int parts)
2917{
2918 while (parts) {
2919 parts--;
2920 if (lhs[parts] == rhs[parts])
2921 continue;
2922
2923 if (lhs[parts] > rhs[parts])
2924 return 1;
2925 else
2926 return -1;
2927 }
2928
2929 return 0;
2930}
2931
2932/* Increment a bignum in-place, return the carry flag. */
2933integerPart
2934APInt::tcIncrement(integerPart *dst, unsigned int parts)
2935{
2936 unsigned int i;
2937
Dan Gohman16e02092010-03-24 19:38:02 +00002938 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002939 if (++dst[i] != 0)
2940 break;
2941
2942 return i == parts;
2943}
2944
2945/* Set the least significant BITS bits of a bignum, clear the
2946 rest. */
2947void
2948APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2949 unsigned int bits)
2950{
2951 unsigned int i;
2952
2953 i = 0;
2954 while (bits > integerPartWidth) {
2955 dst[i++] = ~(integerPart) 0;
2956 bits -= integerPartWidth;
2957 }
2958
2959 if (bits)
2960 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2961
2962 while (i < parts)
2963 dst[i++] = 0;
2964}