blob: 38cfaed9d217a10142871f099b86fb979e6246f1 [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 +0000460APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000461 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000462 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000463 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000464 APInt Result(*this);
465 Result *= RHS;
Eli Friedman9eb6b4d2011-10-07 23:40:49 +0000466 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000467}
468
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000469APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000470 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000471 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000472 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000473 APInt Result(BitWidth, 0);
474 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000475 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000476}
477
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000478APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000479 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000480 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000481 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000482 APInt Result(BitWidth, 0);
483 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000484 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000485}
486
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000487bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000488 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000489 unsigned n1 = getActiveBits();
490 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000491
492 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000493 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000494 return false;
495
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000496 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000497 if (n1 <= APINT_BITS_PER_WORD)
498 return pVal[0] == RHS.pVal[0];
499
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000500 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000501 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000502 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000503 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000504 return true;
505}
506
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000507bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000508 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000509 if (n <= APINT_BITS_PER_WORD)
510 return pVal[0] == Val;
511 else
512 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000513}
514
Reid Spencere81d2da2007-02-16 22:36:51 +0000515bool APInt::ult(const APInt& RHS) const {
516 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
517 if (isSingleWord())
518 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000519
520 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000521 unsigned n1 = getActiveBits();
522 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000523
524 // If magnitude of LHS is less than RHS, return true.
525 if (n1 < n2)
526 return true;
527
528 // If magnitude of RHS is greather than LHS, return false.
529 if (n2 < n1)
530 return false;
531
532 // If they bot fit in a word, just compare the low order word
533 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
534 return pVal[0] < RHS.pVal[0];
535
536 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000537 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000538 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000539 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000540 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000541 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000542 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000543 }
544 return false;
545}
546
Reid Spencere81d2da2007-02-16 22:36:51 +0000547bool APInt::slt(const APInt& RHS) const {
548 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000549 if (isSingleWord()) {
550 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
551 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
552 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000553 }
Reid Spencera58f0582007-02-18 20:09:41 +0000554
555 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000556 APInt rhs(RHS);
557 bool lhsNeg = isNegative();
558 bool rhsNeg = rhs.isNegative();
559 if (lhsNeg) {
560 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000561 lhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000562 lhs++;
563 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000564 if (rhsNeg) {
565 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000566 rhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000567 rhs++;
568 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000569
570 // Now we have unsigned values to compare so do the comparison if necessary
571 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000572 if (lhsNeg)
573 if (rhsNeg)
574 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000575 else
576 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000577 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000578 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000579 else
Reid Spencera58f0582007-02-18 20:09:41 +0000580 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000581}
582
Jay Foad7a874dd2010-12-01 08:53:58 +0000583void APInt::setBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000584 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000585 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000586 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000587 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000588}
589
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000590/// Set the given bit to 0 whose position is given as "bitPosition".
591/// @brief Set a given bit to 0.
Jay Foad7a874dd2010-12-01 08:53:58 +0000592void APInt::clearBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000593 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000594 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000595 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000596 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000597}
598
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000599/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000600
Eric Christopherd37eda82009-08-21 04:06:45 +0000601/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000602/// as "bitPosition".
603/// @brief Toggles a given bit to its opposite value.
Jay Foad7a874dd2010-12-01 08:53:58 +0000604void APInt::flipBit(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000605 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad7a874dd2010-12-01 08:53:58 +0000606 if ((*this)[bitPosition]) clearBit(bitPosition);
607 else setBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000608}
609
Benjamin Kramer38e59892010-07-14 22:38:02 +0000610unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000611 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +0000612 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
613 radix == 36) &&
614 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000615
616 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000617
Eric Christophere250f2a2009-08-21 04:10:31 +0000618 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000619 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000620 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000621 if (*p == '-' || *p == '+') {
622 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000623 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000624 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000625 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000626
Reid Spencer57ae4f52007-04-13 19:19:07 +0000627 // For radixes of power-of-two values, the bits required is accurately and
628 // easily computed
629 if (radix == 2)
630 return slen + isNegative;
631 if (radix == 8)
632 return slen * 3 + isNegative;
633 if (radix == 16)
634 return slen * 4 + isNegative;
635
Douglas Gregordcd99962011-09-14 15:54:46 +0000636 // FIXME: base 36
637
Reid Spencer57ae4f52007-04-13 19:19:07 +0000638 // This is grossly inefficient but accurate. We could probably do something
639 // with a computation of roughly slen*64/20 and then adjust by the value of
640 // the first few digits. But, I'm not sure how accurate that could be.
641
642 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000643 // be too large. This avoids the assertion in the constructor. This
644 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
645 // bits in that case.
Douglas Gregordcd99962011-09-14 15:54:46 +0000646 unsigned sufficient
647 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
648 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000649
650 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000651 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000652
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000653 // Compute how many bits are required. If the log is infinite, assume we need
654 // just bit.
655 unsigned log = tmp.logBase2();
656 if (log == (unsigned)-1) {
657 return isNegative + 1;
658 } else {
659 return isNegative + log + 1;
660 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000661}
662
Chandler Carruthed7692a2012-03-04 12:02:57 +0000663hash_code llvm::hash_value(const APInt &Arg) {
664 if (Arg.isSingleWord())
665 return hash_combine(Arg.VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000666
Chandler Carruthed7692a2012-03-04 12:02:57 +0000667 return hash_combine_range(Arg.pVal, Arg.pVal + Arg.getNumWords());
Reid Spencer794f4722007-02-26 21:02:27 +0000668}
669
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000670/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000671APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000672 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000673}
674
675/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000676APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000677 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000678 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000679}
680
Chris Lattner455e9ab2009-01-21 18:09:24 +0000681unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000682 // Treat the most significand word differently because it might have
683 // meaningless bits set beyond the precision.
684 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
685 integerPart MSWMask;
686 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
687 else {
688 MSWMask = ~integerPart(0);
689 BitsInMSW = APINT_BITS_PER_WORD;
690 }
691
692 unsigned i = getNumWords();
693 integerPart MSW = pVal[i-1] & MSWMask;
694 if (MSW)
695 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
696
697 unsigned Count = BitsInMSW;
698 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000699 if (pVal[i-1] == 0)
700 Count += APINT_BITS_PER_WORD;
701 else {
702 Count += CountLeadingZeros_64(pVal[i-1]);
703 break;
Reid Spencere549c492007-02-21 00:29:48 +0000704 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000705 }
John McCall281d0512010-02-03 03:42:44 +0000706 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000707}
708
Chris Lattner455e9ab2009-01-21 18:09:24 +0000709unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000710 if (isSingleWord())
Benjamin Kramera1853622012-03-12 21:18:53 +0000711 return CountLeadingOnes_64(VAL << (APINT_BITS_PER_WORD - BitWidth));
Reid Spencer681dcd12007-02-27 21:59:26 +0000712
Chris Lattner455e9ab2009-01-21 18:09:24 +0000713 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000714 unsigned shift;
715 if (!highWordBits) {
716 highWordBits = APINT_BITS_PER_WORD;
717 shift = 0;
718 } else {
719 shift = APINT_BITS_PER_WORD - highWordBits;
720 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000721 int i = getNumWords() - 1;
Benjamin Kramera1853622012-03-12 21:18:53 +0000722 unsigned Count = CountLeadingOnes_64(pVal[i] << shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000723 if (Count == highWordBits) {
724 for (i--; i >= 0; --i) {
725 if (pVal[i] == -1ULL)
726 Count += APINT_BITS_PER_WORD;
727 else {
Benjamin Kramera1853622012-03-12 21:18:53 +0000728 Count += CountLeadingOnes_64(pVal[i]);
Reid Spencer681dcd12007-02-27 21:59:26 +0000729 break;
730 }
731 }
732 }
733 return Count;
734}
735
Chris Lattner455e9ab2009-01-21 18:09:24 +0000736unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000737 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000738 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
739 unsigned Count = 0;
740 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000741 for (; i < getNumWords() && pVal[i] == 0; ++i)
742 Count += APINT_BITS_PER_WORD;
743 if (i < getNumWords())
744 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000745 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000746}
747
Chris Lattner455e9ab2009-01-21 18:09:24 +0000748unsigned APInt::countTrailingOnesSlowCase() const {
749 unsigned Count = 0;
750 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000751 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000752 Count += APINT_BITS_PER_WORD;
753 if (i < getNumWords())
754 Count += CountTrailingOnes_64(pVal[i]);
755 return std::min(Count, BitWidth);
756}
757
Chris Lattner455e9ab2009-01-21 18:09:24 +0000758unsigned APInt::countPopulationSlowCase() const {
759 unsigned Count = 0;
760 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000761 Count += CountPopulation_64(pVal[i]);
762 return Count;
763}
764
Richard Smithe73db4e2011-11-23 21:33:37 +0000765/// Perform a logical right-shift from Src to Dst, which must be equal or
766/// non-overlapping, of Words words, by Shift, which must be less than 64.
767static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
768 unsigned Shift) {
769 uint64_t Carry = 0;
770 for (int I = Words - 1; I >= 0; --I) {
771 uint64_t Tmp = Src[I];
772 Dst[I] = (Tmp >> Shift) | Carry;
773 Carry = Tmp << (64 - Shift);
774 }
775}
776
Reid Spencere81d2da2007-02-16 22:36:51 +0000777APInt APInt::byteSwap() const {
778 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
779 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000780 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000781 if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000782 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000783 if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000784 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000785 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000786 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000787 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000788 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengb04973e2007-02-15 06:36:31 +0000789 }
Richard Smithe73db4e2011-11-23 21:33:37 +0000790 if (BitWidth == 64)
791 return APInt(BitWidth, ByteSwap_64(VAL));
792
793 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
794 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
795 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
796 if (Result.BitWidth != BitWidth) {
797 lshrNear(Result.pVal, Result.pVal, getNumWords(),
798 Result.BitWidth - BitWidth);
799 Result.BitWidth = BitWidth;
800 }
801 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000802}
803
Eric Christopherd37eda82009-08-21 04:06:45 +0000804APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000805 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000806 APInt A = API1, B = API2;
807 while (!!B) {
808 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000809 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000810 A = T;
811 }
812 return A;
813}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000814
Chris Lattner455e9ab2009-01-21 18:09:24 +0000815APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000816 union {
817 double D;
818 uint64_t I;
819 } T;
820 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000821
822 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000823 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000824
825 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000826 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000827
828 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000829 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000830 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000831
832 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
833 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
834
835 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000836 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000837 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000838 APInt(width, mantissa >> (52 - exp));
839
840 // If the client didn't provide enough bits for us to shift the mantissa into
841 // then the result is undefined, just return 0
842 if (width <= exp - 52)
843 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000844
845 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000846 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000847 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000848 return isNeg ? -Tmp : Tmp;
849}
850
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000851/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000852/// The layout for double is as following (IEEE Standard 754):
853/// --------------------------------------
854/// | Sign Exponent Fraction Bias |
855/// |-------------------------------------- |
856/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000857/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000858double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000859
860 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000861 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000862 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
863 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000864 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000865 return double(sext);
866 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000867 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000868 }
869
Reid Spencer9c0696f2007-02-20 08:51:03 +0000870 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000871 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000872
873 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000874 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000875
876 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000877 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000878
Reid Spencer9c0696f2007-02-20 08:51:03 +0000879 // The exponent (without bias normalization) is just the number of bits
880 // we are using. Note that the sign bit is gone since we constructed the
881 // absolute value.
882 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000883
Reid Spencer9c0696f2007-02-20 08:51:03 +0000884 // Return infinity for exponent overflow
885 if (exp > 1023) {
886 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000887 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000888 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000889 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000890 }
891 exp += 1023; // Increment for 1023 bias
892
893 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
894 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000895 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000896 unsigned hiWord = whichWord(n-1);
897 if (hiWord == 0) {
898 mantissa = Tmp.pVal[0];
899 if (n > 52)
900 mantissa >>= n - 52; // shift down, we want the top 52 bits.
901 } else {
902 assert(hiWord > 0 && "huh?");
903 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
904 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
905 mantissa = hibits | lobits;
906 }
907
Zhou Shengd93f00c2007-02-12 20:02:55 +0000908 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000909 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000910 union {
911 double D;
912 uint64_t I;
913 } T;
914 T.I = sign | (exp << 52) | mantissa;
915 return T.D;
916}
917
Reid Spencere81d2da2007-02-16 22:36:51 +0000918// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000919APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000920 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000921 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +0000922
923 if (width <= APINT_BITS_PER_WORD)
924 return APInt(width, getRawData()[0]);
925
926 APInt Result(getMemory(getNumWords(width)), width);
927
928 // Copy full words.
929 unsigned i;
930 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
931 Result.pVal[i] = pVal[i];
932
933 // Truncate and copy any partial word.
934 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
935 if (bits != 0)
936 Result.pVal[i] = pVal[i] << bits >> bits;
937
938 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +0000939}
940
941// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000942APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000943 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +0000944
945 if (width <= APINT_BITS_PER_WORD) {
946 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
947 val = (int64_t)val >> (width - BitWidth);
948 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +0000949 }
950
Jay Foad40f8f622010-12-07 08:25:19 +0000951 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +0000952
Jay Foad40f8f622010-12-07 08:25:19 +0000953 // Copy full words.
954 unsigned i;
955 uint64_t word = 0;
956 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
957 word = getRawData()[i];
958 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +0000959 }
960
Jay Foad40f8f622010-12-07 08:25:19 +0000961 // Read and sign-extend any partial word.
962 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
963 if (bits != 0)
964 word = (int64_t)getRawData()[i] << bits >> bits;
965 else
966 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
967
968 // Write remaining full words.
969 for (; i != width / APINT_BITS_PER_WORD; i++) {
970 Result.pVal[i] = word;
971 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +0000972 }
Jay Foad40f8f622010-12-07 08:25:19 +0000973
974 // Write any partial word.
975 bits = (0 - width) % APINT_BITS_PER_WORD;
976 if (bits != 0)
977 Result.pVal[i] = word << bits >> bits;
978
979 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +0000980}
981
982// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000983APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000984 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +0000985
986 if (width <= APINT_BITS_PER_WORD)
987 return APInt(width, VAL);
988
989 APInt Result(getMemory(getNumWords(width)), width);
990
991 // Copy words.
992 unsigned i;
993 for (i = 0; i != getNumWords(); i++)
994 Result.pVal[i] = getRawData()[i];
995
996 // Zero remaining words.
997 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
998
999 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001000}
1001
Jay Foad40f8f622010-12-07 08:25:19 +00001002APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001003 if (BitWidth < width)
1004 return zext(width);
1005 if (BitWidth > width)
1006 return trunc(width);
1007 return *this;
1008}
1009
Jay Foad40f8f622010-12-07 08:25:19 +00001010APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001011 if (BitWidth < width)
1012 return sext(width);
1013 if (BitWidth > width)
1014 return trunc(width);
1015 return *this;
1016}
1017
Rafael Espindola04594ae2012-01-27 23:33:07 +00001018APInt APInt::zextOrSelf(unsigned width) const {
1019 if (BitWidth < width)
1020 return zext(width);
1021 return *this;
1022}
1023
1024APInt APInt::sextOrSelf(unsigned width) const {
1025 if (BitWidth < width)
1026 return sext(width);
1027 return *this;
1028}
1029
Zhou Shengff4304f2007-02-09 07:48:24 +00001030/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001031/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001032APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001033 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001034}
1035
1036/// Arithmetic right-shift this APInt by shiftAmt.
1037/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001038APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001039 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001040 // Handle a degenerate case
1041 if (shiftAmt == 0)
1042 return *this;
1043
1044 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001045 if (isSingleWord()) {
1046 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001047 return APInt(BitWidth, 0); // undefined
1048 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001049 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001050 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001051 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1052 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001053 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001054
Reid Spencer46f9c942007-03-02 22:39:11 +00001055 // If all the bits were shifted out, the result is, technically, undefined.
1056 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1057 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001058 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001059 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001060 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001061 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001062 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001063 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001064
1065 // Create some space for the result.
1066 uint64_t * val = new uint64_t[getNumWords()];
1067
Reid Spencer46f9c942007-03-02 22:39:11 +00001068 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001069 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1070 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1071 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1072 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001073 if (bitsInWord == 0)
1074 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001075
1076 // If we are shifting whole words, just move whole words
1077 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001078 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001079 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001080 val[i] = pVal[i+offset]; // move whole word
1081
1082 // Adjust the top significant word for sign bit fill, if negative
1083 if (isNegative())
1084 if (bitsInWord < APINT_BITS_PER_WORD)
1085 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1086 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001087 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001088 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001089 // This combines the shifted corresponding word with the low bits from
1090 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001091 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001092 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1093 }
1094
1095 // Shift the break word. In this case there are no bits from the next word
1096 // to include in this word.
1097 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1098
1099 // Deal with sign extenstion in the break word, and possibly the word before
1100 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001101 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001102 if (wordShift > bitsInWord) {
1103 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001104 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001105 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1106 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001107 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001108 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001109 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001110 }
1111
Reid Spencer46f9c942007-03-02 22:39:11 +00001112 // Remaining words are 0 or -1, just assign them.
1113 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001114 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001115 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001116 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001117}
1118
Zhou Shengff4304f2007-02-09 07:48:24 +00001119/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001120/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001121APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001122 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001123}
1124
1125/// Logical right-shift this APInt by shiftAmt.
1126/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001127APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001128 if (isSingleWord()) {
Ahmed Charles969b7392012-02-24 19:06:15 +00001129 if (shiftAmt >= BitWidth)
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001130 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001131 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001132 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001133 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001134
Reid Spencerba81c2b2007-02-26 01:19:48 +00001135 // If all the bits were shifted out, the result is 0. This avoids issues
1136 // with shifting by the size of the integer type, which produces undefined
1137 // results. We define these "undefined results" to always be 0.
Chad Rosier28dd9602012-06-08 18:04:52 +00001138 if (shiftAmt >= BitWidth)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001139 return APInt(BitWidth, 0);
1140
Reid Spencer02ae8b72007-05-17 06:26:29 +00001141 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001142 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001143 // undefined results in the code below. This is also an optimization.
1144 if (shiftAmt == 0)
1145 return *this;
1146
Reid Spencerba81c2b2007-02-26 01:19:48 +00001147 // Create some space for the result.
1148 uint64_t * val = new uint64_t[getNumWords()];
1149
1150 // If we are shifting less than a word, compute the shift with a simple carry
1151 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smithe73db4e2011-11-23 21:33:37 +00001152 lshrNear(val, pVal, getNumWords(), shiftAmt);
Reid Spencerba81c2b2007-02-26 01:19:48 +00001153 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001154 }
1155
Reid Spencerba81c2b2007-02-26 01:19:48 +00001156 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001157 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1158 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001159
1160 // If we are shifting whole words, just move whole words
1161 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001162 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001163 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001164 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001165 val[i] = 0;
1166 return APInt(val,BitWidth).clearUnusedBits();
1167 }
1168
Eric Christopherd37eda82009-08-21 04:06:45 +00001169 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001170 unsigned breakWord = getNumWords() - offset -1;
1171 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001172 val[i] = (pVal[i+offset] >> wordShift) |
1173 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001174 // Shift the break word.
1175 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1176
1177 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001178 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001179 val[i] = 0;
1180 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001181}
1182
Zhou Shengff4304f2007-02-09 07:48:24 +00001183/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001184/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001185APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001186 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001187 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001188}
1189
Chris Lattner455e9ab2009-01-21 18:09:24 +00001190APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001191 // If all the bits were shifted out, the result is 0. This avoids issues
1192 // with shifting by the size of the integer type, which produces undefined
1193 // results. We define these "undefined results" to always be 0.
1194 if (shiftAmt == BitWidth)
1195 return APInt(BitWidth, 0);
1196
Reid Spencer92c72832007-05-12 18:01:57 +00001197 // If none of the bits are shifted out, the result is *this. This avoids a
1198 // lshr by the words size in the loop below which can produce incorrect
1199 // results. It also avoids the expensive computation below for a common case.
1200 if (shiftAmt == 0)
1201 return *this;
1202
Reid Spencer87553802007-02-25 00:56:44 +00001203 // Create some space for the result.
1204 uint64_t * val = new uint64_t[getNumWords()];
1205
1206 // If we are shifting less than a word, do it the easy way
1207 if (shiftAmt < APINT_BITS_PER_WORD) {
1208 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001209 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001210 val[i] = pVal[i] << shiftAmt | carry;
1211 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1212 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001213 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001214 }
1215
Reid Spencer87553802007-02-25 00:56:44 +00001216 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001217 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1218 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001219
1220 // If we are shifting whole words, just move whole words
1221 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001222 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001223 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001224 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001225 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001226 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001227 }
Reid Spencer87553802007-02-25 00:56:44 +00001228
1229 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001230 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001231 for (; i > offset; --i)
1232 val[i] = pVal[i-offset] << wordShift |
1233 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001234 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001235 for (i = 0; i < offset; ++i)
1236 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001237 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001238}
1239
Dan Gohmancf609572008-02-29 01:40:47 +00001240APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001241 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001242}
1243
Chris Lattner455e9ab2009-01-21 18:09:24 +00001244APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001245 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001246 if (rotateAmt == 0)
1247 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001248 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001249}
1250
Dan Gohmancf609572008-02-29 01:40:47 +00001251APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001252 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001253}
1254
Chris Lattner455e9ab2009-01-21 18:09:24 +00001255APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001256 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001257 if (rotateAmt == 0)
1258 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001259 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001260}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001261
1262// Square Root - this method computes and returns the square root of "this".
1263// Three mechanisms are used for computation. For small values (<= 5 bits),
1264// a table lookup is done. This gets some performance for common cases. For
1265// values using less than 52 bits, the value is converted to double and then
1266// the libc sqrt function is called. The result is rounded and then converted
1267// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001268// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001269APInt APInt::sqrt() const {
1270
1271 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001272 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001273
1274 // Use a fast table for some small values. This also gets rid of some
1275 // rounding errors in libc sqrt for small values.
1276 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001277 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001278 /* 0 */ 0,
1279 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001280 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001281 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1282 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1283 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1284 /* 31 */ 6
1285 };
1286 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001287 }
1288
1289 // If the magnitude of the value fits in less than 52 bits (the precision of
1290 // an IEEE double precision floating point value), then we can use the
1291 // libc sqrt function which will probably use a hardware sqrt computation.
1292 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001293 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001294#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001295 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001296 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001297#else
1298 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001299 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001300#endif
1301 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001302
1303 // Okay, all the short cuts are exhausted. We must compute it. The following
1304 // is a classical Babylonian method for computing the square root. This code
1305 // was adapted to APINt from a wikipedia article on such computations.
1306 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001307 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001308 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001309 APInt testy(BitWidth, 16);
1310 APInt x_old(BitWidth, 1);
1311 APInt x_new(BitWidth, 0);
1312 APInt two(BitWidth, 2);
1313
1314 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001315 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001316 if (i >= nbits || this->ule(testy)) {
1317 x_old = x_old.shl(i / 2);
1318 break;
1319 }
1320
Eric Christopherd37eda82009-08-21 04:06:45 +00001321 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001322 for (;;) {
1323 x_new = (this->udiv(x_old) + x_old).udiv(two);
1324 if (x_old.ule(x_new))
1325 break;
1326 x_old = x_new;
1327 }
1328
1329 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001330 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001331 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001332 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001333 // floating point representation after 192 bits. There are no discrepancies
1334 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001335 APInt square(x_old * x_old);
1336 APInt nextSquare((x_old + 1) * (x_old +1));
1337 if (this->ult(square))
1338 return x_old;
David Blaikie18c7ec12011-12-01 20:58:30 +00001339 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1340 APInt midpoint((nextSquare - square).udiv(two));
1341 APInt offset(*this - square);
1342 if (offset.ult(midpoint))
1343 return x_old;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001344 return x_old + 1;
1345}
1346
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001347/// Computes the multiplicative inverse of this APInt for a given modulo. The
1348/// iterative extended Euclidean algorithm is used to solve for this value,
1349/// however we simplify it to speed up calculating only the inverse, and take
1350/// advantage of div+rem calculations. We also use some tricks to avoid copying
1351/// (potentially large) APInts around.
1352APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1353 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1354
1355 // Using the properties listed at the following web page (accessed 06/21/08):
1356 // http://www.numbertheory.org/php/euclid.html
1357 // (especially the properties numbered 3, 4 and 9) it can be proved that
1358 // BitWidth bits suffice for all the computations in the algorithm implemented
1359 // below. More precisely, this number of bits suffice if the multiplicative
1360 // inverse exists, but may not suffice for the general extended Euclidean
1361 // algorithm.
1362
1363 APInt r[2] = { modulo, *this };
1364 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1365 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001366
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001367 unsigned i;
1368 for (i = 0; r[i^1] != 0; i ^= 1) {
1369 // An overview of the math without the confusing bit-flipping:
1370 // q = r[i-2] / r[i-1]
1371 // r[i] = r[i-2] % r[i-1]
1372 // t[i] = t[i-2] - t[i-1] * q
1373 udivrem(r[i], r[i^1], q, r[i]);
1374 t[i] -= t[i^1] * q;
1375 }
1376
1377 // If this APInt and the modulo are not coprime, there is no multiplicative
1378 // inverse, so return 0. We check this by looking at the next-to-last
1379 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1380 // algorithm.
1381 if (r[i] != 1)
1382 return APInt(BitWidth, 0);
1383
1384 // The next-to-last t is the multiplicative inverse. However, we are
1385 // interested in a positive inverse. Calcuate a positive one from a negative
1386 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001387 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001388 return t[i].isNegative() ? t[i] + modulo : t[i];
1389}
1390
Jay Foad4e5ea552009-04-30 10:15:35 +00001391/// Calculate the magic numbers required to implement a signed integer division
1392/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1393/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1394/// Warren, Jr., chapter 10.
1395APInt::ms APInt::magic() const {
1396 const APInt& d = *this;
1397 unsigned p;
1398 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001399 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001400 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001401
Jay Foad4e5ea552009-04-30 10:15:35 +00001402 ad = d.abs();
1403 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1404 anc = t - 1 - t.urem(ad); // absolute value of nc
1405 p = d.getBitWidth() - 1; // initialize p
1406 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1407 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1408 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1409 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1410 do {
1411 p = p + 1;
1412 q1 = q1<<1; // update q1 = 2p/abs(nc)
1413 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1414 if (r1.uge(anc)) { // must be unsigned comparison
1415 q1 = q1 + 1;
1416 r1 = r1 - anc;
1417 }
1418 q2 = q2<<1; // update q2 = 2p/abs(d)
1419 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1420 if (r2.uge(ad)) { // must be unsigned comparison
1421 q2 = q2 + 1;
1422 r2 = r2 - ad;
1423 }
1424 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001425 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001426
Jay Foad4e5ea552009-04-30 10:15:35 +00001427 mag.m = q2 + 1;
1428 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1429 mag.s = p - d.getBitWidth(); // resulting shift
1430 return mag;
1431}
1432
1433/// Calculate the magic numbers required to implement an unsigned integer
1434/// division by a constant as a sequence of multiplies, adds and shifts.
1435/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1436/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001437/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001438/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001439APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001440 const APInt& d = *this;
1441 unsigned p;
1442 APInt nc, delta, q1, r1, q2, r2;
1443 struct mu magu;
1444 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001445 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001446 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1447 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1448
Benjamin Kramer597f2952012-07-11 18:31:59 +00001449 nc = allOnes - (allOnes - d).urem(d);
Jay Foad4e5ea552009-04-30 10:15:35 +00001450 p = d.getBitWidth() - 1; // initialize p
1451 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1452 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1453 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1454 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1455 do {
1456 p = p + 1;
1457 if (r1.uge(nc - r1)) {
1458 q1 = q1 + q1 + 1; // update q1
1459 r1 = r1 + r1 - nc; // update r1
1460 }
1461 else {
1462 q1 = q1+q1; // update q1
1463 r1 = r1+r1; // update r1
1464 }
1465 if ((r2 + 1).uge(d - r2)) {
1466 if (q2.uge(signedMax)) magu.a = 1;
1467 q2 = q2+q2 + 1; // update q2
1468 r2 = r2+r2 + 1 - d; // update r2
1469 }
1470 else {
1471 if (q2.uge(signedMin)) magu.a = 1;
1472 q2 = q2+q2; // update q2
1473 r2 = r2+r2 + 1; // update r2
1474 }
1475 delta = d - 1 - r2;
1476 } while (p < d.getBitWidth()*2 &&
1477 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1478 magu.m = q2 + 1; // resulting magic number
1479 magu.s = p - d.getBitWidth(); // resulting shift
1480 return magu;
1481}
1482
Reid Spencer9c0696f2007-02-20 08:51:03 +00001483/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1484/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1485/// variables here have the same names as in the algorithm. Comments explain
1486/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001487static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1488 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001489 assert(u && "Must provide dividend");
1490 assert(v && "Must provide divisor");
1491 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001492 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001493 assert(n>1 && "n must be > 1");
1494
1495 // Knuth uses the value b as the base of the number system. In our case b
1496 // is 2^31 so we just set it to -1u.
1497 uint64_t b = uint64_t(1) << 32;
1498
Chris Lattnerfad86b02008-08-17 07:19:36 +00001499#if 0
David Greene465abed2010-01-05 01:28:52 +00001500 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1501 DEBUG(dbgs() << "KnuthDiv: original:");
1502 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1503 DEBUG(dbgs() << " by");
1504 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1505 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001506#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001507 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1508 // u and v by d. Note that we have taken Knuth's advice here to use a power
1509 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1510 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001511 // shift amount from the leading zeros. We are basically normalizing the u
1512 // and v so that its high bits are shifted to the top of v's range without
1513 // overflow. Note that this can require an extra word in u so that u must
1514 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001515 unsigned shift = CountLeadingZeros_32(v[n-1]);
1516 unsigned v_carry = 0;
1517 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001518 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001519 for (unsigned i = 0; i < m+n; ++i) {
1520 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001521 u[i] = (u[i] << shift) | u_carry;
1522 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001523 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001524 for (unsigned i = 0; i < n; ++i) {
1525 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001526 v[i] = (v[i] << shift) | v_carry;
1527 v_carry = v_tmp;
1528 }
1529 }
1530 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001531#if 0
David Greene465abed2010-01-05 01:28:52 +00001532 DEBUG(dbgs() << "KnuthDiv: normal:");
1533 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1534 DEBUG(dbgs() << " by");
1535 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1536 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001537#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001538
1539 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1540 int j = m;
1541 do {
David Greene465abed2010-01-05 01:28:52 +00001542 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001543 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001544 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1545 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1546 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1547 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1548 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001549 // value qp is one too large, and it eliminates all cases where qp is two
1550 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001551 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001552 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001553 uint64_t qp = dividend / v[n-1];
1554 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001555 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1556 qp--;
1557 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001558 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001559 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001560 }
David Greene465abed2010-01-05 01:28:52 +00001561 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001562
Reid Spencer92904632007-02-23 01:57:13 +00001563 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1564 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1565 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001566 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001567 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001568 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001569 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001570 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001571 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001572 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001573 << ", subtrahend == " << subtrahend
1574 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001575
Reid Spencer610fad82007-02-24 10:01:42 +00001576 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001577 unsigned k = j + i;
1578 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1579 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001580 while (borrow && k <= m+n) { // deal with borrow to the left
1581 borrow = u[k] == 0;
1582 u[k]--;
1583 k++;
1584 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001585 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001586 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001587 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001588 }
David Greene465abed2010-01-05 01:28:52 +00001589 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1590 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1591 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001592 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1593 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001594 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001595 // the true value, and a "borrow" to the left should be remembered.
1596 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001597 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001598 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001599 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001600 u[i] = ~u[i] + carry; // b's complement
1601 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001602 }
Reid Spencer92904632007-02-23 01:57:13 +00001603 }
David Greene465abed2010-01-05 01:28:52 +00001604 DEBUG(dbgs() << "KnuthDiv: after complement:");
1605 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1606 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001607
Eric Christopherd37eda82009-08-21 04:06:45 +00001608 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001609 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001610 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001611 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001612 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001613 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001614 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001615 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001616 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1617 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001618 // since it cancels with the borrow that occurred in D4.
1619 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001620 for (unsigned i = 0; i < n; i++) {
1621 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001622 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001623 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001624 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001625 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001626 }
David Greene465abed2010-01-05 01:28:52 +00001627 DEBUG(dbgs() << "KnuthDiv: after correction:");
1628 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1629 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001630
Reid Spencer92904632007-02-23 01:57:13 +00001631 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1632 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001633
David Greene465abed2010-01-05 01:28:52 +00001634 DEBUG(dbgs() << "KnuthDiv: quotient:");
1635 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1636 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001637
Reid Spencer9c0696f2007-02-20 08:51:03 +00001638 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1639 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1640 // compute the remainder (urem uses this).
1641 if (r) {
1642 // The value d is expressed by the "shift" value above since we avoided
1643 // multiplication by d by using a shift left. So, all we have to do is
1644 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001645 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001646 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001647 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001648 for (int i = n-1; i >= 0; i--) {
1649 r[i] = (u[i] >> shift) | carry;
1650 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001651 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001652 }
1653 } else {
1654 for (int i = n-1; i >= 0; i--) {
1655 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001656 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001657 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001658 }
David Greene465abed2010-01-05 01:28:52 +00001659 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001660 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001661#if 0
David Greene465abed2010-01-05 01:28:52 +00001662 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001663#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001664}
1665
Chris Lattner455e9ab2009-01-21 18:09:24 +00001666void APInt::divide(const APInt LHS, unsigned lhsWords,
1667 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001668 APInt *Quotient, APInt *Remainder)
1669{
1670 assert(lhsWords >= rhsWords && "Fractional result");
1671
Eric Christopherd37eda82009-08-21 04:06:45 +00001672 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001673 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001674 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001675 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1676 // can't use 64-bit operands here because we don't have native results of
1677 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001678 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001679 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001680 unsigned n = rhsWords * 2;
1681 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001682
1683 // Allocate space for the temporary values we need either on the stack, if
1684 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001685 unsigned SPACE[128];
1686 unsigned *U = 0;
1687 unsigned *V = 0;
1688 unsigned *Q = 0;
1689 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001690 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1691 U = &SPACE[0];
1692 V = &SPACE[m+n+1];
1693 Q = &SPACE[(m+n+1) + n];
1694 if (Remainder)
1695 R = &SPACE[(m+n+1) + n + (m+n)];
1696 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001697 U = new unsigned[m + n + 1];
1698 V = new unsigned[n];
1699 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001700 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001701 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001702 }
1703
1704 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001705 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001706 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001707 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001708 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001709 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001710 }
1711 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1712
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001713 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001714 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001715 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001716 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001717 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001718 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001719 }
1720
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001721 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001722 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001723 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001724 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001725
Eric Christopherd37eda82009-08-21 04:06:45 +00001726 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001727 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001728 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001729 // contain any zero words or the Knuth algorithm fails.
1730 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1731 n--;
1732 m++;
1733 }
1734 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1735 m--;
1736
1737 // If we're left with only a single word for the divisor, Knuth doesn't work
1738 // so we implement the short division algorithm here. This is much simpler
1739 // and faster because we are certain that we can divide a 64-bit quantity
1740 // by a 32-bit quantity at hardware speed and short division is simply a
1741 // series of such operations. This is just like doing short division but we
1742 // are using base 2^32 instead of base 10.
1743 assert(n != 0 && "Divide by zero?");
1744 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001745 unsigned divisor = V[0];
1746 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001747 for (int i = m+n-1; i >= 0; i--) {
1748 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1749 if (partial_dividend == 0) {
1750 Q[i] = 0;
1751 remainder = 0;
1752 } else if (partial_dividend < divisor) {
1753 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001754 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001755 } else if (partial_dividend == divisor) {
1756 Q[i] = 1;
1757 remainder = 0;
1758 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001759 Q[i] = (unsigned)(partial_dividend / divisor);
1760 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001761 }
1762 }
1763 if (R)
1764 R[0] = remainder;
1765 } else {
1766 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1767 // case n > 1.
1768 KnuthDiv(U, V, Q, R, m, n);
1769 }
1770
1771 // If the caller wants the quotient
1772 if (Quotient) {
1773 // Set up the Quotient value's memory.
1774 if (Quotient->BitWidth != LHS.BitWidth) {
1775 if (Quotient->isSingleWord())
1776 Quotient->VAL = 0;
1777 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001778 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001779 Quotient->BitWidth = LHS.BitWidth;
1780 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001781 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001782 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001783 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001784
Eric Christopherd37eda82009-08-21 04:06:45 +00001785 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001786 // order words.
1787 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001788 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001789 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1790 if (Quotient->isSingleWord())
1791 Quotient->VAL = tmp;
1792 else
1793 Quotient->pVal[0] = tmp;
1794 } else {
1795 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1796 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001797 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001798 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1799 }
1800 }
1801
1802 // If the caller wants the remainder
1803 if (Remainder) {
1804 // Set up the Remainder value's memory.
1805 if (Remainder->BitWidth != RHS.BitWidth) {
1806 if (Remainder->isSingleWord())
1807 Remainder->VAL = 0;
1808 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001809 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001810 Remainder->BitWidth = RHS.BitWidth;
1811 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001812 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001813 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001814 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001815
1816 // The remainder is in R. Reconstitute the remainder into Remainder's low
1817 // order words.
1818 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001819 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001820 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1821 if (Remainder->isSingleWord())
1822 Remainder->VAL = tmp;
1823 else
1824 Remainder->pVal[0] = tmp;
1825 } else {
1826 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1827 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001828 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001829 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1830 }
1831 }
1832
1833 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001834 if (U != &SPACE[0]) {
1835 delete [] U;
1836 delete [] V;
1837 delete [] Q;
1838 delete [] R;
1839 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001840}
1841
Reid Spencere81d2da2007-02-16 22:36:51 +00001842APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001843 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001844
1845 // First, deal with the easy case
1846 if (isSingleWord()) {
1847 assert(RHS.VAL != 0 && "Divide by zero?");
1848 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001849 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001850
Reid Spencer71bd08f2007-02-17 02:07:07 +00001851 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001852 unsigned rhsBits = RHS.getActiveBits();
1853 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001854 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001855 unsigned lhsBits = this->getActiveBits();
1856 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001857
1858 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001859 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001860 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001861 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001862 else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru94c22712012-09-27 10:14:43 +00001863 // X / Y ===> 0, iff X < Y
Reid Spencere0cdd332007-02-21 08:21:52 +00001864 return APInt(BitWidth, 0);
1865 } else if (*this == RHS) {
1866 // X / X ===> 1
1867 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001868 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001869 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001870 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001871 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001872
1873 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1874 APInt Quotient(1,0); // to hold result.
1875 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1876 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001877}
1878
Reid Spencere81d2da2007-02-16 22:36:51 +00001879APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001880 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001881 if (isSingleWord()) {
1882 assert(RHS.VAL != 0 && "Remainder by zero?");
1883 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001884 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001885
Reid Spencere0cdd332007-02-21 08:21:52 +00001886 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001887 unsigned lhsBits = getActiveBits();
1888 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001889
1890 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001891 unsigned rhsBits = RHS.getActiveBits();
1892 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001893 assert(rhsWords && "Performing remainder operation by zero ???");
1894
Reid Spencer71bd08f2007-02-17 02:07:07 +00001895 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001896 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001897 // 0 % Y ===> 0
1898 return APInt(BitWidth, 0);
1899 } else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru94c22712012-09-27 10:14:43 +00001900 // X % Y ===> X, iff X < Y
Reid Spencere0cdd332007-02-21 08:21:52 +00001901 return *this;
1902 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001903 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001904 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001905 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001906 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001907 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001908 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001909
Reid Spencer19dc32a2007-05-13 23:44:59 +00001910 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001911 APInt Remainder(1,0);
1912 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1913 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001914}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001915
Eric Christopherd37eda82009-08-21 04:06:45 +00001916void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00001917 APInt &Quotient, APInt &Remainder) {
1918 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001919 unsigned lhsBits = LHS.getActiveBits();
1920 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1921 unsigned rhsBits = RHS.getActiveBits();
1922 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001923
1924 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001925 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00001926 Quotient = 0; // 0 / Y ===> 0
1927 Remainder = 0; // 0 % Y ===> 0
1928 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001929 }
1930
1931 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Sylvestre Ledru94c22712012-09-27 10:14:43 +00001932 Remainder = LHS; // X % Y ===> X, iff X < Y
1933 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00001934 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001935 }
1936
Reid Spencer19dc32a2007-05-13 23:44:59 +00001937 if (LHS == RHS) {
1938 Quotient = 1; // X / X ===> 1
1939 Remainder = 0; // X % X ===> 0;
1940 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001941 }
1942
Reid Spencer19dc32a2007-05-13 23:44:59 +00001943 if (lhsWords == 1 && rhsWords == 1) {
1944 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001945 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1946 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
1947 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
1948 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001949 return;
1950 }
1951
1952 // Okay, lets do it the long way
1953 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1954}
1955
Chris Lattner0a0a5852010-10-13 23:54:10 +00001956APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001957 APInt Res = *this+RHS;
1958 Overflow = isNonNegative() == RHS.isNonNegative() &&
1959 Res.isNonNegative() != isNonNegative();
1960 return Res;
1961}
1962
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001963APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
1964 APInt Res = *this+RHS;
1965 Overflow = Res.ult(RHS);
1966 return Res;
1967}
1968
Chris Lattner0a0a5852010-10-13 23:54:10 +00001969APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001970 APInt Res = *this - RHS;
1971 Overflow = isNonNegative() != RHS.isNonNegative() &&
1972 Res.isNonNegative() != isNonNegative();
1973 return Res;
1974}
1975
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001976APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00001977 APInt Res = *this-RHS;
1978 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001979 return Res;
1980}
1981
Chris Lattner0a0a5852010-10-13 23:54:10 +00001982APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001983 // MININT/-1 --> overflow.
1984 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
1985 return sdiv(RHS);
1986}
1987
Chris Lattner0a0a5852010-10-13 23:54:10 +00001988APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001989 APInt Res = *this * RHS;
1990
1991 if (*this != 0 && RHS != 0)
1992 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
1993 else
1994 Overflow = false;
1995 return Res;
1996}
1997
Frits van Bommel62086102011-03-27 14:26:13 +00001998APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
1999 APInt Res = *this * RHS;
2000
2001 if (*this != 0 && RHS != 0)
2002 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2003 else
2004 Overflow = false;
2005 return Res;
2006}
2007
Chris Lattner0a0a5852010-10-13 23:54:10 +00002008APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002009 Overflow = ShAmt >= getBitWidth();
2010 if (Overflow)
2011 ShAmt = getBitWidth()-1;
2012
2013 if (isNonNegative()) // Don't allow sign change.
2014 Overflow = ShAmt >= countLeadingZeros();
2015 else
2016 Overflow = ShAmt >= countLeadingOnes();
2017
2018 return *this << ShAmt;
2019}
2020
2021
2022
2023
Benjamin Kramer38e59892010-07-14 22:38:02 +00002024void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002025 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002026 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002027 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2028 radix == 36) &&
2029 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002030
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002031 StringRef::iterator p = str.begin();
2032 size_t slen = str.size();
2033 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002034 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002035 p++;
2036 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002037 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002038 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002039 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002040 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2041 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002042 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2043 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002044
2045 // Allocate memory
2046 if (!isSingleWord())
2047 pVal = getClearedMemory(getNumWords());
2048
2049 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002050 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002051
2052 // Set up an APInt for the digit to add outside the loop so we don't
2053 // constantly construct/destruct it.
2054 APInt apdigit(getBitWidth(), 0);
2055 APInt apradix(getBitWidth(), radix);
2056
2057 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002058 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002059 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002060 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002061
Reid Spencer6551dcd2007-05-16 19:18:22 +00002062 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002063 if (slen > 1) {
2064 if (shift)
2065 *this <<= shift;
2066 else
2067 *this *= apradix;
2068 }
Reid Spencer385f7542007-02-21 03:55:44 +00002069
2070 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002071 if (apdigit.isSingleWord())
2072 apdigit.VAL = digit;
2073 else
2074 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002075 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002076 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002077 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002078 if (isNeg) {
2079 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002080 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002081 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002082}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002083
Chris Lattnerfad86b02008-08-17 07:19:36 +00002084void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002085 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002086 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2087 Radix == 36) &&
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002088 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002089
Ted Kremenekcf886182011-06-15 00:51:55 +00002090 const char *Prefix = "";
2091 if (formatAsCLiteral) {
2092 switch (Radix) {
2093 case 2:
2094 // Binary literals are a non-standard extension added in gcc 4.3:
2095 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2096 Prefix = "0b";
2097 break;
2098 case 8:
2099 Prefix = "0";
2100 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002101 case 10:
2102 break; // No prefix
Ted Kremenekcf886182011-06-15 00:51:55 +00002103 case 16:
2104 Prefix = "0x";
2105 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002106 default:
2107 llvm_unreachable("Invalid radix!");
Ted Kremenekcf886182011-06-15 00:51:55 +00002108 }
2109 }
2110
Chris Lattnerfad86b02008-08-17 07:19:36 +00002111 // First, check for a zero value and just short circuit the logic below.
2112 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002113 while (*Prefix) {
2114 Str.push_back(*Prefix);
2115 ++Prefix;
2116 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002117 Str.push_back('0');
2118 return;
2119 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002120
Douglas Gregordcd99962011-09-14 15:54:46 +00002121 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002122
Reid Spencer9c0696f2007-02-20 08:51:03 +00002123 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002124 char Buffer[65];
2125 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002126
Chris Lattnerfad86b02008-08-17 07:19:36 +00002127 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002128 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002129 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002130 } else {
2131 int64_t I = getSExtValue();
2132 if (I >= 0) {
2133 N = I;
2134 } else {
2135 Str.push_back('-');
2136 N = -(uint64_t)I;
2137 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002138 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002139
Ted Kremenekcf886182011-06-15 00:51:55 +00002140 while (*Prefix) {
2141 Str.push_back(*Prefix);
2142 ++Prefix;
2143 };
2144
Chris Lattnerfad86b02008-08-17 07:19:36 +00002145 while (N) {
2146 *--BufPtr = Digits[N % Radix];
2147 N /= Radix;
2148 }
2149 Str.append(BufPtr, Buffer+65);
2150 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002151 }
2152
Chris Lattnerfad86b02008-08-17 07:19:36 +00002153 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002154
Chris Lattnerfad86b02008-08-17 07:19:36 +00002155 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002156 // They want to print the signed version and it is a negative value
2157 // Flip the bits and add one to turn it into the equivalent positive
2158 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002159 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002160 Tmp++;
2161 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002162 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002163
Ted Kremenekcf886182011-06-15 00:51:55 +00002164 while (*Prefix) {
2165 Str.push_back(*Prefix);
2166 ++Prefix;
2167 };
2168
Chris Lattnerfad86b02008-08-17 07:19:36 +00002169 // We insert the digits backward, then reverse them to get the right order.
2170 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002171
2172 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2173 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002174 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002175 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002176 // Just shift tmp right for each digit width until it becomes zero
2177 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2178 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002179
Chris Lattnerfad86b02008-08-17 07:19:36 +00002180 while (Tmp != 0) {
2181 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2182 Str.push_back(Digits[Digit]);
2183 Tmp = Tmp.lshr(ShiftAmt);
2184 }
2185 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002186 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002187 while (Tmp != 0) {
2188 APInt APdigit(1, 0);
2189 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002190 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002191 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002192 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002193 assert(Digit < Radix && "divide failed");
2194 Str.push_back(Digits[Digit]);
2195 Tmp = tmp2;
2196 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002197 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002198
Chris Lattnerfad86b02008-08-17 07:19:36 +00002199 // Reverse the digits before returning.
2200 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002201}
2202
Chris Lattnerfad86b02008-08-17 07:19:36 +00002203/// toString - This returns the APInt as a std::string. Note that this is an
2204/// inefficient method. It is better to pass in a SmallVector/SmallString
2205/// to the methods above.
2206std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2207 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002208 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002209 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002210}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002211
Chris Lattnerfad86b02008-08-17 07:19:36 +00002212
2213void APInt::dump() const {
2214 SmallString<40> S, U;
2215 this->toStringUnsigned(U);
2216 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002217 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002218 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002219}
2220
Chris Lattner944fac72008-08-23 22:23:09 +00002221void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002222 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002223 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002224 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002225}
2226
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002227// This implements a variety of operations on a representation of
2228// arbitrary precision, two's-complement, bignum integer values.
2229
Chris Lattner91021d32009-08-23 23:11:28 +00002230// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2231// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002232#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002233COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002234
2235/* Some handy functions local to this file. */
2236namespace {
2237
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002238 /* Returns the integer part with the least significant BITS set.
2239 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002240 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002241 lowBitMask(unsigned int bits)
2242 {
Dan Gohman16e02092010-03-24 19:38:02 +00002243 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002244
2245 return ~(integerPart) 0 >> (integerPartWidth - bits);
2246 }
2247
Neil Booth055c0b32007-10-06 00:43:45 +00002248 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002249 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002250 lowHalf(integerPart part)
2251 {
2252 return part & lowBitMask(integerPartWidth / 2);
2253 }
2254
Neil Booth055c0b32007-10-06 00:43:45 +00002255 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002256 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002257 highHalf(integerPart part)
2258 {
2259 return part >> (integerPartWidth / 2);
2260 }
2261
Neil Booth055c0b32007-10-06 00:43:45 +00002262 /* Returns the bit number of the most significant set bit of a part.
2263 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002264 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002265 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002266 {
2267 unsigned int n, msb;
2268
2269 if (value == 0)
2270 return -1U;
2271
2272 n = integerPartWidth / 2;
2273
2274 msb = 0;
2275 do {
2276 if (value >> n) {
2277 value >>= n;
2278 msb += n;
2279 }
2280
2281 n >>= 1;
2282 } while (n);
2283
2284 return msb;
2285 }
2286
Neil Booth055c0b32007-10-06 00:43:45 +00002287 /* Returns the bit number of the least significant set bit of a
2288 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002289 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002290 partLSB(integerPart value)
2291 {
2292 unsigned int n, lsb;
2293
2294 if (value == 0)
2295 return -1U;
2296
2297 lsb = integerPartWidth - 1;
2298 n = integerPartWidth / 2;
2299
2300 do {
2301 if (value << n) {
2302 value <<= n;
2303 lsb -= n;
2304 }
2305
2306 n >>= 1;
2307 } while (n);
2308
2309 return lsb;
2310 }
2311}
2312
2313/* Sets the least significant part of a bignum to the input value, and
2314 zeroes out higher parts. */
2315void
2316APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2317{
2318 unsigned int i;
2319
Dan Gohman16e02092010-03-24 19:38:02 +00002320 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002321
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002322 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002323 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002324 dst[i] = 0;
2325}
2326
2327/* Assign one bignum to another. */
2328void
2329APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2330{
2331 unsigned int i;
2332
Dan Gohman16e02092010-03-24 19:38:02 +00002333 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002334 dst[i] = src[i];
2335}
2336
2337/* Returns true if a bignum is zero, false otherwise. */
2338bool
2339APInt::tcIsZero(const integerPart *src, unsigned int parts)
2340{
2341 unsigned int i;
2342
Dan Gohman16e02092010-03-24 19:38:02 +00002343 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002344 if (src[i])
2345 return false;
2346
2347 return true;
2348}
2349
2350/* Extract the given bit of a bignum; returns 0 or 1. */
2351int
2352APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2353{
Dan Gohman16e02092010-03-24 19:38:02 +00002354 return (parts[bit / integerPartWidth] &
2355 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002356}
2357
John McCalle12b7382010-02-28 02:51:25 +00002358/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002359void
2360APInt::tcSetBit(integerPart *parts, unsigned int bit)
2361{
2362 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2363}
2364
John McCalle12b7382010-02-28 02:51:25 +00002365/* Clears the given bit of a bignum. */
2366void
2367APInt::tcClearBit(integerPart *parts, unsigned int bit)
2368{
2369 parts[bit / integerPartWidth] &=
2370 ~((integerPart) 1 << (bit % integerPartWidth));
2371}
2372
Neil Booth055c0b32007-10-06 00:43:45 +00002373/* Returns the bit number of the least significant set bit of a
2374 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002375unsigned int
2376APInt::tcLSB(const integerPart *parts, unsigned int n)
2377{
2378 unsigned int i, lsb;
2379
Dan Gohman16e02092010-03-24 19:38:02 +00002380 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002381 if (parts[i] != 0) {
2382 lsb = partLSB(parts[i]);
2383
2384 return lsb + i * integerPartWidth;
2385 }
2386 }
2387
2388 return -1U;
2389}
2390
Neil Booth055c0b32007-10-06 00:43:45 +00002391/* Returns the bit number of the most significant set bit of a number.
2392 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002393unsigned int
2394APInt::tcMSB(const integerPart *parts, unsigned int n)
2395{
2396 unsigned int msb;
2397
2398 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002399 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002400
Dan Gohman16e02092010-03-24 19:38:02 +00002401 if (parts[n] != 0) {
2402 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002403
Dan Gohman16e02092010-03-24 19:38:02 +00002404 return msb + n * integerPartWidth;
2405 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002406 } while (n);
2407
2408 return -1U;
2409}
2410
Neil Booth68e53ad2007-10-08 13:47:12 +00002411/* Copy the bit vector of width srcBITS from SRC, starting at bit
2412 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2413 the least significant bit of DST. All high bits above srcBITS in
2414 DST are zero-filled. */
2415void
Evan Chengcf69a742009-05-21 23:47:47 +00002416APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002417 unsigned int srcBits, unsigned int srcLSB)
2418{
2419 unsigned int firstSrcPart, dstParts, shift, n;
2420
2421 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002422 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002423
2424 firstSrcPart = srcLSB / integerPartWidth;
2425 tcAssign (dst, src + firstSrcPart, dstParts);
2426
2427 shift = srcLSB % integerPartWidth;
2428 tcShiftRight (dst, dstParts, shift);
2429
2430 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2431 in DST. If this is less that srcBits, append the rest, else
2432 clear the high bits. */
2433 n = dstParts * integerPartWidth - shift;
2434 if (n < srcBits) {
2435 integerPart mask = lowBitMask (srcBits - n);
2436 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2437 << n % integerPartWidth);
2438 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002439 if (srcBits % integerPartWidth)
2440 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002441 }
2442
2443 /* Clear high parts. */
2444 while (dstParts < dstCount)
2445 dst[dstParts++] = 0;
2446}
2447
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002448/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2449integerPart
2450APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2451 integerPart c, unsigned int parts)
2452{
2453 unsigned int i;
2454
2455 assert(c <= 1);
2456
Dan Gohman16e02092010-03-24 19:38:02 +00002457 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002458 integerPart l;
2459
2460 l = dst[i];
2461 if (c) {
2462 dst[i] += rhs[i] + 1;
2463 c = (dst[i] <= l);
2464 } else {
2465 dst[i] += rhs[i];
2466 c = (dst[i] < l);
2467 }
2468 }
2469
2470 return c;
2471}
2472
2473/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2474integerPart
2475APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2476 integerPart c, unsigned int parts)
2477{
2478 unsigned int i;
2479
2480 assert(c <= 1);
2481
Dan Gohman16e02092010-03-24 19:38:02 +00002482 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002483 integerPart l;
2484
2485 l = dst[i];
2486 if (c) {
2487 dst[i] -= rhs[i] + 1;
2488 c = (dst[i] >= l);
2489 } else {
2490 dst[i] -= rhs[i];
2491 c = (dst[i] > l);
2492 }
2493 }
2494
2495 return c;
2496}
2497
2498/* Negate a bignum in-place. */
2499void
2500APInt::tcNegate(integerPart *dst, unsigned int parts)
2501{
2502 tcComplement(dst, parts);
2503 tcIncrement(dst, parts);
2504}
2505
Neil Booth055c0b32007-10-06 00:43:45 +00002506/* DST += SRC * MULTIPLIER + CARRY if add is true
2507 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002508
2509 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2510 they must start at the same point, i.e. DST == SRC.
2511
2512 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2513 returned. Otherwise DST is filled with the least significant
2514 DSTPARTS parts of the result, and if all of the omitted higher
2515 parts were zero return zero, otherwise overflow occurred and
2516 return one. */
2517int
2518APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2519 integerPart multiplier, integerPart carry,
2520 unsigned int srcParts, unsigned int dstParts,
2521 bool add)
2522{
2523 unsigned int i, n;
2524
2525 /* Otherwise our writes of DST kill our later reads of SRC. */
2526 assert(dst <= src || dst >= src + srcParts);
2527 assert(dstParts <= srcParts + 1);
2528
2529 /* N loops; minimum of dstParts and srcParts. */
2530 n = dstParts < srcParts ? dstParts: srcParts;
2531
Dan Gohman16e02092010-03-24 19:38:02 +00002532 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002533 integerPart low, mid, high, srcPart;
2534
2535 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2536
2537 This cannot overflow, because
2538
2539 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2540
2541 which is less than n^2. */
2542
2543 srcPart = src[i];
2544
2545 if (multiplier == 0 || srcPart == 0) {
2546 low = carry;
2547 high = 0;
2548 } else {
2549 low = lowHalf(srcPart) * lowHalf(multiplier);
2550 high = highHalf(srcPart) * highHalf(multiplier);
2551
2552 mid = lowHalf(srcPart) * highHalf(multiplier);
2553 high += highHalf(mid);
2554 mid <<= integerPartWidth / 2;
2555 if (low + mid < low)
2556 high++;
2557 low += mid;
2558
2559 mid = highHalf(srcPart) * lowHalf(multiplier);
2560 high += highHalf(mid);
2561 mid <<= integerPartWidth / 2;
2562 if (low + mid < low)
2563 high++;
2564 low += mid;
2565
2566 /* Now add carry. */
2567 if (low + carry < low)
2568 high++;
2569 low += carry;
2570 }
2571
2572 if (add) {
2573 /* And now DST[i], and store the new low part there. */
2574 if (low + dst[i] < low)
2575 high++;
2576 dst[i] += low;
2577 } else
2578 dst[i] = low;
2579
2580 carry = high;
2581 }
2582
2583 if (i < dstParts) {
2584 /* Full multiplication, there is no overflow. */
2585 assert(i + 1 == dstParts);
2586 dst[i] = carry;
2587 return 0;
2588 } else {
2589 /* We overflowed if there is carry. */
2590 if (carry)
2591 return 1;
2592
2593 /* We would overflow if any significant unwritten parts would be
2594 non-zero. This is true if any remaining src parts are non-zero
2595 and the multiplier is non-zero. */
2596 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002597 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002598 if (src[i])
2599 return 1;
2600
2601 /* We fitted in the narrow destination. */
2602 return 0;
2603 }
2604}
2605
2606/* DST = LHS * RHS, where DST has the same width as the operands and
2607 is filled with the least significant parts of the result. Returns
2608 one if overflow occurred, otherwise zero. DST must be disjoint
2609 from both operands. */
2610int
2611APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2612 const integerPart *rhs, unsigned int parts)
2613{
2614 unsigned int i;
2615 int overflow;
2616
2617 assert(dst != lhs && dst != rhs);
2618
2619 overflow = 0;
2620 tcSet(dst, 0, parts);
2621
Dan Gohman16e02092010-03-24 19:38:02 +00002622 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002623 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2624 parts - i, true);
2625
2626 return overflow;
2627}
2628
Neil Booth978661d2007-10-06 00:24:48 +00002629/* DST = LHS * RHS, where DST has width the sum of the widths of the
2630 operands. No overflow occurs. DST must be disjoint from both
2631 operands. Returns the number of parts required to hold the
2632 result. */
2633unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002634APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002635 const integerPart *rhs, unsigned int lhsParts,
2636 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002637{
Neil Booth978661d2007-10-06 00:24:48 +00002638 /* Put the narrower number on the LHS for less loops below. */
2639 if (lhsParts > rhsParts) {
2640 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2641 } else {
2642 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002643
Neil Booth978661d2007-10-06 00:24:48 +00002644 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002645
Neil Booth978661d2007-10-06 00:24:48 +00002646 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002647
Dan Gohman16e02092010-03-24 19:38:02 +00002648 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002649 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002650
Neil Booth978661d2007-10-06 00:24:48 +00002651 n = lhsParts + rhsParts;
2652
2653 return n - (dst[n - 1] == 0);
2654 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002655}
2656
2657/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2658 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2659 set REMAINDER to the remainder, return zero. i.e.
2660
2661 OLD_LHS = RHS * LHS + REMAINDER
2662
2663 SCRATCH is a bignum of the same size as the operands and result for
2664 use by the routine; its contents need not be initialized and are
2665 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2666*/
2667int
2668APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2669 integerPart *remainder, integerPart *srhs,
2670 unsigned int parts)
2671{
2672 unsigned int n, shiftCount;
2673 integerPart mask;
2674
2675 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2676
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002677 shiftCount = tcMSB(rhs, parts) + 1;
2678 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002679 return true;
2680
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002681 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002682 n = shiftCount / integerPartWidth;
2683 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2684
2685 tcAssign(srhs, rhs, parts);
2686 tcShiftLeft(srhs, parts, shiftCount);
2687 tcAssign(remainder, lhs, parts);
2688 tcSet(lhs, 0, parts);
2689
2690 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2691 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002692 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002693 int compare;
2694
2695 compare = tcCompare(remainder, srhs, parts);
2696 if (compare >= 0) {
2697 tcSubtract(remainder, srhs, 0, parts);
2698 lhs[n] |= mask;
2699 }
2700
2701 if (shiftCount == 0)
2702 break;
2703 shiftCount--;
2704 tcShiftRight(srhs, parts, 1);
2705 if ((mask >>= 1) == 0)
2706 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2707 }
2708
2709 return false;
2710}
2711
2712/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2713 There are no restrictions on COUNT. */
2714void
2715APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2716{
Neil Booth68e53ad2007-10-08 13:47:12 +00002717 if (count) {
2718 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002719
Neil Booth68e53ad2007-10-08 13:47:12 +00002720 /* Jump is the inter-part jump; shift is is intra-part shift. */
2721 jump = count / integerPartWidth;
2722 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002723
Neil Booth68e53ad2007-10-08 13:47:12 +00002724 while (parts > jump) {
2725 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002726
Neil Booth68e53ad2007-10-08 13:47:12 +00002727 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002728
Neil Booth68e53ad2007-10-08 13:47:12 +00002729 /* dst[i] comes from the two parts src[i - jump] and, if we have
2730 an intra-part shift, src[i - jump - 1]. */
2731 part = dst[parts - jump];
2732 if (shift) {
2733 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002734 if (parts >= jump + 1)
2735 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2736 }
2737
Neil Booth68e53ad2007-10-08 13:47:12 +00002738 dst[parts] = part;
2739 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002740
Neil Booth68e53ad2007-10-08 13:47:12 +00002741 while (parts > 0)
2742 dst[--parts] = 0;
2743 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002744}
2745
2746/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2747 zero. There are no restrictions on COUNT. */
2748void
2749APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2750{
Neil Booth68e53ad2007-10-08 13:47:12 +00002751 if (count) {
2752 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002753
Neil Booth68e53ad2007-10-08 13:47:12 +00002754 /* Jump is the inter-part jump; shift is is intra-part shift. */
2755 jump = count / integerPartWidth;
2756 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002757
Neil Booth68e53ad2007-10-08 13:47:12 +00002758 /* Perform the shift. This leaves the most significant COUNT bits
2759 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002760 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002761 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002762
Neil Booth68e53ad2007-10-08 13:47:12 +00002763 if (i + jump >= parts) {
2764 part = 0;
2765 } else {
2766 part = dst[i + jump];
2767 if (shift) {
2768 part >>= shift;
2769 if (i + jump + 1 < parts)
2770 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2771 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002772 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002773
Neil Booth68e53ad2007-10-08 13:47:12 +00002774 dst[i] = part;
2775 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002776 }
2777}
2778
2779/* Bitwise and of two bignums. */
2780void
2781APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2782{
2783 unsigned int i;
2784
Dan Gohman16e02092010-03-24 19:38:02 +00002785 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002786 dst[i] &= rhs[i];
2787}
2788
2789/* Bitwise inclusive or of two bignums. */
2790void
2791APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2792{
2793 unsigned int i;
2794
Dan Gohman16e02092010-03-24 19:38:02 +00002795 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002796 dst[i] |= rhs[i];
2797}
2798
2799/* Bitwise exclusive or of two bignums. */
2800void
2801APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2802{
2803 unsigned int i;
2804
Dan Gohman16e02092010-03-24 19:38:02 +00002805 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002806 dst[i] ^= rhs[i];
2807}
2808
2809/* Complement a bignum in-place. */
2810void
2811APInt::tcComplement(integerPart *dst, unsigned int parts)
2812{
2813 unsigned int i;
2814
Dan Gohman16e02092010-03-24 19:38:02 +00002815 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002816 dst[i] = ~dst[i];
2817}
2818
2819/* Comparison (unsigned) of two bignums. */
2820int
2821APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2822 unsigned int parts)
2823{
2824 while (parts) {
2825 parts--;
2826 if (lhs[parts] == rhs[parts])
2827 continue;
2828
2829 if (lhs[parts] > rhs[parts])
2830 return 1;
2831 else
2832 return -1;
2833 }
2834
2835 return 0;
2836}
2837
2838/* Increment a bignum in-place, return the carry flag. */
2839integerPart
2840APInt::tcIncrement(integerPart *dst, unsigned int parts)
2841{
2842 unsigned int i;
2843
Dan Gohman16e02092010-03-24 19:38:02 +00002844 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002845 if (++dst[i] != 0)
2846 break;
2847
2848 return i == parts;
2849}
2850
2851/* Set the least significant BITS bits of a bignum, clear the
2852 rest. */
2853void
2854APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2855 unsigned int bits)
2856{
2857 unsigned int i;
2858
2859 i = 0;
2860 while (bits > integerPartWidth) {
2861 dst[i++] = ~(integerPart) 0;
2862 bits -= integerPartWidth;
2863 }
2864
2865 if (bits)
2866 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2867
2868 while (i < parts)
2869 dst[i++] = 0;
2870}