blob: e5423f153c3e6733984fd9054a629bfd17cdc8e7 [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 +0000725unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000726 if (isSingleWord())
Benjamin Kramera1853622012-03-12 21:18:53 +0000727 return CountLeadingOnes_64(VAL << (APINT_BITS_PER_WORD - BitWidth));
Reid Spencer681dcd12007-02-27 21:59:26 +0000728
Chris Lattner455e9ab2009-01-21 18:09:24 +0000729 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000730 unsigned shift;
731 if (!highWordBits) {
732 highWordBits = APINT_BITS_PER_WORD;
733 shift = 0;
734 } else {
735 shift = APINT_BITS_PER_WORD - highWordBits;
736 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000737 int i = getNumWords() - 1;
Benjamin Kramera1853622012-03-12 21:18:53 +0000738 unsigned Count = CountLeadingOnes_64(pVal[i] << shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000739 if (Count == highWordBits) {
740 for (i--; i >= 0; --i) {
741 if (pVal[i] == -1ULL)
742 Count += APINT_BITS_PER_WORD;
743 else {
Benjamin Kramera1853622012-03-12 21:18:53 +0000744 Count += CountLeadingOnes_64(pVal[i]);
Reid Spencer681dcd12007-02-27 21:59:26 +0000745 break;
746 }
747 }
748 }
749 return Count;
750}
751
Chris Lattner455e9ab2009-01-21 18:09:24 +0000752unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000753 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000754 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
755 unsigned Count = 0;
756 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000757 for (; i < getNumWords() && pVal[i] == 0; ++i)
758 Count += APINT_BITS_PER_WORD;
759 if (i < getNumWords())
760 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000761 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000762}
763
Chris Lattner455e9ab2009-01-21 18:09:24 +0000764unsigned APInt::countTrailingOnesSlowCase() const {
765 unsigned Count = 0;
766 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000767 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000768 Count += APINT_BITS_PER_WORD;
769 if (i < getNumWords())
770 Count += CountTrailingOnes_64(pVal[i]);
771 return std::min(Count, BitWidth);
772}
773
Chris Lattner455e9ab2009-01-21 18:09:24 +0000774unsigned APInt::countPopulationSlowCase() const {
775 unsigned Count = 0;
776 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000777 Count += CountPopulation_64(pVal[i]);
778 return Count;
779}
780
Richard Smithe73db4e2011-11-23 21:33:37 +0000781/// Perform a logical right-shift from Src to Dst, which must be equal or
782/// non-overlapping, of Words words, by Shift, which must be less than 64.
783static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
784 unsigned Shift) {
785 uint64_t Carry = 0;
786 for (int I = Words - 1; I >= 0; --I) {
787 uint64_t Tmp = Src[I];
788 Dst[I] = (Tmp >> Shift) | Carry;
789 Carry = Tmp << (64 - Shift);
790 }
791}
792
Reid Spencere81d2da2007-02-16 22:36:51 +0000793APInt APInt::byteSwap() const {
794 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
795 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000796 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000797 if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000798 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000799 if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000800 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000801 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000802 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000803 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000804 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengb04973e2007-02-15 06:36:31 +0000805 }
Richard Smithe73db4e2011-11-23 21:33:37 +0000806 if (BitWidth == 64)
807 return APInt(BitWidth, ByteSwap_64(VAL));
808
809 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
810 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
811 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
812 if (Result.BitWidth != BitWidth) {
813 lshrNear(Result.pVal, Result.pVal, getNumWords(),
814 Result.BitWidth - BitWidth);
815 Result.BitWidth = BitWidth;
816 }
817 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000818}
819
Eric Christopherd37eda82009-08-21 04:06:45 +0000820APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000821 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000822 APInt A = API1, B = API2;
823 while (!!B) {
824 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000825 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000826 A = T;
827 }
828 return A;
829}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000830
Chris Lattner455e9ab2009-01-21 18:09:24 +0000831APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000832 union {
833 double D;
834 uint64_t I;
835 } T;
836 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000837
838 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000839 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000840
841 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000842 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000843
844 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000845 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000846 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000847
848 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
849 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
850
851 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000852 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000853 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000854 APInt(width, mantissa >> (52 - exp));
855
856 // If the client didn't provide enough bits for us to shift the mantissa into
857 // then the result is undefined, just return 0
858 if (width <= exp - 52)
859 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000860
861 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000862 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000863 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000864 return isNeg ? -Tmp : Tmp;
865}
866
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000867/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000868/// The layout for double is as following (IEEE Standard 754):
869/// --------------------------------------
870/// | Sign Exponent Fraction Bias |
871/// |-------------------------------------- |
872/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000873/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000874double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000875
876 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000877 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000878 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
879 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000880 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000881 return double(sext);
882 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000883 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000884 }
885
Reid Spencer9c0696f2007-02-20 08:51:03 +0000886 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000887 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000888
889 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000890 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000891
892 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000893 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000894
Reid Spencer9c0696f2007-02-20 08:51:03 +0000895 // The exponent (without bias normalization) is just the number of bits
896 // we are using. Note that the sign bit is gone since we constructed the
897 // absolute value.
898 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000899
Reid Spencer9c0696f2007-02-20 08:51:03 +0000900 // Return infinity for exponent overflow
901 if (exp > 1023) {
902 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000903 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000904 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000905 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000906 }
907 exp += 1023; // Increment for 1023 bias
908
909 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
910 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000911 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000912 unsigned hiWord = whichWord(n-1);
913 if (hiWord == 0) {
914 mantissa = Tmp.pVal[0];
915 if (n > 52)
916 mantissa >>= n - 52; // shift down, we want the top 52 bits.
917 } else {
918 assert(hiWord > 0 && "huh?");
919 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
920 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
921 mantissa = hibits | lobits;
922 }
923
Zhou Shengd93f00c2007-02-12 20:02:55 +0000924 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000925 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000926 union {
927 double D;
928 uint64_t I;
929 } T;
930 T.I = sign | (exp << 52) | mantissa;
931 return T.D;
932}
933
Reid Spencere81d2da2007-02-16 22:36:51 +0000934// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000935APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000936 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000937 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +0000938
939 if (width <= APINT_BITS_PER_WORD)
940 return APInt(width, getRawData()[0]);
941
942 APInt Result(getMemory(getNumWords(width)), width);
943
944 // Copy full words.
945 unsigned i;
946 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
947 Result.pVal[i] = pVal[i];
948
949 // Truncate and copy any partial word.
950 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
951 if (bits != 0)
952 Result.pVal[i] = pVal[i] << bits >> bits;
953
954 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +0000955}
956
957// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000958APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000959 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +0000960
961 if (width <= APINT_BITS_PER_WORD) {
962 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
963 val = (int64_t)val >> (width - BitWidth);
964 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +0000965 }
966
Jay Foad40f8f622010-12-07 08:25:19 +0000967 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +0000968
Jay Foad40f8f622010-12-07 08:25:19 +0000969 // Copy full words.
970 unsigned i;
971 uint64_t word = 0;
972 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
973 word = getRawData()[i];
974 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +0000975 }
976
Jay Foad40f8f622010-12-07 08:25:19 +0000977 // Read and sign-extend any partial word.
978 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
979 if (bits != 0)
980 word = (int64_t)getRawData()[i] << bits >> bits;
981 else
982 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
983
984 // Write remaining full words.
985 for (; i != width / APINT_BITS_PER_WORD; i++) {
986 Result.pVal[i] = word;
987 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +0000988 }
Jay Foad40f8f622010-12-07 08:25:19 +0000989
990 // Write any partial word.
991 bits = (0 - width) % APINT_BITS_PER_WORD;
992 if (bits != 0)
993 Result.pVal[i] = word << bits >> bits;
994
995 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +0000996}
997
998// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000999APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001000 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001001
1002 if (width <= APINT_BITS_PER_WORD)
1003 return APInt(width, VAL);
1004
1005 APInt Result(getMemory(getNumWords(width)), width);
1006
1007 // Copy words.
1008 unsigned i;
1009 for (i = 0; i != getNumWords(); i++)
1010 Result.pVal[i] = getRawData()[i];
1011
1012 // Zero remaining words.
1013 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1014
1015 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001016}
1017
Jay Foad40f8f622010-12-07 08:25:19 +00001018APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001019 if (BitWidth < width)
1020 return zext(width);
1021 if (BitWidth > width)
1022 return trunc(width);
1023 return *this;
1024}
1025
Jay Foad40f8f622010-12-07 08:25:19 +00001026APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001027 if (BitWidth < width)
1028 return sext(width);
1029 if (BitWidth > width)
1030 return trunc(width);
1031 return *this;
1032}
1033
Rafael Espindola04594ae2012-01-27 23:33:07 +00001034APInt APInt::zextOrSelf(unsigned width) const {
1035 if (BitWidth < width)
1036 return zext(width);
1037 return *this;
1038}
1039
1040APInt APInt::sextOrSelf(unsigned width) const {
1041 if (BitWidth < width)
1042 return sext(width);
1043 return *this;
1044}
1045
Zhou Shengff4304f2007-02-09 07:48:24 +00001046/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001047/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001048APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001049 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001050}
1051
1052/// Arithmetic right-shift this APInt by shiftAmt.
1053/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001054APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001055 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001056 // Handle a degenerate case
1057 if (shiftAmt == 0)
1058 return *this;
1059
1060 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001061 if (isSingleWord()) {
1062 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001063 return APInt(BitWidth, 0); // undefined
1064 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001065 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001066 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001067 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1068 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001069 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001070
Reid Spencer46f9c942007-03-02 22:39:11 +00001071 // If all the bits were shifted out, the result is, technically, undefined.
1072 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1073 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001074 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001075 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001076 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001077 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001078 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001079 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001080
1081 // Create some space for the result.
1082 uint64_t * val = new uint64_t[getNumWords()];
1083
Reid Spencer46f9c942007-03-02 22:39:11 +00001084 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001085 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1086 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1087 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1088 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001089 if (bitsInWord == 0)
1090 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001091
1092 // If we are shifting whole words, just move whole words
1093 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001094 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001095 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001096 val[i] = pVal[i+offset]; // move whole word
1097
1098 // Adjust the top significant word for sign bit fill, if negative
1099 if (isNegative())
1100 if (bitsInWord < APINT_BITS_PER_WORD)
1101 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1102 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001103 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001104 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001105 // This combines the shifted corresponding word with the low bits from
1106 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001107 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001108 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1109 }
1110
1111 // Shift the break word. In this case there are no bits from the next word
1112 // to include in this word.
1113 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1114
1115 // Deal with sign extenstion in the break word, and possibly the word before
1116 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001117 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001118 if (wordShift > bitsInWord) {
1119 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001120 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001121 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1122 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001123 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001124 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001125 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001126 }
1127
Reid Spencer46f9c942007-03-02 22:39:11 +00001128 // Remaining words are 0 or -1, just assign them.
1129 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001130 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001131 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001132 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001133}
1134
Zhou Shengff4304f2007-02-09 07:48:24 +00001135/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001136/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001137APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001138 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001139}
1140
1141/// Logical right-shift this APInt by shiftAmt.
1142/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001143APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001144 if (isSingleWord()) {
Ahmed Charles969b7392012-02-24 19:06:15 +00001145 if (shiftAmt >= BitWidth)
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001146 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001147 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001148 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001149 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001150
Reid Spencerba81c2b2007-02-26 01:19:48 +00001151 // If all the bits were shifted out, the result is 0. This avoids issues
1152 // with shifting by the size of the integer type, which produces undefined
1153 // results. We define these "undefined results" to always be 0.
1154 if (shiftAmt == BitWidth)
1155 return APInt(BitWidth, 0);
1156
Reid Spencer02ae8b72007-05-17 06:26:29 +00001157 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001158 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001159 // undefined results in the code below. This is also an optimization.
1160 if (shiftAmt == 0)
1161 return *this;
1162
Reid Spencerba81c2b2007-02-26 01:19:48 +00001163 // Create some space for the result.
1164 uint64_t * val = new uint64_t[getNumWords()];
1165
1166 // If we are shifting less than a word, compute the shift with a simple carry
1167 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smithe73db4e2011-11-23 21:33:37 +00001168 lshrNear(val, pVal, getNumWords(), shiftAmt);
Reid Spencerba81c2b2007-02-26 01:19:48 +00001169 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001170 }
1171
Reid Spencerba81c2b2007-02-26 01:19:48 +00001172 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001173 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1174 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001175
1176 // If we are shifting whole words, just move whole words
1177 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001178 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001179 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001180 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001181 val[i] = 0;
1182 return APInt(val,BitWidth).clearUnusedBits();
1183 }
1184
Eric Christopherd37eda82009-08-21 04:06:45 +00001185 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001186 unsigned breakWord = getNumWords() - offset -1;
1187 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001188 val[i] = (pVal[i+offset] >> wordShift) |
1189 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001190 // Shift the break word.
1191 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1192
1193 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001194 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001195 val[i] = 0;
1196 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001197}
1198
Zhou Shengff4304f2007-02-09 07:48:24 +00001199/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001200/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001201APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001202 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001203 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001204}
1205
Chris Lattner455e9ab2009-01-21 18:09:24 +00001206APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001207 // If all the bits were shifted out, the result is 0. This avoids issues
1208 // with shifting by the size of the integer type, which produces undefined
1209 // results. We define these "undefined results" to always be 0.
1210 if (shiftAmt == BitWidth)
1211 return APInt(BitWidth, 0);
1212
Reid Spencer92c72832007-05-12 18:01:57 +00001213 // If none of the bits are shifted out, the result is *this. This avoids a
1214 // lshr by the words size in the loop below which can produce incorrect
1215 // results. It also avoids the expensive computation below for a common case.
1216 if (shiftAmt == 0)
1217 return *this;
1218
Reid Spencer87553802007-02-25 00:56:44 +00001219 // Create some space for the result.
1220 uint64_t * val = new uint64_t[getNumWords()];
1221
1222 // If we are shifting less than a word, do it the easy way
1223 if (shiftAmt < APINT_BITS_PER_WORD) {
1224 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001225 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001226 val[i] = pVal[i] << shiftAmt | carry;
1227 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1228 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001229 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001230 }
1231
Reid Spencer87553802007-02-25 00:56:44 +00001232 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001233 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1234 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001235
1236 // If we are shifting whole words, just move whole words
1237 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001238 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001239 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001240 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001241 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001242 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001243 }
Reid Spencer87553802007-02-25 00:56:44 +00001244
1245 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001246 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001247 for (; i > offset; --i)
1248 val[i] = pVal[i-offset] << wordShift |
1249 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001250 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001251 for (i = 0; i < offset; ++i)
1252 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001253 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001254}
1255
Dan Gohmancf609572008-02-29 01:40:47 +00001256APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001257 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001258}
1259
Chris Lattner455e9ab2009-01-21 18:09:24 +00001260APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001261 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001262 if (rotateAmt == 0)
1263 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001264 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001265}
1266
Dan Gohmancf609572008-02-29 01:40:47 +00001267APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001268 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001269}
1270
Chris Lattner455e9ab2009-01-21 18:09:24 +00001271APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001272 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001273 if (rotateAmt == 0)
1274 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001275 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001276}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001277
1278// Square Root - this method computes and returns the square root of "this".
1279// Three mechanisms are used for computation. For small values (<= 5 bits),
1280// a table lookup is done. This gets some performance for common cases. For
1281// values using less than 52 bits, the value is converted to double and then
1282// the libc sqrt function is called. The result is rounded and then converted
1283// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001284// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001285APInt APInt::sqrt() const {
1286
1287 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001288 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001289
1290 // Use a fast table for some small values. This also gets rid of some
1291 // rounding errors in libc sqrt for small values.
1292 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001293 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001294 /* 0 */ 0,
1295 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001296 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001297 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1298 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1299 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1300 /* 31 */ 6
1301 };
1302 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001303 }
1304
1305 // If the magnitude of the value fits in less than 52 bits (the precision of
1306 // an IEEE double precision floating point value), then we can use the
1307 // libc sqrt function which will probably use a hardware sqrt computation.
1308 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001309 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001310#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001311 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001312 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001313#else
1314 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001315 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001316#endif
1317 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001318
1319 // Okay, all the short cuts are exhausted. We must compute it. The following
1320 // is a classical Babylonian method for computing the square root. This code
1321 // was adapted to APINt from a wikipedia article on such computations.
1322 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001323 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001324 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001325 APInt testy(BitWidth, 16);
1326 APInt x_old(BitWidth, 1);
1327 APInt x_new(BitWidth, 0);
1328 APInt two(BitWidth, 2);
1329
1330 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001331 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001332 if (i >= nbits || this->ule(testy)) {
1333 x_old = x_old.shl(i / 2);
1334 break;
1335 }
1336
Eric Christopherd37eda82009-08-21 04:06:45 +00001337 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001338 for (;;) {
1339 x_new = (this->udiv(x_old) + x_old).udiv(two);
1340 if (x_old.ule(x_new))
1341 break;
1342 x_old = x_new;
1343 }
1344
1345 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001346 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001347 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001348 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001349 // floating point representation after 192 bits. There are no discrepancies
1350 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001351 APInt square(x_old * x_old);
1352 APInt nextSquare((x_old + 1) * (x_old +1));
1353 if (this->ult(square))
1354 return x_old;
David Blaikie18c7ec12011-12-01 20:58:30 +00001355 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1356 APInt midpoint((nextSquare - square).udiv(two));
1357 APInt offset(*this - square);
1358 if (offset.ult(midpoint))
1359 return x_old;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001360 return x_old + 1;
1361}
1362
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001363/// Computes the multiplicative inverse of this APInt for a given modulo. The
1364/// iterative extended Euclidean algorithm is used to solve for this value,
1365/// however we simplify it to speed up calculating only the inverse, and take
1366/// advantage of div+rem calculations. We also use some tricks to avoid copying
1367/// (potentially large) APInts around.
1368APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1369 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1370
1371 // Using the properties listed at the following web page (accessed 06/21/08):
1372 // http://www.numbertheory.org/php/euclid.html
1373 // (especially the properties numbered 3, 4 and 9) it can be proved that
1374 // BitWidth bits suffice for all the computations in the algorithm implemented
1375 // below. More precisely, this number of bits suffice if the multiplicative
1376 // inverse exists, but may not suffice for the general extended Euclidean
1377 // algorithm.
1378
1379 APInt r[2] = { modulo, *this };
1380 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1381 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001382
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001383 unsigned i;
1384 for (i = 0; r[i^1] != 0; i ^= 1) {
1385 // An overview of the math without the confusing bit-flipping:
1386 // q = r[i-2] / r[i-1]
1387 // r[i] = r[i-2] % r[i-1]
1388 // t[i] = t[i-2] - t[i-1] * q
1389 udivrem(r[i], r[i^1], q, r[i]);
1390 t[i] -= t[i^1] * q;
1391 }
1392
1393 // If this APInt and the modulo are not coprime, there is no multiplicative
1394 // inverse, so return 0. We check this by looking at the next-to-last
1395 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1396 // algorithm.
1397 if (r[i] != 1)
1398 return APInt(BitWidth, 0);
1399
1400 // The next-to-last t is the multiplicative inverse. However, we are
1401 // interested in a positive inverse. Calcuate a positive one from a negative
1402 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001403 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001404 return t[i].isNegative() ? t[i] + modulo : t[i];
1405}
1406
Jay Foad4e5ea552009-04-30 10:15:35 +00001407/// Calculate the magic numbers required to implement a signed integer division
1408/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1409/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1410/// Warren, Jr., chapter 10.
1411APInt::ms APInt::magic() const {
1412 const APInt& d = *this;
1413 unsigned p;
1414 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001415 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001416 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001417
Jay Foad4e5ea552009-04-30 10:15:35 +00001418 ad = d.abs();
1419 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1420 anc = t - 1 - t.urem(ad); // absolute value of nc
1421 p = d.getBitWidth() - 1; // initialize p
1422 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1423 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1424 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1425 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1426 do {
1427 p = p + 1;
1428 q1 = q1<<1; // update q1 = 2p/abs(nc)
1429 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1430 if (r1.uge(anc)) { // must be unsigned comparison
1431 q1 = q1 + 1;
1432 r1 = r1 - anc;
1433 }
1434 q2 = q2<<1; // update q2 = 2p/abs(d)
1435 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1436 if (r2.uge(ad)) { // must be unsigned comparison
1437 q2 = q2 + 1;
1438 r2 = r2 - ad;
1439 }
1440 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001441 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001442
Jay Foad4e5ea552009-04-30 10:15:35 +00001443 mag.m = q2 + 1;
1444 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1445 mag.s = p - d.getBitWidth(); // resulting shift
1446 return mag;
1447}
1448
1449/// Calculate the magic numbers required to implement an unsigned integer
1450/// division by a constant as a sequence of multiplies, adds and shifts.
1451/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1452/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001453/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001454/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001455APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001456 const APInt& d = *this;
1457 unsigned p;
1458 APInt nc, delta, q1, r1, q2, r2;
1459 struct mu magu;
1460 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001461 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001462 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1463 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1464
1465 nc = allOnes - (-d).urem(d);
1466 p = d.getBitWidth() - 1; // initialize p
1467 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1468 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1469 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1470 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1471 do {
1472 p = p + 1;
1473 if (r1.uge(nc - r1)) {
1474 q1 = q1 + q1 + 1; // update q1
1475 r1 = r1 + r1 - nc; // update r1
1476 }
1477 else {
1478 q1 = q1+q1; // update q1
1479 r1 = r1+r1; // update r1
1480 }
1481 if ((r2 + 1).uge(d - r2)) {
1482 if (q2.uge(signedMax)) magu.a = 1;
1483 q2 = q2+q2 + 1; // update q2
1484 r2 = r2+r2 + 1 - d; // update r2
1485 }
1486 else {
1487 if (q2.uge(signedMin)) magu.a = 1;
1488 q2 = q2+q2; // update q2
1489 r2 = r2+r2 + 1; // update r2
1490 }
1491 delta = d - 1 - r2;
1492 } while (p < d.getBitWidth()*2 &&
1493 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1494 magu.m = q2 + 1; // resulting magic number
1495 magu.s = p - d.getBitWidth(); // resulting shift
1496 return magu;
1497}
1498
Reid Spencer9c0696f2007-02-20 08:51:03 +00001499/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1500/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1501/// variables here have the same names as in the algorithm. Comments explain
1502/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001503static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1504 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001505 assert(u && "Must provide dividend");
1506 assert(v && "Must provide divisor");
1507 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001508 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001509 assert(n>1 && "n must be > 1");
1510
1511 // Knuth uses the value b as the base of the number system. In our case b
1512 // is 2^31 so we just set it to -1u.
1513 uint64_t b = uint64_t(1) << 32;
1514
Chris Lattnerfad86b02008-08-17 07:19:36 +00001515#if 0
David Greene465abed2010-01-05 01:28:52 +00001516 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1517 DEBUG(dbgs() << "KnuthDiv: original:");
1518 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1519 DEBUG(dbgs() << " by");
1520 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1521 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001522#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001523 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1524 // u and v by d. Note that we have taken Knuth's advice here to use a power
1525 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1526 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001527 // shift amount from the leading zeros. We are basically normalizing the u
1528 // and v so that its high bits are shifted to the top of v's range without
1529 // overflow. Note that this can require an extra word in u so that u must
1530 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001531 unsigned shift = CountLeadingZeros_32(v[n-1]);
1532 unsigned v_carry = 0;
1533 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001534 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001535 for (unsigned i = 0; i < m+n; ++i) {
1536 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001537 u[i] = (u[i] << shift) | u_carry;
1538 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001539 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001540 for (unsigned i = 0; i < n; ++i) {
1541 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001542 v[i] = (v[i] << shift) | v_carry;
1543 v_carry = v_tmp;
1544 }
1545 }
1546 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001547#if 0
David Greene465abed2010-01-05 01:28:52 +00001548 DEBUG(dbgs() << "KnuthDiv: normal:");
1549 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1550 DEBUG(dbgs() << " by");
1551 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1552 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001553#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001554
1555 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1556 int j = m;
1557 do {
David Greene465abed2010-01-05 01:28:52 +00001558 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001559 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001560 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1561 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1562 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1563 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1564 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001565 // value qp is one too large, and it eliminates all cases where qp is two
1566 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001567 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001568 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001569 uint64_t qp = dividend / v[n-1];
1570 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001571 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1572 qp--;
1573 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001574 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001575 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001576 }
David Greene465abed2010-01-05 01:28:52 +00001577 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001578
Reid Spencer92904632007-02-23 01:57:13 +00001579 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1580 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1581 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001582 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001583 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001584 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001585 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001586 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001587 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001588 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001589 << ", subtrahend == " << subtrahend
1590 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001591
Reid Spencer610fad82007-02-24 10:01:42 +00001592 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001593 unsigned k = j + i;
1594 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1595 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001596 while (borrow && k <= m+n) { // deal with borrow to the left
1597 borrow = u[k] == 0;
1598 u[k]--;
1599 k++;
1600 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001601 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001602 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001603 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001604 }
David Greene465abed2010-01-05 01:28:52 +00001605 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1606 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1607 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001608 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1609 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001610 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001611 // the true value, and a "borrow" to the left should be remembered.
1612 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001613 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001614 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001615 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001616 u[i] = ~u[i] + carry; // b's complement
1617 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001618 }
Reid Spencer92904632007-02-23 01:57:13 +00001619 }
David Greene465abed2010-01-05 01:28:52 +00001620 DEBUG(dbgs() << "KnuthDiv: after complement:");
1621 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1622 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001623
Eric Christopherd37eda82009-08-21 04:06:45 +00001624 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001625 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001626 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001627 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001628 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001629 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001630 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001631 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001632 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1633 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001634 // since it cancels with the borrow that occurred in D4.
1635 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001636 for (unsigned i = 0; i < n; i++) {
1637 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001638 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001639 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001640 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001641 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001642 }
David Greene465abed2010-01-05 01:28:52 +00001643 DEBUG(dbgs() << "KnuthDiv: after correction:");
1644 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1645 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001646
Reid Spencer92904632007-02-23 01:57:13 +00001647 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1648 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001649
David Greene465abed2010-01-05 01:28:52 +00001650 DEBUG(dbgs() << "KnuthDiv: quotient:");
1651 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1652 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001653
Reid Spencer9c0696f2007-02-20 08:51:03 +00001654 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1655 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1656 // compute the remainder (urem uses this).
1657 if (r) {
1658 // The value d is expressed by the "shift" value above since we avoided
1659 // multiplication by d by using a shift left. So, all we have to do is
1660 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001661 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001662 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001663 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001664 for (int i = n-1; i >= 0; i--) {
1665 r[i] = (u[i] >> shift) | carry;
1666 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001667 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001668 }
1669 } else {
1670 for (int i = n-1; i >= 0; i--) {
1671 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001672 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001673 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001674 }
David Greene465abed2010-01-05 01:28:52 +00001675 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001676 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001677#if 0
David Greene465abed2010-01-05 01:28:52 +00001678 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001679#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001680}
1681
Chris Lattner455e9ab2009-01-21 18:09:24 +00001682void APInt::divide(const APInt LHS, unsigned lhsWords,
1683 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001684 APInt *Quotient, APInt *Remainder)
1685{
1686 assert(lhsWords >= rhsWords && "Fractional result");
1687
Eric Christopherd37eda82009-08-21 04:06:45 +00001688 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001689 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001690 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001691 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1692 // can't use 64-bit operands here because we don't have native results of
1693 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001694 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001695 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001696 unsigned n = rhsWords * 2;
1697 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001698
1699 // Allocate space for the temporary values we need either on the stack, if
1700 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001701 unsigned SPACE[128];
1702 unsigned *U = 0;
1703 unsigned *V = 0;
1704 unsigned *Q = 0;
1705 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001706 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1707 U = &SPACE[0];
1708 V = &SPACE[m+n+1];
1709 Q = &SPACE[(m+n+1) + n];
1710 if (Remainder)
1711 R = &SPACE[(m+n+1) + n + (m+n)];
1712 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001713 U = new unsigned[m + n + 1];
1714 V = new unsigned[n];
1715 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001716 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001717 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001718 }
1719
1720 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001721 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001722 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001723 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001724 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001725 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001726 }
1727 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1728
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001729 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001730 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001731 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001732 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001733 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001734 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001735 }
1736
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001737 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001738 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001739 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001740 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001741
Eric Christopherd37eda82009-08-21 04:06:45 +00001742 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001743 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001744 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001745 // contain any zero words or the Knuth algorithm fails.
1746 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1747 n--;
1748 m++;
1749 }
1750 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1751 m--;
1752
1753 // If we're left with only a single word for the divisor, Knuth doesn't work
1754 // so we implement the short division algorithm here. This is much simpler
1755 // and faster because we are certain that we can divide a 64-bit quantity
1756 // by a 32-bit quantity at hardware speed and short division is simply a
1757 // series of such operations. This is just like doing short division but we
1758 // are using base 2^32 instead of base 10.
1759 assert(n != 0 && "Divide by zero?");
1760 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001761 unsigned divisor = V[0];
1762 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001763 for (int i = m+n-1; i >= 0; i--) {
1764 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1765 if (partial_dividend == 0) {
1766 Q[i] = 0;
1767 remainder = 0;
1768 } else if (partial_dividend < divisor) {
1769 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001770 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001771 } else if (partial_dividend == divisor) {
1772 Q[i] = 1;
1773 remainder = 0;
1774 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001775 Q[i] = (unsigned)(partial_dividend / divisor);
1776 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001777 }
1778 }
1779 if (R)
1780 R[0] = remainder;
1781 } else {
1782 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1783 // case n > 1.
1784 KnuthDiv(U, V, Q, R, m, n);
1785 }
1786
1787 // If the caller wants the quotient
1788 if (Quotient) {
1789 // Set up the Quotient value's memory.
1790 if (Quotient->BitWidth != LHS.BitWidth) {
1791 if (Quotient->isSingleWord())
1792 Quotient->VAL = 0;
1793 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001794 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001795 Quotient->BitWidth = LHS.BitWidth;
1796 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001797 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001798 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001799 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001800
Eric Christopherd37eda82009-08-21 04:06:45 +00001801 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001802 // order words.
1803 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001804 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001805 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1806 if (Quotient->isSingleWord())
1807 Quotient->VAL = tmp;
1808 else
1809 Quotient->pVal[0] = tmp;
1810 } else {
1811 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1812 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001813 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001814 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1815 }
1816 }
1817
1818 // If the caller wants the remainder
1819 if (Remainder) {
1820 // Set up the Remainder value's memory.
1821 if (Remainder->BitWidth != RHS.BitWidth) {
1822 if (Remainder->isSingleWord())
1823 Remainder->VAL = 0;
1824 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001825 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001826 Remainder->BitWidth = RHS.BitWidth;
1827 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001828 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001829 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001830 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001831
1832 // The remainder is in R. Reconstitute the remainder into Remainder's low
1833 // order words.
1834 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001835 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001836 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1837 if (Remainder->isSingleWord())
1838 Remainder->VAL = tmp;
1839 else
1840 Remainder->pVal[0] = tmp;
1841 } else {
1842 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1843 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001844 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001845 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1846 }
1847 }
1848
1849 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001850 if (U != &SPACE[0]) {
1851 delete [] U;
1852 delete [] V;
1853 delete [] Q;
1854 delete [] R;
1855 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001856}
1857
Reid Spencere81d2da2007-02-16 22:36:51 +00001858APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001859 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001860
1861 // First, deal with the easy case
1862 if (isSingleWord()) {
1863 assert(RHS.VAL != 0 && "Divide by zero?");
1864 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001865 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001866
Reid Spencer71bd08f2007-02-17 02:07:07 +00001867 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001868 unsigned rhsBits = RHS.getActiveBits();
1869 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001870 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001871 unsigned lhsBits = this->getActiveBits();
1872 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001873
1874 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001875 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001876 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001877 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001878 else if (lhsWords < rhsWords || this->ult(RHS)) {
1879 // X / Y ===> 0, iff X < Y
1880 return APInt(BitWidth, 0);
1881 } else if (*this == RHS) {
1882 // X / X ===> 1
1883 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001884 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001885 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001886 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001887 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001888
1889 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1890 APInt Quotient(1,0); // to hold result.
1891 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1892 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001893}
1894
Reid Spencere81d2da2007-02-16 22:36:51 +00001895APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001896 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001897 if (isSingleWord()) {
1898 assert(RHS.VAL != 0 && "Remainder by zero?");
1899 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001900 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001901
Reid Spencere0cdd332007-02-21 08:21:52 +00001902 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001903 unsigned lhsBits = getActiveBits();
1904 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001905
1906 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001907 unsigned rhsBits = RHS.getActiveBits();
1908 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001909 assert(rhsWords && "Performing remainder operation by zero ???");
1910
Reid Spencer71bd08f2007-02-17 02:07:07 +00001911 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001912 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001913 // 0 % Y ===> 0
1914 return APInt(BitWidth, 0);
1915 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1916 // X % Y ===> X, iff X < Y
1917 return *this;
1918 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001919 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001920 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001921 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001922 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001923 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001924 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001925
Reid Spencer19dc32a2007-05-13 23:44:59 +00001926 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001927 APInt Remainder(1,0);
1928 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1929 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001930}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001931
Eric Christopherd37eda82009-08-21 04:06:45 +00001932void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00001933 APInt &Quotient, APInt &Remainder) {
1934 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001935 unsigned lhsBits = LHS.getActiveBits();
1936 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1937 unsigned rhsBits = RHS.getActiveBits();
1938 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001939
1940 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001941 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00001942 Quotient = 0; // 0 / Y ===> 0
1943 Remainder = 0; // 0 % Y ===> 0
1944 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001945 }
1946
1947 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00001948 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00001949 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00001950 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001951 }
1952
Reid Spencer19dc32a2007-05-13 23:44:59 +00001953 if (LHS == RHS) {
1954 Quotient = 1; // X / X ===> 1
1955 Remainder = 0; // X % X ===> 0;
1956 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001957 }
1958
Reid Spencer19dc32a2007-05-13 23:44:59 +00001959 if (lhsWords == 1 && rhsWords == 1) {
1960 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001961 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1962 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
1963 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
1964 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001965 return;
1966 }
1967
1968 // Okay, lets do it the long way
1969 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1970}
1971
Chris Lattner0a0a5852010-10-13 23:54:10 +00001972APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001973 APInt Res = *this+RHS;
1974 Overflow = isNonNegative() == RHS.isNonNegative() &&
1975 Res.isNonNegative() != isNonNegative();
1976 return Res;
1977}
1978
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001979APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
1980 APInt Res = *this+RHS;
1981 Overflow = Res.ult(RHS);
1982 return Res;
1983}
1984
Chris Lattner0a0a5852010-10-13 23:54:10 +00001985APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001986 APInt Res = *this - RHS;
1987 Overflow = isNonNegative() != RHS.isNonNegative() &&
1988 Res.isNonNegative() != isNonNegative();
1989 return Res;
1990}
1991
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001992APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00001993 APInt Res = *this-RHS;
1994 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001995 return Res;
1996}
1997
Chris Lattner0a0a5852010-10-13 23:54:10 +00001998APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001999 // MININT/-1 --> overflow.
2000 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2001 return sdiv(RHS);
2002}
2003
Chris Lattner0a0a5852010-10-13 23:54:10 +00002004APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002005 APInt Res = *this * RHS;
2006
2007 if (*this != 0 && RHS != 0)
2008 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2009 else
2010 Overflow = false;
2011 return Res;
2012}
2013
Frits van Bommel62086102011-03-27 14:26:13 +00002014APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2015 APInt Res = *this * RHS;
2016
2017 if (*this != 0 && RHS != 0)
2018 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2019 else
2020 Overflow = false;
2021 return Res;
2022}
2023
Chris Lattner0a0a5852010-10-13 23:54:10 +00002024APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002025 Overflow = ShAmt >= getBitWidth();
2026 if (Overflow)
2027 ShAmt = getBitWidth()-1;
2028
2029 if (isNonNegative()) // Don't allow sign change.
2030 Overflow = ShAmt >= countLeadingZeros();
2031 else
2032 Overflow = ShAmt >= countLeadingOnes();
2033
2034 return *this << ShAmt;
2035}
2036
2037
2038
2039
Benjamin Kramer38e59892010-07-14 22:38:02 +00002040void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002041 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002042 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002043 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2044 radix == 36) &&
2045 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002046
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002047 StringRef::iterator p = str.begin();
2048 size_t slen = str.size();
2049 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002050 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002051 p++;
2052 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002053 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002054 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002055 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002056 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2057 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002058 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2059 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002060
2061 // Allocate memory
2062 if (!isSingleWord())
2063 pVal = getClearedMemory(getNumWords());
2064
2065 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002066 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002067
2068 // Set up an APInt for the digit to add outside the loop so we don't
2069 // constantly construct/destruct it.
2070 APInt apdigit(getBitWidth(), 0);
2071 APInt apradix(getBitWidth(), radix);
2072
2073 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002074 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002075 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002076 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002077
Reid Spencer6551dcd2007-05-16 19:18:22 +00002078 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002079 if (slen > 1) {
2080 if (shift)
2081 *this <<= shift;
2082 else
2083 *this *= apradix;
2084 }
Reid Spencer385f7542007-02-21 03:55:44 +00002085
2086 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002087 if (apdigit.isSingleWord())
2088 apdigit.VAL = digit;
2089 else
2090 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002091 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002092 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002093 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002094 if (isNeg) {
2095 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002096 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002097 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002098}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002099
Chris Lattnerfad86b02008-08-17 07:19:36 +00002100void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002101 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002102 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2103 Radix == 36) &&
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002104 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002105
Ted Kremenekcf886182011-06-15 00:51:55 +00002106 const char *Prefix = "";
2107 if (formatAsCLiteral) {
2108 switch (Radix) {
2109 case 2:
2110 // Binary literals are a non-standard extension added in gcc 4.3:
2111 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2112 Prefix = "0b";
2113 break;
2114 case 8:
2115 Prefix = "0";
2116 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002117 case 10:
2118 break; // No prefix
Ted Kremenekcf886182011-06-15 00:51:55 +00002119 case 16:
2120 Prefix = "0x";
2121 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002122 default:
2123 llvm_unreachable("Invalid radix!");
Ted Kremenekcf886182011-06-15 00:51:55 +00002124 }
2125 }
2126
Chris Lattnerfad86b02008-08-17 07:19:36 +00002127 // First, check for a zero value and just short circuit the logic below.
2128 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002129 while (*Prefix) {
2130 Str.push_back(*Prefix);
2131 ++Prefix;
2132 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002133 Str.push_back('0');
2134 return;
2135 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002136
Douglas Gregordcd99962011-09-14 15:54:46 +00002137 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002138
Reid Spencer9c0696f2007-02-20 08:51:03 +00002139 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002140 char Buffer[65];
2141 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002142
Chris Lattnerfad86b02008-08-17 07:19:36 +00002143 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002144 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002145 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002146 } else {
2147 int64_t I = getSExtValue();
2148 if (I >= 0) {
2149 N = I;
2150 } else {
2151 Str.push_back('-');
2152 N = -(uint64_t)I;
2153 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002154 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002155
Ted Kremenekcf886182011-06-15 00:51:55 +00002156 while (*Prefix) {
2157 Str.push_back(*Prefix);
2158 ++Prefix;
2159 };
2160
Chris Lattnerfad86b02008-08-17 07:19:36 +00002161 while (N) {
2162 *--BufPtr = Digits[N % Radix];
2163 N /= Radix;
2164 }
2165 Str.append(BufPtr, Buffer+65);
2166 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002167 }
2168
Chris Lattnerfad86b02008-08-17 07:19:36 +00002169 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002170
Chris Lattnerfad86b02008-08-17 07:19:36 +00002171 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002172 // They want to print the signed version and it is a negative value
2173 // Flip the bits and add one to turn it into the equivalent positive
2174 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002175 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002176 Tmp++;
2177 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002178 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002179
Ted Kremenekcf886182011-06-15 00:51:55 +00002180 while (*Prefix) {
2181 Str.push_back(*Prefix);
2182 ++Prefix;
2183 };
2184
Chris Lattnerfad86b02008-08-17 07:19:36 +00002185 // We insert the digits backward, then reverse them to get the right order.
2186 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002187
2188 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2189 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002190 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002191 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002192 // Just shift tmp right for each digit width until it becomes zero
2193 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2194 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002195
Chris Lattnerfad86b02008-08-17 07:19:36 +00002196 while (Tmp != 0) {
2197 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2198 Str.push_back(Digits[Digit]);
2199 Tmp = Tmp.lshr(ShiftAmt);
2200 }
2201 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002202 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002203 while (Tmp != 0) {
2204 APInt APdigit(1, 0);
2205 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002206 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002207 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002208 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002209 assert(Digit < Radix && "divide failed");
2210 Str.push_back(Digits[Digit]);
2211 Tmp = tmp2;
2212 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002213 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002214
Chris Lattnerfad86b02008-08-17 07:19:36 +00002215 // Reverse the digits before returning.
2216 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002217}
2218
Chris Lattnerfad86b02008-08-17 07:19:36 +00002219/// toString - This returns the APInt as a std::string. Note that this is an
2220/// inefficient method. It is better to pass in a SmallVector/SmallString
2221/// to the methods above.
2222std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2223 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002224 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002225 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002226}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002227
Chris Lattnerfad86b02008-08-17 07:19:36 +00002228
2229void APInt::dump() const {
2230 SmallString<40> S, U;
2231 this->toStringUnsigned(U);
2232 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002233 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002234 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002235}
2236
Chris Lattner944fac72008-08-23 22:23:09 +00002237void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002238 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002239 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002240 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002241}
2242
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002243// This implements a variety of operations on a representation of
2244// arbitrary precision, two's-complement, bignum integer values.
2245
Chris Lattner91021d32009-08-23 23:11:28 +00002246// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2247// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002248#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002249COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002250
2251/* Some handy functions local to this file. */
2252namespace {
2253
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002254 /* Returns the integer part with the least significant BITS set.
2255 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002256 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002257 lowBitMask(unsigned int bits)
2258 {
Dan Gohman16e02092010-03-24 19:38:02 +00002259 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002260
2261 return ~(integerPart) 0 >> (integerPartWidth - bits);
2262 }
2263
Neil Booth055c0b32007-10-06 00:43:45 +00002264 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002265 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002266 lowHalf(integerPart part)
2267 {
2268 return part & lowBitMask(integerPartWidth / 2);
2269 }
2270
Neil Booth055c0b32007-10-06 00:43:45 +00002271 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002272 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002273 highHalf(integerPart part)
2274 {
2275 return part >> (integerPartWidth / 2);
2276 }
2277
Neil Booth055c0b32007-10-06 00:43:45 +00002278 /* Returns the bit number of the most significant set bit of a part.
2279 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002280 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002281 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002282 {
2283 unsigned int n, msb;
2284
2285 if (value == 0)
2286 return -1U;
2287
2288 n = integerPartWidth / 2;
2289
2290 msb = 0;
2291 do {
2292 if (value >> n) {
2293 value >>= n;
2294 msb += n;
2295 }
2296
2297 n >>= 1;
2298 } while (n);
2299
2300 return msb;
2301 }
2302
Neil Booth055c0b32007-10-06 00:43:45 +00002303 /* Returns the bit number of the least significant set bit of a
2304 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002305 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002306 partLSB(integerPart value)
2307 {
2308 unsigned int n, lsb;
2309
2310 if (value == 0)
2311 return -1U;
2312
2313 lsb = integerPartWidth - 1;
2314 n = integerPartWidth / 2;
2315
2316 do {
2317 if (value << n) {
2318 value <<= n;
2319 lsb -= n;
2320 }
2321
2322 n >>= 1;
2323 } while (n);
2324
2325 return lsb;
2326 }
2327}
2328
2329/* Sets the least significant part of a bignum to the input value, and
2330 zeroes out higher parts. */
2331void
2332APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2333{
2334 unsigned int i;
2335
Dan Gohman16e02092010-03-24 19:38:02 +00002336 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002337
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002338 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002339 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002340 dst[i] = 0;
2341}
2342
2343/* Assign one bignum to another. */
2344void
2345APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2346{
2347 unsigned int i;
2348
Dan Gohman16e02092010-03-24 19:38:02 +00002349 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002350 dst[i] = src[i];
2351}
2352
2353/* Returns true if a bignum is zero, false otherwise. */
2354bool
2355APInt::tcIsZero(const integerPart *src, unsigned int parts)
2356{
2357 unsigned int i;
2358
Dan Gohman16e02092010-03-24 19:38:02 +00002359 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002360 if (src[i])
2361 return false;
2362
2363 return true;
2364}
2365
2366/* Extract the given bit of a bignum; returns 0 or 1. */
2367int
2368APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2369{
Dan Gohman16e02092010-03-24 19:38:02 +00002370 return (parts[bit / integerPartWidth] &
2371 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002372}
2373
John McCalle12b7382010-02-28 02:51:25 +00002374/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002375void
2376APInt::tcSetBit(integerPart *parts, unsigned int bit)
2377{
2378 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2379}
2380
John McCalle12b7382010-02-28 02:51:25 +00002381/* Clears the given bit of a bignum. */
2382void
2383APInt::tcClearBit(integerPart *parts, unsigned int bit)
2384{
2385 parts[bit / integerPartWidth] &=
2386 ~((integerPart) 1 << (bit % integerPartWidth));
2387}
2388
Neil Booth055c0b32007-10-06 00:43:45 +00002389/* Returns the bit number of the least significant set bit of a
2390 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002391unsigned int
2392APInt::tcLSB(const integerPart *parts, unsigned int n)
2393{
2394 unsigned int i, lsb;
2395
Dan Gohman16e02092010-03-24 19:38:02 +00002396 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002397 if (parts[i] != 0) {
2398 lsb = partLSB(parts[i]);
2399
2400 return lsb + i * integerPartWidth;
2401 }
2402 }
2403
2404 return -1U;
2405}
2406
Neil Booth055c0b32007-10-06 00:43:45 +00002407/* Returns the bit number of the most significant set bit of a number.
2408 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002409unsigned int
2410APInt::tcMSB(const integerPart *parts, unsigned int n)
2411{
2412 unsigned int msb;
2413
2414 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002415 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002416
Dan Gohman16e02092010-03-24 19:38:02 +00002417 if (parts[n] != 0) {
2418 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002419
Dan Gohman16e02092010-03-24 19:38:02 +00002420 return msb + n * integerPartWidth;
2421 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002422 } while (n);
2423
2424 return -1U;
2425}
2426
Neil Booth68e53ad2007-10-08 13:47:12 +00002427/* Copy the bit vector of width srcBITS from SRC, starting at bit
2428 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2429 the least significant bit of DST. All high bits above srcBITS in
2430 DST are zero-filled. */
2431void
Evan Chengcf69a742009-05-21 23:47:47 +00002432APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002433 unsigned int srcBits, unsigned int srcLSB)
2434{
2435 unsigned int firstSrcPart, dstParts, shift, n;
2436
2437 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002438 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002439
2440 firstSrcPart = srcLSB / integerPartWidth;
2441 tcAssign (dst, src + firstSrcPart, dstParts);
2442
2443 shift = srcLSB % integerPartWidth;
2444 tcShiftRight (dst, dstParts, shift);
2445
2446 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2447 in DST. If this is less that srcBits, append the rest, else
2448 clear the high bits. */
2449 n = dstParts * integerPartWidth - shift;
2450 if (n < srcBits) {
2451 integerPart mask = lowBitMask (srcBits - n);
2452 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2453 << n % integerPartWidth);
2454 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002455 if (srcBits % integerPartWidth)
2456 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002457 }
2458
2459 /* Clear high parts. */
2460 while (dstParts < dstCount)
2461 dst[dstParts++] = 0;
2462}
2463
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002464/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2465integerPart
2466APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2467 integerPart c, unsigned int parts)
2468{
2469 unsigned int i;
2470
2471 assert(c <= 1);
2472
Dan Gohman16e02092010-03-24 19:38:02 +00002473 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002474 integerPart l;
2475
2476 l = dst[i];
2477 if (c) {
2478 dst[i] += rhs[i] + 1;
2479 c = (dst[i] <= l);
2480 } else {
2481 dst[i] += rhs[i];
2482 c = (dst[i] < l);
2483 }
2484 }
2485
2486 return c;
2487}
2488
2489/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2490integerPart
2491APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2492 integerPart c, unsigned int parts)
2493{
2494 unsigned int i;
2495
2496 assert(c <= 1);
2497
Dan Gohman16e02092010-03-24 19:38:02 +00002498 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002499 integerPart l;
2500
2501 l = dst[i];
2502 if (c) {
2503 dst[i] -= rhs[i] + 1;
2504 c = (dst[i] >= l);
2505 } else {
2506 dst[i] -= rhs[i];
2507 c = (dst[i] > l);
2508 }
2509 }
2510
2511 return c;
2512}
2513
2514/* Negate a bignum in-place. */
2515void
2516APInt::tcNegate(integerPart *dst, unsigned int parts)
2517{
2518 tcComplement(dst, parts);
2519 tcIncrement(dst, parts);
2520}
2521
Neil Booth055c0b32007-10-06 00:43:45 +00002522/* DST += SRC * MULTIPLIER + CARRY if add is true
2523 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002524
2525 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2526 they must start at the same point, i.e. DST == SRC.
2527
2528 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2529 returned. Otherwise DST is filled with the least significant
2530 DSTPARTS parts of the result, and if all of the omitted higher
2531 parts were zero return zero, otherwise overflow occurred and
2532 return one. */
2533int
2534APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2535 integerPart multiplier, integerPart carry,
2536 unsigned int srcParts, unsigned int dstParts,
2537 bool add)
2538{
2539 unsigned int i, n;
2540
2541 /* Otherwise our writes of DST kill our later reads of SRC. */
2542 assert(dst <= src || dst >= src + srcParts);
2543 assert(dstParts <= srcParts + 1);
2544
2545 /* N loops; minimum of dstParts and srcParts. */
2546 n = dstParts < srcParts ? dstParts: srcParts;
2547
Dan Gohman16e02092010-03-24 19:38:02 +00002548 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002549 integerPart low, mid, high, srcPart;
2550
2551 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2552
2553 This cannot overflow, because
2554
2555 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2556
2557 which is less than n^2. */
2558
2559 srcPart = src[i];
2560
2561 if (multiplier == 0 || srcPart == 0) {
2562 low = carry;
2563 high = 0;
2564 } else {
2565 low = lowHalf(srcPart) * lowHalf(multiplier);
2566 high = highHalf(srcPart) * highHalf(multiplier);
2567
2568 mid = lowHalf(srcPart) * highHalf(multiplier);
2569 high += highHalf(mid);
2570 mid <<= integerPartWidth / 2;
2571 if (low + mid < low)
2572 high++;
2573 low += mid;
2574
2575 mid = highHalf(srcPart) * lowHalf(multiplier);
2576 high += highHalf(mid);
2577 mid <<= integerPartWidth / 2;
2578 if (low + mid < low)
2579 high++;
2580 low += mid;
2581
2582 /* Now add carry. */
2583 if (low + carry < low)
2584 high++;
2585 low += carry;
2586 }
2587
2588 if (add) {
2589 /* And now DST[i], and store the new low part there. */
2590 if (low + dst[i] < low)
2591 high++;
2592 dst[i] += low;
2593 } else
2594 dst[i] = low;
2595
2596 carry = high;
2597 }
2598
2599 if (i < dstParts) {
2600 /* Full multiplication, there is no overflow. */
2601 assert(i + 1 == dstParts);
2602 dst[i] = carry;
2603 return 0;
2604 } else {
2605 /* We overflowed if there is carry. */
2606 if (carry)
2607 return 1;
2608
2609 /* We would overflow if any significant unwritten parts would be
2610 non-zero. This is true if any remaining src parts are non-zero
2611 and the multiplier is non-zero. */
2612 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002613 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002614 if (src[i])
2615 return 1;
2616
2617 /* We fitted in the narrow destination. */
2618 return 0;
2619 }
2620}
2621
2622/* DST = LHS * RHS, where DST has the same width as the operands and
2623 is filled with the least significant parts of the result. Returns
2624 one if overflow occurred, otherwise zero. DST must be disjoint
2625 from both operands. */
2626int
2627APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2628 const integerPart *rhs, unsigned int parts)
2629{
2630 unsigned int i;
2631 int overflow;
2632
2633 assert(dst != lhs && dst != rhs);
2634
2635 overflow = 0;
2636 tcSet(dst, 0, parts);
2637
Dan Gohman16e02092010-03-24 19:38:02 +00002638 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002639 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2640 parts - i, true);
2641
2642 return overflow;
2643}
2644
Neil Booth978661d2007-10-06 00:24:48 +00002645/* DST = LHS * RHS, where DST has width the sum of the widths of the
2646 operands. No overflow occurs. DST must be disjoint from both
2647 operands. Returns the number of parts required to hold the
2648 result. */
2649unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002650APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002651 const integerPart *rhs, unsigned int lhsParts,
2652 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002653{
Neil Booth978661d2007-10-06 00:24:48 +00002654 /* Put the narrower number on the LHS for less loops below. */
2655 if (lhsParts > rhsParts) {
2656 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2657 } else {
2658 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002659
Neil Booth978661d2007-10-06 00:24:48 +00002660 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002661
Neil Booth978661d2007-10-06 00:24:48 +00002662 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002663
Dan Gohman16e02092010-03-24 19:38:02 +00002664 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002665 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002666
Neil Booth978661d2007-10-06 00:24:48 +00002667 n = lhsParts + rhsParts;
2668
2669 return n - (dst[n - 1] == 0);
2670 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002671}
2672
2673/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2674 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2675 set REMAINDER to the remainder, return zero. i.e.
2676
2677 OLD_LHS = RHS * LHS + REMAINDER
2678
2679 SCRATCH is a bignum of the same size as the operands and result for
2680 use by the routine; its contents need not be initialized and are
2681 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2682*/
2683int
2684APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2685 integerPart *remainder, integerPart *srhs,
2686 unsigned int parts)
2687{
2688 unsigned int n, shiftCount;
2689 integerPart mask;
2690
2691 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2692
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002693 shiftCount = tcMSB(rhs, parts) + 1;
2694 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002695 return true;
2696
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002697 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002698 n = shiftCount / integerPartWidth;
2699 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2700
2701 tcAssign(srhs, rhs, parts);
2702 tcShiftLeft(srhs, parts, shiftCount);
2703 tcAssign(remainder, lhs, parts);
2704 tcSet(lhs, 0, parts);
2705
2706 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2707 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002708 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002709 int compare;
2710
2711 compare = tcCompare(remainder, srhs, parts);
2712 if (compare >= 0) {
2713 tcSubtract(remainder, srhs, 0, parts);
2714 lhs[n] |= mask;
2715 }
2716
2717 if (shiftCount == 0)
2718 break;
2719 shiftCount--;
2720 tcShiftRight(srhs, parts, 1);
2721 if ((mask >>= 1) == 0)
2722 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2723 }
2724
2725 return false;
2726}
2727
2728/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2729 There are no restrictions on COUNT. */
2730void
2731APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2732{
Neil Booth68e53ad2007-10-08 13:47:12 +00002733 if (count) {
2734 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002735
Neil Booth68e53ad2007-10-08 13:47:12 +00002736 /* Jump is the inter-part jump; shift is is intra-part shift. */
2737 jump = count / integerPartWidth;
2738 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002739
Neil Booth68e53ad2007-10-08 13:47:12 +00002740 while (parts > jump) {
2741 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002742
Neil Booth68e53ad2007-10-08 13:47:12 +00002743 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002744
Neil Booth68e53ad2007-10-08 13:47:12 +00002745 /* dst[i] comes from the two parts src[i - jump] and, if we have
2746 an intra-part shift, src[i - jump - 1]. */
2747 part = dst[parts - jump];
2748 if (shift) {
2749 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002750 if (parts >= jump + 1)
2751 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2752 }
2753
Neil Booth68e53ad2007-10-08 13:47:12 +00002754 dst[parts] = part;
2755 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002756
Neil Booth68e53ad2007-10-08 13:47:12 +00002757 while (parts > 0)
2758 dst[--parts] = 0;
2759 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002760}
2761
2762/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2763 zero. There are no restrictions on COUNT. */
2764void
2765APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2766{
Neil Booth68e53ad2007-10-08 13:47:12 +00002767 if (count) {
2768 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002769
Neil Booth68e53ad2007-10-08 13:47:12 +00002770 /* Jump is the inter-part jump; shift is is intra-part shift. */
2771 jump = count / integerPartWidth;
2772 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002773
Neil Booth68e53ad2007-10-08 13:47:12 +00002774 /* Perform the shift. This leaves the most significant COUNT bits
2775 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002776 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002777 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002778
Neil Booth68e53ad2007-10-08 13:47:12 +00002779 if (i + jump >= parts) {
2780 part = 0;
2781 } else {
2782 part = dst[i + jump];
2783 if (shift) {
2784 part >>= shift;
2785 if (i + jump + 1 < parts)
2786 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2787 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002788 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002789
Neil Booth68e53ad2007-10-08 13:47:12 +00002790 dst[i] = part;
2791 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002792 }
2793}
2794
2795/* Bitwise and of two bignums. */
2796void
2797APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2798{
2799 unsigned int i;
2800
Dan Gohman16e02092010-03-24 19:38:02 +00002801 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002802 dst[i] &= rhs[i];
2803}
2804
2805/* Bitwise inclusive or of two bignums. */
2806void
2807APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2808{
2809 unsigned int i;
2810
Dan Gohman16e02092010-03-24 19:38:02 +00002811 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002812 dst[i] |= rhs[i];
2813}
2814
2815/* Bitwise exclusive or of two bignums. */
2816void
2817APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2818{
2819 unsigned int i;
2820
Dan Gohman16e02092010-03-24 19:38:02 +00002821 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002822 dst[i] ^= rhs[i];
2823}
2824
2825/* Complement a bignum in-place. */
2826void
2827APInt::tcComplement(integerPart *dst, unsigned int parts)
2828{
2829 unsigned int i;
2830
Dan Gohman16e02092010-03-24 19:38:02 +00002831 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002832 dst[i] = ~dst[i];
2833}
2834
2835/* Comparison (unsigned) of two bignums. */
2836int
2837APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2838 unsigned int parts)
2839{
2840 while (parts) {
2841 parts--;
2842 if (lhs[parts] == rhs[parts])
2843 continue;
2844
2845 if (lhs[parts] > rhs[parts])
2846 return 1;
2847 else
2848 return -1;
2849 }
2850
2851 return 0;
2852}
2853
2854/* Increment a bignum in-place, return the carry flag. */
2855integerPart
2856APInt::tcIncrement(integerPart *dst, unsigned int parts)
2857{
2858 unsigned int i;
2859
Dan Gohman16e02092010-03-24 19:38:02 +00002860 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002861 if (++dst[i] != 0)
2862 break;
2863
2864 return i == parts;
2865}
2866
2867/* Set the least significant BITS bits of a bignum, clear the
2868 rest. */
2869void
2870APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2871 unsigned int bits)
2872{
2873 unsigned int i;
2874
2875 i = 0;
2876 while (bits > integerPartWidth) {
2877 dst[i++] = ~(integerPart) 0;
2878 bits -= integerPartWidth;
2879 }
2880
2881 if (bits)
2882 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2883
2884 while (i < parts)
2885 dst[i++] = 0;
2886}