blob: 031bbb8882423a60fdb41fd652fcd6235eabc7dd [file] [log] [blame]
Zhou Shengfd43dcf2007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Zhou Shengfd43dcf2007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencer5d0d05c2007-02-25 19:32:03 +000010// This file implements a class to represent arbitrary precision integer
11// constant values and provide a variety of arithmetic operations on them.
Zhou Shengfd43dcf2007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer9d6c9192007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
Ted Kremeneke420deb2008-01-19 04:23:33 +000017#include "llvm/ADT/FoldingSet.h"
Chandler Carruthed7692a2012-03-04 12:02:57 +000018#include "llvm/ADT/Hashing.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Chandler Carruthed7692a2012-03-04 12:02:57 +000020#include "llvm/ADT/StringRef.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000021#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000022#include "llvm/Support/ErrorHandling.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000023#include "llvm/Support/MathExtras.h"
Chris Lattner944fac72008-08-23 22:23:09 +000024#include "llvm/Support/raw_ostream.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000025#include <cmath>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000026#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000027#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000028#include <cstdlib>
29using namespace llvm;
30
Reid Spencer5d0d05c2007-02-25 19:32:03 +000031/// A utility function for allocating memory, checking for allocation failures,
32/// and ensuring the contents are zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000033inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000034 uint64_t * result = new uint64_t[numWords];
35 assert(result && "APInt memory allocation fails!");
36 memset(result, 0, numWords * sizeof(uint64_t));
37 return result;
Zhou Sheng353815d2007-02-06 06:04:53 +000038}
39
Eric Christopherd37eda82009-08-21 04:06:45 +000040/// A utility function for allocating memory and checking for allocation
Reid Spencer5d0d05c2007-02-25 19:32:03 +000041/// failure. The content is not zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000042inline static uint64_t* getMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000043 uint64_t * result = new uint64_t[numWords];
44 assert(result && "APInt memory allocation fails!");
45 return result;
46}
47
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000048/// A utility function that converts a character to a digit.
49inline static unsigned getDigit(char cdigit, uint8_t radix) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000050 unsigned r;
51
Douglas Gregordcd99962011-09-14 15:54:46 +000052 if (radix == 16 || radix == 36) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000053 r = cdigit - '0';
54 if (r <= 9)
55 return r;
56
57 r = cdigit - 'A';
Douglas Gregorf34fa6f2011-09-20 18:33:29 +000058 if (r <= radix - 11U)
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000059 return r + 10;
60
61 r = cdigit - 'a';
Douglas Gregorf34fa6f2011-09-20 18:33:29 +000062 if (r <= radix - 11U)
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000063 return r + 10;
Douglas Gregorf83f0f82011-09-20 18:11:52 +000064
65 radix = 10;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000066 }
67
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000068 r = cdigit - '0';
69 if (r < radix)
70 return r;
71
72 return -1U;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000073}
74
75
Chris Lattner455e9ab2009-01-21 18:09:24 +000076void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000077 pVal = getClearedMemory(getNumWords());
78 pVal[0] = val;
Eric Christopherd37eda82009-08-21 04:06:45 +000079 if (isSigned && int64_t(val) < 0)
Chris Lattner98f8ccf2008-08-20 17:02:31 +000080 for (unsigned i = 1; i < getNumWords(); ++i)
81 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000082}
83
Chris Lattner119c30b2008-10-11 22:07:19 +000084void APInt::initSlowCase(const APInt& that) {
85 pVal = getMemory(getNumWords());
86 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
87}
88
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000089void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000090 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000091 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000092 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000093 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000094 else {
Reid Spencer610fad82007-02-24 10:01:42 +000095 // Get memory, cleared to 0
96 pVal = getClearedMemory(getNumWords());
97 // Calculate the number of words to copy
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000098 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +000099 // Copy the words from bigVal to pVal
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +0000100 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000101 }
Reid Spencer610fad82007-02-24 10:01:42 +0000102 // Make sure unused high bits are cleared
103 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000104}
105
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +0000106APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
107 : BitWidth(numBits), VAL(0) {
108 initFromArray(bigVal);
109}
110
111APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
112 : BitWidth(numBits), VAL(0) {
113 initFromArray(makeArrayRef(bigVal, numWords));
114}
115
Benjamin Kramer38e59892010-07-14 22:38:02 +0000116APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +0000117 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000118 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000119 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000120}
121
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000122APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000123 // Don't do anything for X = X
124 if (this == &RHS)
125 return *this;
126
Reid Spencer9ac44112007-02-26 23:38:21 +0000127 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000128 // assume same bit-width single-word case is already handled
129 assert(!isSingleWord());
130 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer9ac44112007-02-26 23:38:21 +0000131 return *this;
132 }
133
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000134 if (isSingleWord()) {
135 // assume case where both are single words is already handled
136 assert(!RHS.isSingleWord());
137 VAL = 0;
138 pVal = getMemory(RHS.getNumWords());
139 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopherd37eda82009-08-21 04:06:45 +0000140 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000141 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
142 else if (RHS.isSingleWord()) {
143 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000144 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000145 } else {
146 delete [] pVal;
147 pVal = getMemory(RHS.getNumWords());
148 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
149 }
150 BitWidth = RHS.BitWidth;
151 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000152}
153
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000154APInt& APInt::operator=(uint64_t RHS) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000155 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000156 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000157 else {
158 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000159 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000160 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000161 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000162}
163
Ted Kremeneke420deb2008-01-19 04:23:33 +0000164/// Profile - This method 'profiles' an APInt for use with FoldingSet.
165void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000166 ID.AddInteger(BitWidth);
Eric Christopherd37eda82009-08-21 04:06:45 +0000167
Ted Kremeneke420deb2008-01-19 04:23:33 +0000168 if (isSingleWord()) {
169 ID.AddInteger(VAL);
170 return;
171 }
172
Chris Lattner455e9ab2009-01-21 18:09:24 +0000173 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000174 for (unsigned i = 0; i < NumWords; ++i)
175 ID.AddInteger(pVal[i]);
176}
177
Eric Christopherd37eda82009-08-21 04:06:45 +0000178/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spenceraf0e9562007-02-18 18:38:44 +0000179/// "digit" integer array, x[]. x[] is modified to reflect the addition and
180/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000181/// @returns the carry of the addition.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000182static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
183 for (unsigned i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000184 dest[i] = y + x[i];
185 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000186 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000187 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000188 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000189 break;
190 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000191 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000192 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000193}
194
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000195/// @brief Prefix increment operator. Increments the APInt by one.
196APInt& APInt::operator++() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000197 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000198 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000199 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000200 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000201 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000202}
203
Eric Christopherd37eda82009-08-21 04:06:45 +0000204/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
205/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spenceraf0e9562007-02-18 18:38:44 +0000206/// no further borrowing is neeeded or it runs out of "digits" in x. The result
207/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
208/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000209/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-01-21 18:09:24 +0000210static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
211 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000212 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000213 x[i] -= y;
Eric Christopherd37eda82009-08-21 04:06:45 +0000214 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000215 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000216 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000217 y = 0; // No need to borrow
218 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000219 }
220 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000221 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000222}
223
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000224/// @brief Prefix decrement operator. Decrements the APInt by one.
225APInt& APInt::operator--() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000226 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000227 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000228 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000229 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000230 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000231}
232
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000233/// add - This function adds the integer array x to the integer array Y and
Eric Christopherd37eda82009-08-21 04:06:45 +0000234/// places the result in dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000235/// @returns the carry out from the addition
236/// @brief General addition of 64-bit integer arrays
Eric Christopherd37eda82009-08-21 04:06:45 +0000237static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000238 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000239 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000240 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000241 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000242 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000243 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000244 }
245 return carry;
246}
247
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000248/// Adds the RHS APint to this APInt.
249/// @returns this, after addition of RHS.
Eric Christopherd37eda82009-08-21 04:06:45 +0000250/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000251APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000252 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000253 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000254 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000255 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000256 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000257 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000258 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000259}
260
Eric Christopherd37eda82009-08-21 04:06:45 +0000261/// Subtracts the integer array y from the integer array x
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000262/// @returns returns the borrow out.
263/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopherd37eda82009-08-21 04:06:45 +0000264static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000265 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000266 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000267 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000268 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
269 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
270 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000271 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000272 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000273}
274
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000275/// Subtracts the RHS APInt from this APInt
276/// @returns this, after subtraction
Eric Christopherd37eda82009-08-21 04:06:45 +0000277/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000278APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000279 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000280 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000281 VAL -= RHS.VAL;
282 else
283 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000284 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000285}
286
Dan Gohmanf451cb82010-02-10 16:03:48 +0000287/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopherd37eda82009-08-21 04:06:45 +0000288/// into dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000289/// @returns the carry out of the multiplication.
290/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000291static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000292 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000293 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000294 uint64_t carry = 0;
295
296 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000297 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000298 // Split x into high and low words
299 uint64_t lx = x[i] & 0xffffffffULL;
300 uint64_t hx = x[i] >> 32;
301 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000302 // hasCarry == 0, no carry
303 // hasCarry == 1, has carry
304 // hasCarry == 2, no carry and the calculation result == 0.
305 uint8_t hasCarry = 0;
306 dest[i] = carry + lx * ly;
307 // Determine if the add above introduces carry.
308 hasCarry = (dest[i] < carry) ? 1 : 0;
309 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopherd37eda82009-08-21 04:06:45 +0000310 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000311 // (2^32 - 1) + 2^32 = 2^64.
312 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
313
314 carry += (lx * hy) & 0xffffffffULL;
315 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopherd37eda82009-08-21 04:06:45 +0000316 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000317 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
318 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000319 return carry;
320}
321
Eric Christopherd37eda82009-08-21 04:06:45 +0000322/// Multiplies integer array x by integer array y and stores the result into
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000323/// the integer array dest. Note that dest's size must be >= xlen + ylen.
324/// @brief Generalized multiplicate of integer arrays.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000325static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
326 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000327 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000328 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000329 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000330 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000331 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000332 lx = x[j] & 0xffffffffULL;
333 hx = x[j] >> 32;
334 // hasCarry - A flag to indicate if has carry.
335 // hasCarry == 0, no carry
336 // hasCarry == 1, has carry
337 // hasCarry == 2, no carry and the calculation result == 0.
338 uint8_t hasCarry = 0;
339 uint64_t resul = carry + lx * ly;
340 hasCarry = (resul < carry) ? 1 : 0;
341 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
342 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
343
344 carry += (lx * hy) & 0xffffffffULL;
345 resul = (carry << 32) | (resul & 0xffffffffULL);
346 dest[i+j] += resul;
347 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopherd37eda82009-08-21 04:06:45 +0000348 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000349 ((lx * hy) >> 32) + hx * hy;
350 }
351 dest[i+xlen] = carry;
352 }
353}
354
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000355APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000356 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000357 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000358 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000359 clearUnusedBits();
360 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000361 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000362
363 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000364 unsigned lhsBits = getActiveBits();
365 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopherd37eda82009-08-21 04:06:45 +0000366 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +0000367 // 0 * X ===> 0
368 return *this;
369
370 // Get some bit facts about RHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000371 unsigned rhsBits = RHS.getActiveBits();
372 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000373 if (!rhsWords) {
374 // X * 0 ===> 0
Jay Foad7a874dd2010-12-01 08:53:58 +0000375 clearAllBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000376 return *this;
377 }
378
379 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000380 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000381 uint64_t *dest = getMemory(destWords);
382
383 // Perform the long multiply
384 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
385
386 // Copy result back into *this
Jay Foad7a874dd2010-12-01 08:53:58 +0000387 clearAllBits();
Chris Lattner455e9ab2009-01-21 18:09:24 +0000388 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000389 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
Eli Friedman9eb6b4d2011-10-07 23:40:49 +0000390 clearUnusedBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000391
392 // delete dest array and return
393 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000394 return *this;
395}
396
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000397APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000398 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000399 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000400 VAL &= RHS.VAL;
401 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000402 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000403 unsigned numWords = getNumWords();
404 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000405 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000406 return *this;
407}
408
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000409APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000410 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000411 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000412 VAL |= RHS.VAL;
413 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000414 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000415 unsigned numWords = getNumWords();
416 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000417 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000418 return *this;
419}
420
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000421APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000422 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000423 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000424 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000425 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000426 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000427 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000428 unsigned numWords = getNumWords();
429 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000430 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000431 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000432}
433
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000434APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000435 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000436 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000437 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000438 val[i] = pVal[i] & RHS.pVal[i];
439 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000440}
441
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000442APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000443 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000444 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000445 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000446 val[i] = pVal[i] | RHS.pVal[i];
447 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000448}
449
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000450APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000451 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000452 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000453 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000454 val[i] = pVal[i] ^ RHS.pVal[i];
455
456 // 0^0==1 so clear the high bits in case they got set.
457 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000458}
459
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000460bool APInt::operator !() const {
461 if (isSingleWord())
462 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000463
Chris Lattner455e9ab2009-01-21 18:09:24 +0000464 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000465 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000466 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000467 return true;
468}
469
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000470APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000471 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000472 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000473 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000474 APInt Result(*this);
475 Result *= RHS;
Eli Friedman9eb6b4d2011-10-07 23:40:49 +0000476 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000477}
478
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000479APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000480 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000481 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000482 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000483 APInt Result(BitWidth, 0);
484 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000485 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000486}
487
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000488APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000489 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000490 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000491 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000492 APInt Result(BitWidth, 0);
493 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000494 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000495}
496
Chris Lattner455e9ab2009-01-21 18:09:24 +0000497bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman078d9672010-11-18 17:14:56 +0000498 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopherd37eda82009-08-21 04:06:45 +0000499 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000500 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000501}
502
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000503bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000504 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000505 unsigned n1 = getActiveBits();
506 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000507
508 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000509 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000510 return false;
511
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000512 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000513 if (n1 <= APINT_BITS_PER_WORD)
514 return pVal[0] == RHS.pVal[0];
515
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000516 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000517 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000518 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000519 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000520 return true;
521}
522
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000523bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000524 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000525 if (n <= APINT_BITS_PER_WORD)
526 return pVal[0] == Val;
527 else
528 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000529}
530
Reid Spencere81d2da2007-02-16 22:36:51 +0000531bool APInt::ult(const APInt& RHS) const {
532 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
533 if (isSingleWord())
534 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000535
536 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000537 unsigned n1 = getActiveBits();
538 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000539
540 // If magnitude of LHS is less than RHS, return true.
541 if (n1 < n2)
542 return true;
543
544 // If magnitude of RHS is greather than LHS, return false.
545 if (n2 < n1)
546 return false;
547
548 // If they bot fit in a word, just compare the low order word
549 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
550 return pVal[0] < RHS.pVal[0];
551
552 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000553 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000554 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000555 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000556 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000557 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000558 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000559 }
560 return false;
561}
562
Reid Spencere81d2da2007-02-16 22:36:51 +0000563bool APInt::slt(const APInt& RHS) const {
564 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000565 if (isSingleWord()) {
566 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
567 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
568 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000569 }
Reid Spencera58f0582007-02-18 20:09:41 +0000570
571 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000572 APInt rhs(RHS);
573 bool lhsNeg = isNegative();
574 bool rhsNeg = rhs.isNegative();
575 if (lhsNeg) {
576 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000577 lhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000578 lhs++;
579 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000580 if (rhsNeg) {
581 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000582 rhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000583 rhs++;
584 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000585
586 // Now we have unsigned values to compare so do the comparison if necessary
587 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000588 if (lhsNeg)
589 if (rhsNeg)
590 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000591 else
592 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000593 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000594 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000595 else
Reid Spencera58f0582007-02-18 20:09:41 +0000596 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000597}
598
Jay Foad7a874dd2010-12-01 08:53:58 +0000599void APInt::setBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000600 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000601 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000602 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000603 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000604}
605
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000606/// Set the given bit to 0 whose position is given as "bitPosition".
607/// @brief Set a given bit to 0.
Jay Foad7a874dd2010-12-01 08:53:58 +0000608void APInt::clearBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000609 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000610 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000611 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000612 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000613}
614
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000615/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000616
Eric Christopherd37eda82009-08-21 04:06:45 +0000617/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000618/// as "bitPosition".
619/// @brief Toggles a given bit to its opposite value.
Jay Foad7a874dd2010-12-01 08:53:58 +0000620void APInt::flipBit(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000621 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad7a874dd2010-12-01 08:53:58 +0000622 if ((*this)[bitPosition]) clearBit(bitPosition);
623 else setBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000624}
625
Benjamin Kramer38e59892010-07-14 22:38:02 +0000626unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000627 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +0000628 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
629 radix == 36) &&
630 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000631
632 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000633
Eric Christophere250f2a2009-08-21 04:10:31 +0000634 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000635 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000636 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000637 if (*p == '-' || *p == '+') {
638 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000639 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000640 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000641 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000642
Reid Spencer57ae4f52007-04-13 19:19:07 +0000643 // For radixes of power-of-two values, the bits required is accurately and
644 // easily computed
645 if (radix == 2)
646 return slen + isNegative;
647 if (radix == 8)
648 return slen * 3 + isNegative;
649 if (radix == 16)
650 return slen * 4 + isNegative;
651
Douglas Gregordcd99962011-09-14 15:54:46 +0000652 // FIXME: base 36
653
Reid Spencer57ae4f52007-04-13 19:19:07 +0000654 // This is grossly inefficient but accurate. We could probably do something
655 // with a computation of roughly slen*64/20 and then adjust by the value of
656 // the first few digits. But, I'm not sure how accurate that could be.
657
658 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000659 // be too large. This avoids the assertion in the constructor. This
660 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
661 // bits in that case.
Douglas Gregordcd99962011-09-14 15:54:46 +0000662 unsigned sufficient
663 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
664 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000665
666 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000667 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000668
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000669 // Compute how many bits are required. If the log is infinite, assume we need
670 // just bit.
671 unsigned log = tmp.logBase2();
672 if (log == (unsigned)-1) {
673 return isNegative + 1;
674 } else {
675 return isNegative + log + 1;
676 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000677}
678
Chandler Carruthed7692a2012-03-04 12:02:57 +0000679hash_code llvm::hash_value(const APInt &Arg) {
680 if (Arg.isSingleWord())
681 return hash_combine(Arg.VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000682
Chandler Carruthed7692a2012-03-04 12:02:57 +0000683 return hash_combine_range(Arg.pVal, Arg.pVal + Arg.getNumWords());
Reid Spencer794f4722007-02-26 21:02:27 +0000684}
685
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000686/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000687APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000688 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000689}
690
691/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000692APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000693 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000694 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000695}
696
Chris Lattner455e9ab2009-01-21 18:09:24 +0000697unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000698 // Treat the most significand word differently because it might have
699 // meaningless bits set beyond the precision.
700 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
701 integerPart MSWMask;
702 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
703 else {
704 MSWMask = ~integerPart(0);
705 BitsInMSW = APINT_BITS_PER_WORD;
706 }
707
708 unsigned i = getNumWords();
709 integerPart MSW = pVal[i-1] & MSWMask;
710 if (MSW)
711 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
712
713 unsigned Count = BitsInMSW;
714 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000715 if (pVal[i-1] == 0)
716 Count += APINT_BITS_PER_WORD;
717 else {
718 Count += CountLeadingZeros_64(pVal[i-1]);
719 break;
Reid Spencere549c492007-02-21 00:29:48 +0000720 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000721 }
John McCall281d0512010-02-03 03:42:44 +0000722 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000723}
724
Chris Lattner455e9ab2009-01-21 18:09:24 +0000725static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
726 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000727 if (skip)
728 V <<= skip;
729 while (V && (V & (1ULL << 63))) {
730 Count++;
731 V <<= 1;
732 }
733 return Count;
734}
735
Chris Lattner455e9ab2009-01-21 18:09:24 +0000736unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000737 if (isSingleWord())
738 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
739
Chris Lattner455e9ab2009-01-21 18:09:24 +0000740 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000741 unsigned shift;
742 if (!highWordBits) {
743 highWordBits = APINT_BITS_PER_WORD;
744 shift = 0;
745 } else {
746 shift = APINT_BITS_PER_WORD - highWordBits;
747 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000748 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000749 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000750 if (Count == highWordBits) {
751 for (i--; i >= 0; --i) {
752 if (pVal[i] == -1ULL)
753 Count += APINT_BITS_PER_WORD;
754 else {
755 Count += countLeadingOnes_64(pVal[i], 0);
756 break;
757 }
758 }
759 }
760 return Count;
761}
762
Chris Lattner455e9ab2009-01-21 18:09:24 +0000763unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000764 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000765 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
766 unsigned Count = 0;
767 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000768 for (; i < getNumWords() && pVal[i] == 0; ++i)
769 Count += APINT_BITS_PER_WORD;
770 if (i < getNumWords())
771 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000772 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000773}
774
Chris Lattner455e9ab2009-01-21 18:09:24 +0000775unsigned APInt::countTrailingOnesSlowCase() const {
776 unsigned Count = 0;
777 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000778 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000779 Count += APINT_BITS_PER_WORD;
780 if (i < getNumWords())
781 Count += CountTrailingOnes_64(pVal[i]);
782 return std::min(Count, BitWidth);
783}
784
Chris Lattner455e9ab2009-01-21 18:09:24 +0000785unsigned APInt::countPopulationSlowCase() const {
786 unsigned Count = 0;
787 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000788 Count += CountPopulation_64(pVal[i]);
789 return Count;
790}
791
Richard Smithe73db4e2011-11-23 21:33:37 +0000792/// Perform a logical right-shift from Src to Dst, which must be equal or
793/// non-overlapping, of Words words, by Shift, which must be less than 64.
794static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
795 unsigned Shift) {
796 uint64_t Carry = 0;
797 for (int I = Words - 1; I >= 0; --I) {
798 uint64_t Tmp = Src[I];
799 Dst[I] = (Tmp >> Shift) | Carry;
800 Carry = Tmp << (64 - Shift);
801 }
802}
803
Reid Spencere81d2da2007-02-16 22:36:51 +0000804APInt APInt::byteSwap() const {
805 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
806 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000807 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000808 if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000809 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smithe73db4e2011-11-23 21:33:37 +0000810 if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000811 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000812 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000813 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000814 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000815 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengb04973e2007-02-15 06:36:31 +0000816 }
Richard Smithe73db4e2011-11-23 21:33:37 +0000817 if (BitWidth == 64)
818 return APInt(BitWidth, ByteSwap_64(VAL));
819
820 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
821 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
822 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
823 if (Result.BitWidth != BitWidth) {
824 lshrNear(Result.pVal, Result.pVal, getNumWords(),
825 Result.BitWidth - BitWidth);
826 Result.BitWidth = BitWidth;
827 }
828 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000829}
830
Eric Christopherd37eda82009-08-21 04:06:45 +0000831APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000832 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000833 APInt A = API1, B = API2;
834 while (!!B) {
835 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000836 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000837 A = T;
838 }
839 return A;
840}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000841
Chris Lattner455e9ab2009-01-21 18:09:24 +0000842APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000843 union {
844 double D;
845 uint64_t I;
846 } T;
847 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000848
849 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000850 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000851
852 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000853 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000854
855 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000856 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000857 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000858
859 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
860 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
861
862 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000863 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000864 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000865 APInt(width, mantissa >> (52 - exp));
866
867 // If the client didn't provide enough bits for us to shift the mantissa into
868 // then the result is undefined, just return 0
869 if (width <= exp - 52)
870 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000871
872 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000873 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000874 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000875 return isNeg ? -Tmp : Tmp;
876}
877
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000878/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000879/// The layout for double is as following (IEEE Standard 754):
880/// --------------------------------------
881/// | Sign Exponent Fraction Bias |
882/// |-------------------------------------- |
883/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000884/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000885double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000886
887 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000888 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000889 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
890 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000891 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000892 return double(sext);
893 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000894 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000895 }
896
Reid Spencer9c0696f2007-02-20 08:51:03 +0000897 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000898 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000899
900 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000901 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000902
903 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000904 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000905
Reid Spencer9c0696f2007-02-20 08:51:03 +0000906 // The exponent (without bias normalization) is just the number of bits
907 // we are using. Note that the sign bit is gone since we constructed the
908 // absolute value.
909 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000910
Reid Spencer9c0696f2007-02-20 08:51:03 +0000911 // Return infinity for exponent overflow
912 if (exp > 1023) {
913 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000914 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000915 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000916 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000917 }
918 exp += 1023; // Increment for 1023 bias
919
920 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
921 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000922 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000923 unsigned hiWord = whichWord(n-1);
924 if (hiWord == 0) {
925 mantissa = Tmp.pVal[0];
926 if (n > 52)
927 mantissa >>= n - 52; // shift down, we want the top 52 bits.
928 } else {
929 assert(hiWord > 0 && "huh?");
930 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
931 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
932 mantissa = hibits | lobits;
933 }
934
Zhou Shengd93f00c2007-02-12 20:02:55 +0000935 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000936 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000937 union {
938 double D;
939 uint64_t I;
940 } T;
941 T.I = sign | (exp << 52) | mantissa;
942 return T.D;
943}
944
Reid Spencere81d2da2007-02-16 22:36:51 +0000945// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000946APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000947 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000948 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +0000949
950 if (width <= APINT_BITS_PER_WORD)
951 return APInt(width, getRawData()[0]);
952
953 APInt Result(getMemory(getNumWords(width)), width);
954
955 // Copy full words.
956 unsigned i;
957 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
958 Result.pVal[i] = pVal[i];
959
960 // Truncate and copy any partial word.
961 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
962 if (bits != 0)
963 Result.pVal[i] = pVal[i] << bits >> bits;
964
965 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +0000966}
967
968// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000969APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000970 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +0000971
972 if (width <= APINT_BITS_PER_WORD) {
973 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
974 val = (int64_t)val >> (width - BitWidth);
975 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +0000976 }
977
Jay Foad40f8f622010-12-07 08:25:19 +0000978 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +0000979
Jay Foad40f8f622010-12-07 08:25:19 +0000980 // Copy full words.
981 unsigned i;
982 uint64_t word = 0;
983 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
984 word = getRawData()[i];
985 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +0000986 }
987
Jay Foad40f8f622010-12-07 08:25:19 +0000988 // Read and sign-extend any partial word.
989 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
990 if (bits != 0)
991 word = (int64_t)getRawData()[i] << bits >> bits;
992 else
993 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
994
995 // Write remaining full words.
996 for (; i != width / APINT_BITS_PER_WORD; i++) {
997 Result.pVal[i] = word;
998 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +0000999 }
Jay Foad40f8f622010-12-07 08:25:19 +00001000
1001 // Write any partial word.
1002 bits = (0 - width) % APINT_BITS_PER_WORD;
1003 if (bits != 0)
1004 Result.pVal[i] = word << bits >> bits;
1005
1006 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001007}
1008
1009// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001010APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001011 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001012
1013 if (width <= APINT_BITS_PER_WORD)
1014 return APInt(width, VAL);
1015
1016 APInt Result(getMemory(getNumWords(width)), width);
1017
1018 // Copy words.
1019 unsigned i;
1020 for (i = 0; i != getNumWords(); i++)
1021 Result.pVal[i] = getRawData()[i];
1022
1023 // Zero remaining words.
1024 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1025
1026 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001027}
1028
Jay Foad40f8f622010-12-07 08:25:19 +00001029APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001030 if (BitWidth < width)
1031 return zext(width);
1032 if (BitWidth > width)
1033 return trunc(width);
1034 return *this;
1035}
1036
Jay Foad40f8f622010-12-07 08:25:19 +00001037APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001038 if (BitWidth < width)
1039 return sext(width);
1040 if (BitWidth > width)
1041 return trunc(width);
1042 return *this;
1043}
1044
Rafael Espindola04594ae2012-01-27 23:33:07 +00001045APInt APInt::zextOrSelf(unsigned width) const {
1046 if (BitWidth < width)
1047 return zext(width);
1048 return *this;
1049}
1050
1051APInt APInt::sextOrSelf(unsigned width) const {
1052 if (BitWidth < width)
1053 return sext(width);
1054 return *this;
1055}
1056
Zhou Shengff4304f2007-02-09 07:48:24 +00001057/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001058/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001059APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001060 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001061}
1062
1063/// Arithmetic right-shift this APInt by shiftAmt.
1064/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001065APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001066 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001067 // Handle a degenerate case
1068 if (shiftAmt == 0)
1069 return *this;
1070
1071 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001072 if (isSingleWord()) {
1073 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001074 return APInt(BitWidth, 0); // undefined
1075 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001076 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001077 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001078 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1079 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001080 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001081
Reid Spencer46f9c942007-03-02 22:39:11 +00001082 // If all the bits were shifted out, the result is, technically, undefined.
1083 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1084 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001085 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001086 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001087 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001088 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001089 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001090 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001091
1092 // Create some space for the result.
1093 uint64_t * val = new uint64_t[getNumWords()];
1094
Reid Spencer46f9c942007-03-02 22:39:11 +00001095 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001096 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1097 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1098 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1099 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001100 if (bitsInWord == 0)
1101 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001102
1103 // If we are shifting whole words, just move whole words
1104 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001105 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001106 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001107 val[i] = pVal[i+offset]; // move whole word
1108
1109 // Adjust the top significant word for sign bit fill, if negative
1110 if (isNegative())
1111 if (bitsInWord < APINT_BITS_PER_WORD)
1112 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1113 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001114 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001115 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001116 // This combines the shifted corresponding word with the low bits from
1117 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001118 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001119 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1120 }
1121
1122 // Shift the break word. In this case there are no bits from the next word
1123 // to include in this word.
1124 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1125
1126 // Deal with sign extenstion in the break word, and possibly the word before
1127 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001128 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001129 if (wordShift > bitsInWord) {
1130 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001131 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001132 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1133 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001134 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001135 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001136 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001137 }
1138
Reid Spencer46f9c942007-03-02 22:39:11 +00001139 // Remaining words are 0 or -1, just assign them.
1140 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001141 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001142 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001143 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001144}
1145
Zhou Shengff4304f2007-02-09 07:48:24 +00001146/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001147/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001148APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001149 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001150}
1151
1152/// Logical right-shift this APInt by shiftAmt.
1153/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001154APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001155 if (isSingleWord()) {
Ahmed Charles969b7392012-02-24 19:06:15 +00001156 if (shiftAmt >= BitWidth)
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001157 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001158 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001159 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001160 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001161
Reid Spencerba81c2b2007-02-26 01:19:48 +00001162 // If all the bits were shifted out, the result is 0. This avoids issues
1163 // with shifting by the size of the integer type, which produces undefined
1164 // results. We define these "undefined results" to always be 0.
1165 if (shiftAmt == BitWidth)
1166 return APInt(BitWidth, 0);
1167
Reid Spencer02ae8b72007-05-17 06:26:29 +00001168 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001169 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001170 // undefined results in the code below. This is also an optimization.
1171 if (shiftAmt == 0)
1172 return *this;
1173
Reid Spencerba81c2b2007-02-26 01:19:48 +00001174 // Create some space for the result.
1175 uint64_t * val = new uint64_t[getNumWords()];
1176
1177 // If we are shifting less than a word, compute the shift with a simple carry
1178 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smithe73db4e2011-11-23 21:33:37 +00001179 lshrNear(val, pVal, getNumWords(), shiftAmt);
Reid Spencerba81c2b2007-02-26 01:19:48 +00001180 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001181 }
1182
Reid Spencerba81c2b2007-02-26 01:19:48 +00001183 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001184 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1185 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001186
1187 // If we are shifting whole words, just move whole words
1188 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001189 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001190 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001191 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001192 val[i] = 0;
1193 return APInt(val,BitWidth).clearUnusedBits();
1194 }
1195
Eric Christopherd37eda82009-08-21 04:06:45 +00001196 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001197 unsigned breakWord = getNumWords() - offset -1;
1198 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001199 val[i] = (pVal[i+offset] >> wordShift) |
1200 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001201 // Shift the break word.
1202 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1203
1204 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001205 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001206 val[i] = 0;
1207 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001208}
1209
Zhou Shengff4304f2007-02-09 07:48:24 +00001210/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001211/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001212APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001213 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001214 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001215}
1216
Chris Lattner455e9ab2009-01-21 18:09:24 +00001217APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001218 // If all the bits were shifted out, the result is 0. This avoids issues
1219 // with shifting by the size of the integer type, which produces undefined
1220 // results. We define these "undefined results" to always be 0.
1221 if (shiftAmt == BitWidth)
1222 return APInt(BitWidth, 0);
1223
Reid Spencer92c72832007-05-12 18:01:57 +00001224 // If none of the bits are shifted out, the result is *this. This avoids a
1225 // lshr by the words size in the loop below which can produce incorrect
1226 // results. It also avoids the expensive computation below for a common case.
1227 if (shiftAmt == 0)
1228 return *this;
1229
Reid Spencer87553802007-02-25 00:56:44 +00001230 // Create some space for the result.
1231 uint64_t * val = new uint64_t[getNumWords()];
1232
1233 // If we are shifting less than a word, do it the easy way
1234 if (shiftAmt < APINT_BITS_PER_WORD) {
1235 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001236 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001237 val[i] = pVal[i] << shiftAmt | carry;
1238 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1239 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001240 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001241 }
1242
Reid Spencer87553802007-02-25 00:56:44 +00001243 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001244 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1245 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001246
1247 // If we are shifting whole words, just move whole words
1248 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001249 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001250 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001251 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001252 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001253 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001254 }
Reid Spencer87553802007-02-25 00:56:44 +00001255
1256 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001257 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001258 for (; i > offset; --i)
1259 val[i] = pVal[i-offset] << wordShift |
1260 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001261 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001262 for (i = 0; i < offset; ++i)
1263 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001264 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001265}
1266
Dan Gohmancf609572008-02-29 01:40:47 +00001267APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001268 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001269}
1270
Chris Lattner455e9ab2009-01-21 18:09:24 +00001271APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001272 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001273 if (rotateAmt == 0)
1274 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001275 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001276}
1277
Dan Gohmancf609572008-02-29 01:40:47 +00001278APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001279 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001280}
1281
Chris Lattner455e9ab2009-01-21 18:09:24 +00001282APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001283 rotateAmt %= BitWidth;
Reid Spencer69944e82007-05-14 00:15:28 +00001284 if (rotateAmt == 0)
1285 return *this;
Eli Friedman2acbd7d2011-12-22 03:15:35 +00001286 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001287}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001288
1289// Square Root - this method computes and returns the square root of "this".
1290// Three mechanisms are used for computation. For small values (<= 5 bits),
1291// a table lookup is done. This gets some performance for common cases. For
1292// values using less than 52 bits, the value is converted to double and then
1293// the libc sqrt function is called. The result is rounded and then converted
1294// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001295// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001296APInt APInt::sqrt() const {
1297
1298 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001299 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001300
1301 // Use a fast table for some small values. This also gets rid of some
1302 // rounding errors in libc sqrt for small values.
1303 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001304 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001305 /* 0 */ 0,
1306 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001307 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001308 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1309 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1310 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1311 /* 31 */ 6
1312 };
1313 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001314 }
1315
1316 // If the magnitude of the value fits in less than 52 bits (the precision of
1317 // an IEEE double precision floating point value), then we can use the
1318 // libc sqrt function which will probably use a hardware sqrt computation.
1319 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001320 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001321#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001322 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001323 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001324#else
1325 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001326 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001327#endif
1328 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001329
1330 // Okay, all the short cuts are exhausted. We must compute it. The following
1331 // is a classical Babylonian method for computing the square root. This code
1332 // was adapted to APINt from a wikipedia article on such computations.
1333 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001334 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001335 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001336 APInt testy(BitWidth, 16);
1337 APInt x_old(BitWidth, 1);
1338 APInt x_new(BitWidth, 0);
1339 APInt two(BitWidth, 2);
1340
1341 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001342 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001343 if (i >= nbits || this->ule(testy)) {
1344 x_old = x_old.shl(i / 2);
1345 break;
1346 }
1347
Eric Christopherd37eda82009-08-21 04:06:45 +00001348 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001349 for (;;) {
1350 x_new = (this->udiv(x_old) + x_old).udiv(two);
1351 if (x_old.ule(x_new))
1352 break;
1353 x_old = x_new;
1354 }
1355
1356 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001357 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001358 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001359 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001360 // floating point representation after 192 bits. There are no discrepancies
1361 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001362 APInt square(x_old * x_old);
1363 APInt nextSquare((x_old + 1) * (x_old +1));
1364 if (this->ult(square))
1365 return x_old;
David Blaikie18c7ec12011-12-01 20:58:30 +00001366 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1367 APInt midpoint((nextSquare - square).udiv(two));
1368 APInt offset(*this - square);
1369 if (offset.ult(midpoint))
1370 return x_old;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001371 return x_old + 1;
1372}
1373
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001374/// Computes the multiplicative inverse of this APInt for a given modulo. The
1375/// iterative extended Euclidean algorithm is used to solve for this value,
1376/// however we simplify it to speed up calculating only the inverse, and take
1377/// advantage of div+rem calculations. We also use some tricks to avoid copying
1378/// (potentially large) APInts around.
1379APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1380 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1381
1382 // Using the properties listed at the following web page (accessed 06/21/08):
1383 // http://www.numbertheory.org/php/euclid.html
1384 // (especially the properties numbered 3, 4 and 9) it can be proved that
1385 // BitWidth bits suffice for all the computations in the algorithm implemented
1386 // below. More precisely, this number of bits suffice if the multiplicative
1387 // inverse exists, but may not suffice for the general extended Euclidean
1388 // algorithm.
1389
1390 APInt r[2] = { modulo, *this };
1391 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1392 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001393
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001394 unsigned i;
1395 for (i = 0; r[i^1] != 0; i ^= 1) {
1396 // An overview of the math without the confusing bit-flipping:
1397 // q = r[i-2] / r[i-1]
1398 // r[i] = r[i-2] % r[i-1]
1399 // t[i] = t[i-2] - t[i-1] * q
1400 udivrem(r[i], r[i^1], q, r[i]);
1401 t[i] -= t[i^1] * q;
1402 }
1403
1404 // If this APInt and the modulo are not coprime, there is no multiplicative
1405 // inverse, so return 0. We check this by looking at the next-to-last
1406 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1407 // algorithm.
1408 if (r[i] != 1)
1409 return APInt(BitWidth, 0);
1410
1411 // The next-to-last t is the multiplicative inverse. However, we are
1412 // interested in a positive inverse. Calcuate a positive one from a negative
1413 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001414 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001415 return t[i].isNegative() ? t[i] + modulo : t[i];
1416}
1417
Jay Foad4e5ea552009-04-30 10:15:35 +00001418/// Calculate the magic numbers required to implement a signed integer division
1419/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1420/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1421/// Warren, Jr., chapter 10.
1422APInt::ms APInt::magic() const {
1423 const APInt& d = *this;
1424 unsigned p;
1425 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001426 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001427 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001428
Jay Foad4e5ea552009-04-30 10:15:35 +00001429 ad = d.abs();
1430 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1431 anc = t - 1 - t.urem(ad); // absolute value of nc
1432 p = d.getBitWidth() - 1; // initialize p
1433 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1434 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1435 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1436 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1437 do {
1438 p = p + 1;
1439 q1 = q1<<1; // update q1 = 2p/abs(nc)
1440 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1441 if (r1.uge(anc)) { // must be unsigned comparison
1442 q1 = q1 + 1;
1443 r1 = r1 - anc;
1444 }
1445 q2 = q2<<1; // update q2 = 2p/abs(d)
1446 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1447 if (r2.uge(ad)) { // must be unsigned comparison
1448 q2 = q2 + 1;
1449 r2 = r2 - ad;
1450 }
1451 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001452 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001453
Jay Foad4e5ea552009-04-30 10:15:35 +00001454 mag.m = q2 + 1;
1455 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1456 mag.s = p - d.getBitWidth(); // resulting shift
1457 return mag;
1458}
1459
1460/// Calculate the magic numbers required to implement an unsigned integer
1461/// division by a constant as a sequence of multiplies, adds and shifts.
1462/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1463/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001464/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001465/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001466APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001467 const APInt& d = *this;
1468 unsigned p;
1469 APInt nc, delta, q1, r1, q2, r2;
1470 struct mu magu;
1471 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001472 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001473 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1474 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1475
1476 nc = allOnes - (-d).urem(d);
1477 p = d.getBitWidth() - 1; // initialize p
1478 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1479 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1480 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1481 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1482 do {
1483 p = p + 1;
1484 if (r1.uge(nc - r1)) {
1485 q1 = q1 + q1 + 1; // update q1
1486 r1 = r1 + r1 - nc; // update r1
1487 }
1488 else {
1489 q1 = q1+q1; // update q1
1490 r1 = r1+r1; // update r1
1491 }
1492 if ((r2 + 1).uge(d - r2)) {
1493 if (q2.uge(signedMax)) magu.a = 1;
1494 q2 = q2+q2 + 1; // update q2
1495 r2 = r2+r2 + 1 - d; // update r2
1496 }
1497 else {
1498 if (q2.uge(signedMin)) magu.a = 1;
1499 q2 = q2+q2; // update q2
1500 r2 = r2+r2 + 1; // update r2
1501 }
1502 delta = d - 1 - r2;
1503 } while (p < d.getBitWidth()*2 &&
1504 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1505 magu.m = q2 + 1; // resulting magic number
1506 magu.s = p - d.getBitWidth(); // resulting shift
1507 return magu;
1508}
1509
Reid Spencer9c0696f2007-02-20 08:51:03 +00001510/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1511/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1512/// variables here have the same names as in the algorithm. Comments explain
1513/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001514static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1515 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001516 assert(u && "Must provide dividend");
1517 assert(v && "Must provide divisor");
1518 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001519 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001520 assert(n>1 && "n must be > 1");
1521
1522 // Knuth uses the value b as the base of the number system. In our case b
1523 // is 2^31 so we just set it to -1u.
1524 uint64_t b = uint64_t(1) << 32;
1525
Chris Lattnerfad86b02008-08-17 07:19:36 +00001526#if 0
David Greene465abed2010-01-05 01:28:52 +00001527 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1528 DEBUG(dbgs() << "KnuthDiv: original:");
1529 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1530 DEBUG(dbgs() << " by");
1531 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1532 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001533#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001534 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1535 // u and v by d. Note that we have taken Knuth's advice here to use a power
1536 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1537 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001538 // shift amount from the leading zeros. We are basically normalizing the u
1539 // and v so that its high bits are shifted to the top of v's range without
1540 // overflow. Note that this can require an extra word in u so that u must
1541 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001542 unsigned shift = CountLeadingZeros_32(v[n-1]);
1543 unsigned v_carry = 0;
1544 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001545 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001546 for (unsigned i = 0; i < m+n; ++i) {
1547 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001548 u[i] = (u[i] << shift) | u_carry;
1549 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001550 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001551 for (unsigned i = 0; i < n; ++i) {
1552 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001553 v[i] = (v[i] << shift) | v_carry;
1554 v_carry = v_tmp;
1555 }
1556 }
1557 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001558#if 0
David Greene465abed2010-01-05 01:28:52 +00001559 DEBUG(dbgs() << "KnuthDiv: normal:");
1560 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1561 DEBUG(dbgs() << " by");
1562 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1563 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001564#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001565
1566 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1567 int j = m;
1568 do {
David Greene465abed2010-01-05 01:28:52 +00001569 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001570 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001571 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1572 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1573 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1574 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1575 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001576 // value qp is one too large, and it eliminates all cases where qp is two
1577 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001578 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001579 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001580 uint64_t qp = dividend / v[n-1];
1581 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001582 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1583 qp--;
1584 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001585 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001586 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001587 }
David Greene465abed2010-01-05 01:28:52 +00001588 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001589
Reid Spencer92904632007-02-23 01:57:13 +00001590 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1591 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1592 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001593 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001594 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001595 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001596 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001597 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001598 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001599 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001600 << ", subtrahend == " << subtrahend
1601 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001602
Reid Spencer610fad82007-02-24 10:01:42 +00001603 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001604 unsigned k = j + i;
1605 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1606 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001607 while (borrow && k <= m+n) { // deal with borrow to the left
1608 borrow = u[k] == 0;
1609 u[k]--;
1610 k++;
1611 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001612 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001613 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001614 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001615 }
David Greene465abed2010-01-05 01:28:52 +00001616 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1617 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1618 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001619 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1620 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001621 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001622 // the true value, and a "borrow" to the left should be remembered.
1623 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001624 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001625 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001626 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001627 u[i] = ~u[i] + carry; // b's complement
1628 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001629 }
Reid Spencer92904632007-02-23 01:57:13 +00001630 }
David Greene465abed2010-01-05 01:28:52 +00001631 DEBUG(dbgs() << "KnuthDiv: after complement:");
1632 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1633 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001634
Eric Christopherd37eda82009-08-21 04:06:45 +00001635 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001636 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001637 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001638 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001639 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001640 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001641 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001642 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001643 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1644 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001645 // since it cancels with the borrow that occurred in D4.
1646 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001647 for (unsigned i = 0; i < n; i++) {
1648 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001649 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001650 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001651 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001652 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001653 }
David Greene465abed2010-01-05 01:28:52 +00001654 DEBUG(dbgs() << "KnuthDiv: after correction:");
1655 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1656 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001657
Reid Spencer92904632007-02-23 01:57:13 +00001658 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1659 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001660
David Greene465abed2010-01-05 01:28:52 +00001661 DEBUG(dbgs() << "KnuthDiv: quotient:");
1662 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1663 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001664
Reid Spencer9c0696f2007-02-20 08:51:03 +00001665 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1666 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1667 // compute the remainder (urem uses this).
1668 if (r) {
1669 // The value d is expressed by the "shift" value above since we avoided
1670 // multiplication by d by using a shift left. So, all we have to do is
1671 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001672 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001673 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001674 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001675 for (int i = n-1; i >= 0; i--) {
1676 r[i] = (u[i] >> shift) | carry;
1677 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001678 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001679 }
1680 } else {
1681 for (int i = n-1; i >= 0; i--) {
1682 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001683 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001684 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001685 }
David Greene465abed2010-01-05 01:28:52 +00001686 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001687 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001688#if 0
David Greene465abed2010-01-05 01:28:52 +00001689 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001690#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001691}
1692
Chris Lattner455e9ab2009-01-21 18:09:24 +00001693void APInt::divide(const APInt LHS, unsigned lhsWords,
1694 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001695 APInt *Quotient, APInt *Remainder)
1696{
1697 assert(lhsWords >= rhsWords && "Fractional result");
1698
Eric Christopherd37eda82009-08-21 04:06:45 +00001699 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001700 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001701 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001702 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1703 // can't use 64-bit operands here because we don't have native results of
1704 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001705 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001706 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001707 unsigned n = rhsWords * 2;
1708 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001709
1710 // Allocate space for the temporary values we need either on the stack, if
1711 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001712 unsigned SPACE[128];
1713 unsigned *U = 0;
1714 unsigned *V = 0;
1715 unsigned *Q = 0;
1716 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001717 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1718 U = &SPACE[0];
1719 V = &SPACE[m+n+1];
1720 Q = &SPACE[(m+n+1) + n];
1721 if (Remainder)
1722 R = &SPACE[(m+n+1) + n + (m+n)];
1723 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001724 U = new unsigned[m + n + 1];
1725 V = new unsigned[n];
1726 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001727 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001728 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001729 }
1730
1731 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001732 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001733 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001734 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001735 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001736 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001737 }
1738 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1739
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001740 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001741 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001742 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001743 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001744 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001745 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001746 }
1747
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001748 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001749 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001750 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001751 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001752
Eric Christopherd37eda82009-08-21 04:06:45 +00001753 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001754 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001755 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001756 // contain any zero words or the Knuth algorithm fails.
1757 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1758 n--;
1759 m++;
1760 }
1761 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1762 m--;
1763
1764 // If we're left with only a single word for the divisor, Knuth doesn't work
1765 // so we implement the short division algorithm here. This is much simpler
1766 // and faster because we are certain that we can divide a 64-bit quantity
1767 // by a 32-bit quantity at hardware speed and short division is simply a
1768 // series of such operations. This is just like doing short division but we
1769 // are using base 2^32 instead of base 10.
1770 assert(n != 0 && "Divide by zero?");
1771 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001772 unsigned divisor = V[0];
1773 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001774 for (int i = m+n-1; i >= 0; i--) {
1775 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1776 if (partial_dividend == 0) {
1777 Q[i] = 0;
1778 remainder = 0;
1779 } else if (partial_dividend < divisor) {
1780 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001781 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001782 } else if (partial_dividend == divisor) {
1783 Q[i] = 1;
1784 remainder = 0;
1785 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001786 Q[i] = (unsigned)(partial_dividend / divisor);
1787 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001788 }
1789 }
1790 if (R)
1791 R[0] = remainder;
1792 } else {
1793 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1794 // case n > 1.
1795 KnuthDiv(U, V, Q, R, m, n);
1796 }
1797
1798 // If the caller wants the quotient
1799 if (Quotient) {
1800 // Set up the Quotient value's memory.
1801 if (Quotient->BitWidth != LHS.BitWidth) {
1802 if (Quotient->isSingleWord())
1803 Quotient->VAL = 0;
1804 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001805 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 Quotient->BitWidth = LHS.BitWidth;
1807 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001808 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001809 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001810 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001811
Eric Christopherd37eda82009-08-21 04:06:45 +00001812 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001813 // order words.
1814 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001815 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001816 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1817 if (Quotient->isSingleWord())
1818 Quotient->VAL = tmp;
1819 else
1820 Quotient->pVal[0] = tmp;
1821 } else {
1822 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1823 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001824 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001825 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1826 }
1827 }
1828
1829 // If the caller wants the remainder
1830 if (Remainder) {
1831 // Set up the Remainder value's memory.
1832 if (Remainder->BitWidth != RHS.BitWidth) {
1833 if (Remainder->isSingleWord())
1834 Remainder->VAL = 0;
1835 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001836 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001837 Remainder->BitWidth = RHS.BitWidth;
1838 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001839 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001840 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001841 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001842
1843 // The remainder is in R. Reconstitute the remainder into Remainder's low
1844 // order words.
1845 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001846 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001847 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1848 if (Remainder->isSingleWord())
1849 Remainder->VAL = tmp;
1850 else
1851 Remainder->pVal[0] = tmp;
1852 } else {
1853 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1854 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001855 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001856 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1857 }
1858 }
1859
1860 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001861 if (U != &SPACE[0]) {
1862 delete [] U;
1863 delete [] V;
1864 delete [] Q;
1865 delete [] R;
1866 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001867}
1868
Reid Spencere81d2da2007-02-16 22:36:51 +00001869APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001870 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001871
1872 // First, deal with the easy case
1873 if (isSingleWord()) {
1874 assert(RHS.VAL != 0 && "Divide by zero?");
1875 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001876 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001877
Reid Spencer71bd08f2007-02-17 02:07:07 +00001878 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001879 unsigned rhsBits = RHS.getActiveBits();
1880 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001881 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001882 unsigned lhsBits = this->getActiveBits();
1883 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001884
1885 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001886 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001887 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001888 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001889 else if (lhsWords < rhsWords || this->ult(RHS)) {
1890 // X / Y ===> 0, iff X < Y
1891 return APInt(BitWidth, 0);
1892 } else if (*this == RHS) {
1893 // X / X ===> 1
1894 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001895 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001896 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001897 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001898 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001899
1900 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1901 APInt Quotient(1,0); // to hold result.
1902 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1903 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001904}
1905
Reid Spencere81d2da2007-02-16 22:36:51 +00001906APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001907 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001908 if (isSingleWord()) {
1909 assert(RHS.VAL != 0 && "Remainder by zero?");
1910 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001911 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001912
Reid Spencere0cdd332007-02-21 08:21:52 +00001913 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001914 unsigned lhsBits = getActiveBits();
1915 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001916
1917 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001918 unsigned rhsBits = RHS.getActiveBits();
1919 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001920 assert(rhsWords && "Performing remainder operation by zero ???");
1921
Reid Spencer71bd08f2007-02-17 02:07:07 +00001922 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001923 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001924 // 0 % Y ===> 0
1925 return APInt(BitWidth, 0);
1926 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1927 // X % Y ===> X, iff X < Y
1928 return *this;
1929 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001930 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001931 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001932 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001933 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001934 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001935 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001936
Reid Spencer19dc32a2007-05-13 23:44:59 +00001937 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001938 APInt Remainder(1,0);
1939 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1940 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001941}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001942
Eric Christopherd37eda82009-08-21 04:06:45 +00001943void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00001944 APInt &Quotient, APInt &Remainder) {
1945 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001946 unsigned lhsBits = LHS.getActiveBits();
1947 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1948 unsigned rhsBits = RHS.getActiveBits();
1949 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001950
1951 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001952 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00001953 Quotient = 0; // 0 / Y ===> 0
1954 Remainder = 0; // 0 % Y ===> 0
1955 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001956 }
1957
1958 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00001959 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00001960 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00001961 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001962 }
1963
Reid Spencer19dc32a2007-05-13 23:44:59 +00001964 if (LHS == RHS) {
1965 Quotient = 1; // X / X ===> 1
1966 Remainder = 0; // X % X ===> 0;
1967 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00001968 }
1969
Reid Spencer19dc32a2007-05-13 23:44:59 +00001970 if (lhsWords == 1 && rhsWords == 1) {
1971 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001972 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1973 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
1974 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
1975 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001976 return;
1977 }
1978
1979 // Okay, lets do it the long way
1980 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1981}
1982
Chris Lattner0a0a5852010-10-13 23:54:10 +00001983APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001984 APInt Res = *this+RHS;
1985 Overflow = isNonNegative() == RHS.isNonNegative() &&
1986 Res.isNonNegative() != isNonNegative();
1987 return Res;
1988}
1989
Chris Lattnereafc5cb2010-10-14 00:05:07 +00001990APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
1991 APInt Res = *this+RHS;
1992 Overflow = Res.ult(RHS);
1993 return Res;
1994}
1995
Chris Lattner0a0a5852010-10-13 23:54:10 +00001996APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00001997 APInt Res = *this - RHS;
1998 Overflow = isNonNegative() != RHS.isNonNegative() &&
1999 Res.isNonNegative() != isNonNegative();
2000 return Res;
2001}
2002
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002003APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002004 APInt Res = *this-RHS;
2005 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002006 return Res;
2007}
2008
Chris Lattner0a0a5852010-10-13 23:54:10 +00002009APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002010 // MININT/-1 --> overflow.
2011 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2012 return sdiv(RHS);
2013}
2014
Chris Lattner0a0a5852010-10-13 23:54:10 +00002015APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002016 APInt Res = *this * RHS;
2017
2018 if (*this != 0 && RHS != 0)
2019 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2020 else
2021 Overflow = false;
2022 return Res;
2023}
2024
Frits van Bommel62086102011-03-27 14:26:13 +00002025APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2026 APInt Res = *this * RHS;
2027
2028 if (*this != 0 && RHS != 0)
2029 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2030 else
2031 Overflow = false;
2032 return Res;
2033}
2034
Chris Lattner0a0a5852010-10-13 23:54:10 +00002035APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002036 Overflow = ShAmt >= getBitWidth();
2037 if (Overflow)
2038 ShAmt = getBitWidth()-1;
2039
2040 if (isNonNegative()) // Don't allow sign change.
2041 Overflow = ShAmt >= countLeadingZeros();
2042 else
2043 Overflow = ShAmt >= countLeadingOnes();
2044
2045 return *this << ShAmt;
2046}
2047
2048
2049
2050
Benjamin Kramer38e59892010-07-14 22:38:02 +00002051void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002052 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002053 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002054 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2055 radix == 36) &&
2056 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002057
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002058 StringRef::iterator p = str.begin();
2059 size_t slen = str.size();
2060 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002061 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002062 p++;
2063 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002064 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002065 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002066 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002067 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2068 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002069 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2070 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002071
2072 // Allocate memory
2073 if (!isSingleWord())
2074 pVal = getClearedMemory(getNumWords());
2075
2076 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002077 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002078
2079 // Set up an APInt for the digit to add outside the loop so we don't
2080 // constantly construct/destruct it.
2081 APInt apdigit(getBitWidth(), 0);
2082 APInt apradix(getBitWidth(), radix);
2083
2084 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002085 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002086 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002087 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002088
Reid Spencer6551dcd2007-05-16 19:18:22 +00002089 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002090 if (slen > 1) {
2091 if (shift)
2092 *this <<= shift;
2093 else
2094 *this *= apradix;
2095 }
Reid Spencer385f7542007-02-21 03:55:44 +00002096
2097 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002098 if (apdigit.isSingleWord())
2099 apdigit.VAL = digit;
2100 else
2101 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002102 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002103 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002104 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002105 if (isNeg) {
2106 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002107 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002108 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002109}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002110
Chris Lattnerfad86b02008-08-17 07:19:36 +00002111void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002112 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002113 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2114 Radix == 36) &&
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002115 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002116
Ted Kremenekcf886182011-06-15 00:51:55 +00002117 const char *Prefix = "";
2118 if (formatAsCLiteral) {
2119 switch (Radix) {
2120 case 2:
2121 // Binary literals are a non-standard extension added in gcc 4.3:
2122 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2123 Prefix = "0b";
2124 break;
2125 case 8:
2126 Prefix = "0";
2127 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002128 case 10:
2129 break; // No prefix
Ted Kremenekcf886182011-06-15 00:51:55 +00002130 case 16:
2131 Prefix = "0x";
2132 break;
Dylan Noblesmithefb0d1e2011-12-16 20:36:31 +00002133 default:
2134 llvm_unreachable("Invalid radix!");
Ted Kremenekcf886182011-06-15 00:51:55 +00002135 }
2136 }
2137
Chris Lattnerfad86b02008-08-17 07:19:36 +00002138 // First, check for a zero value and just short circuit the logic below.
2139 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002140 while (*Prefix) {
2141 Str.push_back(*Prefix);
2142 ++Prefix;
2143 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002144 Str.push_back('0');
2145 return;
2146 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002147
Douglas Gregordcd99962011-09-14 15:54:46 +00002148 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002149
Reid Spencer9c0696f2007-02-20 08:51:03 +00002150 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002151 char Buffer[65];
2152 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002153
Chris Lattnerfad86b02008-08-17 07:19:36 +00002154 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002155 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002156 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002157 } else {
2158 int64_t I = getSExtValue();
2159 if (I >= 0) {
2160 N = I;
2161 } else {
2162 Str.push_back('-');
2163 N = -(uint64_t)I;
2164 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002165 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002166
Ted Kremenekcf886182011-06-15 00:51:55 +00002167 while (*Prefix) {
2168 Str.push_back(*Prefix);
2169 ++Prefix;
2170 };
2171
Chris Lattnerfad86b02008-08-17 07:19:36 +00002172 while (N) {
2173 *--BufPtr = Digits[N % Radix];
2174 N /= Radix;
2175 }
2176 Str.append(BufPtr, Buffer+65);
2177 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002178 }
2179
Chris Lattnerfad86b02008-08-17 07:19:36 +00002180 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002181
Chris Lattnerfad86b02008-08-17 07:19:36 +00002182 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002183 // They want to print the signed version and it is a negative value
2184 // Flip the bits and add one to turn it into the equivalent positive
2185 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002186 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002187 Tmp++;
2188 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002189 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002190
Ted Kremenekcf886182011-06-15 00:51:55 +00002191 while (*Prefix) {
2192 Str.push_back(*Prefix);
2193 ++Prefix;
2194 };
2195
Chris Lattnerfad86b02008-08-17 07:19:36 +00002196 // We insert the digits backward, then reverse them to get the right order.
2197 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002198
2199 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2200 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002201 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002202 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002203 // Just shift tmp right for each digit width until it becomes zero
2204 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2205 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002206
Chris Lattnerfad86b02008-08-17 07:19:36 +00002207 while (Tmp != 0) {
2208 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2209 Str.push_back(Digits[Digit]);
2210 Tmp = Tmp.lshr(ShiftAmt);
2211 }
2212 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002213 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002214 while (Tmp != 0) {
2215 APInt APdigit(1, 0);
2216 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002217 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002218 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002219 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002220 assert(Digit < Radix && "divide failed");
2221 Str.push_back(Digits[Digit]);
2222 Tmp = tmp2;
2223 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002224 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002225
Chris Lattnerfad86b02008-08-17 07:19:36 +00002226 // Reverse the digits before returning.
2227 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002228}
2229
Chris Lattnerfad86b02008-08-17 07:19:36 +00002230/// toString - This returns the APInt as a std::string. Note that this is an
2231/// inefficient method. It is better to pass in a SmallVector/SmallString
2232/// to the methods above.
2233std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2234 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002235 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002236 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002237}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002238
Chris Lattnerfad86b02008-08-17 07:19:36 +00002239
2240void APInt::dump() const {
2241 SmallString<40> S, U;
2242 this->toStringUnsigned(U);
2243 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002244 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002245 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002246}
2247
Chris Lattner944fac72008-08-23 22:23:09 +00002248void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002249 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002250 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002251 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002252}
2253
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002254// This implements a variety of operations on a representation of
2255// arbitrary precision, two's-complement, bignum integer values.
2256
Chris Lattner91021d32009-08-23 23:11:28 +00002257// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2258// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002259#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002260COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002261
2262/* Some handy functions local to this file. */
2263namespace {
2264
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002265 /* Returns the integer part with the least significant BITS set.
2266 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002267 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002268 lowBitMask(unsigned int bits)
2269 {
Dan Gohman16e02092010-03-24 19:38:02 +00002270 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002271
2272 return ~(integerPart) 0 >> (integerPartWidth - bits);
2273 }
2274
Neil Booth055c0b32007-10-06 00:43:45 +00002275 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002276 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002277 lowHalf(integerPart part)
2278 {
2279 return part & lowBitMask(integerPartWidth / 2);
2280 }
2281
Neil Booth055c0b32007-10-06 00:43:45 +00002282 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002283 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002284 highHalf(integerPart part)
2285 {
2286 return part >> (integerPartWidth / 2);
2287 }
2288
Neil Booth055c0b32007-10-06 00:43:45 +00002289 /* Returns the bit number of the most significant set bit of a part.
2290 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002291 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002292 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002293 {
2294 unsigned int n, msb;
2295
2296 if (value == 0)
2297 return -1U;
2298
2299 n = integerPartWidth / 2;
2300
2301 msb = 0;
2302 do {
2303 if (value >> n) {
2304 value >>= n;
2305 msb += n;
2306 }
2307
2308 n >>= 1;
2309 } while (n);
2310
2311 return msb;
2312 }
2313
Neil Booth055c0b32007-10-06 00:43:45 +00002314 /* Returns the bit number of the least significant set bit of a
2315 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002316 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002317 partLSB(integerPart value)
2318 {
2319 unsigned int n, lsb;
2320
2321 if (value == 0)
2322 return -1U;
2323
2324 lsb = integerPartWidth - 1;
2325 n = integerPartWidth / 2;
2326
2327 do {
2328 if (value << n) {
2329 value <<= n;
2330 lsb -= n;
2331 }
2332
2333 n >>= 1;
2334 } while (n);
2335
2336 return lsb;
2337 }
2338}
2339
2340/* Sets the least significant part of a bignum to the input value, and
2341 zeroes out higher parts. */
2342void
2343APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2344{
2345 unsigned int i;
2346
Dan Gohman16e02092010-03-24 19:38:02 +00002347 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002348
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002349 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002350 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002351 dst[i] = 0;
2352}
2353
2354/* Assign one bignum to another. */
2355void
2356APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2357{
2358 unsigned int i;
2359
Dan Gohman16e02092010-03-24 19:38:02 +00002360 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002361 dst[i] = src[i];
2362}
2363
2364/* Returns true if a bignum is zero, false otherwise. */
2365bool
2366APInt::tcIsZero(const integerPart *src, unsigned int parts)
2367{
2368 unsigned int i;
2369
Dan Gohman16e02092010-03-24 19:38:02 +00002370 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002371 if (src[i])
2372 return false;
2373
2374 return true;
2375}
2376
2377/* Extract the given bit of a bignum; returns 0 or 1. */
2378int
2379APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2380{
Dan Gohman16e02092010-03-24 19:38:02 +00002381 return (parts[bit / integerPartWidth] &
2382 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002383}
2384
John McCalle12b7382010-02-28 02:51:25 +00002385/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002386void
2387APInt::tcSetBit(integerPart *parts, unsigned int bit)
2388{
2389 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2390}
2391
John McCalle12b7382010-02-28 02:51:25 +00002392/* Clears the given bit of a bignum. */
2393void
2394APInt::tcClearBit(integerPart *parts, unsigned int bit)
2395{
2396 parts[bit / integerPartWidth] &=
2397 ~((integerPart) 1 << (bit % integerPartWidth));
2398}
2399
Neil Booth055c0b32007-10-06 00:43:45 +00002400/* Returns the bit number of the least significant set bit of a
2401 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002402unsigned int
2403APInt::tcLSB(const integerPart *parts, unsigned int n)
2404{
2405 unsigned int i, lsb;
2406
Dan Gohman16e02092010-03-24 19:38:02 +00002407 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002408 if (parts[i] != 0) {
2409 lsb = partLSB(parts[i]);
2410
2411 return lsb + i * integerPartWidth;
2412 }
2413 }
2414
2415 return -1U;
2416}
2417
Neil Booth055c0b32007-10-06 00:43:45 +00002418/* Returns the bit number of the most significant set bit of a number.
2419 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002420unsigned int
2421APInt::tcMSB(const integerPart *parts, unsigned int n)
2422{
2423 unsigned int msb;
2424
2425 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002426 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002427
Dan Gohman16e02092010-03-24 19:38:02 +00002428 if (parts[n] != 0) {
2429 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002430
Dan Gohman16e02092010-03-24 19:38:02 +00002431 return msb + n * integerPartWidth;
2432 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002433 } while (n);
2434
2435 return -1U;
2436}
2437
Neil Booth68e53ad2007-10-08 13:47:12 +00002438/* Copy the bit vector of width srcBITS from SRC, starting at bit
2439 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2440 the least significant bit of DST. All high bits above srcBITS in
2441 DST are zero-filled. */
2442void
Evan Chengcf69a742009-05-21 23:47:47 +00002443APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002444 unsigned int srcBits, unsigned int srcLSB)
2445{
2446 unsigned int firstSrcPart, dstParts, shift, n;
2447
2448 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002449 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002450
2451 firstSrcPart = srcLSB / integerPartWidth;
2452 tcAssign (dst, src + firstSrcPart, dstParts);
2453
2454 shift = srcLSB % integerPartWidth;
2455 tcShiftRight (dst, dstParts, shift);
2456
2457 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2458 in DST. If this is less that srcBits, append the rest, else
2459 clear the high bits. */
2460 n = dstParts * integerPartWidth - shift;
2461 if (n < srcBits) {
2462 integerPart mask = lowBitMask (srcBits - n);
2463 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2464 << n % integerPartWidth);
2465 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002466 if (srcBits % integerPartWidth)
2467 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002468 }
2469
2470 /* Clear high parts. */
2471 while (dstParts < dstCount)
2472 dst[dstParts++] = 0;
2473}
2474
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002475/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2476integerPart
2477APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2478 integerPart c, unsigned int parts)
2479{
2480 unsigned int i;
2481
2482 assert(c <= 1);
2483
Dan Gohman16e02092010-03-24 19:38:02 +00002484 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002485 integerPart l;
2486
2487 l = dst[i];
2488 if (c) {
2489 dst[i] += rhs[i] + 1;
2490 c = (dst[i] <= l);
2491 } else {
2492 dst[i] += rhs[i];
2493 c = (dst[i] < l);
2494 }
2495 }
2496
2497 return c;
2498}
2499
2500/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2501integerPart
2502APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2503 integerPart c, unsigned int parts)
2504{
2505 unsigned int i;
2506
2507 assert(c <= 1);
2508
Dan Gohman16e02092010-03-24 19:38:02 +00002509 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002510 integerPart l;
2511
2512 l = dst[i];
2513 if (c) {
2514 dst[i] -= rhs[i] + 1;
2515 c = (dst[i] >= l);
2516 } else {
2517 dst[i] -= rhs[i];
2518 c = (dst[i] > l);
2519 }
2520 }
2521
2522 return c;
2523}
2524
2525/* Negate a bignum in-place. */
2526void
2527APInt::tcNegate(integerPart *dst, unsigned int parts)
2528{
2529 tcComplement(dst, parts);
2530 tcIncrement(dst, parts);
2531}
2532
Neil Booth055c0b32007-10-06 00:43:45 +00002533/* DST += SRC * MULTIPLIER + CARRY if add is true
2534 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002535
2536 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2537 they must start at the same point, i.e. DST == SRC.
2538
2539 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2540 returned. Otherwise DST is filled with the least significant
2541 DSTPARTS parts of the result, and if all of the omitted higher
2542 parts were zero return zero, otherwise overflow occurred and
2543 return one. */
2544int
2545APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2546 integerPart multiplier, integerPart carry,
2547 unsigned int srcParts, unsigned int dstParts,
2548 bool add)
2549{
2550 unsigned int i, n;
2551
2552 /* Otherwise our writes of DST kill our later reads of SRC. */
2553 assert(dst <= src || dst >= src + srcParts);
2554 assert(dstParts <= srcParts + 1);
2555
2556 /* N loops; minimum of dstParts and srcParts. */
2557 n = dstParts < srcParts ? dstParts: srcParts;
2558
Dan Gohman16e02092010-03-24 19:38:02 +00002559 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002560 integerPart low, mid, high, srcPart;
2561
2562 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2563
2564 This cannot overflow, because
2565
2566 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2567
2568 which is less than n^2. */
2569
2570 srcPart = src[i];
2571
2572 if (multiplier == 0 || srcPart == 0) {
2573 low = carry;
2574 high = 0;
2575 } else {
2576 low = lowHalf(srcPart) * lowHalf(multiplier);
2577 high = highHalf(srcPart) * highHalf(multiplier);
2578
2579 mid = lowHalf(srcPart) * highHalf(multiplier);
2580 high += highHalf(mid);
2581 mid <<= integerPartWidth / 2;
2582 if (low + mid < low)
2583 high++;
2584 low += mid;
2585
2586 mid = highHalf(srcPart) * lowHalf(multiplier);
2587 high += highHalf(mid);
2588 mid <<= integerPartWidth / 2;
2589 if (low + mid < low)
2590 high++;
2591 low += mid;
2592
2593 /* Now add carry. */
2594 if (low + carry < low)
2595 high++;
2596 low += carry;
2597 }
2598
2599 if (add) {
2600 /* And now DST[i], and store the new low part there. */
2601 if (low + dst[i] < low)
2602 high++;
2603 dst[i] += low;
2604 } else
2605 dst[i] = low;
2606
2607 carry = high;
2608 }
2609
2610 if (i < dstParts) {
2611 /* Full multiplication, there is no overflow. */
2612 assert(i + 1 == dstParts);
2613 dst[i] = carry;
2614 return 0;
2615 } else {
2616 /* We overflowed if there is carry. */
2617 if (carry)
2618 return 1;
2619
2620 /* We would overflow if any significant unwritten parts would be
2621 non-zero. This is true if any remaining src parts are non-zero
2622 and the multiplier is non-zero. */
2623 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002624 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002625 if (src[i])
2626 return 1;
2627
2628 /* We fitted in the narrow destination. */
2629 return 0;
2630 }
2631}
2632
2633/* DST = LHS * RHS, where DST has the same width as the operands and
2634 is filled with the least significant parts of the result. Returns
2635 one if overflow occurred, otherwise zero. DST must be disjoint
2636 from both operands. */
2637int
2638APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2639 const integerPart *rhs, unsigned int parts)
2640{
2641 unsigned int i;
2642 int overflow;
2643
2644 assert(dst != lhs && dst != rhs);
2645
2646 overflow = 0;
2647 tcSet(dst, 0, parts);
2648
Dan Gohman16e02092010-03-24 19:38:02 +00002649 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002650 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2651 parts - i, true);
2652
2653 return overflow;
2654}
2655
Neil Booth978661d2007-10-06 00:24:48 +00002656/* DST = LHS * RHS, where DST has width the sum of the widths of the
2657 operands. No overflow occurs. DST must be disjoint from both
2658 operands. Returns the number of parts required to hold the
2659 result. */
2660unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002661APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002662 const integerPart *rhs, unsigned int lhsParts,
2663 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002664{
Neil Booth978661d2007-10-06 00:24:48 +00002665 /* Put the narrower number on the LHS for less loops below. */
2666 if (lhsParts > rhsParts) {
2667 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2668 } else {
2669 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002670
Neil Booth978661d2007-10-06 00:24:48 +00002671 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002672
Neil Booth978661d2007-10-06 00:24:48 +00002673 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002674
Dan Gohman16e02092010-03-24 19:38:02 +00002675 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002676 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002677
Neil Booth978661d2007-10-06 00:24:48 +00002678 n = lhsParts + rhsParts;
2679
2680 return n - (dst[n - 1] == 0);
2681 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002682}
2683
2684/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2685 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2686 set REMAINDER to the remainder, return zero. i.e.
2687
2688 OLD_LHS = RHS * LHS + REMAINDER
2689
2690 SCRATCH is a bignum of the same size as the operands and result for
2691 use by the routine; its contents need not be initialized and are
2692 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2693*/
2694int
2695APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2696 integerPart *remainder, integerPart *srhs,
2697 unsigned int parts)
2698{
2699 unsigned int n, shiftCount;
2700 integerPart mask;
2701
2702 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2703
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002704 shiftCount = tcMSB(rhs, parts) + 1;
2705 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002706 return true;
2707
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002708 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002709 n = shiftCount / integerPartWidth;
2710 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2711
2712 tcAssign(srhs, rhs, parts);
2713 tcShiftLeft(srhs, parts, shiftCount);
2714 tcAssign(remainder, lhs, parts);
2715 tcSet(lhs, 0, parts);
2716
2717 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2718 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002719 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002720 int compare;
2721
2722 compare = tcCompare(remainder, srhs, parts);
2723 if (compare >= 0) {
2724 tcSubtract(remainder, srhs, 0, parts);
2725 lhs[n] |= mask;
2726 }
2727
2728 if (shiftCount == 0)
2729 break;
2730 shiftCount--;
2731 tcShiftRight(srhs, parts, 1);
2732 if ((mask >>= 1) == 0)
2733 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2734 }
2735
2736 return false;
2737}
2738
2739/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2740 There are no restrictions on COUNT. */
2741void
2742APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2743{
Neil Booth68e53ad2007-10-08 13:47:12 +00002744 if (count) {
2745 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002746
Neil Booth68e53ad2007-10-08 13:47:12 +00002747 /* Jump is the inter-part jump; shift is is intra-part shift. */
2748 jump = count / integerPartWidth;
2749 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002750
Neil Booth68e53ad2007-10-08 13:47:12 +00002751 while (parts > jump) {
2752 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002753
Neil Booth68e53ad2007-10-08 13:47:12 +00002754 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002755
Neil Booth68e53ad2007-10-08 13:47:12 +00002756 /* dst[i] comes from the two parts src[i - jump] and, if we have
2757 an intra-part shift, src[i - jump - 1]. */
2758 part = dst[parts - jump];
2759 if (shift) {
2760 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002761 if (parts >= jump + 1)
2762 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2763 }
2764
Neil Booth68e53ad2007-10-08 13:47:12 +00002765 dst[parts] = part;
2766 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002767
Neil Booth68e53ad2007-10-08 13:47:12 +00002768 while (parts > 0)
2769 dst[--parts] = 0;
2770 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002771}
2772
2773/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2774 zero. There are no restrictions on COUNT. */
2775void
2776APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2777{
Neil Booth68e53ad2007-10-08 13:47:12 +00002778 if (count) {
2779 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002780
Neil Booth68e53ad2007-10-08 13:47:12 +00002781 /* Jump is the inter-part jump; shift is is intra-part shift. */
2782 jump = count / integerPartWidth;
2783 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002784
Neil Booth68e53ad2007-10-08 13:47:12 +00002785 /* Perform the shift. This leaves the most significant COUNT bits
2786 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002787 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002788 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002789
Neil Booth68e53ad2007-10-08 13:47:12 +00002790 if (i + jump >= parts) {
2791 part = 0;
2792 } else {
2793 part = dst[i + jump];
2794 if (shift) {
2795 part >>= shift;
2796 if (i + jump + 1 < parts)
2797 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2798 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002799 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002800
Neil Booth68e53ad2007-10-08 13:47:12 +00002801 dst[i] = part;
2802 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002803 }
2804}
2805
2806/* Bitwise and of two bignums. */
2807void
2808APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2809{
2810 unsigned int i;
2811
Dan Gohman16e02092010-03-24 19:38:02 +00002812 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002813 dst[i] &= rhs[i];
2814}
2815
2816/* Bitwise inclusive or of two bignums. */
2817void
2818APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2819{
2820 unsigned int i;
2821
Dan Gohman16e02092010-03-24 19:38:02 +00002822 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002823 dst[i] |= rhs[i];
2824}
2825
2826/* Bitwise exclusive or of two bignums. */
2827void
2828APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2829{
2830 unsigned int i;
2831
Dan Gohman16e02092010-03-24 19:38:02 +00002832 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002833 dst[i] ^= rhs[i];
2834}
2835
2836/* Complement a bignum in-place. */
2837void
2838APInt::tcComplement(integerPart *dst, unsigned int parts)
2839{
2840 unsigned int i;
2841
Dan Gohman16e02092010-03-24 19:38:02 +00002842 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002843 dst[i] = ~dst[i];
2844}
2845
2846/* Comparison (unsigned) of two bignums. */
2847int
2848APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2849 unsigned int parts)
2850{
2851 while (parts) {
2852 parts--;
2853 if (lhs[parts] == rhs[parts])
2854 continue;
2855
2856 if (lhs[parts] > rhs[parts])
2857 return 1;
2858 else
2859 return -1;
2860 }
2861
2862 return 0;
2863}
2864
2865/* Increment a bignum in-place, return the carry flag. */
2866integerPart
2867APInt::tcIncrement(integerPart *dst, unsigned int parts)
2868{
2869 unsigned int i;
2870
Dan Gohman16e02092010-03-24 19:38:02 +00002871 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002872 if (++dst[i] != 0)
2873 break;
2874
2875 return i == parts;
2876}
2877
2878/* Set the least significant BITS bits of a bignum, clear the
2879 rest. */
2880void
2881APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2882 unsigned int bits)
2883{
2884 unsigned int i;
2885
2886 i = 0;
2887 while (bits > integerPartWidth) {
2888 dst[i++] = ~(integerPart) 0;
2889 bits -= integerPartWidth;
2890 }
2891
2892 if (bits)
2893 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2894
2895 while (i < parts)
2896 dst[i++] = 0;
2897}