blob: b5411bec9d4d5380958dc2959250c508f0593f51 [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
Richard Smithe73db4e2011-11-23 21:33:37 +0000873/// Perform a logical right-shift from Src to Dst, which must be equal or
874/// non-overlapping, of Words words, by Shift, which must be less than 64.
875static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
876 unsigned Shift) {
877 uint64_t Carry = 0;
878 for (int I = Words - 1; I >= 0; --I) {
879 uint64_t Tmp = Src[I];
880 Dst[I] = (Tmp >> Shift) | Carry;
881 Carry = Tmp << (64 - Shift);
882 }
883}
884
Reid Spencere81d2da2007-02-16 22:36:51 +0000885APInt APInt::byteSwap() const {
886 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
887 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000888 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000889 if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000890 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000891 if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000892 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000893 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000894 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000895 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000896 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengb04973e2007-02-15 06:36:31 +0000897 }
Richard Smithe73db4e2011-11-23 21:33:37 +0000898 if (BitWidth == 64)
899 return APInt(BitWidth, ByteSwap_64(VAL));
900
901 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
902 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
903 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
904 if (Result.BitWidth != BitWidth) {
905 lshrNear(Result.pVal, Result.pVal, getNumWords(),
906 Result.BitWidth - BitWidth);
907 Result.BitWidth = BitWidth;
908 }
909 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000910}
911
Eric Christopherd37eda82009-08-21 04:06:45 +0000912APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000913 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000914 APInt A = API1, B = API2;
915 while (!!B) {
916 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000917 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000918 A = T;
919 }
920 return A;
921}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000922
Chris Lattner455e9ab2009-01-21 18:09:24 +0000923APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000924 union {
925 double D;
926 uint64_t I;
927 } T;
928 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000929
930 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000931 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000932
933 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000934 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000935
936 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000937 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000938 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000939
940 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
941 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
942
943 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000944 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000945 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000946 APInt(width, mantissa >> (52 - exp));
947
948 // If the client didn't provide enough bits for us to shift the mantissa into
949 // then the result is undefined, just return 0
950 if (width <= exp - 52)
951 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000952
953 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000954 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000955 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000956 return isNeg ? -Tmp : Tmp;
957}
958
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000959/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000960/// The layout for double is as following (IEEE Standard 754):
961/// --------------------------------------
962/// | Sign Exponent Fraction Bias |
963/// |-------------------------------------- |
964/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000965/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000966double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000967
968 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000969 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000970 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
971 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000972 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000973 return double(sext);
974 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000975 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000976 }
977
Reid Spencer9c0696f2007-02-20 08:51:03 +0000978 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000979 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000980
981 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000982 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000983
984 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000985 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000986
Reid Spencer9c0696f2007-02-20 08:51:03 +0000987 // The exponent (without bias normalization) is just the number of bits
988 // we are using. Note that the sign bit is gone since we constructed the
989 // absolute value.
990 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000991
Reid Spencer9c0696f2007-02-20 08:51:03 +0000992 // Return infinity for exponent overflow
993 if (exp > 1023) {
994 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000995 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000996 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000997 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000998 }
999 exp += 1023; // Increment for 1023 bias
1000
1001 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
1002 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +00001003 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001004 unsigned hiWord = whichWord(n-1);
1005 if (hiWord == 0) {
1006 mantissa = Tmp.pVal[0];
1007 if (n > 52)
1008 mantissa >>= n - 52; // shift down, we want the top 52 bits.
1009 } else {
1010 assert(hiWord > 0 && "huh?");
1011 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
1012 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
1013 mantissa = hibits | lobits;
1014 }
1015
Zhou Shengd93f00c2007-02-12 20:02:55 +00001016 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +00001017 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +00001018 union {
1019 double D;
1020 uint64_t I;
1021 } T;
1022 T.I = sign | (exp << 52) | mantissa;
1023 return T.D;
1024}
1025
Reid Spencere81d2da2007-02-16 22:36:51 +00001026// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001027APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001028 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +00001029 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +00001030
1031 if (width <= APINT_BITS_PER_WORD)
1032 return APInt(width, getRawData()[0]);
1033
1034 APInt Result(getMemory(getNumWords(width)), width);
1035
1036 // Copy full words.
1037 unsigned i;
1038 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1039 Result.pVal[i] = pVal[i];
1040
1041 // Truncate and copy any partial word.
1042 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1043 if (bits != 0)
1044 Result.pVal[i] = pVal[i] << bits >> bits;
1045
1046 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001047}
1048
1049// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001050APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001051 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001052
1053 if (width <= APINT_BITS_PER_WORD) {
1054 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1055 val = (int64_t)val >> (width - BitWidth);
1056 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +00001057 }
1058
Jay Foad40f8f622010-12-07 08:25:19 +00001059 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +00001060
Jay Foad40f8f622010-12-07 08:25:19 +00001061 // Copy full words.
1062 unsigned i;
1063 uint64_t word = 0;
1064 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1065 word = getRawData()[i];
1066 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +00001067 }
1068
Jay Foad40f8f622010-12-07 08:25:19 +00001069 // Read and sign-extend any partial word.
1070 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1071 if (bits != 0)
1072 word = (int64_t)getRawData()[i] << bits >> bits;
1073 else
1074 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1075
1076 // Write remaining full words.
1077 for (; i != width / APINT_BITS_PER_WORD; i++) {
1078 Result.pVal[i] = word;
1079 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +00001080 }
Jay Foad40f8f622010-12-07 08:25:19 +00001081
1082 // Write any partial word.
1083 bits = (0 - width) % APINT_BITS_PER_WORD;
1084 if (bits != 0)
1085 Result.pVal[i] = word << bits >> bits;
1086
1087 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001088}
1089
1090// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001091APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001092 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001093
1094 if (width <= APINT_BITS_PER_WORD)
1095 return APInt(width, VAL);
1096
1097 APInt Result(getMemory(getNumWords(width)), width);
1098
1099 // Copy words.
1100 unsigned i;
1101 for (i = 0; i != getNumWords(); i++)
1102 Result.pVal[i] = getRawData()[i];
1103
1104 // Zero remaining words.
1105 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1106
1107 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001108}
1109
Jay Foad40f8f622010-12-07 08:25:19 +00001110APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001111 if (BitWidth < width)
1112 return zext(width);
1113 if (BitWidth > width)
1114 return trunc(width);
1115 return *this;
1116}
1117
Jay Foad40f8f622010-12-07 08:25:19 +00001118APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001119 if (BitWidth < width)
1120 return sext(width);
1121 if (BitWidth > width)
1122 return trunc(width);
1123 return *this;
1124}
1125
Zhou Shengff4304f2007-02-09 07:48:24 +00001126/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001127/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001128APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001129 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001130}
1131
1132/// Arithmetic right-shift this APInt by shiftAmt.
1133/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001134APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001135 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001136 // Handle a degenerate case
1137 if (shiftAmt == 0)
1138 return *this;
1139
1140 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001141 if (isSingleWord()) {
1142 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001143 return APInt(BitWidth, 0); // undefined
1144 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001145 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001146 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001147 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1148 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001149 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001150
Reid Spencer46f9c942007-03-02 22:39:11 +00001151 // If all the bits were shifted out, the result is, technically, undefined.
1152 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1153 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001154 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001155 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001156 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001157 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001158 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001159 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001160
1161 // Create some space for the result.
1162 uint64_t * val = new uint64_t[getNumWords()];
1163
Reid Spencer46f9c942007-03-02 22:39:11 +00001164 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001165 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1166 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1167 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1168 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001169 if (bitsInWord == 0)
1170 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001171
1172 // If we are shifting whole words, just move whole words
1173 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001174 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001175 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001176 val[i] = pVal[i+offset]; // move whole word
1177
1178 // Adjust the top significant word for sign bit fill, if negative
1179 if (isNegative())
1180 if (bitsInWord < APINT_BITS_PER_WORD)
1181 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1182 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001183 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001184 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001185 // This combines the shifted corresponding word with the low bits from
1186 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001187 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001188 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1189 }
1190
1191 // Shift the break word. In this case there are no bits from the next word
1192 // to include in this word.
1193 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1194
1195 // Deal with sign extenstion in the break word, and possibly the word before
1196 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001197 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001198 if (wordShift > bitsInWord) {
1199 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001200 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001201 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1202 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001203 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001204 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001205 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001206 }
1207
Reid Spencer46f9c942007-03-02 22:39:11 +00001208 // Remaining words are 0 or -1, just assign them.
1209 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001210 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001211 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001212 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001213}
1214
Zhou Shengff4304f2007-02-09 07:48:24 +00001215/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001216/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001217APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001218 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001219}
1220
1221/// Logical right-shift this APInt by shiftAmt.
1222/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001223APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001224 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001225 if (shiftAmt == BitWidth)
1226 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001227 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001228 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001229 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001230
Reid Spencerba81c2b2007-02-26 01:19:48 +00001231 // If all the bits were shifted out, the result is 0. This avoids issues
1232 // with shifting by the size of the integer type, which produces undefined
1233 // results. We define these "undefined results" to always be 0.
1234 if (shiftAmt == BitWidth)
1235 return APInt(BitWidth, 0);
1236
Reid Spencer02ae8b72007-05-17 06:26:29 +00001237 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001238 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001239 // undefined results in the code below. This is also an optimization.
1240 if (shiftAmt == 0)
1241 return *this;
1242
Reid Spencerba81c2b2007-02-26 01:19:48 +00001243 // Create some space for the result.
1244 uint64_t * val = new uint64_t[getNumWords()];
1245
1246 // If we are shifting less than a word, compute the shift with a simple carry
1247 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smithe73db4e2011-11-23 21:33:37 +00001248 lshrNear(val, pVal, getNumWords(), shiftAmt);
Reid Spencerba81c2b2007-02-26 01:19:48 +00001249 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001250 }
1251
Reid Spencerba81c2b2007-02-26 01:19:48 +00001252 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001253 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1254 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001255
1256 // If we are shifting whole words, just move whole words
1257 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001258 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001259 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001260 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001261 val[i] = 0;
1262 return APInt(val,BitWidth).clearUnusedBits();
1263 }
1264
Eric Christopherd37eda82009-08-21 04:06:45 +00001265 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001266 unsigned breakWord = getNumWords() - offset -1;
1267 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001268 val[i] = (pVal[i+offset] >> wordShift) |
1269 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001270 // Shift the break word.
1271 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1272
1273 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001274 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001275 val[i] = 0;
1276 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001277}
1278
Zhou Shengff4304f2007-02-09 07:48:24 +00001279/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001280/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001281APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001282 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001283 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001284}
1285
Chris Lattner455e9ab2009-01-21 18:09:24 +00001286APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001287 // If all the bits were shifted out, the result is 0. This avoids issues
1288 // with shifting by the size of the integer type, which produces undefined
1289 // results. We define these "undefined results" to always be 0.
1290 if (shiftAmt == BitWidth)
1291 return APInt(BitWidth, 0);
1292
Reid Spencer92c72832007-05-12 18:01:57 +00001293 // If none of the bits are shifted out, the result is *this. This avoids a
1294 // lshr by the words size in the loop below which can produce incorrect
1295 // results. It also avoids the expensive computation below for a common case.
1296 if (shiftAmt == 0)
1297 return *this;
1298
Reid Spencer87553802007-02-25 00:56:44 +00001299 // Create some space for the result.
1300 uint64_t * val = new uint64_t[getNumWords()];
1301
1302 // If we are shifting less than a word, do it the easy way
1303 if (shiftAmt < APINT_BITS_PER_WORD) {
1304 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001305 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001306 val[i] = pVal[i] << shiftAmt | carry;
1307 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1308 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001309 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001310 }
1311
Reid Spencer87553802007-02-25 00:56:44 +00001312 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001313 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1314 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001315
1316 // If we are shifting whole words, just move whole words
1317 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001318 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001319 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001320 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001321 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001322 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001323 }
Reid Spencer87553802007-02-25 00:56:44 +00001324
1325 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001326 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001327 for (; i > offset; --i)
1328 val[i] = pVal[i-offset] << wordShift |
1329 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001330 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001331 for (i = 0; i < offset; ++i)
1332 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001333 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001334}
1335
Dan Gohmancf609572008-02-29 01:40:47 +00001336APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001337 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001338}
1339
Chris Lattner455e9ab2009-01-21 18:09:24 +00001340APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001341 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001342 if (rotateAmt == 0)
1343 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001344 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001345}
1346
Dan Gohmancf609572008-02-29 01:40:47 +00001347APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001348 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001349}
1350
Chris Lattner455e9ab2009-01-21 18:09:24 +00001351APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001352 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001353 if (rotateAmt == 0)
1354 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001355 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001356}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001357
1358// Square Root - this method computes and returns the square root of "this".
1359// Three mechanisms are used for computation. For small values (<= 5 bits),
1360// a table lookup is done. This gets some performance for common cases. For
1361// values using less than 52 bits, the value is converted to double and then
1362// the libc sqrt function is called. The result is rounded and then converted
1363// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001364// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001365APInt APInt::sqrt() const {
1366
1367 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001368 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001369
1370 // Use a fast table for some small values. This also gets rid of some
1371 // rounding errors in libc sqrt for small values.
1372 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001373 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001374 /* 0 */ 0,
1375 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001376 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001377 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1378 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1379 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1380 /* 31 */ 6
1381 };
1382 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001383 }
1384
1385 // If the magnitude of the value fits in less than 52 bits (the precision of
1386 // an IEEE double precision floating point value), then we can use the
1387 // libc sqrt function which will probably use a hardware sqrt computation.
1388 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001389 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001390#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001391 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001392 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001393#else
1394 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001395 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001396#endif
1397 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001398
1399 // Okay, all the short cuts are exhausted. We must compute it. The following
1400 // is a classical Babylonian method for computing the square root. This code
1401 // was adapted to APINt from a wikipedia article on such computations.
1402 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001403 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001404 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001405 APInt testy(BitWidth, 16);
1406 APInt x_old(BitWidth, 1);
1407 APInt x_new(BitWidth, 0);
1408 APInt two(BitWidth, 2);
1409
1410 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001411 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001412 if (i >= nbits || this->ule(testy)) {
1413 x_old = x_old.shl(i / 2);
1414 break;
1415 }
1416
Eric Christopherd37eda82009-08-21 04:06:45 +00001417 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001418 for (;;) {
1419 x_new = (this->udiv(x_old) + x_old).udiv(two);
1420 if (x_old.ule(x_new))
1421 break;
1422 x_old = x_new;
1423 }
1424
1425 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001426 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001427 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001428 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001429 // floating point representation after 192 bits. There are no discrepancies
1430 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001431 APInt square(x_old * x_old);
1432 APInt nextSquare((x_old + 1) * (x_old +1));
1433 if (this->ult(square))
1434 return x_old;
David Blaikie18c7ec12011-12-01 20:58:30 +00001435 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1436 APInt midpoint((nextSquare - square).udiv(two));
1437 APInt offset(*this - square);
1438 if (offset.ult(midpoint))
1439 return x_old;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001440 return x_old + 1;
1441}
1442
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001443/// Computes the multiplicative inverse of this APInt for a given modulo. The
1444/// iterative extended Euclidean algorithm is used to solve for this value,
1445/// however we simplify it to speed up calculating only the inverse, and take
1446/// advantage of div+rem calculations. We also use some tricks to avoid copying
1447/// (potentially large) APInts around.
1448APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1449 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1450
1451 // Using the properties listed at the following web page (accessed 06/21/08):
1452 // http://www.numbertheory.org/php/euclid.html
1453 // (especially the properties numbered 3, 4 and 9) it can be proved that
1454 // BitWidth bits suffice for all the computations in the algorithm implemented
1455 // below. More precisely, this number of bits suffice if the multiplicative
1456 // inverse exists, but may not suffice for the general extended Euclidean
1457 // algorithm.
1458
1459 APInt r[2] = { modulo, *this };
1460 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1461 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001462
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001463 unsigned i;
1464 for (i = 0; r[i^1] != 0; i ^= 1) {
1465 // An overview of the math without the confusing bit-flipping:
1466 // q = r[i-2] / r[i-1]
1467 // r[i] = r[i-2] % r[i-1]
1468 // t[i] = t[i-2] - t[i-1] * q
1469 udivrem(r[i], r[i^1], q, r[i]);
1470 t[i] -= t[i^1] * q;
1471 }
1472
1473 // If this APInt and the modulo are not coprime, there is no multiplicative
1474 // inverse, so return 0. We check this by looking at the next-to-last
1475 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1476 // algorithm.
1477 if (r[i] != 1)
1478 return APInt(BitWidth, 0);
1479
1480 // The next-to-last t is the multiplicative inverse. However, we are
1481 // interested in a positive inverse. Calcuate a positive one from a negative
1482 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001483 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001484 return t[i].isNegative() ? t[i] + modulo : t[i];
1485}
1486
Jay Foad4e5ea552009-04-30 10:15:35 +00001487/// Calculate the magic numbers required to implement a signed integer division
1488/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1489/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1490/// Warren, Jr., chapter 10.
1491APInt::ms APInt::magic() const {
1492 const APInt& d = *this;
1493 unsigned p;
1494 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001495 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001496 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001497
Jay Foad4e5ea552009-04-30 10:15:35 +00001498 ad = d.abs();
1499 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1500 anc = t - 1 - t.urem(ad); // absolute value of nc
1501 p = d.getBitWidth() - 1; // initialize p
1502 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1503 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1504 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1505 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1506 do {
1507 p = p + 1;
1508 q1 = q1<<1; // update q1 = 2p/abs(nc)
1509 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1510 if (r1.uge(anc)) { // must be unsigned comparison
1511 q1 = q1 + 1;
1512 r1 = r1 - anc;
1513 }
1514 q2 = q2<<1; // update q2 = 2p/abs(d)
1515 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1516 if (r2.uge(ad)) { // must be unsigned comparison
1517 q2 = q2 + 1;
1518 r2 = r2 - ad;
1519 }
1520 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001521 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001522
Jay Foad4e5ea552009-04-30 10:15:35 +00001523 mag.m = q2 + 1;
1524 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1525 mag.s = p - d.getBitWidth(); // resulting shift
1526 return mag;
1527}
1528
1529/// Calculate the magic numbers required to implement an unsigned integer
1530/// division by a constant as a sequence of multiplies, adds and shifts.
1531/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1532/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001533/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001534/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001535APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001536 const APInt& d = *this;
1537 unsigned p;
1538 APInt nc, delta, q1, r1, q2, r2;
1539 struct mu magu;
1540 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001541 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001542 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1543 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1544
1545 nc = allOnes - (-d).urem(d);
1546 p = d.getBitWidth() - 1; // initialize p
1547 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1548 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1549 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1550 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1551 do {
1552 p = p + 1;
1553 if (r1.uge(nc - r1)) {
1554 q1 = q1 + q1 + 1; // update q1
1555 r1 = r1 + r1 - nc; // update r1
1556 }
1557 else {
1558 q1 = q1+q1; // update q1
1559 r1 = r1+r1; // update r1
1560 }
1561 if ((r2 + 1).uge(d - r2)) {
1562 if (q2.uge(signedMax)) magu.a = 1;
1563 q2 = q2+q2 + 1; // update q2
1564 r2 = r2+r2 + 1 - d; // update r2
1565 }
1566 else {
1567 if (q2.uge(signedMin)) magu.a = 1;
1568 q2 = q2+q2; // update q2
1569 r2 = r2+r2 + 1; // update r2
1570 }
1571 delta = d - 1 - r2;
1572 } while (p < d.getBitWidth()*2 &&
1573 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1574 magu.m = q2 + 1; // resulting magic number
1575 magu.s = p - d.getBitWidth(); // resulting shift
1576 return magu;
1577}
1578
Reid Spencer9c0696f2007-02-20 08:51:03 +00001579/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1580/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1581/// variables here have the same names as in the algorithm. Comments explain
1582/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001583static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1584 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001585 assert(u && "Must provide dividend");
1586 assert(v && "Must provide divisor");
1587 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001588 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001589 assert(n>1 && "n must be > 1");
1590
1591 // Knuth uses the value b as the base of the number system. In our case b
1592 // is 2^31 so we just set it to -1u.
1593 uint64_t b = uint64_t(1) << 32;
1594
Chris Lattnerfad86b02008-08-17 07:19:36 +00001595#if 0
David Greene465abed2010-01-05 01:28:52 +00001596 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1597 DEBUG(dbgs() << "KnuthDiv: original:");
1598 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1599 DEBUG(dbgs() << " by");
1600 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1601 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001602#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001603 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1604 // u and v by d. Note that we have taken Knuth's advice here to use a power
1605 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1606 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001607 // shift amount from the leading zeros. We are basically normalizing the u
1608 // and v so that its high bits are shifted to the top of v's range without
1609 // overflow. Note that this can require an extra word in u so that u must
1610 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001611 unsigned shift = CountLeadingZeros_32(v[n-1]);
1612 unsigned v_carry = 0;
1613 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001614 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001615 for (unsigned i = 0; i < m+n; ++i) {
1616 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001617 u[i] = (u[i] << shift) | u_carry;
1618 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001619 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001620 for (unsigned i = 0; i < n; ++i) {
1621 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001622 v[i] = (v[i] << shift) | v_carry;
1623 v_carry = v_tmp;
1624 }
1625 }
1626 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001627#if 0
David Greene465abed2010-01-05 01:28:52 +00001628 DEBUG(dbgs() << "KnuthDiv: normal:");
1629 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1630 DEBUG(dbgs() << " by");
1631 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1632 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001633#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001634
1635 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1636 int j = m;
1637 do {
David Greene465abed2010-01-05 01:28:52 +00001638 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001639 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001640 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1641 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1642 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1643 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1644 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001645 // value qp is one too large, and it eliminates all cases where qp is two
1646 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001647 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001648 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001649 uint64_t qp = dividend / v[n-1];
1650 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001651 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1652 qp--;
1653 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001654 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001655 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001656 }
David Greene465abed2010-01-05 01:28:52 +00001657 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001658
Reid Spencer92904632007-02-23 01:57:13 +00001659 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1660 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1661 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001662 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001663 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001664 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001665 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001666 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001667 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001668 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001669 << ", subtrahend == " << subtrahend
1670 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001671
Reid Spencer610fad82007-02-24 10:01:42 +00001672 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001673 unsigned k = j + i;
1674 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1675 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001676 while (borrow && k <= m+n) { // deal with borrow to the left
1677 borrow = u[k] == 0;
1678 u[k]--;
1679 k++;
1680 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001681 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001682 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001683 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001684 }
David Greene465abed2010-01-05 01:28:52 +00001685 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1686 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1687 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001688 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1689 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001690 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001691 // the true value, and a "borrow" to the left should be remembered.
1692 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001693 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001694 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001695 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001696 u[i] = ~u[i] + carry; // b's complement
1697 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001698 }
Reid Spencer92904632007-02-23 01:57:13 +00001699 }
David Greene465abed2010-01-05 01:28:52 +00001700 DEBUG(dbgs() << "KnuthDiv: after complement:");
1701 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1702 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001703
Eric Christopherd37eda82009-08-21 04:06:45 +00001704 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001705 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001706 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001707 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001708 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001709 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001710 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001711 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001712 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1713 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001714 // since it cancels with the borrow that occurred in D4.
1715 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001716 for (unsigned i = 0; i < n; i++) {
1717 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001718 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001719 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001720 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001721 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001722 }
David Greene465abed2010-01-05 01:28:52 +00001723 DEBUG(dbgs() << "KnuthDiv: after correction:");
1724 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1725 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001726
Reid Spencer92904632007-02-23 01:57:13 +00001727 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1728 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001729
David Greene465abed2010-01-05 01:28:52 +00001730 DEBUG(dbgs() << "KnuthDiv: quotient:");
1731 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1732 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001733
Reid Spencer9c0696f2007-02-20 08:51:03 +00001734 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1735 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1736 // compute the remainder (urem uses this).
1737 if (r) {
1738 // The value d is expressed by the "shift" value above since we avoided
1739 // multiplication by d by using a shift left. So, all we have to do is
1740 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001741 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001742 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001743 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001744 for (int i = n-1; i >= 0; i--) {
1745 r[i] = (u[i] >> shift) | carry;
1746 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001747 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001748 }
1749 } else {
1750 for (int i = n-1; i >= 0; i--) {
1751 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001752 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001753 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001754 }
David Greene465abed2010-01-05 01:28:52 +00001755 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001756 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001757#if 0
David Greene465abed2010-01-05 01:28:52 +00001758 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001759#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001760}
1761
Chris Lattner455e9ab2009-01-21 18:09:24 +00001762void APInt::divide(const APInt LHS, unsigned lhsWords,
1763 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001764 APInt *Quotient, APInt *Remainder)
1765{
1766 assert(lhsWords >= rhsWords && "Fractional result");
1767
Eric Christopherd37eda82009-08-21 04:06:45 +00001768 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001769 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001770 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001771 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1772 // can't use 64-bit operands here because we don't have native results of
1773 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001774 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001775 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001776 unsigned n = rhsWords * 2;
1777 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001778
1779 // Allocate space for the temporary values we need either on the stack, if
1780 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001781 unsigned SPACE[128];
1782 unsigned *U = 0;
1783 unsigned *V = 0;
1784 unsigned *Q = 0;
1785 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001786 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1787 U = &SPACE[0];
1788 V = &SPACE[m+n+1];
1789 Q = &SPACE[(m+n+1) + n];
1790 if (Remainder)
1791 R = &SPACE[(m+n+1) + n + (m+n)];
1792 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001793 U = new unsigned[m + n + 1];
1794 V = new unsigned[n];
1795 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001796 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001797 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001798 }
1799
1800 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001801 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001802 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001803 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001804 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001805 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 }
1807 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1808
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001809 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001810 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001811 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001812 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001813 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001814 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001815 }
1816
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001817 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001818 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001819 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001820 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001821
Eric Christopherd37eda82009-08-21 04:06:45 +00001822 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001823 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001824 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001825 // contain any zero words or the Knuth algorithm fails.
1826 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1827 n--;
1828 m++;
1829 }
1830 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1831 m--;
1832
1833 // If we're left with only a single word for the divisor, Knuth doesn't work
1834 // so we implement the short division algorithm here. This is much simpler
1835 // and faster because we are certain that we can divide a 64-bit quantity
1836 // by a 32-bit quantity at hardware speed and short division is simply a
1837 // series of such operations. This is just like doing short division but we
1838 // are using base 2^32 instead of base 10.
1839 assert(n != 0 && "Divide by zero?");
1840 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001841 unsigned divisor = V[0];
1842 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001843 for (int i = m+n-1; i >= 0; i--) {
1844 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1845 if (partial_dividend == 0) {
1846 Q[i] = 0;
1847 remainder = 0;
1848 } else if (partial_dividend < divisor) {
1849 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001850 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001851 } else if (partial_dividend == divisor) {
1852 Q[i] = 1;
1853 remainder = 0;
1854 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001855 Q[i] = (unsigned)(partial_dividend / divisor);
1856 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001857 }
1858 }
1859 if (R)
1860 R[0] = remainder;
1861 } else {
1862 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1863 // case n > 1.
1864 KnuthDiv(U, V, Q, R, m, n);
1865 }
1866
1867 // If the caller wants the quotient
1868 if (Quotient) {
1869 // Set up the Quotient value's memory.
1870 if (Quotient->BitWidth != LHS.BitWidth) {
1871 if (Quotient->isSingleWord())
1872 Quotient->VAL = 0;
1873 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001874 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001875 Quotient->BitWidth = LHS.BitWidth;
1876 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001877 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001878 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001879 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001880
Eric Christopherd37eda82009-08-21 04:06:45 +00001881 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001882 // order words.
1883 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001884 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001885 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1886 if (Quotient->isSingleWord())
1887 Quotient->VAL = tmp;
1888 else
1889 Quotient->pVal[0] = tmp;
1890 } else {
1891 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1892 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001893 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001894 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1895 }
1896 }
1897
1898 // If the caller wants the remainder
1899 if (Remainder) {
1900 // Set up the Remainder value's memory.
1901 if (Remainder->BitWidth != RHS.BitWidth) {
1902 if (Remainder->isSingleWord())
1903 Remainder->VAL = 0;
1904 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001905 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001906 Remainder->BitWidth = RHS.BitWidth;
1907 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001908 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001909 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001910 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001911
1912 // The remainder is in R. Reconstitute the remainder into Remainder's low
1913 // order words.
1914 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001915 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001916 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1917 if (Remainder->isSingleWord())
1918 Remainder->VAL = tmp;
1919 else
1920 Remainder->pVal[0] = tmp;
1921 } else {
1922 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1923 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001924 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001925 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1926 }
1927 }
1928
1929 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001930 if (U != &SPACE[0]) {
1931 delete [] U;
1932 delete [] V;
1933 delete [] Q;
1934 delete [] R;
1935 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001936}
1937
Reid Spencere81d2da2007-02-16 22:36:51 +00001938APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001939 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001940
1941 // First, deal with the easy case
1942 if (isSingleWord()) {
1943 assert(RHS.VAL != 0 && "Divide by zero?");
1944 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001945 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001946
Reid Spencer71bd08f2007-02-17 02:07:07 +00001947 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001948 unsigned rhsBits = RHS.getActiveBits();
1949 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001950 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001951 unsigned lhsBits = this->getActiveBits();
1952 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001953
1954 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001955 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001956 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001957 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001958 else if (lhsWords < rhsWords || this->ult(RHS)) {
1959 // X / Y ===> 0, iff X < Y
1960 return APInt(BitWidth, 0);
1961 } else if (*this == RHS) {
1962 // X / X ===> 1
1963 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001964 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001965 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001966 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001967 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001968
1969 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1970 APInt Quotient(1,0); // to hold result.
1971 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1972 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001973}
1974
Reid Spencere81d2da2007-02-16 22:36:51 +00001975APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001976 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001977 if (isSingleWord()) {
1978 assert(RHS.VAL != 0 && "Remainder by zero?");
1979 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001980 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001981
Reid Spencere0cdd332007-02-21 08:21:52 +00001982 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001983 unsigned lhsBits = getActiveBits();
1984 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001985
1986 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001987 unsigned rhsBits = RHS.getActiveBits();
1988 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001989 assert(rhsWords && "Performing remainder operation by zero ???");
1990
Reid Spencer71bd08f2007-02-17 02:07:07 +00001991 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001992 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001993 // 0 % Y ===> 0
1994 return APInt(BitWidth, 0);
1995 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1996 // X % Y ===> X, iff X < Y
1997 return *this;
1998 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001999 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00002000 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002001 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00002002 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00002003 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00002004 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002005
Reid Spencer19dc32a2007-05-13 23:44:59 +00002006 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00002007 APInt Remainder(1,0);
2008 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2009 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002010}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002011
Eric Christopherd37eda82009-08-21 04:06:45 +00002012void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002013 APInt &Quotient, APInt &Remainder) {
2014 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002015 unsigned lhsBits = LHS.getActiveBits();
2016 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2017 unsigned rhsBits = RHS.getActiveBits();
2018 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002019
2020 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002021 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002022 Quotient = 0; // 0 / Y ===> 0
2023 Remainder = 0; // 0 % Y ===> 0
2024 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002025 }
2026
2027 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002028 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002029 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002030 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002031 }
2032
Reid Spencer19dc32a2007-05-13 23:44:59 +00002033 if (LHS == RHS) {
2034 Quotient = 1; // X / X ===> 1
2035 Remainder = 0; // X % X ===> 0;
2036 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002037 }
2038
Reid Spencer19dc32a2007-05-13 23:44:59 +00002039 if (lhsWords == 1 && rhsWords == 1) {
2040 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002041 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2042 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2043 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2044 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002045 return;
2046 }
2047
2048 // Okay, lets do it the long way
2049 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2050}
2051
Chris Lattner0a0a5852010-10-13 23:54:10 +00002052APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002053 APInt Res = *this+RHS;
2054 Overflow = isNonNegative() == RHS.isNonNegative() &&
2055 Res.isNonNegative() != isNonNegative();
2056 return Res;
2057}
2058
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002059APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2060 APInt Res = *this+RHS;
2061 Overflow = Res.ult(RHS);
2062 return Res;
2063}
2064
Chris Lattner0a0a5852010-10-13 23:54:10 +00002065APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002066 APInt Res = *this - RHS;
2067 Overflow = isNonNegative() != RHS.isNonNegative() &&
2068 Res.isNonNegative() != isNonNegative();
2069 return Res;
2070}
2071
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002072APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002073 APInt Res = *this-RHS;
2074 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002075 return Res;
2076}
2077
Chris Lattner0a0a5852010-10-13 23:54:10 +00002078APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002079 // MININT/-1 --> overflow.
2080 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2081 return sdiv(RHS);
2082}
2083
Chris Lattner0a0a5852010-10-13 23:54:10 +00002084APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002085 APInt Res = *this * RHS;
2086
2087 if (*this != 0 && RHS != 0)
2088 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2089 else
2090 Overflow = false;
2091 return Res;
2092}
2093
Frits van Bommel62086102011-03-27 14:26:13 +00002094APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2095 APInt Res = *this * RHS;
2096
2097 if (*this != 0 && RHS != 0)
2098 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2099 else
2100 Overflow = false;
2101 return Res;
2102}
2103
Chris Lattner0a0a5852010-10-13 23:54:10 +00002104APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002105 Overflow = ShAmt >= getBitWidth();
2106 if (Overflow)
2107 ShAmt = getBitWidth()-1;
2108
2109 if (isNonNegative()) // Don't allow sign change.
2110 Overflow = ShAmt >= countLeadingZeros();
2111 else
2112 Overflow = ShAmt >= countLeadingOnes();
2113
2114 return *this << ShAmt;
2115}
2116
2117
2118
2119
Benjamin Kramer38e59892010-07-14 22:38:02 +00002120void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002121 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002122 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002123 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2124 radix == 36) &&
2125 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002126
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002127 StringRef::iterator p = str.begin();
2128 size_t slen = str.size();
2129 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002130 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002131 p++;
2132 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002133 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002134 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002135 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002136 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2137 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002138 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2139 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002140
2141 // Allocate memory
2142 if (!isSingleWord())
2143 pVal = getClearedMemory(getNumWords());
2144
2145 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002146 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002147
2148 // Set up an APInt for the digit to add outside the loop so we don't
2149 // constantly construct/destruct it.
2150 APInt apdigit(getBitWidth(), 0);
2151 APInt apradix(getBitWidth(), radix);
2152
2153 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002154 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002155 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002156 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002157
Reid Spencer6551dcd2007-05-16 19:18:22 +00002158 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002159 if (slen > 1) {
2160 if (shift)
2161 *this <<= shift;
2162 else
2163 *this *= apradix;
2164 }
Reid Spencer385f7542007-02-21 03:55:44 +00002165
2166 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002167 if (apdigit.isSingleWord())
2168 apdigit.VAL = digit;
2169 else
2170 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002171 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002172 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002173 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002174 if (isNeg) {
2175 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002176 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002177 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002178}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002179
Chris Lattnerfad86b02008-08-17 07:19:36 +00002180void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002181 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002182 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2183 Radix == 36) &&
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002184 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002185
Ted Kremenekcf886182011-06-15 00:51:55 +00002186 const char *Prefix = "";
2187 if (formatAsCLiteral) {
2188 switch (Radix) {
2189 case 2:
2190 // Binary literals are a non-standard extension added in gcc 4.3:
2191 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2192 Prefix = "0b";
2193 break;
2194 case 8:
2195 Prefix = "0";
2196 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002197 case 10:
2198 break; // No prefix
Ted Kremenekcf886182011-06-15 00:51:55 +00002199 case 16:
2200 Prefix = "0x";
2201 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002202 default:
2203 llvm_unreachable("Invalid radix!");
Ted Kremenekcf886182011-06-15 00:51:55 +00002204 }
2205 }
2206
Chris Lattnerfad86b02008-08-17 07:19:36 +00002207 // First, check for a zero value and just short circuit the logic below.
2208 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002209 while (*Prefix) {
2210 Str.push_back(*Prefix);
2211 ++Prefix;
2212 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002213 Str.push_back('0');
2214 return;
2215 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002216
Douglas Gregordcd99962011-09-14 15:54:46 +00002217 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002218
Reid Spencer9c0696f2007-02-20 08:51:03 +00002219 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002220 char Buffer[65];
2221 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002222
Chris Lattnerfad86b02008-08-17 07:19:36 +00002223 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002224 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002225 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002226 } else {
2227 int64_t I = getSExtValue();
2228 if (I >= 0) {
2229 N = I;
2230 } else {
2231 Str.push_back('-');
2232 N = -(uint64_t)I;
2233 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002234 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002235
Ted Kremenekcf886182011-06-15 00:51:55 +00002236 while (*Prefix) {
2237 Str.push_back(*Prefix);
2238 ++Prefix;
2239 };
2240
Chris Lattnerfad86b02008-08-17 07:19:36 +00002241 while (N) {
2242 *--BufPtr = Digits[N % Radix];
2243 N /= Radix;
2244 }
2245 Str.append(BufPtr, Buffer+65);
2246 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002247 }
2248
Chris Lattnerfad86b02008-08-17 07:19:36 +00002249 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002250
Chris Lattnerfad86b02008-08-17 07:19:36 +00002251 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002252 // They want to print the signed version and it is a negative value
2253 // Flip the bits and add one to turn it into the equivalent positive
2254 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002255 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002256 Tmp++;
2257 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002258 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002259
Ted Kremenekcf886182011-06-15 00:51:55 +00002260 while (*Prefix) {
2261 Str.push_back(*Prefix);
2262 ++Prefix;
2263 };
2264
Chris Lattnerfad86b02008-08-17 07:19:36 +00002265 // We insert the digits backward, then reverse them to get the right order.
2266 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002267
2268 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2269 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002270 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002271 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002272 // Just shift tmp right for each digit width until it becomes zero
2273 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2274 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002275
Chris Lattnerfad86b02008-08-17 07:19:36 +00002276 while (Tmp != 0) {
2277 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2278 Str.push_back(Digits[Digit]);
2279 Tmp = Tmp.lshr(ShiftAmt);
2280 }
2281 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002282 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002283 while (Tmp != 0) {
2284 APInt APdigit(1, 0);
2285 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002286 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002287 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002288 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002289 assert(Digit < Radix && "divide failed");
2290 Str.push_back(Digits[Digit]);
2291 Tmp = tmp2;
2292 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002293 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002294
Chris Lattnerfad86b02008-08-17 07:19:36 +00002295 // Reverse the digits before returning.
2296 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002297}
2298
Chris Lattnerfad86b02008-08-17 07:19:36 +00002299/// toString - This returns the APInt as a std::string. Note that this is an
2300/// inefficient method. It is better to pass in a SmallVector/SmallString
2301/// to the methods above.
2302std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2303 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002304 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002305 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002306}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002307
Chris Lattnerfad86b02008-08-17 07:19:36 +00002308
2309void APInt::dump() const {
2310 SmallString<40> S, U;
2311 this->toStringUnsigned(U);
2312 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002313 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002314 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002315}
2316
Chris Lattner944fac72008-08-23 22:23:09 +00002317void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002318 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002319 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002320 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002321}
2322
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002323// This implements a variety of operations on a representation of
2324// arbitrary precision, two's-complement, bignum integer values.
2325
Chris Lattner91021d32009-08-23 23:11:28 +00002326// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2327// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002328#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002329COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002330
2331/* Some handy functions local to this file. */
2332namespace {
2333
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002334 /* Returns the integer part with the least significant BITS set.
2335 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002336 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002337 lowBitMask(unsigned int bits)
2338 {
Dan Gohman16e02092010-03-24 19:38:02 +00002339 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002340
2341 return ~(integerPart) 0 >> (integerPartWidth - bits);
2342 }
2343
Neil Booth055c0b32007-10-06 00:43:45 +00002344 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002345 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002346 lowHalf(integerPart part)
2347 {
2348 return part & lowBitMask(integerPartWidth / 2);
2349 }
2350
Neil Booth055c0b32007-10-06 00:43:45 +00002351 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002352 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002353 highHalf(integerPart part)
2354 {
2355 return part >> (integerPartWidth / 2);
2356 }
2357
Neil Booth055c0b32007-10-06 00:43:45 +00002358 /* Returns the bit number of the most significant set bit of a part.
2359 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002360 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002361 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002362 {
2363 unsigned int n, msb;
2364
2365 if (value == 0)
2366 return -1U;
2367
2368 n = integerPartWidth / 2;
2369
2370 msb = 0;
2371 do {
2372 if (value >> n) {
2373 value >>= n;
2374 msb += n;
2375 }
2376
2377 n >>= 1;
2378 } while (n);
2379
2380 return msb;
2381 }
2382
Neil Booth055c0b32007-10-06 00:43:45 +00002383 /* Returns the bit number of the least significant set bit of a
2384 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002385 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002386 partLSB(integerPart value)
2387 {
2388 unsigned int n, lsb;
2389
2390 if (value == 0)
2391 return -1U;
2392
2393 lsb = integerPartWidth - 1;
2394 n = integerPartWidth / 2;
2395
2396 do {
2397 if (value << n) {
2398 value <<= n;
2399 lsb -= n;
2400 }
2401
2402 n >>= 1;
2403 } while (n);
2404
2405 return lsb;
2406 }
2407}
2408
2409/* Sets the least significant part of a bignum to the input value, and
2410 zeroes out higher parts. */
2411void
2412APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2413{
2414 unsigned int i;
2415
Dan Gohman16e02092010-03-24 19:38:02 +00002416 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002417
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002418 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002419 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002420 dst[i] = 0;
2421}
2422
2423/* Assign one bignum to another. */
2424void
2425APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2426{
2427 unsigned int i;
2428
Dan Gohman16e02092010-03-24 19:38:02 +00002429 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002430 dst[i] = src[i];
2431}
2432
2433/* Returns true if a bignum is zero, false otherwise. */
2434bool
2435APInt::tcIsZero(const integerPart *src, unsigned int parts)
2436{
2437 unsigned int i;
2438
Dan Gohman16e02092010-03-24 19:38:02 +00002439 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002440 if (src[i])
2441 return false;
2442
2443 return true;
2444}
2445
2446/* Extract the given bit of a bignum; returns 0 or 1. */
2447int
2448APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2449{
Dan Gohman16e02092010-03-24 19:38:02 +00002450 return (parts[bit / integerPartWidth] &
2451 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002452}
2453
John McCalle12b7382010-02-28 02:51:25 +00002454/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002455void
2456APInt::tcSetBit(integerPart *parts, unsigned int bit)
2457{
2458 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2459}
2460
John McCalle12b7382010-02-28 02:51:25 +00002461/* Clears the given bit of a bignum. */
2462void
2463APInt::tcClearBit(integerPart *parts, unsigned int bit)
2464{
2465 parts[bit / integerPartWidth] &=
2466 ~((integerPart) 1 << (bit % integerPartWidth));
2467}
2468
Neil Booth055c0b32007-10-06 00:43:45 +00002469/* Returns the bit number of the least significant set bit of a
2470 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002471unsigned int
2472APInt::tcLSB(const integerPart *parts, unsigned int n)
2473{
2474 unsigned int i, lsb;
2475
Dan Gohman16e02092010-03-24 19:38:02 +00002476 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002477 if (parts[i] != 0) {
2478 lsb = partLSB(parts[i]);
2479
2480 return lsb + i * integerPartWidth;
2481 }
2482 }
2483
2484 return -1U;
2485}
2486
Neil Booth055c0b32007-10-06 00:43:45 +00002487/* Returns the bit number of the most significant set bit of a number.
2488 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002489unsigned int
2490APInt::tcMSB(const integerPart *parts, unsigned int n)
2491{
2492 unsigned int msb;
2493
2494 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002495 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002496
Dan Gohman16e02092010-03-24 19:38:02 +00002497 if (parts[n] != 0) {
2498 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002499
Dan Gohman16e02092010-03-24 19:38:02 +00002500 return msb + n * integerPartWidth;
2501 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002502 } while (n);
2503
2504 return -1U;
2505}
2506
Neil Booth68e53ad2007-10-08 13:47:12 +00002507/* Copy the bit vector of width srcBITS from SRC, starting at bit
2508 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2509 the least significant bit of DST. All high bits above srcBITS in
2510 DST are zero-filled. */
2511void
Evan Chengcf69a742009-05-21 23:47:47 +00002512APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002513 unsigned int srcBits, unsigned int srcLSB)
2514{
2515 unsigned int firstSrcPart, dstParts, shift, n;
2516
2517 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002518 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002519
2520 firstSrcPart = srcLSB / integerPartWidth;
2521 tcAssign (dst, src + firstSrcPart, dstParts);
2522
2523 shift = srcLSB % integerPartWidth;
2524 tcShiftRight (dst, dstParts, shift);
2525
2526 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2527 in DST. If this is less that srcBits, append the rest, else
2528 clear the high bits. */
2529 n = dstParts * integerPartWidth - shift;
2530 if (n < srcBits) {
2531 integerPart mask = lowBitMask (srcBits - n);
2532 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2533 << n % integerPartWidth);
2534 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002535 if (srcBits % integerPartWidth)
2536 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002537 }
2538
2539 /* Clear high parts. */
2540 while (dstParts < dstCount)
2541 dst[dstParts++] = 0;
2542}
2543
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002544/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2545integerPart
2546APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2547 integerPart c, unsigned int parts)
2548{
2549 unsigned int i;
2550
2551 assert(c <= 1);
2552
Dan Gohman16e02092010-03-24 19:38:02 +00002553 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002554 integerPart l;
2555
2556 l = dst[i];
2557 if (c) {
2558 dst[i] += rhs[i] + 1;
2559 c = (dst[i] <= l);
2560 } else {
2561 dst[i] += rhs[i];
2562 c = (dst[i] < l);
2563 }
2564 }
2565
2566 return c;
2567}
2568
2569/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2570integerPart
2571APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2572 integerPart c, unsigned int parts)
2573{
2574 unsigned int i;
2575
2576 assert(c <= 1);
2577
Dan Gohman16e02092010-03-24 19:38:02 +00002578 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002579 integerPart l;
2580
2581 l = dst[i];
2582 if (c) {
2583 dst[i] -= rhs[i] + 1;
2584 c = (dst[i] >= l);
2585 } else {
2586 dst[i] -= rhs[i];
2587 c = (dst[i] > l);
2588 }
2589 }
2590
2591 return c;
2592}
2593
2594/* Negate a bignum in-place. */
2595void
2596APInt::tcNegate(integerPart *dst, unsigned int parts)
2597{
2598 tcComplement(dst, parts);
2599 tcIncrement(dst, parts);
2600}
2601
Neil Booth055c0b32007-10-06 00:43:45 +00002602/* DST += SRC * MULTIPLIER + CARRY if add is true
2603 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002604
2605 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2606 they must start at the same point, i.e. DST == SRC.
2607
2608 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2609 returned. Otherwise DST is filled with the least significant
2610 DSTPARTS parts of the result, and if all of the omitted higher
2611 parts were zero return zero, otherwise overflow occurred and
2612 return one. */
2613int
2614APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2615 integerPart multiplier, integerPart carry,
2616 unsigned int srcParts, unsigned int dstParts,
2617 bool add)
2618{
2619 unsigned int i, n;
2620
2621 /* Otherwise our writes of DST kill our later reads of SRC. */
2622 assert(dst <= src || dst >= src + srcParts);
2623 assert(dstParts <= srcParts + 1);
2624
2625 /* N loops; minimum of dstParts and srcParts. */
2626 n = dstParts < srcParts ? dstParts: srcParts;
2627
Dan Gohman16e02092010-03-24 19:38:02 +00002628 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002629 integerPart low, mid, high, srcPart;
2630
2631 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2632
2633 This cannot overflow, because
2634
2635 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2636
2637 which is less than n^2. */
2638
2639 srcPart = src[i];
2640
2641 if (multiplier == 0 || srcPart == 0) {
2642 low = carry;
2643 high = 0;
2644 } else {
2645 low = lowHalf(srcPart) * lowHalf(multiplier);
2646 high = highHalf(srcPart) * highHalf(multiplier);
2647
2648 mid = lowHalf(srcPart) * highHalf(multiplier);
2649 high += highHalf(mid);
2650 mid <<= integerPartWidth / 2;
2651 if (low + mid < low)
2652 high++;
2653 low += mid;
2654
2655 mid = highHalf(srcPart) * lowHalf(multiplier);
2656 high += highHalf(mid);
2657 mid <<= integerPartWidth / 2;
2658 if (low + mid < low)
2659 high++;
2660 low += mid;
2661
2662 /* Now add carry. */
2663 if (low + carry < low)
2664 high++;
2665 low += carry;
2666 }
2667
2668 if (add) {
2669 /* And now DST[i], and store the new low part there. */
2670 if (low + dst[i] < low)
2671 high++;
2672 dst[i] += low;
2673 } else
2674 dst[i] = low;
2675
2676 carry = high;
2677 }
2678
2679 if (i < dstParts) {
2680 /* Full multiplication, there is no overflow. */
2681 assert(i + 1 == dstParts);
2682 dst[i] = carry;
2683 return 0;
2684 } else {
2685 /* We overflowed if there is carry. */
2686 if (carry)
2687 return 1;
2688
2689 /* We would overflow if any significant unwritten parts would be
2690 non-zero. This is true if any remaining src parts are non-zero
2691 and the multiplier is non-zero. */
2692 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002693 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002694 if (src[i])
2695 return 1;
2696
2697 /* We fitted in the narrow destination. */
2698 return 0;
2699 }
2700}
2701
2702/* DST = LHS * RHS, where DST has the same width as the operands and
2703 is filled with the least significant parts of the result. Returns
2704 one if overflow occurred, otherwise zero. DST must be disjoint
2705 from both operands. */
2706int
2707APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2708 const integerPart *rhs, unsigned int parts)
2709{
2710 unsigned int i;
2711 int overflow;
2712
2713 assert(dst != lhs && dst != rhs);
2714
2715 overflow = 0;
2716 tcSet(dst, 0, parts);
2717
Dan Gohman16e02092010-03-24 19:38:02 +00002718 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002719 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2720 parts - i, true);
2721
2722 return overflow;
2723}
2724
Neil Booth978661d2007-10-06 00:24:48 +00002725/* DST = LHS * RHS, where DST has width the sum of the widths of the
2726 operands. No overflow occurs. DST must be disjoint from both
2727 operands. Returns the number of parts required to hold the
2728 result. */
2729unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002730APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002731 const integerPart *rhs, unsigned int lhsParts,
2732 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002733{
Neil Booth978661d2007-10-06 00:24:48 +00002734 /* Put the narrower number on the LHS for less loops below. */
2735 if (lhsParts > rhsParts) {
2736 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2737 } else {
2738 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002739
Neil Booth978661d2007-10-06 00:24:48 +00002740 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002741
Neil Booth978661d2007-10-06 00:24:48 +00002742 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002743
Dan Gohman16e02092010-03-24 19:38:02 +00002744 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002745 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002746
Neil Booth978661d2007-10-06 00:24:48 +00002747 n = lhsParts + rhsParts;
2748
2749 return n - (dst[n - 1] == 0);
2750 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002751}
2752
2753/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2754 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2755 set REMAINDER to the remainder, return zero. i.e.
2756
2757 OLD_LHS = RHS * LHS + REMAINDER
2758
2759 SCRATCH is a bignum of the same size as the operands and result for
2760 use by the routine; its contents need not be initialized and are
2761 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2762*/
2763int
2764APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2765 integerPart *remainder, integerPart *srhs,
2766 unsigned int parts)
2767{
2768 unsigned int n, shiftCount;
2769 integerPart mask;
2770
2771 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2772
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002773 shiftCount = tcMSB(rhs, parts) + 1;
2774 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002775 return true;
2776
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002777 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002778 n = shiftCount / integerPartWidth;
2779 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2780
2781 tcAssign(srhs, rhs, parts);
2782 tcShiftLeft(srhs, parts, shiftCount);
2783 tcAssign(remainder, lhs, parts);
2784 tcSet(lhs, 0, parts);
2785
2786 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2787 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002788 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002789 int compare;
2790
2791 compare = tcCompare(remainder, srhs, parts);
2792 if (compare >= 0) {
2793 tcSubtract(remainder, srhs, 0, parts);
2794 lhs[n] |= mask;
2795 }
2796
2797 if (shiftCount == 0)
2798 break;
2799 shiftCount--;
2800 tcShiftRight(srhs, parts, 1);
2801 if ((mask >>= 1) == 0)
2802 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2803 }
2804
2805 return false;
2806}
2807
2808/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2809 There are no restrictions on COUNT. */
2810void
2811APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2812{
Neil Booth68e53ad2007-10-08 13:47:12 +00002813 if (count) {
2814 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002815
Neil Booth68e53ad2007-10-08 13:47:12 +00002816 /* Jump is the inter-part jump; shift is is intra-part shift. */
2817 jump = count / integerPartWidth;
2818 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002819
Neil Booth68e53ad2007-10-08 13:47:12 +00002820 while (parts > jump) {
2821 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002822
Neil Booth68e53ad2007-10-08 13:47:12 +00002823 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002824
Neil Booth68e53ad2007-10-08 13:47:12 +00002825 /* dst[i] comes from the two parts src[i - jump] and, if we have
2826 an intra-part shift, src[i - jump - 1]. */
2827 part = dst[parts - jump];
2828 if (shift) {
2829 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002830 if (parts >= jump + 1)
2831 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2832 }
2833
Neil Booth68e53ad2007-10-08 13:47:12 +00002834 dst[parts] = part;
2835 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002836
Neil Booth68e53ad2007-10-08 13:47:12 +00002837 while (parts > 0)
2838 dst[--parts] = 0;
2839 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002840}
2841
2842/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2843 zero. There are no restrictions on COUNT. */
2844void
2845APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2846{
Neil Booth68e53ad2007-10-08 13:47:12 +00002847 if (count) {
2848 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002849
Neil Booth68e53ad2007-10-08 13:47:12 +00002850 /* Jump is the inter-part jump; shift is is intra-part shift. */
2851 jump = count / integerPartWidth;
2852 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002853
Neil Booth68e53ad2007-10-08 13:47:12 +00002854 /* Perform the shift. This leaves the most significant COUNT bits
2855 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002856 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002857 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002858
Neil Booth68e53ad2007-10-08 13:47:12 +00002859 if (i + jump >= parts) {
2860 part = 0;
2861 } else {
2862 part = dst[i + jump];
2863 if (shift) {
2864 part >>= shift;
2865 if (i + jump + 1 < parts)
2866 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2867 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002868 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002869
Neil Booth68e53ad2007-10-08 13:47:12 +00002870 dst[i] = part;
2871 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002872 }
2873}
2874
2875/* Bitwise and of two bignums. */
2876void
2877APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2878{
2879 unsigned int i;
2880
Dan Gohman16e02092010-03-24 19:38:02 +00002881 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002882 dst[i] &= rhs[i];
2883}
2884
2885/* Bitwise inclusive or of two bignums. */
2886void
2887APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2888{
2889 unsigned int i;
2890
Dan Gohman16e02092010-03-24 19:38:02 +00002891 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002892 dst[i] |= rhs[i];
2893}
2894
2895/* Bitwise exclusive or of two bignums. */
2896void
2897APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2898{
2899 unsigned int i;
2900
Dan Gohman16e02092010-03-24 19:38:02 +00002901 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002902 dst[i] ^= rhs[i];
2903}
2904
2905/* Complement a bignum in-place. */
2906void
2907APInt::tcComplement(integerPart *dst, unsigned int parts)
2908{
2909 unsigned int i;
2910
Dan Gohman16e02092010-03-24 19:38:02 +00002911 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002912 dst[i] = ~dst[i];
2913}
2914
2915/* Comparison (unsigned) of two bignums. */
2916int
2917APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2918 unsigned int parts)
2919{
2920 while (parts) {
2921 parts--;
2922 if (lhs[parts] == rhs[parts])
2923 continue;
2924
2925 if (lhs[parts] > rhs[parts])
2926 return 1;
2927 else
2928 return -1;
2929 }
2930
2931 return 0;
2932}
2933
2934/* Increment a bignum in-place, return the carry flag. */
2935integerPart
2936APInt::tcIncrement(integerPart *dst, unsigned int parts)
2937{
2938 unsigned int i;
2939
Dan Gohman16e02092010-03-24 19:38:02 +00002940 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002941 if (++dst[i] != 0)
2942 break;
2943
2944 return i == parts;
2945}
2946
2947/* Set the least significant BITS bits of a bignum, clear the
2948 rest. */
2949void
2950APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2951 unsigned int bits)
2952{
2953 unsigned int i;
2954
2955 i = 0;
2956 while (bits > integerPartWidth) {
2957 dst[i++] = ~(integerPart) 0;
2958 bits -= integerPartWidth;
2959 }
2960
2961 if (bits)
2962 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2963
2964 while (i < parts)
2965 dst[i++] = 0;
2966}