blob: a60bff330633269e01b03160d734d8d645bd1e98 [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"
Ted Kremeneke420deb2008-01-19 04:23:33 +000017#include "llvm/ADT/FoldingSet.h"
Chandler Carruthed7692a2012-03-04 12:02:57 +000018#include "llvm/ADT/Hashing.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Chandler Carruthed7692a2012-03-04 12:02:57 +000020#include "llvm/ADT/StringRef.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000021#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000022#include "llvm/Support/ErrorHandling.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000023#include "llvm/Support/MathExtras.h"
Chris Lattner944fac72008-08-23 22:23:09 +000024#include "llvm/Support/raw_ostream.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000025#include <cmath>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000026#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000027#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000028#include <cstdlib>
29using namespace llvm;
30
Reid Spencer5d0d05c2007-02-25 19:32:03 +000031/// A utility function for allocating memory, checking for allocation failures,
32/// and ensuring the contents are zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000033inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000034 uint64_t * result = new uint64_t[numWords];
35 assert(result && "APInt memory allocation fails!");
36 memset(result, 0, numWords * sizeof(uint64_t));
37 return result;
Zhou Sheng353815d2007-02-06 06:04:53 +000038}
39
Eric Christopherd37eda82009-08-21 04:06:45 +000040/// A utility function for allocating memory and checking for allocation
Reid Spencer5d0d05c2007-02-25 19:32:03 +000041/// failure. The content is not zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000042inline static uint64_t* getMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000043 uint64_t * result = new uint64_t[numWords];
44 assert(result && "APInt memory allocation fails!");
45 return result;
46}
47
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000048/// A utility function that converts a character to a digit.
49inline static unsigned getDigit(char cdigit, uint8_t radix) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000050 unsigned r;
51
Douglas Gregordcd99962011-09-14 15:54:46 +000052 if (radix == 16 || radix == 36) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000053 r = cdigit - '0';
54 if (r <= 9)
55 return r;
56
57 r = cdigit - 'A';
Douglas Gregorf34fa6f2011-09-20 18:33:29 +000058 if (r <= radix - 11U)
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000059 return r + 10;
60
61 r = cdigit - 'a';
Douglas Gregorf34fa6f2011-09-20 18:33:29 +000062 if (r <= radix - 11U)
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000063 return r + 10;
Douglas Gregorf83f0f82011-09-20 18:11:52 +000064
65 radix = 10;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000066 }
67
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000068 r = cdigit - '0';
69 if (r < radix)
70 return r;
71
72 return -1U;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000073}
74
75
Chris Lattner455e9ab2009-01-21 18:09:24 +000076void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000077 pVal = getClearedMemory(getNumWords());
78 pVal[0] = val;
Eric Christopherd37eda82009-08-21 04:06:45 +000079 if (isSigned && int64_t(val) < 0)
Chris Lattner98f8ccf2008-08-20 17:02:31 +000080 for (unsigned i = 1; i < getNumWords(); ++i)
81 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000082}
83
Chris Lattner119c30b2008-10-11 22:07:19 +000084void APInt::initSlowCase(const APInt& that) {
85 pVal = getMemory(getNumWords());
86 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
87}
88
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000089void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000090 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000091 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000092 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000093 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000094 else {
Reid Spencer610fad82007-02-24 10:01:42 +000095 // Get memory, cleared to 0
96 pVal = getClearedMemory(getNumWords());
97 // Calculate the number of words to copy
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000098 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +000099 // Copy the words from bigVal to pVal
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +0000100 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000101 }
Reid Spencer610fad82007-02-24 10:01:42 +0000102 // Make sure unused high bits are cleared
103 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000104}
105
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +0000106APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
107 : BitWidth(numBits), VAL(0) {
108 initFromArray(bigVal);
109}
110
111APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
112 : BitWidth(numBits), VAL(0) {
113 initFromArray(makeArrayRef(bigVal, numWords));
114}
115
Benjamin Kramer38e59892010-07-14 22:38:02 +0000116APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +0000117 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000118 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000119 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000120}
121
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000122APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000123 // Don't do anything for X = X
124 if (this == &RHS)
125 return *this;
126
Reid Spencer9ac44112007-02-26 23:38:21 +0000127 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000128 // assume same bit-width single-word case is already handled
129 assert(!isSingleWord());
130 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer9ac44112007-02-26 23:38:21 +0000131 return *this;
132 }
133
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000134 if (isSingleWord()) {
135 // assume case where both are single words is already handled
136 assert(!RHS.isSingleWord());
137 VAL = 0;
138 pVal = getMemory(RHS.getNumWords());
139 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopherd37eda82009-08-21 04:06:45 +0000140 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000141 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
142 else if (RHS.isSingleWord()) {
143 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000144 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000145 } else {
146 delete [] pVal;
147 pVal = getMemory(RHS.getNumWords());
148 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
149 }
150 BitWidth = RHS.BitWidth;
151 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000152}
153
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000154APInt& APInt::operator=(uint64_t RHS) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000155 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000156 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000157 else {
158 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000159 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000160 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000161 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000162}
163
Ted Kremeneke420deb2008-01-19 04:23:33 +0000164/// Profile - This method 'profiles' an APInt for use with FoldingSet.
165void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000166 ID.AddInteger(BitWidth);
Eric Christopherd37eda82009-08-21 04:06:45 +0000167
Ted Kremeneke420deb2008-01-19 04:23:33 +0000168 if (isSingleWord()) {
169 ID.AddInteger(VAL);
170 return;
171 }
172
Chris Lattner455e9ab2009-01-21 18:09:24 +0000173 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000174 for (unsigned i = 0; i < NumWords; ++i)
175 ID.AddInteger(pVal[i]);
176}
177
Eric Christopherd37eda82009-08-21 04:06:45 +0000178/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spenceraf0e9562007-02-18 18:38:44 +0000179/// "digit" integer array, x[]. x[] is modified to reflect the addition and
180/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000181/// @returns the carry of the addition.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000182static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
183 for (unsigned i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000184 dest[i] = y + x[i];
185 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000186 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000187 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000188 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000189 break;
190 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000191 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000192 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000193}
194
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000195/// @brief Prefix increment operator. Increments the APInt by one.
196APInt& APInt::operator++() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000197 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000198 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000199 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000200 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000201 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000202}
203
Eric Christopherd37eda82009-08-21 04:06:45 +0000204/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
205/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spenceraf0e9562007-02-18 18:38:44 +0000206/// no further borrowing is neeeded or it runs out of "digits" in x. The result
207/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
208/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000209/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-01-21 18:09:24 +0000210static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
211 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000212 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000213 x[i] -= y;
Eric Christopherd37eda82009-08-21 04:06:45 +0000214 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000215 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000216 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000217 y = 0; // No need to borrow
218 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000219 }
220 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000221 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000222}
223
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000224/// @brief Prefix decrement operator. Decrements the APInt by one.
225APInt& APInt::operator--() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000226 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000227 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000228 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000229 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000230 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000231}
232
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000233/// add - This function adds the integer array x to the integer array Y and
Eric Christopherd37eda82009-08-21 04:06:45 +0000234/// places the result in dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000235/// @returns the carry out from the addition
236/// @brief General addition of 64-bit integer arrays
Eric Christopherd37eda82009-08-21 04:06:45 +0000237static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000238 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000239 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000240 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000241 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000242 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000243 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000244 }
245 return carry;
246}
247
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000248/// Adds the RHS APint to this APInt.
249/// @returns this, after addition of RHS.
Eric Christopherd37eda82009-08-21 04:06:45 +0000250/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000251APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000252 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000253 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000254 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000255 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000256 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000257 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000258 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000259}
260
Eric Christopherd37eda82009-08-21 04:06:45 +0000261/// Subtracts the integer array y from the integer array x
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000262/// @returns returns the borrow out.
263/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopherd37eda82009-08-21 04:06:45 +0000264static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000265 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000266 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000267 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000268 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
269 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
270 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000271 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000272 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000273}
274
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000275/// Subtracts the RHS APInt from this APInt
276/// @returns this, after subtraction
Eric Christopherd37eda82009-08-21 04:06:45 +0000277/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000278APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000279 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000280 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000281 VAL -= RHS.VAL;
282 else
283 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000284 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000285}
286
Dan Gohmanf451cb82010-02-10 16:03:48 +0000287/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopherd37eda82009-08-21 04:06:45 +0000288/// into dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000289/// @returns the carry out of the multiplication.
290/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000291static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000292 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000293 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000294 uint64_t carry = 0;
295
296 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000297 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000298 // Split x into high and low words
299 uint64_t lx = x[i] & 0xffffffffULL;
300 uint64_t hx = x[i] >> 32;
301 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000302 // hasCarry == 0, no carry
303 // hasCarry == 1, has carry
304 // hasCarry == 2, no carry and the calculation result == 0.
305 uint8_t hasCarry = 0;
306 dest[i] = carry + lx * ly;
307 // Determine if the add above introduces carry.
308 hasCarry = (dest[i] < carry) ? 1 : 0;
309 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopherd37eda82009-08-21 04:06:45 +0000310 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000311 // (2^32 - 1) + 2^32 = 2^64.
312 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
313
314 carry += (lx * hy) & 0xffffffffULL;
315 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopherd37eda82009-08-21 04:06:45 +0000316 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000317 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
318 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000319 return carry;
320}
321
Eric Christopherd37eda82009-08-21 04:06:45 +0000322/// Multiplies integer array x by integer array y and stores the result into
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000323/// the integer array dest. Note that dest's size must be >= xlen + ylen.
324/// @brief Generalized multiplicate of integer arrays.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000325static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
326 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000327 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000328 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000329 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000330 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000331 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000332 lx = x[j] & 0xffffffffULL;
333 hx = x[j] >> 32;
334 // hasCarry - A flag to indicate if has carry.
335 // hasCarry == 0, no carry
336 // hasCarry == 1, has carry
337 // hasCarry == 2, no carry and the calculation result == 0.
338 uint8_t hasCarry = 0;
339 uint64_t resul = carry + lx * ly;
340 hasCarry = (resul < carry) ? 1 : 0;
341 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
342 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
343
344 carry += (lx * hy) & 0xffffffffULL;
345 resul = (carry << 32) | (resul & 0xffffffffULL);
346 dest[i+j] += resul;
347 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopherd37eda82009-08-21 04:06:45 +0000348 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000349 ((lx * hy) >> 32) + hx * hy;
350 }
351 dest[i+xlen] = carry;
352 }
353}
354
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000355APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000356 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000357 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000358 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000359 clearUnusedBits();
360 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000361 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000362
363 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000364 unsigned lhsBits = getActiveBits();
365 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopherd37eda82009-08-21 04:06:45 +0000366 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +0000367 // 0 * X ===> 0
368 return *this;
369
370 // Get some bit facts about RHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000371 unsigned rhsBits = RHS.getActiveBits();
372 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000373 if (!rhsWords) {
374 // X * 0 ===> 0
Jay Foad7a874dd2010-12-01 08:53:58 +0000375 clearAllBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000376 return *this;
377 }
378
379 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000380 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000381 uint64_t *dest = getMemory(destWords);
382
383 // Perform the long multiply
384 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
385
386 // Copy result back into *this
Jay Foad7a874dd2010-12-01 08:53:58 +0000387 clearAllBits();
Chris Lattner455e9ab2009-01-21 18:09:24 +0000388 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000389 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
Eli Friedman9eb6b4d2011-10-07 23:40:49 +0000390 clearUnusedBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000391
392 // delete dest array and return
393 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000394 return *this;
395}
396
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000397APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000398 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000399 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000400 VAL &= RHS.VAL;
401 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000402 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000403 unsigned numWords = getNumWords();
404 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000405 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000406 return *this;
407}
408
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000409APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000410 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000411 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000412 VAL |= RHS.VAL;
413 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000414 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000415 unsigned numWords = getNumWords();
416 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000417 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000418 return *this;
419}
420
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000421APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000422 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000423 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000424 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000425 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000426 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000427 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000428 unsigned numWords = getNumWords();
429 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000430 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000431 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000432}
433
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000434APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000435 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000436 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000437 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000438 val[i] = pVal[i] & RHS.pVal[i];
439 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000440}
441
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000442APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000443 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000444 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000445 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000446 val[i] = pVal[i] | RHS.pVal[i];
447 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000448}
449
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000450APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000451 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000452 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000453 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000454 val[i] = pVal[i] ^ RHS.pVal[i];
455
456 // 0^0==1 so clear the high bits in case they got set.
457 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000458}
459
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000460bool APInt::operator !() const {
461 if (isSingleWord())
462 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000463
Chris Lattner455e9ab2009-01-21 18:09:24 +0000464 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000465 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000466 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000467 return true;
468}
469
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000470APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000471 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000472 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000473 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000474 APInt Result(*this);
475 Result *= RHS;
Eli Friedman9eb6b4d2011-10-07 23:40:49 +0000476 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000477}
478
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000479APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000480 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000481 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000482 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000483 APInt Result(BitWidth, 0);
484 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000485 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000486}
487
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000488APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000489 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000490 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000491 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000492 APInt Result(BitWidth, 0);
493 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000494 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000495}
496
Chris Lattner455e9ab2009-01-21 18:09:24 +0000497bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman078d9672010-11-18 17:14:56 +0000498 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopherd37eda82009-08-21 04:06:45 +0000499 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000500 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000501}
502
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000503bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000504 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000505 unsigned n1 = getActiveBits();
506 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000507
508 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000509 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000510 return false;
511
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000512 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000513 if (n1 <= APINT_BITS_PER_WORD)
514 return pVal[0] == RHS.pVal[0];
515
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000516 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000517 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000518 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000519 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000520 return true;
521}
522
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000523bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000524 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000525 if (n <= APINT_BITS_PER_WORD)
526 return pVal[0] == Val;
527 else
528 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000529}
530
Reid Spencere81d2da2007-02-16 22:36:51 +0000531bool APInt::ult(const APInt& RHS) const {
532 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
533 if (isSingleWord())
534 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000535
536 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000537 unsigned n1 = getActiveBits();
538 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000539
540 // If magnitude of LHS is less than RHS, return true.
541 if (n1 < n2)
542 return true;
543
544 // If magnitude of RHS is greather than LHS, return false.
545 if (n2 < n1)
546 return false;
547
548 // If they bot fit in a word, just compare the low order word
549 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
550 return pVal[0] < RHS.pVal[0];
551
552 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000553 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000554 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000555 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000556 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000557 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000558 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000559 }
560 return false;
561}
562
Reid Spencere81d2da2007-02-16 22:36:51 +0000563bool APInt::slt(const APInt& RHS) const {
564 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000565 if (isSingleWord()) {
566 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
567 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
568 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000569 }
Reid Spencera58f0582007-02-18 20:09:41 +0000570
571 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000572 APInt rhs(RHS);
573 bool lhsNeg = isNegative();
574 bool rhsNeg = rhs.isNegative();
575 if (lhsNeg) {
576 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000577 lhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000578 lhs++;
579 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000580 if (rhsNeg) {
581 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000582 rhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000583 rhs++;
584 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000585
586 // Now we have unsigned values to compare so do the comparison if necessary
587 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000588 if (lhsNeg)
589 if (rhsNeg)
590 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000591 else
592 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000593 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000594 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000595 else
Reid Spencera58f0582007-02-18 20:09:41 +0000596 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000597}
598
Jay Foad7a874dd2010-12-01 08:53:58 +0000599void APInt::setBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000600 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000601 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000602 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000603 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000604}
605
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000606/// Set the given bit to 0 whose position is given as "bitPosition".
607/// @brief Set a given bit to 0.
Jay Foad7a874dd2010-12-01 08:53:58 +0000608void APInt::clearBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000609 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000610 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000611 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000612 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000613}
614
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000615/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000616
Eric Christopherd37eda82009-08-21 04:06:45 +0000617/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000618/// as "bitPosition".
619/// @brief Toggles a given bit to its opposite value.
Jay Foad7a874dd2010-12-01 08:53:58 +0000620void APInt::flipBit(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000621 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad7a874dd2010-12-01 08:53:58 +0000622 if ((*this)[bitPosition]) clearBit(bitPosition);
623 else setBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000624}
625
Benjamin Kramer38e59892010-07-14 22:38:02 +0000626unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000627 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +0000628 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
629 radix == 36) &&
630 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000631
632 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000633
Eric Christophere250f2a2009-08-21 04:10:31 +0000634 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000635 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000636 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000637 if (*p == '-' || *p == '+') {
638 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000639 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000640 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000641 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000642
Reid Spencer57ae4f52007-04-13 19:19:07 +0000643 // For radixes of power-of-two values, the bits required is accurately and
644 // easily computed
645 if (radix == 2)
646 return slen + isNegative;
647 if (radix == 8)
648 return slen * 3 + isNegative;
649 if (radix == 16)
650 return slen * 4 + isNegative;
651
Douglas Gregordcd99962011-09-14 15:54:46 +0000652 // FIXME: base 36
653
Reid Spencer57ae4f52007-04-13 19:19:07 +0000654 // This is grossly inefficient but accurate. We could probably do something
655 // with a computation of roughly slen*64/20 and then adjust by the value of
656 // the first few digits. But, I'm not sure how accurate that could be.
657
658 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000659 // be too large. This avoids the assertion in the constructor. This
660 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
661 // bits in that case.
Douglas Gregordcd99962011-09-14 15:54:46 +0000662 unsigned sufficient
663 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
664 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000665
666 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000667 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000668
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000669 // Compute how many bits are required. If the log is infinite, assume we need
670 // just bit.
671 unsigned log = tmp.logBase2();
672 if (log == (unsigned)-1) {
673 return isNegative + 1;
674 } else {
675 return isNegative + log + 1;
676 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000677}
678
Chandler Carruthed7692a2012-03-04 12:02:57 +0000679hash_code llvm::hash_value(const APInt &Arg) {
680 if (Arg.isSingleWord())
681 return hash_combine(Arg.VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000682
Chandler Carruthed7692a2012-03-04 12:02:57 +0000683 return hash_combine_range(Arg.pVal, Arg.pVal + Arg.getNumWords());
Reid Spencer794f4722007-02-26 21:02:27 +0000684}
685
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000686/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000687APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000688 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000689}
690
691/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000692APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000693 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000694 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000695}
696
Chris Lattner455e9ab2009-01-21 18:09:24 +0000697unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000698 // Treat the most significand word differently because it might have
699 // meaningless bits set beyond the precision.
700 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
701 integerPart MSWMask;
702 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
703 else {
704 MSWMask = ~integerPart(0);
705 BitsInMSW = APINT_BITS_PER_WORD;
706 }
707
708 unsigned i = getNumWords();
709 integerPart MSW = pVal[i-1] & MSWMask;
710 if (MSW)
711 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
712
713 unsigned Count = BitsInMSW;
714 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000715 if (pVal[i-1] == 0)
716 Count += APINT_BITS_PER_WORD;
717 else {
718 Count += CountLeadingZeros_64(pVal[i-1]);
719 break;
Reid Spencere549c492007-02-21 00:29:48 +0000720 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000721 }
John McCall281d0512010-02-03 03:42:44 +0000722 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000723}
724
Chris Lattner455e9ab2009-01-21 18:09:24 +0000725static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
Benjamin Kramer38d2ff42012-03-11 19:32:35 +0000726 return CountLeadingOnes_64(V << skip);
Reid Spencer681dcd12007-02-27 21:59:26 +0000727}
728
Chris Lattner455e9ab2009-01-21 18:09:24 +0000729unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000730 if (isSingleWord())
731 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
732
Chris Lattner455e9ab2009-01-21 18:09:24 +0000733 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000734 unsigned shift;
735 if (!highWordBits) {
736 highWordBits = APINT_BITS_PER_WORD;
737 shift = 0;
738 } else {
739 shift = APINT_BITS_PER_WORD - highWordBits;
740 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000741 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000742 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000743 if (Count == highWordBits) {
744 for (i--; i >= 0; --i) {
745 if (pVal[i] == -1ULL)
746 Count += APINT_BITS_PER_WORD;
747 else {
748 Count += countLeadingOnes_64(pVal[i], 0);
749 break;
750 }
751 }
752 }
753 return Count;
754}
755
Chris Lattner455e9ab2009-01-21 18:09:24 +0000756unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000757 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000758 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
759 unsigned Count = 0;
760 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000761 for (; i < getNumWords() && pVal[i] == 0; ++i)
762 Count += APINT_BITS_PER_WORD;
763 if (i < getNumWords())
764 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000765 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000766}
767
Chris Lattner455e9ab2009-01-21 18:09:24 +0000768unsigned APInt::countTrailingOnesSlowCase() const {
769 unsigned Count = 0;
770 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000771 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000772 Count += APINT_BITS_PER_WORD;
773 if (i < getNumWords())
774 Count += CountTrailingOnes_64(pVal[i]);
775 return std::min(Count, BitWidth);
776}
777
Chris Lattner455e9ab2009-01-21 18:09:24 +0000778unsigned APInt::countPopulationSlowCase() const {
779 unsigned Count = 0;
780 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000781 Count += CountPopulation_64(pVal[i]);
782 return Count;
783}
784
Richard Smithe73db4e2011-11-23 21:33:37 +0000785/// Perform a logical right-shift from Src to Dst, which must be equal or
786/// non-overlapping, of Words words, by Shift, which must be less than 64.
787static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
788 unsigned Shift) {
789 uint64_t Carry = 0;
790 for (int I = Words - 1; I >= 0; --I) {
791 uint64_t Tmp = Src[I];
792 Dst[I] = (Tmp >> Shift) | Carry;
793 Carry = Tmp << (64 - Shift);
794 }
795}
796
Reid Spencere81d2da2007-02-16 22:36:51 +0000797APInt APInt::byteSwap() const {
798 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
799 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000800 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000801 if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000802 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000803 if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000804 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000805 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000806 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000807 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000808 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengb04973e2007-02-15 06:36:31 +0000809 }
Richard Smithe73db4e2011-11-23 21:33:37 +0000810 if (BitWidth == 64)
811 return APInt(BitWidth, ByteSwap_64(VAL));
812
813 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
814 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
815 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
816 if (Result.BitWidth != BitWidth) {
817 lshrNear(Result.pVal, Result.pVal, getNumWords(),
818 Result.BitWidth - BitWidth);
819 Result.BitWidth = BitWidth;
820 }
821 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000822}
823
Eric Christopherd37eda82009-08-21 04:06:45 +0000824APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000825 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000826 APInt A = API1, B = API2;
827 while (!!B) {
828 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000829 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000830 A = T;
831 }
832 return A;
833}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000834
Chris Lattner455e9ab2009-01-21 18:09:24 +0000835APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000836 union {
837 double D;
838 uint64_t I;
839 } T;
840 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000841
842 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000843 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000844
845 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000846 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000847
848 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000849 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000850 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000851
852 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
853 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
854
855 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000856 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000857 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000858 APInt(width, mantissa >> (52 - exp));
859
860 // If the client didn't provide enough bits for us to shift the mantissa into
861 // then the result is undefined, just return 0
862 if (width <= exp - 52)
863 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000864
865 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000866 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000867 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000868 return isNeg ? -Tmp : Tmp;
869}
870
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000871/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000872/// The layout for double is as following (IEEE Standard 754):
873/// --------------------------------------
874/// | Sign Exponent Fraction Bias |
875/// |-------------------------------------- |
876/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000877/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000878double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000879
880 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000881 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000882 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
883 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000884 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000885 return double(sext);
886 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000887 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000888 }
889
Reid Spencer9c0696f2007-02-20 08:51:03 +0000890 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000891 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000892
893 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000894 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000895
896 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000897 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000898
Reid Spencer9c0696f2007-02-20 08:51:03 +0000899 // The exponent (without bias normalization) is just the number of bits
900 // we are using. Note that the sign bit is gone since we constructed the
901 // absolute value.
902 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000903
Reid Spencer9c0696f2007-02-20 08:51:03 +0000904 // Return infinity for exponent overflow
905 if (exp > 1023) {
906 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000907 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000908 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000909 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000910 }
911 exp += 1023; // Increment for 1023 bias
912
913 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
914 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000915 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000916 unsigned hiWord = whichWord(n-1);
917 if (hiWord == 0) {
918 mantissa = Tmp.pVal[0];
919 if (n > 52)
920 mantissa >>= n - 52; // shift down, we want the top 52 bits.
921 } else {
922 assert(hiWord > 0 && "huh?");
923 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
924 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
925 mantissa = hibits | lobits;
926 }
927
Zhou Shengd93f00c2007-02-12 20:02:55 +0000928 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000929 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000930 union {
931 double D;
932 uint64_t I;
933 } T;
934 T.I = sign | (exp << 52) | mantissa;
935 return T.D;
936}
937
Reid Spencere81d2da2007-02-16 22:36:51 +0000938// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000939APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000940 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000941 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +0000942
943 if (width <= APINT_BITS_PER_WORD)
944 return APInt(width, getRawData()[0]);
945
946 APInt Result(getMemory(getNumWords(width)), width);
947
948 // Copy full words.
949 unsigned i;
950 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
951 Result.pVal[i] = pVal[i];
952
953 // Truncate and copy any partial word.
954 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
955 if (bits != 0)
956 Result.pVal[i] = pVal[i] << bits >> bits;
957
958 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +0000959}
960
961// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000962APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000963 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +0000964
965 if (width <= APINT_BITS_PER_WORD) {
966 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
967 val = (int64_t)val >> (width - BitWidth);
968 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +0000969 }
970
Jay Foad40f8f622010-12-07 08:25:19 +0000971 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +0000972
Jay Foad40f8f622010-12-07 08:25:19 +0000973 // Copy full words.
974 unsigned i;
975 uint64_t word = 0;
976 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
977 word = getRawData()[i];
978 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +0000979 }
980
Jay Foad40f8f622010-12-07 08:25:19 +0000981 // Read and sign-extend any partial word.
982 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
983 if (bits != 0)
984 word = (int64_t)getRawData()[i] << bits >> bits;
985 else
986 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
987
988 // Write remaining full words.
989 for (; i != width / APINT_BITS_PER_WORD; i++) {
990 Result.pVal[i] = word;
991 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +0000992 }
Jay Foad40f8f622010-12-07 08:25:19 +0000993
994 // Write any partial word.
995 bits = (0 - width) % APINT_BITS_PER_WORD;
996 if (bits != 0)
997 Result.pVal[i] = word << bits >> bits;
998
999 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001000}
1001
1002// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001003APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001004 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001005
1006 if (width <= APINT_BITS_PER_WORD)
1007 return APInt(width, VAL);
1008
1009 APInt Result(getMemory(getNumWords(width)), width);
1010
1011 // Copy words.
1012 unsigned i;
1013 for (i = 0; i != getNumWords(); i++)
1014 Result.pVal[i] = getRawData()[i];
1015
1016 // Zero remaining words.
1017 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1018
1019 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001020}
1021
Jay Foad40f8f622010-12-07 08:25:19 +00001022APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001023 if (BitWidth < width)
1024 return zext(width);
1025 if (BitWidth > width)
1026 return trunc(width);
1027 return *this;
1028}
1029
Jay Foad40f8f622010-12-07 08:25:19 +00001030APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001031 if (BitWidth < width)
1032 return sext(width);
1033 if (BitWidth > width)
1034 return trunc(width);
1035 return *this;
1036}
1037
Rafael Espindola04594ae2012-01-27 23:33:07 +00001038APInt APInt::zextOrSelf(unsigned width) const {
1039 if (BitWidth < width)
1040 return zext(width);
1041 return *this;
1042}
1043
1044APInt APInt::sextOrSelf(unsigned width) const {
1045 if (BitWidth < width)
1046 return sext(width);
1047 return *this;
1048}
1049
Zhou Shengff4304f2007-02-09 07:48:24 +00001050/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001051/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001052APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001053 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001054}
1055
1056/// Arithmetic right-shift this APInt by shiftAmt.
1057/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001058APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001059 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001060 // Handle a degenerate case
1061 if (shiftAmt == 0)
1062 return *this;
1063
1064 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001065 if (isSingleWord()) {
1066 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001067 return APInt(BitWidth, 0); // undefined
1068 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001069 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001070 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001071 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1072 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001073 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001074
Reid Spencer46f9c942007-03-02 22:39:11 +00001075 // If all the bits were shifted out, the result is, technically, undefined.
1076 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1077 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001078 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001079 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001080 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001081 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001082 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001083 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001084
1085 // Create some space for the result.
1086 uint64_t * val = new uint64_t[getNumWords()];
1087
Reid Spencer46f9c942007-03-02 22:39:11 +00001088 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001089 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1090 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1091 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1092 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001093 if (bitsInWord == 0)
1094 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001095
1096 // If we are shifting whole words, just move whole words
1097 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001098 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001099 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001100 val[i] = pVal[i+offset]; // move whole word
1101
1102 // Adjust the top significant word for sign bit fill, if negative
1103 if (isNegative())
1104 if (bitsInWord < APINT_BITS_PER_WORD)
1105 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1106 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001107 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001108 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001109 // This combines the shifted corresponding word with the low bits from
1110 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001111 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001112 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1113 }
1114
1115 // Shift the break word. In this case there are no bits from the next word
1116 // to include in this word.
1117 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1118
1119 // Deal with sign extenstion in the break word, and possibly the word before
1120 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001121 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001122 if (wordShift > bitsInWord) {
1123 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001124 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001125 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1126 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001127 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001128 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001129 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001130 }
1131
Reid Spencer46f9c942007-03-02 22:39:11 +00001132 // Remaining words are 0 or -1, just assign them.
1133 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001134 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001135 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001136 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001137}
1138
Zhou Shengff4304f2007-02-09 07:48:24 +00001139/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001140/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001141APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001142 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001143}
1144
1145/// Logical right-shift this APInt by shiftAmt.
1146/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001147APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001148 if (isSingleWord()) {
Ahmed Charles969b7392012-02-24 19:06:15 +00001149 if (shiftAmt >= BitWidth)
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001150 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001151 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001152 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001153 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001154
Reid Spencerba81c2b2007-02-26 01:19:48 +00001155 // If all the bits were shifted out, the result is 0. This avoids issues
1156 // with shifting by the size of the integer type, which produces undefined
1157 // results. We define these "undefined results" to always be 0.
1158 if (shiftAmt == BitWidth)
1159 return APInt(BitWidth, 0);
1160
Reid Spencer02ae8b72007-05-17 06:26:29 +00001161 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001162 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001163 // undefined results in the code below. This is also an optimization.
1164 if (shiftAmt == 0)
1165 return *this;
1166
Reid Spencerba81c2b2007-02-26 01:19:48 +00001167 // Create some space for the result.
1168 uint64_t * val = new uint64_t[getNumWords()];
1169
1170 // If we are shifting less than a word, compute the shift with a simple carry
1171 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smithe73db4e2011-11-23 21:33:37 +00001172 lshrNear(val, pVal, getNumWords(), shiftAmt);
Reid Spencerba81c2b2007-02-26 01:19:48 +00001173 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001174 }
1175
Reid Spencerba81c2b2007-02-26 01:19:48 +00001176 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001177 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1178 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001179
1180 // If we are shifting whole words, just move whole words
1181 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001182 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001183 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001184 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001185 val[i] = 0;
1186 return APInt(val,BitWidth).clearUnusedBits();
1187 }
1188
Eric Christopherd37eda82009-08-21 04:06:45 +00001189 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001190 unsigned breakWord = getNumWords() - offset -1;
1191 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001192 val[i] = (pVal[i+offset] >> wordShift) |
1193 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001194 // Shift the break word.
1195 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1196
1197 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001198 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001199 val[i] = 0;
1200 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001201}
1202
Zhou Shengff4304f2007-02-09 07:48:24 +00001203/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001204/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001205APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001206 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001207 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001208}
1209
Chris Lattner455e9ab2009-01-21 18:09:24 +00001210APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001211 // If all the bits were shifted out, the result is 0. This avoids issues
1212 // with shifting by the size of the integer type, which produces undefined
1213 // results. We define these "undefined results" to always be 0.
1214 if (shiftAmt == BitWidth)
1215 return APInt(BitWidth, 0);
1216
Reid Spencer92c72832007-05-12 18:01:57 +00001217 // If none of the bits are shifted out, the result is *this. This avoids a
1218 // lshr by the words size in the loop below which can produce incorrect
1219 // results. It also avoids the expensive computation below for a common case.
1220 if (shiftAmt == 0)
1221 return *this;
1222
Reid Spencer87553802007-02-25 00:56:44 +00001223 // Create some space for the result.
1224 uint64_t * val = new uint64_t[getNumWords()];
1225
1226 // If we are shifting less than a word, do it the easy way
1227 if (shiftAmt < APINT_BITS_PER_WORD) {
1228 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001229 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001230 val[i] = pVal[i] << shiftAmt | carry;
1231 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1232 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001233 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001234 }
1235
Reid Spencer87553802007-02-25 00:56:44 +00001236 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001237 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1238 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001239
1240 // If we are shifting whole words, just move whole words
1241 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001242 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001243 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001244 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001245 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001246 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001247 }
Reid Spencer87553802007-02-25 00:56:44 +00001248
1249 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001250 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001251 for (; i > offset; --i)
1252 val[i] = pVal[i-offset] << wordShift |
1253 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001254 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001255 for (i = 0; i < offset; ++i)
1256 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001257 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001258}
1259
Dan Gohmancf609572008-02-29 01:40:47 +00001260APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001261 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001262}
1263
Chris Lattner455e9ab2009-01-21 18:09:24 +00001264APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001265 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001266 if (rotateAmt == 0)
1267 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001268 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001269}
1270
Dan Gohmancf609572008-02-29 01:40:47 +00001271APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001272 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001273}
1274
Chris Lattner455e9ab2009-01-21 18:09:24 +00001275APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001276 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001277 if (rotateAmt == 0)
1278 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001279 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001280}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001281
1282// Square Root - this method computes and returns the square root of "this".
1283// Three mechanisms are used for computation. For small values (<= 5 bits),
1284// a table lookup is done. This gets some performance for common cases. For
1285// values using less than 52 bits, the value is converted to double and then
1286// the libc sqrt function is called. The result is rounded and then converted
1287// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001288// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001289APInt APInt::sqrt() const {
1290
1291 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001292 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001293
1294 // Use a fast table for some small values. This also gets rid of some
1295 // rounding errors in libc sqrt for small values.
1296 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001297 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001298 /* 0 */ 0,
1299 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001300 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001301 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1302 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1303 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1304 /* 31 */ 6
1305 };
1306 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001307 }
1308
1309 // If the magnitude of the value fits in less than 52 bits (the precision of
1310 // an IEEE double precision floating point value), then we can use the
1311 // libc sqrt function which will probably use a hardware sqrt computation.
1312 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001313 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001314#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001315 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001316 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001317#else
1318 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001319 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001320#endif
1321 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001322
1323 // Okay, all the short cuts are exhausted. We must compute it. The following
1324 // is a classical Babylonian method for computing the square root. This code
1325 // was adapted to APINt from a wikipedia article on such computations.
1326 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001327 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001328 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001329 APInt testy(BitWidth, 16);
1330 APInt x_old(BitWidth, 1);
1331 APInt x_new(BitWidth, 0);
1332 APInt two(BitWidth, 2);
1333
1334 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001335 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001336 if (i >= nbits || this->ule(testy)) {
1337 x_old = x_old.shl(i / 2);
1338 break;
1339 }
1340
Eric Christopherd37eda82009-08-21 04:06:45 +00001341 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001342 for (;;) {
1343 x_new = (this->udiv(x_old) + x_old).udiv(two);
1344 if (x_old.ule(x_new))
1345 break;
1346 x_old = x_new;
1347 }
1348
1349 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001350 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001351 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001352 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001353 // floating point representation after 192 bits. There are no discrepancies
1354 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001355 APInt square(x_old * x_old);
1356 APInt nextSquare((x_old + 1) * (x_old +1));
1357 if (this->ult(square))
1358 return x_old;
David Blaikie18c7ec12011-12-01 20:58:30 +00001359 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1360 APInt midpoint((nextSquare - square).udiv(two));
1361 APInt offset(*this - square);
1362 if (offset.ult(midpoint))
1363 return x_old;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001364 return x_old + 1;
1365}
1366
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001367/// Computes the multiplicative inverse of this APInt for a given modulo. The
1368/// iterative extended Euclidean algorithm is used to solve for this value,
1369/// however we simplify it to speed up calculating only the inverse, and take
1370/// advantage of div+rem calculations. We also use some tricks to avoid copying
1371/// (potentially large) APInts around.
1372APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1373 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1374
1375 // Using the properties listed at the following web page (accessed 06/21/08):
1376 // http://www.numbertheory.org/php/euclid.html
1377 // (especially the properties numbered 3, 4 and 9) it can be proved that
1378 // BitWidth bits suffice for all the computations in the algorithm implemented
1379 // below. More precisely, this number of bits suffice if the multiplicative
1380 // inverse exists, but may not suffice for the general extended Euclidean
1381 // algorithm.
1382
1383 APInt r[2] = { modulo, *this };
1384 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1385 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001386
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001387 unsigned i;
1388 for (i = 0; r[i^1] != 0; i ^= 1) {
1389 // An overview of the math without the confusing bit-flipping:
1390 // q = r[i-2] / r[i-1]
1391 // r[i] = r[i-2] % r[i-1]
1392 // t[i] = t[i-2] - t[i-1] * q
1393 udivrem(r[i], r[i^1], q, r[i]);
1394 t[i] -= t[i^1] * q;
1395 }
1396
1397 // If this APInt and the modulo are not coprime, there is no multiplicative
1398 // inverse, so return 0. We check this by looking at the next-to-last
1399 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1400 // algorithm.
1401 if (r[i] != 1)
1402 return APInt(BitWidth, 0);
1403
1404 // The next-to-last t is the multiplicative inverse. However, we are
1405 // interested in a positive inverse. Calcuate a positive one from a negative
1406 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001407 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001408 return t[i].isNegative() ? t[i] + modulo : t[i];
1409}
1410
Jay Foad4e5ea552009-04-30 10:15:35 +00001411/// Calculate the magic numbers required to implement a signed integer division
1412/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1413/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1414/// Warren, Jr., chapter 10.
1415APInt::ms APInt::magic() const {
1416 const APInt& d = *this;
1417 unsigned p;
1418 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001419 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001420 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001421
Jay Foad4e5ea552009-04-30 10:15:35 +00001422 ad = d.abs();
1423 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1424 anc = t - 1 - t.urem(ad); // absolute value of nc
1425 p = d.getBitWidth() - 1; // initialize p
1426 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1427 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1428 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1429 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1430 do {
1431 p = p + 1;
1432 q1 = q1<<1; // update q1 = 2p/abs(nc)
1433 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1434 if (r1.uge(anc)) { // must be unsigned comparison
1435 q1 = q1 + 1;
1436 r1 = r1 - anc;
1437 }
1438 q2 = q2<<1; // update q2 = 2p/abs(d)
1439 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1440 if (r2.uge(ad)) { // must be unsigned comparison
1441 q2 = q2 + 1;
1442 r2 = r2 - ad;
1443 }
1444 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001445 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001446
Jay Foad4e5ea552009-04-30 10:15:35 +00001447 mag.m = q2 + 1;
1448 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1449 mag.s = p - d.getBitWidth(); // resulting shift
1450 return mag;
1451}
1452
1453/// Calculate the magic numbers required to implement an unsigned integer
1454/// division by a constant as a sequence of multiplies, adds and shifts.
1455/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1456/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001457/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001458/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001459APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001460 const APInt& d = *this;
1461 unsigned p;
1462 APInt nc, delta, q1, r1, q2, r2;
1463 struct mu magu;
1464 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001465 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001466 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1467 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1468
1469 nc = allOnes - (-d).urem(d);
1470 p = d.getBitWidth() - 1; // initialize p
1471 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1472 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1473 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1474 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1475 do {
1476 p = p + 1;
1477 if (r1.uge(nc - r1)) {
1478 q1 = q1 + q1 + 1; // update q1
1479 r1 = r1 + r1 - nc; // update r1
1480 }
1481 else {
1482 q1 = q1+q1; // update q1
1483 r1 = r1+r1; // update r1
1484 }
1485 if ((r2 + 1).uge(d - r2)) {
1486 if (q2.uge(signedMax)) magu.a = 1;
1487 q2 = q2+q2 + 1; // update q2
1488 r2 = r2+r2 + 1 - d; // update r2
1489 }
1490 else {
1491 if (q2.uge(signedMin)) magu.a = 1;
1492 q2 = q2+q2; // update q2
1493 r2 = r2+r2 + 1; // update r2
1494 }
1495 delta = d - 1 - r2;
1496 } while (p < d.getBitWidth()*2 &&
1497 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1498 magu.m = q2 + 1; // resulting magic number
1499 magu.s = p - d.getBitWidth(); // resulting shift
1500 return magu;
1501}
1502
Reid Spencer9c0696f2007-02-20 08:51:03 +00001503/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1504/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1505/// variables here have the same names as in the algorithm. Comments explain
1506/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001507static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1508 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001509 assert(u && "Must provide dividend");
1510 assert(v && "Must provide divisor");
1511 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001512 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001513 assert(n>1 && "n must be > 1");
1514
1515 // Knuth uses the value b as the base of the number system. In our case b
1516 // is 2^31 so we just set it to -1u.
1517 uint64_t b = uint64_t(1) << 32;
1518
Chris Lattnerfad86b02008-08-17 07:19:36 +00001519#if 0
David Greene465abed2010-01-05 01:28:52 +00001520 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1521 DEBUG(dbgs() << "KnuthDiv: original:");
1522 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1523 DEBUG(dbgs() << " by");
1524 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1525 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001526#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001527 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1528 // u and v by d. Note that we have taken Knuth's advice here to use a power
1529 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1530 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001531 // shift amount from the leading zeros. We are basically normalizing the u
1532 // and v so that its high bits are shifted to the top of v's range without
1533 // overflow. Note that this can require an extra word in u so that u must
1534 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001535 unsigned shift = CountLeadingZeros_32(v[n-1]);
1536 unsigned v_carry = 0;
1537 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001538 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001539 for (unsigned i = 0; i < m+n; ++i) {
1540 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001541 u[i] = (u[i] << shift) | u_carry;
1542 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001543 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001544 for (unsigned i = 0; i < n; ++i) {
1545 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001546 v[i] = (v[i] << shift) | v_carry;
1547 v_carry = v_tmp;
1548 }
1549 }
1550 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001551#if 0
David Greene465abed2010-01-05 01:28:52 +00001552 DEBUG(dbgs() << "KnuthDiv: normal:");
1553 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1554 DEBUG(dbgs() << " by");
1555 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1556 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001557#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001558
1559 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1560 int j = m;
1561 do {
David Greene465abed2010-01-05 01:28:52 +00001562 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001563 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001564 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1565 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1566 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1567 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1568 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001569 // value qp is one too large, and it eliminates all cases where qp is two
1570 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001571 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001572 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001573 uint64_t qp = dividend / v[n-1];
1574 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001575 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1576 qp--;
1577 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001578 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001579 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001580 }
David Greene465abed2010-01-05 01:28:52 +00001581 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001582
Reid Spencer92904632007-02-23 01:57:13 +00001583 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1584 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1585 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001586 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001587 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001588 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001589 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001590 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001591 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001592 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001593 << ", subtrahend == " << subtrahend
1594 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001595
Reid Spencer610fad82007-02-24 10:01:42 +00001596 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001597 unsigned k = j + i;
1598 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1599 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001600 while (borrow && k <= m+n) { // deal with borrow to the left
1601 borrow = u[k] == 0;
1602 u[k]--;
1603 k++;
1604 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001605 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001606 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001607 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001608 }
David Greene465abed2010-01-05 01:28:52 +00001609 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1610 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1611 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001612 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1613 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001614 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001615 // the true value, and a "borrow" to the left should be remembered.
1616 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001617 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001618 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001619 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001620 u[i] = ~u[i] + carry; // b's complement
1621 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001622 }
Reid Spencer92904632007-02-23 01:57:13 +00001623 }
David Greene465abed2010-01-05 01:28:52 +00001624 DEBUG(dbgs() << "KnuthDiv: after complement:");
1625 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1626 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001627
Eric Christopherd37eda82009-08-21 04:06:45 +00001628 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001629 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001630 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001631 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001632 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001633 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001634 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001635 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001636 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1637 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001638 // since it cancels with the borrow that occurred in D4.
1639 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001640 for (unsigned i = 0; i < n; i++) {
1641 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001642 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001643 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001644 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001645 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001646 }
David Greene465abed2010-01-05 01:28:52 +00001647 DEBUG(dbgs() << "KnuthDiv: after correction:");
1648 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1649 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001650
Reid Spencer92904632007-02-23 01:57:13 +00001651 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1652 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001653
David Greene465abed2010-01-05 01:28:52 +00001654 DEBUG(dbgs() << "KnuthDiv: quotient:");
1655 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1656 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001657
Reid Spencer9c0696f2007-02-20 08:51:03 +00001658 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1659 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1660 // compute the remainder (urem uses this).
1661 if (r) {
1662 // The value d is expressed by the "shift" value above since we avoided
1663 // multiplication by d by using a shift left. So, all we have to do is
1664 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001665 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001666 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001667 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001668 for (int i = n-1; i >= 0; i--) {
1669 r[i] = (u[i] >> shift) | carry;
1670 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001671 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001672 }
1673 } else {
1674 for (int i = n-1; i >= 0; i--) {
1675 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001676 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001677 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001678 }
David Greene465abed2010-01-05 01:28:52 +00001679 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001680 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001681#if 0
David Greene465abed2010-01-05 01:28:52 +00001682 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001683#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001684}
1685
Chris Lattner455e9ab2009-01-21 18:09:24 +00001686void APInt::divide(const APInt LHS, unsigned lhsWords,
1687 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001688 APInt *Quotient, APInt *Remainder)
1689{
1690 assert(lhsWords >= rhsWords && "Fractional result");
1691
Eric Christopherd37eda82009-08-21 04:06:45 +00001692 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001693 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001694 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001695 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1696 // can't use 64-bit operands here because we don't have native results of
1697 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001698 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001699 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001700 unsigned n = rhsWords * 2;
1701 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001702
1703 // Allocate space for the temporary values we need either on the stack, if
1704 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001705 unsigned SPACE[128];
1706 unsigned *U = 0;
1707 unsigned *V = 0;
1708 unsigned *Q = 0;
1709 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001710 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1711 U = &SPACE[0];
1712 V = &SPACE[m+n+1];
1713 Q = &SPACE[(m+n+1) + n];
1714 if (Remainder)
1715 R = &SPACE[(m+n+1) + n + (m+n)];
1716 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001717 U = new unsigned[m + n + 1];
1718 V = new unsigned[n];
1719 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001720 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001721 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001722 }
1723
1724 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001725 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001726 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001727 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001728 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001729 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001730 }
1731 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1732
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001733 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001734 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001735 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001736 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001737 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001738 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001739 }
1740
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001741 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001742 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001743 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001744 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001745
Eric Christopherd37eda82009-08-21 04:06:45 +00001746 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001747 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001748 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001749 // contain any zero words or the Knuth algorithm fails.
1750 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1751 n--;
1752 m++;
1753 }
1754 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1755 m--;
1756
1757 // If we're left with only a single word for the divisor, Knuth doesn't work
1758 // so we implement the short division algorithm here. This is much simpler
1759 // and faster because we are certain that we can divide a 64-bit quantity
1760 // by a 32-bit quantity at hardware speed and short division is simply a
1761 // series of such operations. This is just like doing short division but we
1762 // are using base 2^32 instead of base 10.
1763 assert(n != 0 && "Divide by zero?");
1764 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001765 unsigned divisor = V[0];
1766 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001767 for (int i = m+n-1; i >= 0; i--) {
1768 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1769 if (partial_dividend == 0) {
1770 Q[i] = 0;
1771 remainder = 0;
1772 } else if (partial_dividend < divisor) {
1773 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001774 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001775 } else if (partial_dividend == divisor) {
1776 Q[i] = 1;
1777 remainder = 0;
1778 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001779 Q[i] = (unsigned)(partial_dividend / divisor);
1780 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001781 }
1782 }
1783 if (R)
1784 R[0] = remainder;
1785 } else {
1786 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1787 // case n > 1.
1788 KnuthDiv(U, V, Q, R, m, n);
1789 }
1790
1791 // If the caller wants the quotient
1792 if (Quotient) {
1793 // Set up the Quotient value's memory.
1794 if (Quotient->BitWidth != LHS.BitWidth) {
1795 if (Quotient->isSingleWord())
1796 Quotient->VAL = 0;
1797 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001798 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001799 Quotient->BitWidth = LHS.BitWidth;
1800 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001801 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001802 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001803 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001804
Eric Christopherd37eda82009-08-21 04:06:45 +00001805 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 // order words.
1807 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001808 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001809 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1810 if (Quotient->isSingleWord())
1811 Quotient->VAL = tmp;
1812 else
1813 Quotient->pVal[0] = tmp;
1814 } else {
1815 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1816 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001817 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001818 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1819 }
1820 }
1821
1822 // If the caller wants the remainder
1823 if (Remainder) {
1824 // Set up the Remainder value's memory.
1825 if (Remainder->BitWidth != RHS.BitWidth) {
1826 if (Remainder->isSingleWord())
1827 Remainder->VAL = 0;
1828 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001829 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001830 Remainder->BitWidth = RHS.BitWidth;
1831 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001832 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001833 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001834 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001835
1836 // The remainder is in R. Reconstitute the remainder into Remainder's low
1837 // order words.
1838 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001839 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001840 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1841 if (Remainder->isSingleWord())
1842 Remainder->VAL = tmp;
1843 else
1844 Remainder->pVal[0] = tmp;
1845 } else {
1846 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1847 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001848 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001849 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1850 }
1851 }
1852
1853 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001854 if (U != &SPACE[0]) {
1855 delete [] U;
1856 delete [] V;
1857 delete [] Q;
1858 delete [] R;
1859 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001860}
1861
Reid Spencere81d2da2007-02-16 22:36:51 +00001862APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001863 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001864
1865 // First, deal with the easy case
1866 if (isSingleWord()) {
1867 assert(RHS.VAL != 0 && "Divide by zero?");
1868 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001869 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001870
Reid Spencer71bd08f2007-02-17 02:07:07 +00001871 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001872 unsigned rhsBits = RHS.getActiveBits();
1873 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001874 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001875 unsigned lhsBits = this->getActiveBits();
1876 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001877
1878 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001879 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001880 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001881 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001882 else if (lhsWords < rhsWords || this->ult(RHS)) {
1883 // X / Y ===> 0, iff X < Y
1884 return APInt(BitWidth, 0);
1885 } else if (*this == RHS) {
1886 // X / X ===> 1
1887 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001888 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001889 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001890 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001891 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001892
1893 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1894 APInt Quotient(1,0); // to hold result.
1895 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1896 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001897}
1898
Reid Spencere81d2da2007-02-16 22:36:51 +00001899APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001900 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001901 if (isSingleWord()) {
1902 assert(RHS.VAL != 0 && "Remainder by zero?");
1903 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001904 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001905
Reid Spencere0cdd332007-02-21 08:21:52 +00001906 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001907 unsigned lhsBits = getActiveBits();
1908 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001909
1910 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001911 unsigned rhsBits = RHS.getActiveBits();
1912 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001913 assert(rhsWords && "Performing remainder operation by zero ???");
1914
Reid Spencer71bd08f2007-02-17 02:07:07 +00001915 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001916 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001917 // 0 % Y ===> 0
1918 return APInt(BitWidth, 0);
1919 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1920 // X % Y ===> X, iff X < Y
1921 return *this;
1922 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001923 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001924 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001925 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001926 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001927 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001928 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001929
Reid Spencer19dc32a2007-05-13 23:44:59 +00001930 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001931 APInt Remainder(1,0);
1932 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1933 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001934}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001935
Eric Christopherd37eda82009-08-21 04:06:45 +00001936void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00001937 APInt &Quotient, APInt &Remainder) {
1938 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001939 unsigned lhsBits = LHS.getActiveBits();
1940 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1941 unsigned rhsBits = RHS.getActiveBits();
1942 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001943
1944 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001945 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00001946 Quotient = 0; // 0 / Y ===> 0
1947 Remainder = 0; // 0 % Y ===> 0
1948 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001949 }
1950
1951 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00001952 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00001953 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00001954 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001955 }
1956
Reid Spencer19dc32a2007-05-13 23:44:59 +00001957 if (LHS == RHS) {
1958 Quotient = 1; // X / X ===> 1
1959 Remainder = 0; // X % X ===> 0;
1960 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001961 }
1962
Reid Spencer19dc32a2007-05-13 23:44:59 +00001963 if (lhsWords == 1 && rhsWords == 1) {
1964 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001965 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1966 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
1967 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
1968 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001969 return;
1970 }
1971
1972 // Okay, lets do it the long way
1973 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1974}
1975
Chris Lattner0a0a5852010-10-13 23:54:10 +00001976APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001977 APInt Res = *this+RHS;
1978 Overflow = isNonNegative() == RHS.isNonNegative() &&
1979 Res.isNonNegative() != isNonNegative();
1980 return Res;
1981}
1982
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001983APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
1984 APInt Res = *this+RHS;
1985 Overflow = Res.ult(RHS);
1986 return Res;
1987}
1988
Chris Lattner0a0a5852010-10-13 23:54:10 +00001989APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001990 APInt Res = *this - RHS;
1991 Overflow = isNonNegative() != RHS.isNonNegative() &&
1992 Res.isNonNegative() != isNonNegative();
1993 return Res;
1994}
1995
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001996APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00001997 APInt Res = *this-RHS;
1998 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001999 return Res;
2000}
2001
Chris Lattner0a0a5852010-10-13 23:54:10 +00002002APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002003 // MININT/-1 --> overflow.
2004 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2005 return sdiv(RHS);
2006}
2007
Chris Lattner0a0a5852010-10-13 23:54:10 +00002008APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002009 APInt Res = *this * RHS;
2010
2011 if (*this != 0 && RHS != 0)
2012 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2013 else
2014 Overflow = false;
2015 return Res;
2016}
2017
Frits van Bommel62086102011-03-27 14:26:13 +00002018APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2019 APInt Res = *this * RHS;
2020
2021 if (*this != 0 && RHS != 0)
2022 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2023 else
2024 Overflow = false;
2025 return Res;
2026}
2027
Chris Lattner0a0a5852010-10-13 23:54:10 +00002028APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002029 Overflow = ShAmt >= getBitWidth();
2030 if (Overflow)
2031 ShAmt = getBitWidth()-1;
2032
2033 if (isNonNegative()) // Don't allow sign change.
2034 Overflow = ShAmt >= countLeadingZeros();
2035 else
2036 Overflow = ShAmt >= countLeadingOnes();
2037
2038 return *this << ShAmt;
2039}
2040
2041
2042
2043
Benjamin Kramer38e59892010-07-14 22:38:02 +00002044void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002045 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002046 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002047 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2048 radix == 36) &&
2049 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002050
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002051 StringRef::iterator p = str.begin();
2052 size_t slen = str.size();
2053 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002054 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002055 p++;
2056 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002057 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002058 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002059 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002060 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2061 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002062 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2063 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002064
2065 // Allocate memory
2066 if (!isSingleWord())
2067 pVal = getClearedMemory(getNumWords());
2068
2069 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002070 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002071
2072 // Set up an APInt for the digit to add outside the loop so we don't
2073 // constantly construct/destruct it.
2074 APInt apdigit(getBitWidth(), 0);
2075 APInt apradix(getBitWidth(), radix);
2076
2077 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002078 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002079 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002080 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002081
Reid Spencer6551dcd2007-05-16 19:18:22 +00002082 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002083 if (slen > 1) {
2084 if (shift)
2085 *this <<= shift;
2086 else
2087 *this *= apradix;
2088 }
Reid Spencer385f7542007-02-21 03:55:44 +00002089
2090 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002091 if (apdigit.isSingleWord())
2092 apdigit.VAL = digit;
2093 else
2094 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002095 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002096 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002097 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002098 if (isNeg) {
2099 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002100 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002101 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002102}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002103
Chris Lattnerfad86b02008-08-17 07:19:36 +00002104void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002105 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002106 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2107 Radix == 36) &&
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002108 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002109
Ted Kremenekcf886182011-06-15 00:51:55 +00002110 const char *Prefix = "";
2111 if (formatAsCLiteral) {
2112 switch (Radix) {
2113 case 2:
2114 // Binary literals are a non-standard extension added in gcc 4.3:
2115 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2116 Prefix = "0b";
2117 break;
2118 case 8:
2119 Prefix = "0";
2120 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002121 case 10:
2122 break; // No prefix
Ted Kremenekcf886182011-06-15 00:51:55 +00002123 case 16:
2124 Prefix = "0x";
2125 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002126 default:
2127 llvm_unreachable("Invalid radix!");
Ted Kremenekcf886182011-06-15 00:51:55 +00002128 }
2129 }
2130
Chris Lattnerfad86b02008-08-17 07:19:36 +00002131 // First, check for a zero value and just short circuit the logic below.
2132 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002133 while (*Prefix) {
2134 Str.push_back(*Prefix);
2135 ++Prefix;
2136 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002137 Str.push_back('0');
2138 return;
2139 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002140
Douglas Gregordcd99962011-09-14 15:54:46 +00002141 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002142
Reid Spencer9c0696f2007-02-20 08:51:03 +00002143 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002144 char Buffer[65];
2145 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002146
Chris Lattnerfad86b02008-08-17 07:19:36 +00002147 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002148 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002149 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002150 } else {
2151 int64_t I = getSExtValue();
2152 if (I >= 0) {
2153 N = I;
2154 } else {
2155 Str.push_back('-');
2156 N = -(uint64_t)I;
2157 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002158 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002159
Ted Kremenekcf886182011-06-15 00:51:55 +00002160 while (*Prefix) {
2161 Str.push_back(*Prefix);
2162 ++Prefix;
2163 };
2164
Chris Lattnerfad86b02008-08-17 07:19:36 +00002165 while (N) {
2166 *--BufPtr = Digits[N % Radix];
2167 N /= Radix;
2168 }
2169 Str.append(BufPtr, Buffer+65);
2170 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002171 }
2172
Chris Lattnerfad86b02008-08-17 07:19:36 +00002173 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002174
Chris Lattnerfad86b02008-08-17 07:19:36 +00002175 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002176 // They want to print the signed version and it is a negative value
2177 // Flip the bits and add one to turn it into the equivalent positive
2178 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002179 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002180 Tmp++;
2181 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002182 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002183
Ted Kremenekcf886182011-06-15 00:51:55 +00002184 while (*Prefix) {
2185 Str.push_back(*Prefix);
2186 ++Prefix;
2187 };
2188
Chris Lattnerfad86b02008-08-17 07:19:36 +00002189 // We insert the digits backward, then reverse them to get the right order.
2190 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002191
2192 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2193 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002194 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002195 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002196 // Just shift tmp right for each digit width until it becomes zero
2197 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2198 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002199
Chris Lattnerfad86b02008-08-17 07:19:36 +00002200 while (Tmp != 0) {
2201 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2202 Str.push_back(Digits[Digit]);
2203 Tmp = Tmp.lshr(ShiftAmt);
2204 }
2205 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002206 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002207 while (Tmp != 0) {
2208 APInt APdigit(1, 0);
2209 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002210 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002211 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002212 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002213 assert(Digit < Radix && "divide failed");
2214 Str.push_back(Digits[Digit]);
2215 Tmp = tmp2;
2216 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002217 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002218
Chris Lattnerfad86b02008-08-17 07:19:36 +00002219 // Reverse the digits before returning.
2220 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002221}
2222
Chris Lattnerfad86b02008-08-17 07:19:36 +00002223/// toString - This returns the APInt as a std::string. Note that this is an
2224/// inefficient method. It is better to pass in a SmallVector/SmallString
2225/// to the methods above.
2226std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2227 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002228 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002229 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002230}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002231
Chris Lattnerfad86b02008-08-17 07:19:36 +00002232
2233void APInt::dump() const {
2234 SmallString<40> S, U;
2235 this->toStringUnsigned(U);
2236 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002237 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002238 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002239}
2240
Chris Lattner944fac72008-08-23 22:23:09 +00002241void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002242 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002243 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002244 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002245}
2246
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002247// This implements a variety of operations on a representation of
2248// arbitrary precision, two's-complement, bignum integer values.
2249
Chris Lattner91021d32009-08-23 23:11:28 +00002250// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2251// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002252#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002253COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002254
2255/* Some handy functions local to this file. */
2256namespace {
2257
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002258 /* Returns the integer part with the least significant BITS set.
2259 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002260 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002261 lowBitMask(unsigned int bits)
2262 {
Dan Gohman16e02092010-03-24 19:38:02 +00002263 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002264
2265 return ~(integerPart) 0 >> (integerPartWidth - bits);
2266 }
2267
Neil Booth055c0b32007-10-06 00:43:45 +00002268 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002269 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002270 lowHalf(integerPart part)
2271 {
2272 return part & lowBitMask(integerPartWidth / 2);
2273 }
2274
Neil Booth055c0b32007-10-06 00:43:45 +00002275 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002276 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002277 highHalf(integerPart part)
2278 {
2279 return part >> (integerPartWidth / 2);
2280 }
2281
Neil Booth055c0b32007-10-06 00:43:45 +00002282 /* Returns the bit number of the most significant set bit of a part.
2283 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002284 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002285 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002286 {
2287 unsigned int n, msb;
2288
2289 if (value == 0)
2290 return -1U;
2291
2292 n = integerPartWidth / 2;
2293
2294 msb = 0;
2295 do {
2296 if (value >> n) {
2297 value >>= n;
2298 msb += n;
2299 }
2300
2301 n >>= 1;
2302 } while (n);
2303
2304 return msb;
2305 }
2306
Neil Booth055c0b32007-10-06 00:43:45 +00002307 /* Returns the bit number of the least significant set bit of a
2308 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002309 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002310 partLSB(integerPart value)
2311 {
2312 unsigned int n, lsb;
2313
2314 if (value == 0)
2315 return -1U;
2316
2317 lsb = integerPartWidth - 1;
2318 n = integerPartWidth / 2;
2319
2320 do {
2321 if (value << n) {
2322 value <<= n;
2323 lsb -= n;
2324 }
2325
2326 n >>= 1;
2327 } while (n);
2328
2329 return lsb;
2330 }
2331}
2332
2333/* Sets the least significant part of a bignum to the input value, and
2334 zeroes out higher parts. */
2335void
2336APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2337{
2338 unsigned int i;
2339
Dan Gohman16e02092010-03-24 19:38:02 +00002340 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002341
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002342 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002343 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002344 dst[i] = 0;
2345}
2346
2347/* Assign one bignum to another. */
2348void
2349APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2350{
2351 unsigned int i;
2352
Dan Gohman16e02092010-03-24 19:38:02 +00002353 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002354 dst[i] = src[i];
2355}
2356
2357/* Returns true if a bignum is zero, false otherwise. */
2358bool
2359APInt::tcIsZero(const integerPart *src, unsigned int parts)
2360{
2361 unsigned int i;
2362
Dan Gohman16e02092010-03-24 19:38:02 +00002363 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002364 if (src[i])
2365 return false;
2366
2367 return true;
2368}
2369
2370/* Extract the given bit of a bignum; returns 0 or 1. */
2371int
2372APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2373{
Dan Gohman16e02092010-03-24 19:38:02 +00002374 return (parts[bit / integerPartWidth] &
2375 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002376}
2377
John McCalle12b7382010-02-28 02:51:25 +00002378/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002379void
2380APInt::tcSetBit(integerPart *parts, unsigned int bit)
2381{
2382 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2383}
2384
John McCalle12b7382010-02-28 02:51:25 +00002385/* Clears the given bit of a bignum. */
2386void
2387APInt::tcClearBit(integerPart *parts, unsigned int bit)
2388{
2389 parts[bit / integerPartWidth] &=
2390 ~((integerPart) 1 << (bit % integerPartWidth));
2391}
2392
Neil Booth055c0b32007-10-06 00:43:45 +00002393/* Returns the bit number of the least significant set bit of a
2394 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002395unsigned int
2396APInt::tcLSB(const integerPart *parts, unsigned int n)
2397{
2398 unsigned int i, lsb;
2399
Dan Gohman16e02092010-03-24 19:38:02 +00002400 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002401 if (parts[i] != 0) {
2402 lsb = partLSB(parts[i]);
2403
2404 return lsb + i * integerPartWidth;
2405 }
2406 }
2407
2408 return -1U;
2409}
2410
Neil Booth055c0b32007-10-06 00:43:45 +00002411/* Returns the bit number of the most significant set bit of a number.
2412 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002413unsigned int
2414APInt::tcMSB(const integerPart *parts, unsigned int n)
2415{
2416 unsigned int msb;
2417
2418 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002419 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002420
Dan Gohman16e02092010-03-24 19:38:02 +00002421 if (parts[n] != 0) {
2422 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002423
Dan Gohman16e02092010-03-24 19:38:02 +00002424 return msb + n * integerPartWidth;
2425 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002426 } while (n);
2427
2428 return -1U;
2429}
2430
Neil Booth68e53ad2007-10-08 13:47:12 +00002431/* Copy the bit vector of width srcBITS from SRC, starting at bit
2432 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2433 the least significant bit of DST. All high bits above srcBITS in
2434 DST are zero-filled. */
2435void
Evan Chengcf69a742009-05-21 23:47:47 +00002436APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002437 unsigned int srcBits, unsigned int srcLSB)
2438{
2439 unsigned int firstSrcPart, dstParts, shift, n;
2440
2441 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002442 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002443
2444 firstSrcPart = srcLSB / integerPartWidth;
2445 tcAssign (dst, src + firstSrcPart, dstParts);
2446
2447 shift = srcLSB % integerPartWidth;
2448 tcShiftRight (dst, dstParts, shift);
2449
2450 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2451 in DST. If this is less that srcBits, append the rest, else
2452 clear the high bits. */
2453 n = dstParts * integerPartWidth - shift;
2454 if (n < srcBits) {
2455 integerPart mask = lowBitMask (srcBits - n);
2456 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2457 << n % integerPartWidth);
2458 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002459 if (srcBits % integerPartWidth)
2460 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002461 }
2462
2463 /* Clear high parts. */
2464 while (dstParts < dstCount)
2465 dst[dstParts++] = 0;
2466}
2467
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002468/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2469integerPart
2470APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2471 integerPart c, unsigned int parts)
2472{
2473 unsigned int i;
2474
2475 assert(c <= 1);
2476
Dan Gohman16e02092010-03-24 19:38:02 +00002477 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002478 integerPart l;
2479
2480 l = dst[i];
2481 if (c) {
2482 dst[i] += rhs[i] + 1;
2483 c = (dst[i] <= l);
2484 } else {
2485 dst[i] += rhs[i];
2486 c = (dst[i] < l);
2487 }
2488 }
2489
2490 return c;
2491}
2492
2493/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2494integerPart
2495APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2496 integerPart c, unsigned int parts)
2497{
2498 unsigned int i;
2499
2500 assert(c <= 1);
2501
Dan Gohman16e02092010-03-24 19:38:02 +00002502 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002503 integerPart l;
2504
2505 l = dst[i];
2506 if (c) {
2507 dst[i] -= rhs[i] + 1;
2508 c = (dst[i] >= l);
2509 } else {
2510 dst[i] -= rhs[i];
2511 c = (dst[i] > l);
2512 }
2513 }
2514
2515 return c;
2516}
2517
2518/* Negate a bignum in-place. */
2519void
2520APInt::tcNegate(integerPart *dst, unsigned int parts)
2521{
2522 tcComplement(dst, parts);
2523 tcIncrement(dst, parts);
2524}
2525
Neil Booth055c0b32007-10-06 00:43:45 +00002526/* DST += SRC * MULTIPLIER + CARRY if add is true
2527 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002528
2529 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2530 they must start at the same point, i.e. DST == SRC.
2531
2532 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2533 returned. Otherwise DST is filled with the least significant
2534 DSTPARTS parts of the result, and if all of the omitted higher
2535 parts were zero return zero, otherwise overflow occurred and
2536 return one. */
2537int
2538APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2539 integerPart multiplier, integerPart carry,
2540 unsigned int srcParts, unsigned int dstParts,
2541 bool add)
2542{
2543 unsigned int i, n;
2544
2545 /* Otherwise our writes of DST kill our later reads of SRC. */
2546 assert(dst <= src || dst >= src + srcParts);
2547 assert(dstParts <= srcParts + 1);
2548
2549 /* N loops; minimum of dstParts and srcParts. */
2550 n = dstParts < srcParts ? dstParts: srcParts;
2551
Dan Gohman16e02092010-03-24 19:38:02 +00002552 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002553 integerPart low, mid, high, srcPart;
2554
2555 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2556
2557 This cannot overflow, because
2558
2559 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2560
2561 which is less than n^2. */
2562
2563 srcPart = src[i];
2564
2565 if (multiplier == 0 || srcPart == 0) {
2566 low = carry;
2567 high = 0;
2568 } else {
2569 low = lowHalf(srcPart) * lowHalf(multiplier);
2570 high = highHalf(srcPart) * highHalf(multiplier);
2571
2572 mid = lowHalf(srcPart) * highHalf(multiplier);
2573 high += highHalf(mid);
2574 mid <<= integerPartWidth / 2;
2575 if (low + mid < low)
2576 high++;
2577 low += mid;
2578
2579 mid = highHalf(srcPart) * lowHalf(multiplier);
2580 high += highHalf(mid);
2581 mid <<= integerPartWidth / 2;
2582 if (low + mid < low)
2583 high++;
2584 low += mid;
2585
2586 /* Now add carry. */
2587 if (low + carry < low)
2588 high++;
2589 low += carry;
2590 }
2591
2592 if (add) {
2593 /* And now DST[i], and store the new low part there. */
2594 if (low + dst[i] < low)
2595 high++;
2596 dst[i] += low;
2597 } else
2598 dst[i] = low;
2599
2600 carry = high;
2601 }
2602
2603 if (i < dstParts) {
2604 /* Full multiplication, there is no overflow. */
2605 assert(i + 1 == dstParts);
2606 dst[i] = carry;
2607 return 0;
2608 } else {
2609 /* We overflowed if there is carry. */
2610 if (carry)
2611 return 1;
2612
2613 /* We would overflow if any significant unwritten parts would be
2614 non-zero. This is true if any remaining src parts are non-zero
2615 and the multiplier is non-zero. */
2616 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002617 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002618 if (src[i])
2619 return 1;
2620
2621 /* We fitted in the narrow destination. */
2622 return 0;
2623 }
2624}
2625
2626/* DST = LHS * RHS, where DST has the same width as the operands and
2627 is filled with the least significant parts of the result. Returns
2628 one if overflow occurred, otherwise zero. DST must be disjoint
2629 from both operands. */
2630int
2631APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2632 const integerPart *rhs, unsigned int parts)
2633{
2634 unsigned int i;
2635 int overflow;
2636
2637 assert(dst != lhs && dst != rhs);
2638
2639 overflow = 0;
2640 tcSet(dst, 0, parts);
2641
Dan Gohman16e02092010-03-24 19:38:02 +00002642 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002643 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2644 parts - i, true);
2645
2646 return overflow;
2647}
2648
Neil Booth978661d2007-10-06 00:24:48 +00002649/* DST = LHS * RHS, where DST has width the sum of the widths of the
2650 operands. No overflow occurs. DST must be disjoint from both
2651 operands. Returns the number of parts required to hold the
2652 result. */
2653unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002654APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002655 const integerPart *rhs, unsigned int lhsParts,
2656 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002657{
Neil Booth978661d2007-10-06 00:24:48 +00002658 /* Put the narrower number on the LHS for less loops below. */
2659 if (lhsParts > rhsParts) {
2660 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2661 } else {
2662 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002663
Neil Booth978661d2007-10-06 00:24:48 +00002664 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002665
Neil Booth978661d2007-10-06 00:24:48 +00002666 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002667
Dan Gohman16e02092010-03-24 19:38:02 +00002668 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002669 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002670
Neil Booth978661d2007-10-06 00:24:48 +00002671 n = lhsParts + rhsParts;
2672
2673 return n - (dst[n - 1] == 0);
2674 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002675}
2676
2677/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2678 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2679 set REMAINDER to the remainder, return zero. i.e.
2680
2681 OLD_LHS = RHS * LHS + REMAINDER
2682
2683 SCRATCH is a bignum of the same size as the operands and result for
2684 use by the routine; its contents need not be initialized and are
2685 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2686*/
2687int
2688APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2689 integerPart *remainder, integerPart *srhs,
2690 unsigned int parts)
2691{
2692 unsigned int n, shiftCount;
2693 integerPart mask;
2694
2695 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2696
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002697 shiftCount = tcMSB(rhs, parts) + 1;
2698 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002699 return true;
2700
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002701 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002702 n = shiftCount / integerPartWidth;
2703 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2704
2705 tcAssign(srhs, rhs, parts);
2706 tcShiftLeft(srhs, parts, shiftCount);
2707 tcAssign(remainder, lhs, parts);
2708 tcSet(lhs, 0, parts);
2709
2710 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2711 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002712 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002713 int compare;
2714
2715 compare = tcCompare(remainder, srhs, parts);
2716 if (compare >= 0) {
2717 tcSubtract(remainder, srhs, 0, parts);
2718 lhs[n] |= mask;
2719 }
2720
2721 if (shiftCount == 0)
2722 break;
2723 shiftCount--;
2724 tcShiftRight(srhs, parts, 1);
2725 if ((mask >>= 1) == 0)
2726 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2727 }
2728
2729 return false;
2730}
2731
2732/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2733 There are no restrictions on COUNT. */
2734void
2735APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2736{
Neil Booth68e53ad2007-10-08 13:47:12 +00002737 if (count) {
2738 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002739
Neil Booth68e53ad2007-10-08 13:47:12 +00002740 /* Jump is the inter-part jump; shift is is intra-part shift. */
2741 jump = count / integerPartWidth;
2742 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002743
Neil Booth68e53ad2007-10-08 13:47:12 +00002744 while (parts > jump) {
2745 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002746
Neil Booth68e53ad2007-10-08 13:47:12 +00002747 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002748
Neil Booth68e53ad2007-10-08 13:47:12 +00002749 /* dst[i] comes from the two parts src[i - jump] and, if we have
2750 an intra-part shift, src[i - jump - 1]. */
2751 part = dst[parts - jump];
2752 if (shift) {
2753 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002754 if (parts >= jump + 1)
2755 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2756 }
2757
Neil Booth68e53ad2007-10-08 13:47:12 +00002758 dst[parts] = part;
2759 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002760
Neil Booth68e53ad2007-10-08 13:47:12 +00002761 while (parts > 0)
2762 dst[--parts] = 0;
2763 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002764}
2765
2766/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2767 zero. There are no restrictions on COUNT. */
2768void
2769APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2770{
Neil Booth68e53ad2007-10-08 13:47:12 +00002771 if (count) {
2772 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002773
Neil Booth68e53ad2007-10-08 13:47:12 +00002774 /* Jump is the inter-part jump; shift is is intra-part shift. */
2775 jump = count / integerPartWidth;
2776 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002777
Neil Booth68e53ad2007-10-08 13:47:12 +00002778 /* Perform the shift. This leaves the most significant COUNT bits
2779 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002780 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002781 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002782
Neil Booth68e53ad2007-10-08 13:47:12 +00002783 if (i + jump >= parts) {
2784 part = 0;
2785 } else {
2786 part = dst[i + jump];
2787 if (shift) {
2788 part >>= shift;
2789 if (i + jump + 1 < parts)
2790 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2791 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002792 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002793
Neil Booth68e53ad2007-10-08 13:47:12 +00002794 dst[i] = part;
2795 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002796 }
2797}
2798
2799/* Bitwise and of two bignums. */
2800void
2801APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2802{
2803 unsigned int i;
2804
Dan Gohman16e02092010-03-24 19:38:02 +00002805 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002806 dst[i] &= rhs[i];
2807}
2808
2809/* Bitwise inclusive or of two bignums. */
2810void
2811APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2812{
2813 unsigned int i;
2814
Dan Gohman16e02092010-03-24 19:38:02 +00002815 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002816 dst[i] |= rhs[i];
2817}
2818
2819/* Bitwise exclusive or of two bignums. */
2820void
2821APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2822{
2823 unsigned int i;
2824
Dan Gohman16e02092010-03-24 19:38:02 +00002825 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002826 dst[i] ^= rhs[i];
2827}
2828
2829/* Complement a bignum in-place. */
2830void
2831APInt::tcComplement(integerPart *dst, unsigned int parts)
2832{
2833 unsigned int i;
2834
Dan Gohman16e02092010-03-24 19:38:02 +00002835 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002836 dst[i] = ~dst[i];
2837}
2838
2839/* Comparison (unsigned) of two bignums. */
2840int
2841APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2842 unsigned int parts)
2843{
2844 while (parts) {
2845 parts--;
2846 if (lhs[parts] == rhs[parts])
2847 continue;
2848
2849 if (lhs[parts] > rhs[parts])
2850 return 1;
2851 else
2852 return -1;
2853 }
2854
2855 return 0;
2856}
2857
2858/* Increment a bignum in-place, return the carry flag. */
2859integerPart
2860APInt::tcIncrement(integerPart *dst, unsigned int parts)
2861{
2862 unsigned int i;
2863
Dan Gohman16e02092010-03-24 19:38:02 +00002864 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002865 if (++dst[i] != 0)
2866 break;
2867
2868 return i == parts;
2869}
2870
2871/* Set the least significant BITS bits of a bignum, clear the
2872 rest. */
2873void
2874APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2875 unsigned int bits)
2876{
2877 unsigned int i;
2878
2879 i = 0;
2880 while (bits > integerPartWidth) {
2881 dst[i++] = ~(integerPart) 0;
2882 bits -= integerPartWidth;
2883 }
2884
2885 if (bits)
2886 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2887
2888 while (i < parts)
2889 dst[i++] = 0;
2890}