blob: 3774c5223c46db0fed27461a0e6c2dbf59158afa [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 Gregorf34fa6f2011-09-20 18:33:29 +000057 if (r <= radix - 11U)
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000058 return r + 10;
59
60 r = cdigit - 'a';
Douglas Gregorf34fa6f2011-09-20 18:33:29 +000061 if (r <= 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);
Eli Friedman9eb6b4d2011-10-07 23:40:49 +0000389 clearUnusedBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000390
391 // delete dest array and return
392 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000393 return *this;
394}
395
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000396APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000397 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000398 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000399 VAL &= RHS.VAL;
400 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000401 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000402 unsigned numWords = getNumWords();
403 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000404 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000405 return *this;
406}
407
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000408APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000409 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000410 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000411 VAL |= RHS.VAL;
412 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000413 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000414 unsigned numWords = getNumWords();
415 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000416 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000417 return *this;
418}
419
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000420APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000421 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000422 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000423 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000424 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000425 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000426 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000427 unsigned numWords = getNumWords();
428 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000429 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000430 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000431}
432
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000433APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000434 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000435 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000436 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000437 val[i] = pVal[i] & RHS.pVal[i];
438 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000439}
440
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000441APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000442 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000443 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000444 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000445 val[i] = pVal[i] | RHS.pVal[i];
446 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000447}
448
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000449APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000450 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000451 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000452 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000453 val[i] = pVal[i] ^ RHS.pVal[i];
454
455 // 0^0==1 so clear the high bits in case they got set.
456 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000457}
458
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000459bool APInt::operator !() const {
460 if (isSingleWord())
461 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000462
Chris Lattner455e9ab2009-01-21 18:09:24 +0000463 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000464 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000465 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000466 return true;
467}
468
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000469APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000470 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000471 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000472 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000473 APInt Result(*this);
474 Result *= RHS;
Eli Friedman9eb6b4d2011-10-07 23:40:49 +0000475 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000476}
477
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000478APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000479 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000480 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000481 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000482 APInt Result(BitWidth, 0);
483 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000484 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000485}
486
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000487APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000488 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000489 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000490 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000491 APInt Result(BitWidth, 0);
492 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000493 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000494}
495
Chris Lattner455e9ab2009-01-21 18:09:24 +0000496bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman078d9672010-11-18 17:14:56 +0000497 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopherd37eda82009-08-21 04:06:45 +0000498 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000499 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000500}
501
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000502bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000503 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000504 unsigned n1 = getActiveBits();
505 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000506
507 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000508 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000509 return false;
510
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000511 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000512 if (n1 <= APINT_BITS_PER_WORD)
513 return pVal[0] == RHS.pVal[0];
514
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000515 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000516 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000517 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000518 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000519 return true;
520}
521
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000522bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000523 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000524 if (n <= APINT_BITS_PER_WORD)
525 return pVal[0] == Val;
526 else
527 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000528}
529
Reid Spencere81d2da2007-02-16 22:36:51 +0000530bool APInt::ult(const APInt& RHS) const {
531 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
532 if (isSingleWord())
533 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000534
535 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000536 unsigned n1 = getActiveBits();
537 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000538
539 // If magnitude of LHS is less than RHS, return true.
540 if (n1 < n2)
541 return true;
542
543 // If magnitude of RHS is greather than LHS, return false.
544 if (n2 < n1)
545 return false;
546
547 // If they bot fit in a word, just compare the low order word
548 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
549 return pVal[0] < RHS.pVal[0];
550
551 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000552 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000553 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000554 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000555 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000556 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000557 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000558 }
559 return false;
560}
561
Reid Spencere81d2da2007-02-16 22:36:51 +0000562bool APInt::slt(const APInt& RHS) const {
563 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000564 if (isSingleWord()) {
565 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
566 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
567 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000568 }
Reid Spencera58f0582007-02-18 20:09:41 +0000569
570 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000571 APInt rhs(RHS);
572 bool lhsNeg = isNegative();
573 bool rhsNeg = rhs.isNegative();
574 if (lhsNeg) {
575 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000576 lhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000577 lhs++;
578 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000579 if (rhsNeg) {
580 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000581 rhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000582 rhs++;
583 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000584
585 // Now we have unsigned values to compare so do the comparison if necessary
586 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000587 if (lhsNeg)
588 if (rhsNeg)
589 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000590 else
591 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000592 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000593 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000594 else
Reid Spencera58f0582007-02-18 20:09:41 +0000595 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000596}
597
Jay Foad7a874dd2010-12-01 08:53:58 +0000598void APInt::setBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000599 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000600 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000601 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000602 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000603}
604
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000605/// Set the given bit to 0 whose position is given as "bitPosition".
606/// @brief Set a given bit to 0.
Jay Foad7a874dd2010-12-01 08:53:58 +0000607void APInt::clearBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000608 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000609 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000610 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000611 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000612}
613
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000614/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000615
Eric Christopherd37eda82009-08-21 04:06:45 +0000616/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000617/// as "bitPosition".
618/// @brief Toggles a given bit to its opposite value.
Jay Foad7a874dd2010-12-01 08:53:58 +0000619void APInt::flipBit(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000620 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad7a874dd2010-12-01 08:53:58 +0000621 if ((*this)[bitPosition]) clearBit(bitPosition);
622 else setBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000623}
624
Benjamin Kramer38e59892010-07-14 22:38:02 +0000625unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000626 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +0000627 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
628 radix == 36) &&
629 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000630
631 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000632
Eric Christophere250f2a2009-08-21 04:10:31 +0000633 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000634 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000635 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000636 if (*p == '-' || *p == '+') {
637 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000638 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000639 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000640 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000641
Reid Spencer57ae4f52007-04-13 19:19:07 +0000642 // For radixes of power-of-two values, the bits required is accurately and
643 // easily computed
644 if (radix == 2)
645 return slen + isNegative;
646 if (radix == 8)
647 return slen * 3 + isNegative;
648 if (radix == 16)
649 return slen * 4 + isNegative;
650
Douglas Gregordcd99962011-09-14 15:54:46 +0000651 // FIXME: base 36
652
Reid Spencer57ae4f52007-04-13 19:19:07 +0000653 // This is grossly inefficient but accurate. We could probably do something
654 // with a computation of roughly slen*64/20 and then adjust by the value of
655 // the first few digits. But, I'm not sure how accurate that could be.
656
657 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000658 // be too large. This avoids the assertion in the constructor. This
659 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
660 // bits in that case.
Douglas Gregordcd99962011-09-14 15:54:46 +0000661 unsigned sufficient
662 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
663 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000664
665 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000666 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000667
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000668 // Compute how many bits are required. If the log is infinite, assume we need
669 // just bit.
670 unsigned log = tmp.logBase2();
671 if (log == (unsigned)-1) {
672 return isNegative + 1;
673 } else {
674 return isNegative + log + 1;
675 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000676}
677
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000678// From http://www.burtleburtle.net, byBob Jenkins.
679// When targeting x86, both GCC and LLVM seem to recognize this as a
680// rotate instruction.
681#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencer794f4722007-02-26 21:02:27 +0000682
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000683// From http://www.burtleburtle.net, by Bob Jenkins.
684#define mix(a,b,c) \
685 { \
686 a -= c; a ^= rot(c, 4); c += b; \
687 b -= a; b ^= rot(a, 6); a += c; \
688 c -= b; c ^= rot(b, 8); b += a; \
689 a -= c; a ^= rot(c,16); c += b; \
690 b -= a; b ^= rot(a,19); a += c; \
691 c -= b; c ^= rot(b, 4); b += a; \
692 }
693
694// From http://www.burtleburtle.net, by Bob Jenkins.
695#define final(a,b,c) \
696 { \
697 c ^= b; c -= rot(b,14); \
698 a ^= c; a -= rot(c,11); \
699 b ^= a; b -= rot(a,25); \
700 c ^= b; c -= rot(b,16); \
701 a ^= c; a -= rot(c,4); \
702 b ^= a; b -= rot(a,14); \
703 c ^= b; c -= rot(b,24); \
704 }
705
706// hashword() was adapted from http://www.burtleburtle.net, by Bob
707// Jenkins. k is a pointer to an array of uint32_t values; length is
708// the length of the key, in 32-bit chunks. This version only handles
709// keys that are a multiple of 32 bits in size.
710static inline uint32_t hashword(const uint64_t *k64, size_t length)
711{
712 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
713 uint32_t a,b,c;
714
715 /* Set up the internal state */
716 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
717
718 /*------------------------------------------------- handle most of the key */
Dan Gohman16e02092010-03-24 19:38:02 +0000719 while (length > 3) {
720 a += k[0];
721 b += k[1];
722 c += k[2];
723 mix(a,b,c);
724 length -= 3;
725 k += 3;
726 }
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000727
728 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-05-13 23:23:20 +0000729 switch (length) { /* all the case statements fall through */
730 case 3 : c+=k[2];
731 case 2 : b+=k[1];
732 case 1 : a+=k[0];
733 final(a,b,c);
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000734 case 0: /* case 0: nothing left to add */
735 break;
736 }
737 /*------------------------------------------------------ report the result */
738 return c;
739}
740
741// hashword8() was adapted from http://www.burtleburtle.net, by Bob
742// Jenkins. This computes a 32-bit hash from one 64-bit word. When
743// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
744// function into about 35 instructions when inlined.
745static inline uint32_t hashword8(const uint64_t k64)
746{
747 uint32_t a,b,c;
748 a = b = c = 0xdeadbeef + 4;
749 b += k64 >> 32;
750 a += k64 & 0xffffffff;
751 final(a,b,c);
752 return c;
753}
754#undef final
755#undef mix
756#undef rot
757
758uint64_t APInt::getHashValue() const {
759 uint64_t hash;
Reid Spencer794f4722007-02-26 21:02:27 +0000760 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000761 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000762 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000763 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000764 return hash;
765}
766
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000767/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000768APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000769 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000770}
771
772/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000773APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000774 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000775 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000776}
777
Chris Lattner455e9ab2009-01-21 18:09:24 +0000778unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000779 // Treat the most significand word differently because it might have
780 // meaningless bits set beyond the precision.
781 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
782 integerPart MSWMask;
783 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
784 else {
785 MSWMask = ~integerPart(0);
786 BitsInMSW = APINT_BITS_PER_WORD;
787 }
788
789 unsigned i = getNumWords();
790 integerPart MSW = pVal[i-1] & MSWMask;
791 if (MSW)
792 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
793
794 unsigned Count = BitsInMSW;
795 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000796 if (pVal[i-1] == 0)
797 Count += APINT_BITS_PER_WORD;
798 else {
799 Count += CountLeadingZeros_64(pVal[i-1]);
800 break;
Reid Spencere549c492007-02-21 00:29:48 +0000801 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000802 }
John McCall281d0512010-02-03 03:42:44 +0000803 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000804}
805
Chris Lattner455e9ab2009-01-21 18:09:24 +0000806static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
807 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000808 if (skip)
809 V <<= skip;
810 while (V && (V & (1ULL << 63))) {
811 Count++;
812 V <<= 1;
813 }
814 return Count;
815}
816
Chris Lattner455e9ab2009-01-21 18:09:24 +0000817unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000818 if (isSingleWord())
819 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
820
Chris Lattner455e9ab2009-01-21 18:09:24 +0000821 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000822 unsigned shift;
823 if (!highWordBits) {
824 highWordBits = APINT_BITS_PER_WORD;
825 shift = 0;
826 } else {
827 shift = APINT_BITS_PER_WORD - highWordBits;
828 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000829 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000830 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000831 if (Count == highWordBits) {
832 for (i--; i >= 0; --i) {
833 if (pVal[i] == -1ULL)
834 Count += APINT_BITS_PER_WORD;
835 else {
836 Count += countLeadingOnes_64(pVal[i], 0);
837 break;
838 }
839 }
840 }
841 return Count;
842}
843
Chris Lattner455e9ab2009-01-21 18:09:24 +0000844unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000845 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000846 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
847 unsigned Count = 0;
848 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000849 for (; i < getNumWords() && pVal[i] == 0; ++i)
850 Count += APINT_BITS_PER_WORD;
851 if (i < getNumWords())
852 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000853 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000854}
855
Chris Lattner455e9ab2009-01-21 18:09:24 +0000856unsigned APInt::countTrailingOnesSlowCase() const {
857 unsigned Count = 0;
858 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000859 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000860 Count += APINT_BITS_PER_WORD;
861 if (i < getNumWords())
862 Count += CountTrailingOnes_64(pVal[i]);
863 return std::min(Count, BitWidth);
864}
865
Chris Lattner455e9ab2009-01-21 18:09:24 +0000866unsigned APInt::countPopulationSlowCase() const {
867 unsigned Count = 0;
868 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000869 Count += CountPopulation_64(pVal[i]);
870 return Count;
871}
872
Reid Spencere81d2da2007-02-16 22:36:51 +0000873APInt APInt::byteSwap() const {
874 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
875 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000876 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000877 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000878 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000879 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000880 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000881 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000882 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000883 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000884 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000885 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000886 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000887 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000888 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000889 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000890 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000891 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000892 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
893 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000894 }
895 return Result;
896 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000897}
898
Eric Christopherd37eda82009-08-21 04:06:45 +0000899APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000900 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000901 APInt A = API1, B = API2;
902 while (!!B) {
903 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000904 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000905 A = T;
906 }
907 return A;
908}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000909
Chris Lattner455e9ab2009-01-21 18:09:24 +0000910APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000911 union {
912 double D;
913 uint64_t I;
914 } T;
915 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000916
917 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000918 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000919
920 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000921 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000922
923 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000924 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000925 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000926
927 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
928 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
929
930 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000931 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000932 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000933 APInt(width, mantissa >> (52 - exp));
934
935 // If the client didn't provide enough bits for us to shift the mantissa into
936 // then the result is undefined, just return 0
937 if (width <= exp - 52)
938 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000939
940 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000941 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000942 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000943 return isNeg ? -Tmp : Tmp;
944}
945
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000946/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000947/// The layout for double is as following (IEEE Standard 754):
948/// --------------------------------------
949/// | Sign Exponent Fraction Bias |
950/// |-------------------------------------- |
951/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000952/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000953double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000954
955 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000956 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000957 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
958 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000959 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000960 return double(sext);
961 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000962 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000963 }
964
Reid Spencer9c0696f2007-02-20 08:51:03 +0000965 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000966 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000967
968 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000969 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000970
971 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000972 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000973
Reid Spencer9c0696f2007-02-20 08:51:03 +0000974 // The exponent (without bias normalization) is just the number of bits
975 // we are using. Note that the sign bit is gone since we constructed the
976 // absolute value.
977 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000978
Reid Spencer9c0696f2007-02-20 08:51:03 +0000979 // Return infinity for exponent overflow
980 if (exp > 1023) {
981 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000982 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000983 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000984 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000985 }
986 exp += 1023; // Increment for 1023 bias
987
988 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
989 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000990 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000991 unsigned hiWord = whichWord(n-1);
992 if (hiWord == 0) {
993 mantissa = Tmp.pVal[0];
994 if (n > 52)
995 mantissa >>= n - 52; // shift down, we want the top 52 bits.
996 } else {
997 assert(hiWord > 0 && "huh?");
998 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
999 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
1000 mantissa = hibits | lobits;
1001 }
1002
Zhou Shengd93f00c2007-02-12 20:02:55 +00001003 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +00001004 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +00001005 union {
1006 double D;
1007 uint64_t I;
1008 } T;
1009 T.I = sign | (exp << 52) | mantissa;
1010 return T.D;
1011}
1012
Reid Spencere81d2da2007-02-16 22:36:51 +00001013// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001014APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001015 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +00001016 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +00001017
1018 if (width <= APINT_BITS_PER_WORD)
1019 return APInt(width, getRawData()[0]);
1020
1021 APInt Result(getMemory(getNumWords(width)), width);
1022
1023 // Copy full words.
1024 unsigned i;
1025 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1026 Result.pVal[i] = pVal[i];
1027
1028 // Truncate and copy any partial word.
1029 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1030 if (bits != 0)
1031 Result.pVal[i] = pVal[i] << bits >> bits;
1032
1033 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001034}
1035
1036// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001037APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001038 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001039
1040 if (width <= APINT_BITS_PER_WORD) {
1041 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1042 val = (int64_t)val >> (width - BitWidth);
1043 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +00001044 }
1045
Jay Foad40f8f622010-12-07 08:25:19 +00001046 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +00001047
Jay Foad40f8f622010-12-07 08:25:19 +00001048 // Copy full words.
1049 unsigned i;
1050 uint64_t word = 0;
1051 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1052 word = getRawData()[i];
1053 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +00001054 }
1055
Jay Foad40f8f622010-12-07 08:25:19 +00001056 // Read and sign-extend any partial word.
1057 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1058 if (bits != 0)
1059 word = (int64_t)getRawData()[i] << bits >> bits;
1060 else
1061 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1062
1063 // Write remaining full words.
1064 for (; i != width / APINT_BITS_PER_WORD; i++) {
1065 Result.pVal[i] = word;
1066 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +00001067 }
Jay Foad40f8f622010-12-07 08:25:19 +00001068
1069 // Write any partial word.
1070 bits = (0 - width) % APINT_BITS_PER_WORD;
1071 if (bits != 0)
1072 Result.pVal[i] = word << bits >> bits;
1073
1074 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001075}
1076
1077// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001078APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001079 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001080
1081 if (width <= APINT_BITS_PER_WORD)
1082 return APInt(width, VAL);
1083
1084 APInt Result(getMemory(getNumWords(width)), width);
1085
1086 // Copy words.
1087 unsigned i;
1088 for (i = 0; i != getNumWords(); i++)
1089 Result.pVal[i] = getRawData()[i];
1090
1091 // Zero remaining words.
1092 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1093
1094 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001095}
1096
Jay Foad40f8f622010-12-07 08:25:19 +00001097APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001098 if (BitWidth < width)
1099 return zext(width);
1100 if (BitWidth > width)
1101 return trunc(width);
1102 return *this;
1103}
1104
Jay Foad40f8f622010-12-07 08:25:19 +00001105APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001106 if (BitWidth < width)
1107 return sext(width);
1108 if (BitWidth > width)
1109 return trunc(width);
1110 return *this;
1111}
1112
Zhou Shengff4304f2007-02-09 07:48:24 +00001113/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001114/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001115APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001116 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001117}
1118
1119/// Arithmetic right-shift this APInt by shiftAmt.
1120/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001121APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001122 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001123 // Handle a degenerate case
1124 if (shiftAmt == 0)
1125 return *this;
1126
1127 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001128 if (isSingleWord()) {
1129 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001130 return APInt(BitWidth, 0); // undefined
1131 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001132 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001133 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001134 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1135 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001136 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001137
Reid Spencer46f9c942007-03-02 22:39:11 +00001138 // If all the bits were shifted out, the result is, technically, undefined.
1139 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1140 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001141 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001142 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001143 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001144 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001145 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001146 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001147
1148 // Create some space for the result.
1149 uint64_t * val = new uint64_t[getNumWords()];
1150
Reid Spencer46f9c942007-03-02 22:39:11 +00001151 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001152 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1153 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1154 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1155 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001156 if (bitsInWord == 0)
1157 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001158
1159 // If we are shifting whole words, just move whole words
1160 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001161 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001162 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001163 val[i] = pVal[i+offset]; // move whole word
1164
1165 // Adjust the top significant word for sign bit fill, if negative
1166 if (isNegative())
1167 if (bitsInWord < APINT_BITS_PER_WORD)
1168 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1169 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001170 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001171 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001172 // This combines the shifted corresponding word with the low bits from
1173 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001174 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001175 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1176 }
1177
1178 // Shift the break word. In this case there are no bits from the next word
1179 // to include in this word.
1180 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1181
1182 // Deal with sign extenstion in the break word, and possibly the word before
1183 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001184 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001185 if (wordShift > bitsInWord) {
1186 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001187 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001188 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1189 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001190 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001191 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001192 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001193 }
1194
Reid Spencer46f9c942007-03-02 22:39:11 +00001195 // Remaining words are 0 or -1, just assign them.
1196 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001197 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001198 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001199 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001200}
1201
Zhou Shengff4304f2007-02-09 07:48:24 +00001202/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001203/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001204APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001205 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001206}
1207
1208/// Logical right-shift this APInt by shiftAmt.
1209/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001210APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001211 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001212 if (shiftAmt == BitWidth)
1213 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001214 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001215 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001216 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001217
Reid Spencerba81c2b2007-02-26 01:19:48 +00001218 // If all the bits were shifted out, the result is 0. This avoids issues
1219 // with shifting by the size of the integer type, which produces undefined
1220 // results. We define these "undefined results" to always be 0.
1221 if (shiftAmt == BitWidth)
1222 return APInt(BitWidth, 0);
1223
Reid Spencer02ae8b72007-05-17 06:26:29 +00001224 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001225 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001226 // undefined results in the code below. This is also an optimization.
1227 if (shiftAmt == 0)
1228 return *this;
1229
Reid Spencerba81c2b2007-02-26 01:19:48 +00001230 // Create some space for the result.
1231 uint64_t * val = new uint64_t[getNumWords()];
1232
1233 // If we are shifting less than a word, compute the shift with a simple carry
1234 if (shiftAmt < APINT_BITS_PER_WORD) {
1235 uint64_t carry = 0;
1236 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001237 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001238 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1239 }
1240 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001241 }
1242
Reid Spencerba81c2b2007-02-26 01:19:48 +00001243 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001244 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1245 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001246
1247 // If we are shifting whole words, just move whole words
1248 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001249 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001250 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001251 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001252 val[i] = 0;
1253 return APInt(val,BitWidth).clearUnusedBits();
1254 }
1255
Eric Christopherd37eda82009-08-21 04:06:45 +00001256 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001257 unsigned breakWord = getNumWords() - offset -1;
1258 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001259 val[i] = (pVal[i+offset] >> wordShift) |
1260 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001261 // Shift the break word.
1262 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1263
1264 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001265 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001266 val[i] = 0;
1267 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001268}
1269
Zhou Shengff4304f2007-02-09 07:48:24 +00001270/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001271/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001272APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001273 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001274 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001275}
1276
Chris Lattner455e9ab2009-01-21 18:09:24 +00001277APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001278 // If all the bits were shifted out, the result is 0. This avoids issues
1279 // with shifting by the size of the integer type, which produces undefined
1280 // results. We define these "undefined results" to always be 0.
1281 if (shiftAmt == BitWidth)
1282 return APInt(BitWidth, 0);
1283
Reid Spencer92c72832007-05-12 18:01:57 +00001284 // If none of the bits are shifted out, the result is *this. This avoids a
1285 // lshr by the words size in the loop below which can produce incorrect
1286 // results. It also avoids the expensive computation below for a common case.
1287 if (shiftAmt == 0)
1288 return *this;
1289
Reid Spencer87553802007-02-25 00:56:44 +00001290 // Create some space for the result.
1291 uint64_t * val = new uint64_t[getNumWords()];
1292
1293 // If we are shifting less than a word, do it the easy way
1294 if (shiftAmt < APINT_BITS_PER_WORD) {
1295 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001296 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001297 val[i] = pVal[i] << shiftAmt | carry;
1298 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1299 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001300 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001301 }
1302
Reid Spencer87553802007-02-25 00:56:44 +00001303 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001304 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1305 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001306
1307 // If we are shifting whole words, just move whole words
1308 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001309 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001310 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001311 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001312 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001313 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001314 }
Reid Spencer87553802007-02-25 00:56:44 +00001315
1316 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001317 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001318 for (; i > offset; --i)
1319 val[i] = pVal[i-offset] << wordShift |
1320 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001321 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001322 for (i = 0; i < offset; ++i)
1323 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001324 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001325}
1326
Dan Gohmancf609572008-02-29 01:40:47 +00001327APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001328 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001329}
1330
Chris Lattner455e9ab2009-01-21 18:09:24 +00001331APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001332 if (rotateAmt == 0)
1333 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001334 // Don't get too fancy, just use existing shift/or facilities
1335 APInt hi(*this);
1336 APInt lo(*this);
1337 hi.shl(rotateAmt);
1338 lo.lshr(BitWidth - rotateAmt);
1339 return hi | lo;
1340}
1341
Dan Gohmancf609572008-02-29 01:40:47 +00001342APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001343 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001344}
1345
Chris Lattner455e9ab2009-01-21 18:09:24 +00001346APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001347 if (rotateAmt == 0)
1348 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001349 // Don't get too fancy, just use existing shift/or facilities
1350 APInt hi(*this);
1351 APInt lo(*this);
1352 lo.lshr(rotateAmt);
1353 hi.shl(BitWidth - rotateAmt);
1354 return hi | lo;
1355}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001356
1357// Square Root - this method computes and returns the square root of "this".
1358// Three mechanisms are used for computation. For small values (<= 5 bits),
1359// a table lookup is done. This gets some performance for common cases. For
1360// values using less than 52 bits, the value is converted to double and then
1361// the libc sqrt function is called. The result is rounded and then converted
1362// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001363// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001364APInt APInt::sqrt() const {
1365
1366 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001367 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001368
1369 // Use a fast table for some small values. This also gets rid of some
1370 // rounding errors in libc sqrt for small values.
1371 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001372 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001373 /* 0 */ 0,
1374 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001375 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001376 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1377 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1378 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1379 /* 31 */ 6
1380 };
1381 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001382 }
1383
1384 // If the magnitude of the value fits in less than 52 bits (the precision of
1385 // an IEEE double precision floating point value), then we can use the
1386 // libc sqrt function which will probably use a hardware sqrt computation.
1387 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001388 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001389#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001390 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001391 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001392#else
1393 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001394 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001395#endif
1396 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001397
1398 // Okay, all the short cuts are exhausted. We must compute it. The following
1399 // is a classical Babylonian method for computing the square root. This code
1400 // was adapted to APINt from a wikipedia article on such computations.
1401 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001402 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001403 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001404 APInt testy(BitWidth, 16);
1405 APInt x_old(BitWidth, 1);
1406 APInt x_new(BitWidth, 0);
1407 APInt two(BitWidth, 2);
1408
1409 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001410 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001411 if (i >= nbits || this->ule(testy)) {
1412 x_old = x_old.shl(i / 2);
1413 break;
1414 }
1415
Eric Christopherd37eda82009-08-21 04:06:45 +00001416 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001417 for (;;) {
1418 x_new = (this->udiv(x_old) + x_old).udiv(two);
1419 if (x_old.ule(x_new))
1420 break;
1421 x_old = x_new;
1422 }
1423
1424 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001425 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001426 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001427 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001428 // floating point representation after 192 bits. There are no discrepancies
1429 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001430 APInt square(x_old * x_old);
1431 APInt nextSquare((x_old + 1) * (x_old +1));
1432 if (this->ult(square))
1433 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001434 else if (this->ule(nextSquare)) {
1435 APInt midpoint((nextSquare - square).udiv(two));
1436 APInt offset(*this - square);
1437 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001438 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001439 else
1440 return x_old + 1;
1441 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001442 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001443 return x_old + 1;
1444}
1445
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001446/// Computes the multiplicative inverse of this APInt for a given modulo. The
1447/// iterative extended Euclidean algorithm is used to solve for this value,
1448/// however we simplify it to speed up calculating only the inverse, and take
1449/// advantage of div+rem calculations. We also use some tricks to avoid copying
1450/// (potentially large) APInts around.
1451APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1452 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1453
1454 // Using the properties listed at the following web page (accessed 06/21/08):
1455 // http://www.numbertheory.org/php/euclid.html
1456 // (especially the properties numbered 3, 4 and 9) it can be proved that
1457 // BitWidth bits suffice for all the computations in the algorithm implemented
1458 // below. More precisely, this number of bits suffice if the multiplicative
1459 // inverse exists, but may not suffice for the general extended Euclidean
1460 // algorithm.
1461
1462 APInt r[2] = { modulo, *this };
1463 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1464 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001465
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001466 unsigned i;
1467 for (i = 0; r[i^1] != 0; i ^= 1) {
1468 // An overview of the math without the confusing bit-flipping:
1469 // q = r[i-2] / r[i-1]
1470 // r[i] = r[i-2] % r[i-1]
1471 // t[i] = t[i-2] - t[i-1] * q
1472 udivrem(r[i], r[i^1], q, r[i]);
1473 t[i] -= t[i^1] * q;
1474 }
1475
1476 // If this APInt and the modulo are not coprime, there is no multiplicative
1477 // inverse, so return 0. We check this by looking at the next-to-last
1478 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1479 // algorithm.
1480 if (r[i] != 1)
1481 return APInt(BitWidth, 0);
1482
1483 // The next-to-last t is the multiplicative inverse. However, we are
1484 // interested in a positive inverse. Calcuate a positive one from a negative
1485 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001486 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001487 return t[i].isNegative() ? t[i] + modulo : t[i];
1488}
1489
Jay Foad4e5ea552009-04-30 10:15:35 +00001490/// Calculate the magic numbers required to implement a signed integer division
1491/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1492/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1493/// Warren, Jr., chapter 10.
1494APInt::ms APInt::magic() const {
1495 const APInt& d = *this;
1496 unsigned p;
1497 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001498 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001499 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001500
Jay Foad4e5ea552009-04-30 10:15:35 +00001501 ad = d.abs();
1502 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1503 anc = t - 1 - t.urem(ad); // absolute value of nc
1504 p = d.getBitWidth() - 1; // initialize p
1505 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1506 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1507 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1508 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1509 do {
1510 p = p + 1;
1511 q1 = q1<<1; // update q1 = 2p/abs(nc)
1512 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1513 if (r1.uge(anc)) { // must be unsigned comparison
1514 q1 = q1 + 1;
1515 r1 = r1 - anc;
1516 }
1517 q2 = q2<<1; // update q2 = 2p/abs(d)
1518 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1519 if (r2.uge(ad)) { // must be unsigned comparison
1520 q2 = q2 + 1;
1521 r2 = r2 - ad;
1522 }
1523 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001524 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001525
Jay Foad4e5ea552009-04-30 10:15:35 +00001526 mag.m = q2 + 1;
1527 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1528 mag.s = p - d.getBitWidth(); // resulting shift
1529 return mag;
1530}
1531
1532/// Calculate the magic numbers required to implement an unsigned integer
1533/// division by a constant as a sequence of multiplies, adds and shifts.
1534/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1535/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001536/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001537/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001538APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001539 const APInt& d = *this;
1540 unsigned p;
1541 APInt nc, delta, q1, r1, q2, r2;
1542 struct mu magu;
1543 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001544 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001545 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1546 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1547
1548 nc = allOnes - (-d).urem(d);
1549 p = d.getBitWidth() - 1; // initialize p
1550 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1551 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1552 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1553 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1554 do {
1555 p = p + 1;
1556 if (r1.uge(nc - r1)) {
1557 q1 = q1 + q1 + 1; // update q1
1558 r1 = r1 + r1 - nc; // update r1
1559 }
1560 else {
1561 q1 = q1+q1; // update q1
1562 r1 = r1+r1; // update r1
1563 }
1564 if ((r2 + 1).uge(d - r2)) {
1565 if (q2.uge(signedMax)) magu.a = 1;
1566 q2 = q2+q2 + 1; // update q2
1567 r2 = r2+r2 + 1 - d; // update r2
1568 }
1569 else {
1570 if (q2.uge(signedMin)) magu.a = 1;
1571 q2 = q2+q2; // update q2
1572 r2 = r2+r2 + 1; // update r2
1573 }
1574 delta = d - 1 - r2;
1575 } while (p < d.getBitWidth()*2 &&
1576 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1577 magu.m = q2 + 1; // resulting magic number
1578 magu.s = p - d.getBitWidth(); // resulting shift
1579 return magu;
1580}
1581
Reid Spencer9c0696f2007-02-20 08:51:03 +00001582/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1583/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1584/// variables here have the same names as in the algorithm. Comments explain
1585/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001586static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1587 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001588 assert(u && "Must provide dividend");
1589 assert(v && "Must provide divisor");
1590 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001591 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001592 assert(n>1 && "n must be > 1");
1593
1594 // Knuth uses the value b as the base of the number system. In our case b
1595 // is 2^31 so we just set it to -1u.
1596 uint64_t b = uint64_t(1) << 32;
1597
Chris Lattnerfad86b02008-08-17 07:19:36 +00001598#if 0
David Greene465abed2010-01-05 01:28:52 +00001599 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1600 DEBUG(dbgs() << "KnuthDiv: original:");
1601 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1602 DEBUG(dbgs() << " by");
1603 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1604 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001605#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001606 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1607 // u and v by d. Note that we have taken Knuth's advice here to use a power
1608 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1609 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001610 // shift amount from the leading zeros. We are basically normalizing the u
1611 // and v so that its high bits are shifted to the top of v's range without
1612 // overflow. Note that this can require an extra word in u so that u must
1613 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001614 unsigned shift = CountLeadingZeros_32(v[n-1]);
1615 unsigned v_carry = 0;
1616 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001617 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001618 for (unsigned i = 0; i < m+n; ++i) {
1619 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001620 u[i] = (u[i] << shift) | u_carry;
1621 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001622 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001623 for (unsigned i = 0; i < n; ++i) {
1624 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001625 v[i] = (v[i] << shift) | v_carry;
1626 v_carry = v_tmp;
1627 }
1628 }
1629 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001630#if 0
David Greene465abed2010-01-05 01:28:52 +00001631 DEBUG(dbgs() << "KnuthDiv: normal:");
1632 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1633 DEBUG(dbgs() << " by");
1634 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1635 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001636#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001637
1638 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1639 int j = m;
1640 do {
David Greene465abed2010-01-05 01:28:52 +00001641 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001642 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001643 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1644 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1645 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1646 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1647 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001648 // value qp is one too large, and it eliminates all cases where qp is two
1649 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001650 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001651 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001652 uint64_t qp = dividend / v[n-1];
1653 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001654 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1655 qp--;
1656 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001657 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001658 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001659 }
David Greene465abed2010-01-05 01:28:52 +00001660 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001661
Reid Spencer92904632007-02-23 01:57:13 +00001662 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1663 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1664 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001665 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001666 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001667 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001668 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001669 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001670 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001671 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001672 << ", subtrahend == " << subtrahend
1673 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001674
Reid Spencer610fad82007-02-24 10:01:42 +00001675 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001676 unsigned k = j + i;
1677 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1678 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001679 while (borrow && k <= m+n) { // deal with borrow to the left
1680 borrow = u[k] == 0;
1681 u[k]--;
1682 k++;
1683 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001684 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001685 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001686 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001687 }
David Greene465abed2010-01-05 01:28:52 +00001688 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1689 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1690 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001691 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1692 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001693 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001694 // the true value, and a "borrow" to the left should be remembered.
1695 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001696 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001697 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001698 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001699 u[i] = ~u[i] + carry; // b's complement
1700 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001701 }
Reid Spencer92904632007-02-23 01:57:13 +00001702 }
David Greene465abed2010-01-05 01:28:52 +00001703 DEBUG(dbgs() << "KnuthDiv: after complement:");
1704 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1705 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001706
Eric Christopherd37eda82009-08-21 04:06:45 +00001707 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001708 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001709 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001710 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001711 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001712 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001713 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001714 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001715 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1716 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001717 // since it cancels with the borrow that occurred in D4.
1718 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001719 for (unsigned i = 0; i < n; i++) {
1720 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001721 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001722 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001723 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001724 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001725 }
David Greene465abed2010-01-05 01:28:52 +00001726 DEBUG(dbgs() << "KnuthDiv: after correction:");
1727 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1728 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001729
Reid Spencer92904632007-02-23 01:57:13 +00001730 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1731 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001732
David Greene465abed2010-01-05 01:28:52 +00001733 DEBUG(dbgs() << "KnuthDiv: quotient:");
1734 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1735 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001736
Reid Spencer9c0696f2007-02-20 08:51:03 +00001737 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1738 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1739 // compute the remainder (urem uses this).
1740 if (r) {
1741 // The value d is expressed by the "shift" value above since we avoided
1742 // multiplication by d by using a shift left. So, all we have to do is
1743 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001744 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001745 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001746 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001747 for (int i = n-1; i >= 0; i--) {
1748 r[i] = (u[i] >> shift) | carry;
1749 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001750 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001751 }
1752 } else {
1753 for (int i = n-1; i >= 0; i--) {
1754 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001755 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001756 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001757 }
David Greene465abed2010-01-05 01:28:52 +00001758 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001759 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001760#if 0
David Greene465abed2010-01-05 01:28:52 +00001761 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001762#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001763}
1764
Chris Lattner455e9ab2009-01-21 18:09:24 +00001765void APInt::divide(const APInt LHS, unsigned lhsWords,
1766 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001767 APInt *Quotient, APInt *Remainder)
1768{
1769 assert(lhsWords >= rhsWords && "Fractional result");
1770
Eric Christopherd37eda82009-08-21 04:06:45 +00001771 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001772 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001773 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001774 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1775 // can't use 64-bit operands here because we don't have native results of
1776 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001777 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001778 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001779 unsigned n = rhsWords * 2;
1780 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001781
1782 // Allocate space for the temporary values we need either on the stack, if
1783 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001784 unsigned SPACE[128];
1785 unsigned *U = 0;
1786 unsigned *V = 0;
1787 unsigned *Q = 0;
1788 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001789 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1790 U = &SPACE[0];
1791 V = &SPACE[m+n+1];
1792 Q = &SPACE[(m+n+1) + n];
1793 if (Remainder)
1794 R = &SPACE[(m+n+1) + n + (m+n)];
1795 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001796 U = new unsigned[m + n + 1];
1797 V = new unsigned[n];
1798 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001799 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001800 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001801 }
1802
1803 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001804 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001805 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001806 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001807 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001808 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001809 }
1810 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1811
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001812 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001813 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001814 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001815 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001816 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001817 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001818 }
1819
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001820 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001821 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001822 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001823 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001824
Eric Christopherd37eda82009-08-21 04:06:45 +00001825 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001826 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001827 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001828 // contain any zero words or the Knuth algorithm fails.
1829 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1830 n--;
1831 m++;
1832 }
1833 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1834 m--;
1835
1836 // If we're left with only a single word for the divisor, Knuth doesn't work
1837 // so we implement the short division algorithm here. This is much simpler
1838 // and faster because we are certain that we can divide a 64-bit quantity
1839 // by a 32-bit quantity at hardware speed and short division is simply a
1840 // series of such operations. This is just like doing short division but we
1841 // are using base 2^32 instead of base 10.
1842 assert(n != 0 && "Divide by zero?");
1843 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001844 unsigned divisor = V[0];
1845 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001846 for (int i = m+n-1; i >= 0; i--) {
1847 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1848 if (partial_dividend == 0) {
1849 Q[i] = 0;
1850 remainder = 0;
1851 } else if (partial_dividend < divisor) {
1852 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001853 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001854 } else if (partial_dividend == divisor) {
1855 Q[i] = 1;
1856 remainder = 0;
1857 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001858 Q[i] = (unsigned)(partial_dividend / divisor);
1859 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001860 }
1861 }
1862 if (R)
1863 R[0] = remainder;
1864 } else {
1865 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1866 // case n > 1.
1867 KnuthDiv(U, V, Q, R, m, n);
1868 }
1869
1870 // If the caller wants the quotient
1871 if (Quotient) {
1872 // Set up the Quotient value's memory.
1873 if (Quotient->BitWidth != LHS.BitWidth) {
1874 if (Quotient->isSingleWord())
1875 Quotient->VAL = 0;
1876 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001877 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001878 Quotient->BitWidth = LHS.BitWidth;
1879 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001880 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001881 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001882 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001883
Eric Christopherd37eda82009-08-21 04:06:45 +00001884 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001885 // order words.
1886 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001887 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001888 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1889 if (Quotient->isSingleWord())
1890 Quotient->VAL = tmp;
1891 else
1892 Quotient->pVal[0] = tmp;
1893 } else {
1894 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1895 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001896 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001897 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1898 }
1899 }
1900
1901 // If the caller wants the remainder
1902 if (Remainder) {
1903 // Set up the Remainder value's memory.
1904 if (Remainder->BitWidth != RHS.BitWidth) {
1905 if (Remainder->isSingleWord())
1906 Remainder->VAL = 0;
1907 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001908 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001909 Remainder->BitWidth = RHS.BitWidth;
1910 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001911 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001912 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001913 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001914
1915 // The remainder is in R. Reconstitute the remainder into Remainder's low
1916 // order words.
1917 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001918 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001919 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1920 if (Remainder->isSingleWord())
1921 Remainder->VAL = tmp;
1922 else
1923 Remainder->pVal[0] = tmp;
1924 } else {
1925 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1926 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001927 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001928 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1929 }
1930 }
1931
1932 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001933 if (U != &SPACE[0]) {
1934 delete [] U;
1935 delete [] V;
1936 delete [] Q;
1937 delete [] R;
1938 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001939}
1940
Reid Spencere81d2da2007-02-16 22:36:51 +00001941APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001942 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001943
1944 // First, deal with the easy case
1945 if (isSingleWord()) {
1946 assert(RHS.VAL != 0 && "Divide by zero?");
1947 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001948 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001949
Reid Spencer71bd08f2007-02-17 02:07:07 +00001950 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001951 unsigned rhsBits = RHS.getActiveBits();
1952 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001953 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001954 unsigned lhsBits = this->getActiveBits();
1955 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001956
1957 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001958 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001959 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001960 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001961 else if (lhsWords < rhsWords || this->ult(RHS)) {
1962 // X / Y ===> 0, iff X < Y
1963 return APInt(BitWidth, 0);
1964 } else if (*this == RHS) {
1965 // X / X ===> 1
1966 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001967 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001968 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001969 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001970 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001971
1972 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1973 APInt Quotient(1,0); // to hold result.
1974 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1975 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001976}
1977
Reid Spencere81d2da2007-02-16 22:36:51 +00001978APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001979 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001980 if (isSingleWord()) {
1981 assert(RHS.VAL != 0 && "Remainder by zero?");
1982 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001983 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001984
Reid Spencere0cdd332007-02-21 08:21:52 +00001985 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001986 unsigned lhsBits = getActiveBits();
1987 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001988
1989 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001990 unsigned rhsBits = RHS.getActiveBits();
1991 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001992 assert(rhsWords && "Performing remainder operation by zero ???");
1993
Reid Spencer71bd08f2007-02-17 02:07:07 +00001994 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001995 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001996 // 0 % Y ===> 0
1997 return APInt(BitWidth, 0);
1998 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1999 // X % Y ===> X, iff X < Y
2000 return *this;
2001 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00002002 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00002003 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002004 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00002005 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00002006 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00002007 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002008
Reid Spencer19dc32a2007-05-13 23:44:59 +00002009 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00002010 APInt Remainder(1,0);
2011 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2012 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002013}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002014
Eric Christopherd37eda82009-08-21 04:06:45 +00002015void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002016 APInt &Quotient, APInt &Remainder) {
2017 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002018 unsigned lhsBits = LHS.getActiveBits();
2019 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2020 unsigned rhsBits = RHS.getActiveBits();
2021 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002022
2023 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002024 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002025 Quotient = 0; // 0 / Y ===> 0
2026 Remainder = 0; // 0 % Y ===> 0
2027 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002028 }
2029
2030 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002031 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002032 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002033 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002034 }
2035
Reid Spencer19dc32a2007-05-13 23:44:59 +00002036 if (LHS == RHS) {
2037 Quotient = 1; // X / X ===> 1
2038 Remainder = 0; // X % X ===> 0;
2039 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002040 }
2041
Reid Spencer19dc32a2007-05-13 23:44:59 +00002042 if (lhsWords == 1 && rhsWords == 1) {
2043 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002044 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2045 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2046 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2047 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002048 return;
2049 }
2050
2051 // Okay, lets do it the long way
2052 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2053}
2054
Chris Lattner0a0a5852010-10-13 23:54:10 +00002055APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002056 APInt Res = *this+RHS;
2057 Overflow = isNonNegative() == RHS.isNonNegative() &&
2058 Res.isNonNegative() != isNonNegative();
2059 return Res;
2060}
2061
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002062APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2063 APInt Res = *this+RHS;
2064 Overflow = Res.ult(RHS);
2065 return Res;
2066}
2067
Chris Lattner0a0a5852010-10-13 23:54:10 +00002068APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002069 APInt Res = *this - RHS;
2070 Overflow = isNonNegative() != RHS.isNonNegative() &&
2071 Res.isNonNegative() != isNonNegative();
2072 return Res;
2073}
2074
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002075APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002076 APInt Res = *this-RHS;
2077 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002078 return Res;
2079}
2080
Chris Lattner0a0a5852010-10-13 23:54:10 +00002081APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002082 // MININT/-1 --> overflow.
2083 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2084 return sdiv(RHS);
2085}
2086
Chris Lattner0a0a5852010-10-13 23:54:10 +00002087APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002088 APInt Res = *this * RHS;
2089
2090 if (*this != 0 && RHS != 0)
2091 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2092 else
2093 Overflow = false;
2094 return Res;
2095}
2096
Frits van Bommel62086102011-03-27 14:26:13 +00002097APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2098 APInt Res = *this * RHS;
2099
2100 if (*this != 0 && RHS != 0)
2101 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2102 else
2103 Overflow = false;
2104 return Res;
2105}
2106
Chris Lattner0a0a5852010-10-13 23:54:10 +00002107APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002108 Overflow = ShAmt >= getBitWidth();
2109 if (Overflow)
2110 ShAmt = getBitWidth()-1;
2111
2112 if (isNonNegative()) // Don't allow sign change.
2113 Overflow = ShAmt >= countLeadingZeros();
2114 else
2115 Overflow = ShAmt >= countLeadingOnes();
2116
2117 return *this << ShAmt;
2118}
2119
2120
2121
2122
Benjamin Kramer38e59892010-07-14 22:38:02 +00002123void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002124 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002125 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002126 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2127 radix == 36) &&
2128 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002129
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002130 StringRef::iterator p = str.begin();
2131 size_t slen = str.size();
2132 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002133 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002134 p++;
2135 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002136 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002137 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002138 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002139 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2140 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002141 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2142 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002143
2144 // Allocate memory
2145 if (!isSingleWord())
2146 pVal = getClearedMemory(getNumWords());
2147
2148 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002149 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002150
2151 // Set up an APInt for the digit to add outside the loop so we don't
2152 // constantly construct/destruct it.
2153 APInt apdigit(getBitWidth(), 0);
2154 APInt apradix(getBitWidth(), radix);
2155
2156 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002157 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002158 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002159 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002160
Reid Spencer6551dcd2007-05-16 19:18:22 +00002161 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002162 if (slen > 1) {
2163 if (shift)
2164 *this <<= shift;
2165 else
2166 *this *= apradix;
2167 }
Reid Spencer385f7542007-02-21 03:55:44 +00002168
2169 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002170 if (apdigit.isSingleWord())
2171 apdigit.VAL = digit;
2172 else
2173 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002174 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002175 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002176 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002177 if (isNeg) {
2178 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002179 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002180 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002181}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002182
Chris Lattnerfad86b02008-08-17 07:19:36 +00002183void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002184 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002185 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2186 Radix == 36) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002187 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002188
Ted Kremenekcf886182011-06-15 00:51:55 +00002189 const char *Prefix = "";
2190 if (formatAsCLiteral) {
2191 switch (Radix) {
2192 case 2:
2193 // Binary literals are a non-standard extension added in gcc 4.3:
2194 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2195 Prefix = "0b";
2196 break;
2197 case 8:
2198 Prefix = "0";
2199 break;
2200 case 16:
2201 Prefix = "0x";
2202 break;
2203 }
2204 }
2205
Chris Lattnerfad86b02008-08-17 07:19:36 +00002206 // First, check for a zero value and just short circuit the logic below.
2207 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002208 while (*Prefix) {
2209 Str.push_back(*Prefix);
2210 ++Prefix;
2211 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002212 Str.push_back('0');
2213 return;
2214 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002215
Douglas Gregordcd99962011-09-14 15:54:46 +00002216 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002217
Reid Spencer9c0696f2007-02-20 08:51:03 +00002218 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002219 char Buffer[65];
2220 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002221
Chris Lattnerfad86b02008-08-17 07:19:36 +00002222 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002223 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002224 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002225 } else {
2226 int64_t I = getSExtValue();
2227 if (I >= 0) {
2228 N = I;
2229 } else {
2230 Str.push_back('-');
2231 N = -(uint64_t)I;
2232 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002233 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002234
Ted Kremenekcf886182011-06-15 00:51:55 +00002235 while (*Prefix) {
2236 Str.push_back(*Prefix);
2237 ++Prefix;
2238 };
2239
Chris Lattnerfad86b02008-08-17 07:19:36 +00002240 while (N) {
2241 *--BufPtr = Digits[N % Radix];
2242 N /= Radix;
2243 }
2244 Str.append(BufPtr, Buffer+65);
2245 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002246 }
2247
Chris Lattnerfad86b02008-08-17 07:19:36 +00002248 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002249
Chris Lattnerfad86b02008-08-17 07:19:36 +00002250 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002251 // They want to print the signed version and it is a negative value
2252 // Flip the bits and add one to turn it into the equivalent positive
2253 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002254 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002255 Tmp++;
2256 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002257 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002258
Ted Kremenekcf886182011-06-15 00:51:55 +00002259 while (*Prefix) {
2260 Str.push_back(*Prefix);
2261 ++Prefix;
2262 };
2263
Chris Lattnerfad86b02008-08-17 07:19:36 +00002264 // We insert the digits backward, then reverse them to get the right order.
2265 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002266
2267 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2268 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002269 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002270 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002271 // Just shift tmp right for each digit width until it becomes zero
2272 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2273 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002274
Chris Lattnerfad86b02008-08-17 07:19:36 +00002275 while (Tmp != 0) {
2276 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2277 Str.push_back(Digits[Digit]);
2278 Tmp = Tmp.lshr(ShiftAmt);
2279 }
2280 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002281 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002282 while (Tmp != 0) {
2283 APInt APdigit(1, 0);
2284 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002285 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002286 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002287 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002288 assert(Digit < Radix && "divide failed");
2289 Str.push_back(Digits[Digit]);
2290 Tmp = tmp2;
2291 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002292 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002293
Chris Lattnerfad86b02008-08-17 07:19:36 +00002294 // Reverse the digits before returning.
2295 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002296}
2297
Chris Lattnerfad86b02008-08-17 07:19:36 +00002298/// toString - This returns the APInt as a std::string. Note that this is an
2299/// inefficient method. It is better to pass in a SmallVector/SmallString
2300/// to the methods above.
2301std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2302 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002303 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002304 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002305}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002306
Chris Lattnerfad86b02008-08-17 07:19:36 +00002307
2308void APInt::dump() const {
2309 SmallString<40> S, U;
2310 this->toStringUnsigned(U);
2311 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002312 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002313 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002314}
2315
Chris Lattner944fac72008-08-23 22:23:09 +00002316void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002317 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002318 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002319 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002320}
2321
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002322// This implements a variety of operations on a representation of
2323// arbitrary precision, two's-complement, bignum integer values.
2324
Chris Lattner91021d32009-08-23 23:11:28 +00002325// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2326// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002327#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002328COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002329
2330/* Some handy functions local to this file. */
2331namespace {
2332
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002333 /* Returns the integer part with the least significant BITS set.
2334 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002335 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002336 lowBitMask(unsigned int bits)
2337 {
Dan Gohman16e02092010-03-24 19:38:02 +00002338 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002339
2340 return ~(integerPart) 0 >> (integerPartWidth - bits);
2341 }
2342
Neil Booth055c0b32007-10-06 00:43:45 +00002343 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002344 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002345 lowHalf(integerPart part)
2346 {
2347 return part & lowBitMask(integerPartWidth / 2);
2348 }
2349
Neil Booth055c0b32007-10-06 00:43:45 +00002350 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002351 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002352 highHalf(integerPart part)
2353 {
2354 return part >> (integerPartWidth / 2);
2355 }
2356
Neil Booth055c0b32007-10-06 00:43:45 +00002357 /* Returns the bit number of the most significant set bit of a part.
2358 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002359 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002360 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002361 {
2362 unsigned int n, msb;
2363
2364 if (value == 0)
2365 return -1U;
2366
2367 n = integerPartWidth / 2;
2368
2369 msb = 0;
2370 do {
2371 if (value >> n) {
2372 value >>= n;
2373 msb += n;
2374 }
2375
2376 n >>= 1;
2377 } while (n);
2378
2379 return msb;
2380 }
2381
Neil Booth055c0b32007-10-06 00:43:45 +00002382 /* Returns the bit number of the least significant set bit of a
2383 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002384 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002385 partLSB(integerPart value)
2386 {
2387 unsigned int n, lsb;
2388
2389 if (value == 0)
2390 return -1U;
2391
2392 lsb = integerPartWidth - 1;
2393 n = integerPartWidth / 2;
2394
2395 do {
2396 if (value << n) {
2397 value <<= n;
2398 lsb -= n;
2399 }
2400
2401 n >>= 1;
2402 } while (n);
2403
2404 return lsb;
2405 }
2406}
2407
2408/* Sets the least significant part of a bignum to the input value, and
2409 zeroes out higher parts. */
2410void
2411APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2412{
2413 unsigned int i;
2414
Dan Gohman16e02092010-03-24 19:38:02 +00002415 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002416
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002417 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002418 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002419 dst[i] = 0;
2420}
2421
2422/* Assign one bignum to another. */
2423void
2424APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2425{
2426 unsigned int i;
2427
Dan Gohman16e02092010-03-24 19:38:02 +00002428 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002429 dst[i] = src[i];
2430}
2431
2432/* Returns true if a bignum is zero, false otherwise. */
2433bool
2434APInt::tcIsZero(const integerPart *src, unsigned int parts)
2435{
2436 unsigned int i;
2437
Dan Gohman16e02092010-03-24 19:38:02 +00002438 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002439 if (src[i])
2440 return false;
2441
2442 return true;
2443}
2444
2445/* Extract the given bit of a bignum; returns 0 or 1. */
2446int
2447APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2448{
Dan Gohman16e02092010-03-24 19:38:02 +00002449 return (parts[bit / integerPartWidth] &
2450 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002451}
2452
John McCalle12b7382010-02-28 02:51:25 +00002453/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002454void
2455APInt::tcSetBit(integerPart *parts, unsigned int bit)
2456{
2457 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2458}
2459
John McCalle12b7382010-02-28 02:51:25 +00002460/* Clears the given bit of a bignum. */
2461void
2462APInt::tcClearBit(integerPart *parts, unsigned int bit)
2463{
2464 parts[bit / integerPartWidth] &=
2465 ~((integerPart) 1 << (bit % integerPartWidth));
2466}
2467
Neil Booth055c0b32007-10-06 00:43:45 +00002468/* Returns the bit number of the least significant set bit of a
2469 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002470unsigned int
2471APInt::tcLSB(const integerPart *parts, unsigned int n)
2472{
2473 unsigned int i, lsb;
2474
Dan Gohman16e02092010-03-24 19:38:02 +00002475 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002476 if (parts[i] != 0) {
2477 lsb = partLSB(parts[i]);
2478
2479 return lsb + i * integerPartWidth;
2480 }
2481 }
2482
2483 return -1U;
2484}
2485
Neil Booth055c0b32007-10-06 00:43:45 +00002486/* Returns the bit number of the most significant set bit of a number.
2487 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002488unsigned int
2489APInt::tcMSB(const integerPart *parts, unsigned int n)
2490{
2491 unsigned int msb;
2492
2493 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002494 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002495
Dan Gohman16e02092010-03-24 19:38:02 +00002496 if (parts[n] != 0) {
2497 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002498
Dan Gohman16e02092010-03-24 19:38:02 +00002499 return msb + n * integerPartWidth;
2500 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002501 } while (n);
2502
2503 return -1U;
2504}
2505
Neil Booth68e53ad2007-10-08 13:47:12 +00002506/* Copy the bit vector of width srcBITS from SRC, starting at bit
2507 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2508 the least significant bit of DST. All high bits above srcBITS in
2509 DST are zero-filled. */
2510void
Evan Chengcf69a742009-05-21 23:47:47 +00002511APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002512 unsigned int srcBits, unsigned int srcLSB)
2513{
2514 unsigned int firstSrcPart, dstParts, shift, n;
2515
2516 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002517 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002518
2519 firstSrcPart = srcLSB / integerPartWidth;
2520 tcAssign (dst, src + firstSrcPart, dstParts);
2521
2522 shift = srcLSB % integerPartWidth;
2523 tcShiftRight (dst, dstParts, shift);
2524
2525 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2526 in DST. If this is less that srcBits, append the rest, else
2527 clear the high bits. */
2528 n = dstParts * integerPartWidth - shift;
2529 if (n < srcBits) {
2530 integerPart mask = lowBitMask (srcBits - n);
2531 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2532 << n % integerPartWidth);
2533 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002534 if (srcBits % integerPartWidth)
2535 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002536 }
2537
2538 /* Clear high parts. */
2539 while (dstParts < dstCount)
2540 dst[dstParts++] = 0;
2541}
2542
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002543/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2544integerPart
2545APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2546 integerPart c, unsigned int parts)
2547{
2548 unsigned int i;
2549
2550 assert(c <= 1);
2551
Dan Gohman16e02092010-03-24 19:38:02 +00002552 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002553 integerPart l;
2554
2555 l = dst[i];
2556 if (c) {
2557 dst[i] += rhs[i] + 1;
2558 c = (dst[i] <= l);
2559 } else {
2560 dst[i] += rhs[i];
2561 c = (dst[i] < l);
2562 }
2563 }
2564
2565 return c;
2566}
2567
2568/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2569integerPart
2570APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2571 integerPart c, unsigned int parts)
2572{
2573 unsigned int i;
2574
2575 assert(c <= 1);
2576
Dan Gohman16e02092010-03-24 19:38:02 +00002577 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002578 integerPart l;
2579
2580 l = dst[i];
2581 if (c) {
2582 dst[i] -= rhs[i] + 1;
2583 c = (dst[i] >= l);
2584 } else {
2585 dst[i] -= rhs[i];
2586 c = (dst[i] > l);
2587 }
2588 }
2589
2590 return c;
2591}
2592
2593/* Negate a bignum in-place. */
2594void
2595APInt::tcNegate(integerPart *dst, unsigned int parts)
2596{
2597 tcComplement(dst, parts);
2598 tcIncrement(dst, parts);
2599}
2600
Neil Booth055c0b32007-10-06 00:43:45 +00002601/* DST += SRC * MULTIPLIER + CARRY if add is true
2602 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002603
2604 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2605 they must start at the same point, i.e. DST == SRC.
2606
2607 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2608 returned. Otherwise DST is filled with the least significant
2609 DSTPARTS parts of the result, and if all of the omitted higher
2610 parts were zero return zero, otherwise overflow occurred and
2611 return one. */
2612int
2613APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2614 integerPart multiplier, integerPart carry,
2615 unsigned int srcParts, unsigned int dstParts,
2616 bool add)
2617{
2618 unsigned int i, n;
2619
2620 /* Otherwise our writes of DST kill our later reads of SRC. */
2621 assert(dst <= src || dst >= src + srcParts);
2622 assert(dstParts <= srcParts + 1);
2623
2624 /* N loops; minimum of dstParts and srcParts. */
2625 n = dstParts < srcParts ? dstParts: srcParts;
2626
Dan Gohman16e02092010-03-24 19:38:02 +00002627 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002628 integerPart low, mid, high, srcPart;
2629
2630 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2631
2632 This cannot overflow, because
2633
2634 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2635
2636 which is less than n^2. */
2637
2638 srcPart = src[i];
2639
2640 if (multiplier == 0 || srcPart == 0) {
2641 low = carry;
2642 high = 0;
2643 } else {
2644 low = lowHalf(srcPart) * lowHalf(multiplier);
2645 high = highHalf(srcPart) * highHalf(multiplier);
2646
2647 mid = lowHalf(srcPart) * highHalf(multiplier);
2648 high += highHalf(mid);
2649 mid <<= integerPartWidth / 2;
2650 if (low + mid < low)
2651 high++;
2652 low += mid;
2653
2654 mid = highHalf(srcPart) * lowHalf(multiplier);
2655 high += highHalf(mid);
2656 mid <<= integerPartWidth / 2;
2657 if (low + mid < low)
2658 high++;
2659 low += mid;
2660
2661 /* Now add carry. */
2662 if (low + carry < low)
2663 high++;
2664 low += carry;
2665 }
2666
2667 if (add) {
2668 /* And now DST[i], and store the new low part there. */
2669 if (low + dst[i] < low)
2670 high++;
2671 dst[i] += low;
2672 } else
2673 dst[i] = low;
2674
2675 carry = high;
2676 }
2677
2678 if (i < dstParts) {
2679 /* Full multiplication, there is no overflow. */
2680 assert(i + 1 == dstParts);
2681 dst[i] = carry;
2682 return 0;
2683 } else {
2684 /* We overflowed if there is carry. */
2685 if (carry)
2686 return 1;
2687
2688 /* We would overflow if any significant unwritten parts would be
2689 non-zero. This is true if any remaining src parts are non-zero
2690 and the multiplier is non-zero. */
2691 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002692 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002693 if (src[i])
2694 return 1;
2695
2696 /* We fitted in the narrow destination. */
2697 return 0;
2698 }
2699}
2700
2701/* DST = LHS * RHS, where DST has the same width as the operands and
2702 is filled with the least significant parts of the result. Returns
2703 one if overflow occurred, otherwise zero. DST must be disjoint
2704 from both operands. */
2705int
2706APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2707 const integerPart *rhs, unsigned int parts)
2708{
2709 unsigned int i;
2710 int overflow;
2711
2712 assert(dst != lhs && dst != rhs);
2713
2714 overflow = 0;
2715 tcSet(dst, 0, parts);
2716
Dan Gohman16e02092010-03-24 19:38:02 +00002717 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002718 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2719 parts - i, true);
2720
2721 return overflow;
2722}
2723
Neil Booth978661d2007-10-06 00:24:48 +00002724/* DST = LHS * RHS, where DST has width the sum of the widths of the
2725 operands. No overflow occurs. DST must be disjoint from both
2726 operands. Returns the number of parts required to hold the
2727 result. */
2728unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002729APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002730 const integerPart *rhs, unsigned int lhsParts,
2731 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002732{
Neil Booth978661d2007-10-06 00:24:48 +00002733 /* Put the narrower number on the LHS for less loops below. */
2734 if (lhsParts > rhsParts) {
2735 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2736 } else {
2737 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002738
Neil Booth978661d2007-10-06 00:24:48 +00002739 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002740
Neil Booth978661d2007-10-06 00:24:48 +00002741 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002742
Dan Gohman16e02092010-03-24 19:38:02 +00002743 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002744 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002745
Neil Booth978661d2007-10-06 00:24:48 +00002746 n = lhsParts + rhsParts;
2747
2748 return n - (dst[n - 1] == 0);
2749 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002750}
2751
2752/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2753 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2754 set REMAINDER to the remainder, return zero. i.e.
2755
2756 OLD_LHS = RHS * LHS + REMAINDER
2757
2758 SCRATCH is a bignum of the same size as the operands and result for
2759 use by the routine; its contents need not be initialized and are
2760 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2761*/
2762int
2763APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2764 integerPart *remainder, integerPart *srhs,
2765 unsigned int parts)
2766{
2767 unsigned int n, shiftCount;
2768 integerPart mask;
2769
2770 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2771
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002772 shiftCount = tcMSB(rhs, parts) + 1;
2773 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002774 return true;
2775
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002776 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002777 n = shiftCount / integerPartWidth;
2778 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2779
2780 tcAssign(srhs, rhs, parts);
2781 tcShiftLeft(srhs, parts, shiftCount);
2782 tcAssign(remainder, lhs, parts);
2783 tcSet(lhs, 0, parts);
2784
2785 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2786 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002787 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002788 int compare;
2789
2790 compare = tcCompare(remainder, srhs, parts);
2791 if (compare >= 0) {
2792 tcSubtract(remainder, srhs, 0, parts);
2793 lhs[n] |= mask;
2794 }
2795
2796 if (shiftCount == 0)
2797 break;
2798 shiftCount--;
2799 tcShiftRight(srhs, parts, 1);
2800 if ((mask >>= 1) == 0)
2801 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2802 }
2803
2804 return false;
2805}
2806
2807/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2808 There are no restrictions on COUNT. */
2809void
2810APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2811{
Neil Booth68e53ad2007-10-08 13:47:12 +00002812 if (count) {
2813 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002814
Neil Booth68e53ad2007-10-08 13:47:12 +00002815 /* Jump is the inter-part jump; shift is is intra-part shift. */
2816 jump = count / integerPartWidth;
2817 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002818
Neil Booth68e53ad2007-10-08 13:47:12 +00002819 while (parts > jump) {
2820 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002821
Neil Booth68e53ad2007-10-08 13:47:12 +00002822 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002823
Neil Booth68e53ad2007-10-08 13:47:12 +00002824 /* dst[i] comes from the two parts src[i - jump] and, if we have
2825 an intra-part shift, src[i - jump - 1]. */
2826 part = dst[parts - jump];
2827 if (shift) {
2828 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002829 if (parts >= jump + 1)
2830 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2831 }
2832
Neil Booth68e53ad2007-10-08 13:47:12 +00002833 dst[parts] = part;
2834 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002835
Neil Booth68e53ad2007-10-08 13:47:12 +00002836 while (parts > 0)
2837 dst[--parts] = 0;
2838 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002839}
2840
2841/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2842 zero. There are no restrictions on COUNT. */
2843void
2844APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2845{
Neil Booth68e53ad2007-10-08 13:47:12 +00002846 if (count) {
2847 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002848
Neil Booth68e53ad2007-10-08 13:47:12 +00002849 /* Jump is the inter-part jump; shift is is intra-part shift. */
2850 jump = count / integerPartWidth;
2851 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002852
Neil Booth68e53ad2007-10-08 13:47:12 +00002853 /* Perform the shift. This leaves the most significant COUNT bits
2854 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002855 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002856 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002857
Neil Booth68e53ad2007-10-08 13:47:12 +00002858 if (i + jump >= parts) {
2859 part = 0;
2860 } else {
2861 part = dst[i + jump];
2862 if (shift) {
2863 part >>= shift;
2864 if (i + jump + 1 < parts)
2865 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2866 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002867 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002868
Neil Booth68e53ad2007-10-08 13:47:12 +00002869 dst[i] = part;
2870 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002871 }
2872}
2873
2874/* Bitwise and of two bignums. */
2875void
2876APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2877{
2878 unsigned int i;
2879
Dan Gohman16e02092010-03-24 19:38:02 +00002880 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002881 dst[i] &= rhs[i];
2882}
2883
2884/* Bitwise inclusive or of two bignums. */
2885void
2886APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2887{
2888 unsigned int i;
2889
Dan Gohman16e02092010-03-24 19:38:02 +00002890 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002891 dst[i] |= rhs[i];
2892}
2893
2894/* Bitwise exclusive or of two bignums. */
2895void
2896APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2897{
2898 unsigned int i;
2899
Dan Gohman16e02092010-03-24 19:38:02 +00002900 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002901 dst[i] ^= rhs[i];
2902}
2903
2904/* Complement a bignum in-place. */
2905void
2906APInt::tcComplement(integerPart *dst, unsigned int parts)
2907{
2908 unsigned int i;
2909
Dan Gohman16e02092010-03-24 19:38:02 +00002910 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002911 dst[i] = ~dst[i];
2912}
2913
2914/* Comparison (unsigned) of two bignums. */
2915int
2916APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2917 unsigned int parts)
2918{
2919 while (parts) {
2920 parts--;
2921 if (lhs[parts] == rhs[parts])
2922 continue;
2923
2924 if (lhs[parts] > rhs[parts])
2925 return 1;
2926 else
2927 return -1;
2928 }
2929
2930 return 0;
2931}
2932
2933/* Increment a bignum in-place, return the carry flag. */
2934integerPart
2935APInt::tcIncrement(integerPart *dst, unsigned int parts)
2936{
2937 unsigned int i;
2938
Dan Gohman16e02092010-03-24 19:38:02 +00002939 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002940 if (++dst[i] != 0)
2941 break;
2942
2943 return i == parts;
2944}
2945
2946/* Set the least significant BITS bits of a bignum, clear the
2947 rest. */
2948void
2949APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2950 unsigned int bits)
2951{
2952 unsigned int i;
2953
2954 i = 0;
2955 while (bits > integerPartWidth) {
2956 dst[i++] = ~(integerPart) 0;
2957 bits -= integerPartWidth;
2958 }
2959
2960 if (bits)
2961 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2962
2963 while (i < parts)
2964 dst[i++] = 0;
2965}