blob: 3cb757627909b76802a73b83b6fb2653d59db7a0 [file] [log] [blame]
Zhou Shengfd43dcf2007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Zhou Shengfd43dcf2007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencer5d0d05c2007-02-25 19:32:03 +000010// This file implements a class to represent arbitrary precision integer
11// constant values and provide a variety of arithmetic operations on them.
Zhou Shengfd43dcf2007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer9d6c9192007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
Daniel Dunbar689ad6e2009-08-13 02:33:34 +000017#include "llvm/ADT/StringRef.h"
Ted Kremeneke420deb2008-01-19 04:23:33 +000018#include "llvm/ADT/FoldingSet.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000020#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000021#include "llvm/Support/ErrorHandling.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000022#include "llvm/Support/MathExtras.h"
Chris Lattner944fac72008-08-23 22:23:09 +000023#include "llvm/Support/raw_ostream.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000024#include <cmath>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000025#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000026#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000027#include <cstdlib>
28using namespace llvm;
29
Reid Spencer5d0d05c2007-02-25 19:32:03 +000030/// A utility function for allocating memory, checking for allocation failures,
31/// and ensuring the contents are zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000032inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000033 uint64_t * result = new uint64_t[numWords];
34 assert(result && "APInt memory allocation fails!");
35 memset(result, 0, numWords * sizeof(uint64_t));
36 return result;
Zhou Sheng353815d2007-02-06 06:04:53 +000037}
38
Eric Christopherd37eda82009-08-21 04:06:45 +000039/// A utility function for allocating memory and checking for allocation
Reid Spencer5d0d05c2007-02-25 19:32:03 +000040/// failure. The content is not zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000041inline static uint64_t* getMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000042 uint64_t * result = new uint64_t[numWords];
43 assert(result && "APInt memory allocation fails!");
44 return result;
45}
46
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000047/// A utility function that converts a character to a digit.
48inline static unsigned getDigit(char cdigit, uint8_t radix) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000049 unsigned r;
50
Douglas Gregordcd99962011-09-14 15:54:46 +000051 if (radix == 16 || radix == 36) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000052 r = cdigit - '0';
53 if (r <= 9)
54 return r;
55
56 r = cdigit - 'A';
Douglas Gregordcd99962011-09-14 15:54:46 +000057 if (r <= radix-11)
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000058 return r + 10;
59
60 r = cdigit - 'a';
Douglas Gregordcd99962011-09-14 15:54:46 +000061 if (r <= radix-11)
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000062 return r + 10;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000063 }
64
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000065 r = cdigit - '0';
66 if (r < radix)
67 return r;
68
69 return -1U;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000070}
71
72
Chris Lattner455e9ab2009-01-21 18:09:24 +000073void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000074 pVal = getClearedMemory(getNumWords());
75 pVal[0] = val;
Eric Christopherd37eda82009-08-21 04:06:45 +000076 if (isSigned && int64_t(val) < 0)
Chris Lattner98f8ccf2008-08-20 17:02:31 +000077 for (unsigned i = 1; i < getNumWords(); ++i)
78 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000079}
80
Chris Lattner119c30b2008-10-11 22:07:19 +000081void APInt::initSlowCase(const APInt& that) {
82 pVal = getMemory(getNumWords());
83 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
84}
85
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000086void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000087 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000088 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000089 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000090 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000091 else {
Reid Spencer610fad82007-02-24 10:01:42 +000092 // Get memory, cleared to 0
93 pVal = getClearedMemory(getNumWords());
94 // Calculate the number of words to copy
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000095 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +000096 // Copy the words from bigVal to pVal
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +000097 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +000098 }
Reid Spencer610fad82007-02-24 10:01:42 +000099 // Make sure unused high bits are cleared
100 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000101}
102
Jeffrey Yasskin3ba292d2011-07-18 21:45:40 +0000103APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
104 : BitWidth(numBits), VAL(0) {
105 initFromArray(bigVal);
106}
107
108APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
109 : BitWidth(numBits), VAL(0) {
110 initFromArray(makeArrayRef(bigVal, numWords));
111}
112
Benjamin Kramer38e59892010-07-14 22:38:02 +0000113APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +0000114 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000115 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000116 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000117}
118
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000119APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000120 // Don't do anything for X = X
121 if (this == &RHS)
122 return *this;
123
Reid Spencer9ac44112007-02-26 23:38:21 +0000124 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000125 // assume same bit-width single-word case is already handled
126 assert(!isSingleWord());
127 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer9ac44112007-02-26 23:38:21 +0000128 return *this;
129 }
130
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000131 if (isSingleWord()) {
132 // assume case where both are single words is already handled
133 assert(!RHS.isSingleWord());
134 VAL = 0;
135 pVal = getMemory(RHS.getNumWords());
136 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopherd37eda82009-08-21 04:06:45 +0000137 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000138 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
139 else if (RHS.isSingleWord()) {
140 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000141 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000142 } else {
143 delete [] pVal;
144 pVal = getMemory(RHS.getNumWords());
145 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
146 }
147 BitWidth = RHS.BitWidth;
148 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000149}
150
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000151APInt& APInt::operator=(uint64_t RHS) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000152 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000153 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000154 else {
155 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000156 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000157 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000158 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000159}
160
Ted Kremeneke420deb2008-01-19 04:23:33 +0000161/// Profile - This method 'profiles' an APInt for use with FoldingSet.
162void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000163 ID.AddInteger(BitWidth);
Eric Christopherd37eda82009-08-21 04:06:45 +0000164
Ted Kremeneke420deb2008-01-19 04:23:33 +0000165 if (isSingleWord()) {
166 ID.AddInteger(VAL);
167 return;
168 }
169
Chris Lattner455e9ab2009-01-21 18:09:24 +0000170 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000171 for (unsigned i = 0; i < NumWords; ++i)
172 ID.AddInteger(pVal[i]);
173}
174
Eric Christopherd37eda82009-08-21 04:06:45 +0000175/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spenceraf0e9562007-02-18 18:38:44 +0000176/// "digit" integer array, x[]. x[] is modified to reflect the addition and
177/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000178/// @returns the carry of the addition.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000179static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
180 for (unsigned i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000181 dest[i] = y + x[i];
182 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000183 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000184 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000185 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000186 break;
187 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000188 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000189 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000190}
191
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000192/// @brief Prefix increment operator. Increments the APInt by one.
193APInt& APInt::operator++() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000194 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000195 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000196 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000197 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000198 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000199}
200
Eric Christopherd37eda82009-08-21 04:06:45 +0000201/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
202/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spenceraf0e9562007-02-18 18:38:44 +0000203/// no further borrowing is neeeded or it runs out of "digits" in x. The result
204/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
205/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000206/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-01-21 18:09:24 +0000207static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
208 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000209 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000210 x[i] -= y;
Eric Christopherd37eda82009-08-21 04:06:45 +0000211 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000212 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000213 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000214 y = 0; // No need to borrow
215 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000216 }
217 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000218 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000219}
220
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000221/// @brief Prefix decrement operator. Decrements the APInt by one.
222APInt& APInt::operator--() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000223 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000224 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000225 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000226 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000227 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000228}
229
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000230/// add - This function adds the integer array x to the integer array Y and
Eric Christopherd37eda82009-08-21 04:06:45 +0000231/// places the result in dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000232/// @returns the carry out from the addition
233/// @brief General addition of 64-bit integer arrays
Eric Christopherd37eda82009-08-21 04:06:45 +0000234static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000235 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000236 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000237 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000238 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000239 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000240 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000241 }
242 return carry;
243}
244
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000245/// Adds the RHS APint to this APInt.
246/// @returns this, after addition of RHS.
Eric Christopherd37eda82009-08-21 04:06:45 +0000247/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000248APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000249 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000250 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000251 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000252 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000253 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000254 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000255 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000256}
257
Eric Christopherd37eda82009-08-21 04:06:45 +0000258/// Subtracts the integer array y from the integer array x
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000259/// @returns returns the borrow out.
260/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopherd37eda82009-08-21 04:06:45 +0000261static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000262 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000263 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000264 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000265 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
266 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
267 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000268 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000269 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000270}
271
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000272/// Subtracts the RHS APInt from this APInt
273/// @returns this, after subtraction
Eric Christopherd37eda82009-08-21 04:06:45 +0000274/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000275APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000276 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000277 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000278 VAL -= RHS.VAL;
279 else
280 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000281 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000282}
283
Dan Gohmanf451cb82010-02-10 16:03:48 +0000284/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopherd37eda82009-08-21 04:06:45 +0000285/// into dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000286/// @returns the carry out of the multiplication.
287/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000288static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000289 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000290 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000291 uint64_t carry = 0;
292
293 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000294 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000295 // Split x into high and low words
296 uint64_t lx = x[i] & 0xffffffffULL;
297 uint64_t hx = x[i] >> 32;
298 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000299 // hasCarry == 0, no carry
300 // hasCarry == 1, has carry
301 // hasCarry == 2, no carry and the calculation result == 0.
302 uint8_t hasCarry = 0;
303 dest[i] = carry + lx * ly;
304 // Determine if the add above introduces carry.
305 hasCarry = (dest[i] < carry) ? 1 : 0;
306 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopherd37eda82009-08-21 04:06:45 +0000307 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000308 // (2^32 - 1) + 2^32 = 2^64.
309 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
310
311 carry += (lx * hy) & 0xffffffffULL;
312 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopherd37eda82009-08-21 04:06:45 +0000313 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000314 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
315 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000316 return carry;
317}
318
Eric Christopherd37eda82009-08-21 04:06:45 +0000319/// Multiplies integer array x by integer array y and stores the result into
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000320/// the integer array dest. Note that dest's size must be >= xlen + ylen.
321/// @brief Generalized multiplicate of integer arrays.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000322static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
323 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000324 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000325 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000326 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000327 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000328 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000329 lx = x[j] & 0xffffffffULL;
330 hx = x[j] >> 32;
331 // hasCarry - A flag to indicate if has carry.
332 // hasCarry == 0, no carry
333 // hasCarry == 1, has carry
334 // hasCarry == 2, no carry and the calculation result == 0.
335 uint8_t hasCarry = 0;
336 uint64_t resul = carry + lx * ly;
337 hasCarry = (resul < carry) ? 1 : 0;
338 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
339 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
340
341 carry += (lx * hy) & 0xffffffffULL;
342 resul = (carry << 32) | (resul & 0xffffffffULL);
343 dest[i+j] += resul;
344 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopherd37eda82009-08-21 04:06:45 +0000345 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000346 ((lx * hy) >> 32) + hx * hy;
347 }
348 dest[i+xlen] = carry;
349 }
350}
351
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000352APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000353 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000354 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000355 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000356 clearUnusedBits();
357 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000358 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000359
360 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000361 unsigned lhsBits = getActiveBits();
362 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopherd37eda82009-08-21 04:06:45 +0000363 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +0000364 // 0 * X ===> 0
365 return *this;
366
367 // Get some bit facts about RHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000368 unsigned rhsBits = RHS.getActiveBits();
369 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000370 if (!rhsWords) {
371 // X * 0 ===> 0
Jay Foad7a874dd2010-12-01 08:53:58 +0000372 clearAllBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000373 return *this;
374 }
375
376 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000377 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000378 uint64_t *dest = getMemory(destWords);
379
380 // Perform the long multiply
381 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
382
383 // Copy result back into *this
Jay Foad7a874dd2010-12-01 08:53:58 +0000384 clearAllBits();
Chris Lattner455e9ab2009-01-21 18:09:24 +0000385 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000386 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
387
388 // delete dest array and return
389 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000390 return *this;
391}
392
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000393APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000394 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000395 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000396 VAL &= RHS.VAL;
397 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000398 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000399 unsigned numWords = getNumWords();
400 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000401 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000402 return *this;
403}
404
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000405APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000406 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000407 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000408 VAL |= RHS.VAL;
409 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000410 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000411 unsigned numWords = getNumWords();
412 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000413 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000414 return *this;
415}
416
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000417APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000418 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000419 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000420 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000421 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000422 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000423 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000424 unsigned numWords = getNumWords();
425 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000426 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000427 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000428}
429
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000430APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000431 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000432 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000433 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000434 val[i] = pVal[i] & RHS.pVal[i];
435 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000436}
437
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000438APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000439 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000440 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000441 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000442 val[i] = pVal[i] | RHS.pVal[i];
443 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000444}
445
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000446APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000447 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000448 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000449 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000450 val[i] = pVal[i] ^ RHS.pVal[i];
451
452 // 0^0==1 so clear the high bits in case they got set.
453 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000454}
455
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000456bool APInt::operator !() const {
457 if (isSingleWord())
458 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000459
Chris Lattner455e9ab2009-01-21 18:09:24 +0000460 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000461 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000462 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000463 return true;
464}
465
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000466APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000467 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000468 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000469 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000470 APInt Result(*this);
471 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000472 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000473}
474
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000475APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000476 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000477 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000478 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000479 APInt Result(BitWidth, 0);
480 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000481 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000482}
483
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000484APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000485 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000486 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000487 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000488 APInt Result(BitWidth, 0);
489 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000490 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000491}
492
Chris Lattner455e9ab2009-01-21 18:09:24 +0000493bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman078d9672010-11-18 17:14:56 +0000494 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopherd37eda82009-08-21 04:06:45 +0000495 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000496 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000497}
498
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000499bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000500 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000501 unsigned n1 = getActiveBits();
502 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000503
504 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000505 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000506 return false;
507
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000508 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000509 if (n1 <= APINT_BITS_PER_WORD)
510 return pVal[0] == RHS.pVal[0];
511
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000512 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000513 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000514 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000515 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000516 return true;
517}
518
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000519bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000520 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000521 if (n <= APINT_BITS_PER_WORD)
522 return pVal[0] == Val;
523 else
524 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000525}
526
Reid Spencere81d2da2007-02-16 22:36:51 +0000527bool APInt::ult(const APInt& RHS) const {
528 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
529 if (isSingleWord())
530 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000531
532 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000533 unsigned n1 = getActiveBits();
534 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000535
536 // If magnitude of LHS is less than RHS, return true.
537 if (n1 < n2)
538 return true;
539
540 // If magnitude of RHS is greather than LHS, return false.
541 if (n2 < n1)
542 return false;
543
544 // If they bot fit in a word, just compare the low order word
545 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
546 return pVal[0] < RHS.pVal[0];
547
548 // Otherwise, compare all words
Chris Lattner455e9ab2009-01-21 18:09:24 +0000549 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000550 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000551 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000552 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000553 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000554 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000555 }
556 return false;
557}
558
Reid Spencere81d2da2007-02-16 22:36:51 +0000559bool APInt::slt(const APInt& RHS) const {
560 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000561 if (isSingleWord()) {
562 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
563 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
564 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000565 }
Reid Spencera58f0582007-02-18 20:09:41 +0000566
567 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000568 APInt rhs(RHS);
569 bool lhsNeg = isNegative();
570 bool rhsNeg = rhs.isNegative();
571 if (lhsNeg) {
572 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000573 lhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000574 lhs++;
575 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000576 if (rhsNeg) {
577 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000578 rhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000579 rhs++;
580 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000581
582 // Now we have unsigned values to compare so do the comparison if necessary
583 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000584 if (lhsNeg)
585 if (rhsNeg)
586 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000587 else
588 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000589 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000590 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000591 else
Reid Spencera58f0582007-02-18 20:09:41 +0000592 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000593}
594
Jay Foad7a874dd2010-12-01 08:53:58 +0000595void APInt::setBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000596 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000597 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000598 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000599 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000600}
601
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000602/// Set the given bit to 0 whose position is given as "bitPosition".
603/// @brief Set a given bit to 0.
Jay Foad7a874dd2010-12-01 08:53:58 +0000604void APInt::clearBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000605 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000606 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000607 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000608 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000609}
610
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000611/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000612
Eric Christopherd37eda82009-08-21 04:06:45 +0000613/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000614/// as "bitPosition".
615/// @brief Toggles a given bit to its opposite value.
Jay Foad7a874dd2010-12-01 08:53:58 +0000616void APInt::flipBit(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000617 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad7a874dd2010-12-01 08:53:58 +0000618 if ((*this)[bitPosition]) clearBit(bitPosition);
619 else setBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000620}
621
Benjamin Kramer38e59892010-07-14 22:38:02 +0000622unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000623 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +0000624 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
625 radix == 36) &&
626 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000627
628 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000629
Eric Christophere250f2a2009-08-21 04:10:31 +0000630 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000631 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000632 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000633 if (*p == '-' || *p == '+') {
634 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000635 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000636 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000637 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000638
Reid Spencer57ae4f52007-04-13 19:19:07 +0000639 // For radixes of power-of-two values, the bits required is accurately and
640 // easily computed
641 if (radix == 2)
642 return slen + isNegative;
643 if (radix == 8)
644 return slen * 3 + isNegative;
645 if (radix == 16)
646 return slen * 4 + isNegative;
647
Douglas Gregordcd99962011-09-14 15:54:46 +0000648 // FIXME: base 36
649
Reid Spencer57ae4f52007-04-13 19:19:07 +0000650 // This is grossly inefficient but accurate. We could probably do something
651 // with a computation of roughly slen*64/20 and then adjust by the value of
652 // the first few digits. But, I'm not sure how accurate that could be.
653
654 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000655 // be too large. This avoids the assertion in the constructor. This
656 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
657 // bits in that case.
Douglas Gregordcd99962011-09-14 15:54:46 +0000658 unsigned sufficient
659 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
660 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000661
662 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000663 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000664
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000665 // Compute how many bits are required. If the log is infinite, assume we need
666 // just bit.
667 unsigned log = tmp.logBase2();
668 if (log == (unsigned)-1) {
669 return isNegative + 1;
670 } else {
671 return isNegative + log + 1;
672 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000673}
674
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000675// From http://www.burtleburtle.net, byBob Jenkins.
676// When targeting x86, both GCC and LLVM seem to recognize this as a
677// rotate instruction.
678#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencer794f4722007-02-26 21:02:27 +0000679
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000680// From http://www.burtleburtle.net, by Bob Jenkins.
681#define mix(a,b,c) \
682 { \
683 a -= c; a ^= rot(c, 4); c += b; \
684 b -= a; b ^= rot(a, 6); a += c; \
685 c -= b; c ^= rot(b, 8); b += a; \
686 a -= c; a ^= rot(c,16); c += b; \
687 b -= a; b ^= rot(a,19); a += c; \
688 c -= b; c ^= rot(b, 4); b += a; \
689 }
690
691// From http://www.burtleburtle.net, by Bob Jenkins.
692#define final(a,b,c) \
693 { \
694 c ^= b; c -= rot(b,14); \
695 a ^= c; a -= rot(c,11); \
696 b ^= a; b -= rot(a,25); \
697 c ^= b; c -= rot(b,16); \
698 a ^= c; a -= rot(c,4); \
699 b ^= a; b -= rot(a,14); \
700 c ^= b; c -= rot(b,24); \
701 }
702
703// hashword() was adapted from http://www.burtleburtle.net, by Bob
704// Jenkins. k is a pointer to an array of uint32_t values; length is
705// the length of the key, in 32-bit chunks. This version only handles
706// keys that are a multiple of 32 bits in size.
707static inline uint32_t hashword(const uint64_t *k64, size_t length)
708{
709 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
710 uint32_t a,b,c;
711
712 /* Set up the internal state */
713 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
714
715 /*------------------------------------------------- handle most of the key */
Dan Gohman16e02092010-03-24 19:38:02 +0000716 while (length > 3) {
717 a += k[0];
718 b += k[1];
719 c += k[2];
720 mix(a,b,c);
721 length -= 3;
722 k += 3;
723 }
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000724
725 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-05-13 23:23:20 +0000726 switch (length) { /* all the case statements fall through */
727 case 3 : c+=k[2];
728 case 2 : b+=k[1];
729 case 1 : a+=k[0];
730 final(a,b,c);
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000731 case 0: /* case 0: nothing left to add */
732 break;
733 }
734 /*------------------------------------------------------ report the result */
735 return c;
736}
737
738// hashword8() was adapted from http://www.burtleburtle.net, by Bob
739// Jenkins. This computes a 32-bit hash from one 64-bit word. When
740// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
741// function into about 35 instructions when inlined.
742static inline uint32_t hashword8(const uint64_t k64)
743{
744 uint32_t a,b,c;
745 a = b = c = 0xdeadbeef + 4;
746 b += k64 >> 32;
747 a += k64 & 0xffffffff;
748 final(a,b,c);
749 return c;
750}
751#undef final
752#undef mix
753#undef rot
754
755uint64_t APInt::getHashValue() const {
756 uint64_t hash;
Reid Spencer794f4722007-02-26 21:02:27 +0000757 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000758 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000759 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000760 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000761 return hash;
762}
763
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000764/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000765APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000766 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000767}
768
769/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000770APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000771 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000772 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000773}
774
Chris Lattner455e9ab2009-01-21 18:09:24 +0000775unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000776 // Treat the most significand word differently because it might have
777 // meaningless bits set beyond the precision.
778 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
779 integerPart MSWMask;
780 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
781 else {
782 MSWMask = ~integerPart(0);
783 BitsInMSW = APINT_BITS_PER_WORD;
784 }
785
786 unsigned i = getNumWords();
787 integerPart MSW = pVal[i-1] & MSWMask;
788 if (MSW)
789 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
790
791 unsigned Count = BitsInMSW;
792 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000793 if (pVal[i-1] == 0)
794 Count += APINT_BITS_PER_WORD;
795 else {
796 Count += CountLeadingZeros_64(pVal[i-1]);
797 break;
Reid Spencere549c492007-02-21 00:29:48 +0000798 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000799 }
John McCall281d0512010-02-03 03:42:44 +0000800 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000801}
802
Chris Lattner455e9ab2009-01-21 18:09:24 +0000803static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
804 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000805 if (skip)
806 V <<= skip;
807 while (V && (V & (1ULL << 63))) {
808 Count++;
809 V <<= 1;
810 }
811 return Count;
812}
813
Chris Lattner455e9ab2009-01-21 18:09:24 +0000814unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000815 if (isSingleWord())
816 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
817
Chris Lattner455e9ab2009-01-21 18:09:24 +0000818 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000819 unsigned shift;
820 if (!highWordBits) {
821 highWordBits = APINT_BITS_PER_WORD;
822 shift = 0;
823 } else {
824 shift = APINT_BITS_PER_WORD - highWordBits;
825 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000826 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000827 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000828 if (Count == highWordBits) {
829 for (i--; i >= 0; --i) {
830 if (pVal[i] == -1ULL)
831 Count += APINT_BITS_PER_WORD;
832 else {
833 Count += countLeadingOnes_64(pVal[i], 0);
834 break;
835 }
836 }
837 }
838 return Count;
839}
840
Chris Lattner455e9ab2009-01-21 18:09:24 +0000841unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000842 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000843 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
844 unsigned Count = 0;
845 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000846 for (; i < getNumWords() && pVal[i] == 0; ++i)
847 Count += APINT_BITS_PER_WORD;
848 if (i < getNumWords())
849 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000850 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000851}
852
Chris Lattner455e9ab2009-01-21 18:09:24 +0000853unsigned APInt::countTrailingOnesSlowCase() const {
854 unsigned Count = 0;
855 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000856 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000857 Count += APINT_BITS_PER_WORD;
858 if (i < getNumWords())
859 Count += CountTrailingOnes_64(pVal[i]);
860 return std::min(Count, BitWidth);
861}
862
Chris Lattner455e9ab2009-01-21 18:09:24 +0000863unsigned APInt::countPopulationSlowCase() const {
864 unsigned Count = 0;
865 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000866 Count += CountPopulation_64(pVal[i]);
867 return Count;
868}
869
Reid Spencere81d2da2007-02-16 22:36:51 +0000870APInt APInt::byteSwap() const {
871 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
872 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000873 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000874 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000875 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000876 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000877 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000878 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000879 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000880 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000881 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000882 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000883 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000884 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000885 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000886 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000887 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000888 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000889 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
890 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000891 }
892 return Result;
893 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000894}
895
Eric Christopherd37eda82009-08-21 04:06:45 +0000896APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000897 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000898 APInt A = API1, B = API2;
899 while (!!B) {
900 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000901 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000902 A = T;
903 }
904 return A;
905}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000906
Chris Lattner455e9ab2009-01-21 18:09:24 +0000907APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000908 union {
909 double D;
910 uint64_t I;
911 } T;
912 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000913
914 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000915 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000916
917 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000918 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000919
920 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000921 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000922 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000923
924 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
925 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
926
927 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000928 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000929 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000930 APInt(width, mantissa >> (52 - exp));
931
932 // If the client didn't provide enough bits for us to shift the mantissa into
933 // then the result is undefined, just return 0
934 if (width <= exp - 52)
935 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000936
937 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000938 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000939 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000940 return isNeg ? -Tmp : Tmp;
941}
942
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000943/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000944/// The layout for double is as following (IEEE Standard 754):
945/// --------------------------------------
946/// | Sign Exponent Fraction Bias |
947/// |-------------------------------------- |
948/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000949/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000950double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000951
952 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000953 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000954 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
955 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000956 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000957 return double(sext);
958 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000959 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000960 }
961
Reid Spencer9c0696f2007-02-20 08:51:03 +0000962 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000963 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000964
965 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000966 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000967
968 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000969 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000970
Reid Spencer9c0696f2007-02-20 08:51:03 +0000971 // The exponent (without bias normalization) is just the number of bits
972 // we are using. Note that the sign bit is gone since we constructed the
973 // absolute value.
974 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000975
Reid Spencer9c0696f2007-02-20 08:51:03 +0000976 // Return infinity for exponent overflow
977 if (exp > 1023) {
978 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000979 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000980 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000981 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000982 }
983 exp += 1023; // Increment for 1023 bias
984
985 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
986 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000987 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000988 unsigned hiWord = whichWord(n-1);
989 if (hiWord == 0) {
990 mantissa = Tmp.pVal[0];
991 if (n > 52)
992 mantissa >>= n - 52; // shift down, we want the top 52 bits.
993 } else {
994 assert(hiWord > 0 && "huh?");
995 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
996 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
997 mantissa = hibits | lobits;
998 }
999
Zhou Shengd93f00c2007-02-12 20:02:55 +00001000 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +00001001 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +00001002 union {
1003 double D;
1004 uint64_t I;
1005 } T;
1006 T.I = sign | (exp << 52) | mantissa;
1007 return T.D;
1008}
1009
Reid Spencere81d2da2007-02-16 22:36:51 +00001010// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001011APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001012 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +00001013 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +00001014
1015 if (width <= APINT_BITS_PER_WORD)
1016 return APInt(width, getRawData()[0]);
1017
1018 APInt Result(getMemory(getNumWords(width)), width);
1019
1020 // Copy full words.
1021 unsigned i;
1022 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1023 Result.pVal[i] = pVal[i];
1024
1025 // Truncate and copy any partial word.
1026 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1027 if (bits != 0)
1028 Result.pVal[i] = pVal[i] << bits >> bits;
1029
1030 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001031}
1032
1033// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001034APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001035 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001036
1037 if (width <= APINT_BITS_PER_WORD) {
1038 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1039 val = (int64_t)val >> (width - BitWidth);
1040 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +00001041 }
1042
Jay Foad40f8f622010-12-07 08:25:19 +00001043 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +00001044
Jay Foad40f8f622010-12-07 08:25:19 +00001045 // Copy full words.
1046 unsigned i;
1047 uint64_t word = 0;
1048 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1049 word = getRawData()[i];
1050 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +00001051 }
1052
Jay Foad40f8f622010-12-07 08:25:19 +00001053 // Read and sign-extend any partial word.
1054 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1055 if (bits != 0)
1056 word = (int64_t)getRawData()[i] << bits >> bits;
1057 else
1058 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1059
1060 // Write remaining full words.
1061 for (; i != width / APINT_BITS_PER_WORD; i++) {
1062 Result.pVal[i] = word;
1063 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +00001064 }
Jay Foad40f8f622010-12-07 08:25:19 +00001065
1066 // Write any partial word.
1067 bits = (0 - width) % APINT_BITS_PER_WORD;
1068 if (bits != 0)
1069 Result.pVal[i] = word << bits >> bits;
1070
1071 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001072}
1073
1074// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001075APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001076 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001077
1078 if (width <= APINT_BITS_PER_WORD)
1079 return APInt(width, VAL);
1080
1081 APInt Result(getMemory(getNumWords(width)), width);
1082
1083 // Copy words.
1084 unsigned i;
1085 for (i = 0; i != getNumWords(); i++)
1086 Result.pVal[i] = getRawData()[i];
1087
1088 // Zero remaining words.
1089 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1090
1091 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001092}
1093
Jay Foad40f8f622010-12-07 08:25:19 +00001094APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001095 if (BitWidth < width)
1096 return zext(width);
1097 if (BitWidth > width)
1098 return trunc(width);
1099 return *this;
1100}
1101
Jay Foad40f8f622010-12-07 08:25:19 +00001102APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001103 if (BitWidth < width)
1104 return sext(width);
1105 if (BitWidth > width)
1106 return trunc(width);
1107 return *this;
1108}
1109
Zhou Shengff4304f2007-02-09 07:48:24 +00001110/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001111/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001112APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001113 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001114}
1115
1116/// Arithmetic right-shift this APInt by shiftAmt.
1117/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001118APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001119 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001120 // Handle a degenerate case
1121 if (shiftAmt == 0)
1122 return *this;
1123
1124 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001125 if (isSingleWord()) {
1126 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001127 return APInt(BitWidth, 0); // undefined
1128 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001129 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001130 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001131 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1132 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001133 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001134
Reid Spencer46f9c942007-03-02 22:39:11 +00001135 // If all the bits were shifted out, the result is, technically, undefined.
1136 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1137 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001138 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001139 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001140 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001141 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001142 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001143 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001144
1145 // Create some space for the result.
1146 uint64_t * val = new uint64_t[getNumWords()];
1147
Reid Spencer46f9c942007-03-02 22:39:11 +00001148 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001149 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1150 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1151 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1152 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001153 if (bitsInWord == 0)
1154 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001155
1156 // If we are shifting whole words, just move whole words
1157 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001158 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001159 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001160 val[i] = pVal[i+offset]; // move whole word
1161
1162 // Adjust the top significant word for sign bit fill, if negative
1163 if (isNegative())
1164 if (bitsInWord < APINT_BITS_PER_WORD)
1165 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1166 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001167 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001168 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001169 // This combines the shifted corresponding word with the low bits from
1170 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001171 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001172 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1173 }
1174
1175 // Shift the break word. In this case there are no bits from the next word
1176 // to include in this word.
1177 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1178
1179 // Deal with sign extenstion in the break word, and possibly the word before
1180 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001181 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001182 if (wordShift > bitsInWord) {
1183 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001184 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001185 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1186 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001187 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001188 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001189 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001190 }
1191
Reid Spencer46f9c942007-03-02 22:39:11 +00001192 // Remaining words are 0 or -1, just assign them.
1193 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001194 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001195 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001196 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001197}
1198
Zhou Shengff4304f2007-02-09 07:48:24 +00001199/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001200/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001201APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001202 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001203}
1204
1205/// Logical right-shift this APInt by shiftAmt.
1206/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001207APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001208 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001209 if (shiftAmt == BitWidth)
1210 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001211 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001212 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001213 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001214
Reid Spencerba81c2b2007-02-26 01:19:48 +00001215 // If all the bits were shifted out, the result is 0. This avoids issues
1216 // with shifting by the size of the integer type, which produces undefined
1217 // results. We define these "undefined results" to always be 0.
1218 if (shiftAmt == BitWidth)
1219 return APInt(BitWidth, 0);
1220
Reid Spencer02ae8b72007-05-17 06:26:29 +00001221 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001222 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001223 // undefined results in the code below. This is also an optimization.
1224 if (shiftAmt == 0)
1225 return *this;
1226
Reid Spencerba81c2b2007-02-26 01:19:48 +00001227 // Create some space for the result.
1228 uint64_t * val = new uint64_t[getNumWords()];
1229
1230 // If we are shifting less than a word, compute the shift with a simple carry
1231 if (shiftAmt < APINT_BITS_PER_WORD) {
1232 uint64_t carry = 0;
1233 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001234 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001235 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1236 }
1237 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001238 }
1239
Reid Spencerba81c2b2007-02-26 01:19:48 +00001240 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001241 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1242 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001243
1244 // If we are shifting whole words, just move whole words
1245 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001246 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001247 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001248 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001249 val[i] = 0;
1250 return APInt(val,BitWidth).clearUnusedBits();
1251 }
1252
Eric Christopherd37eda82009-08-21 04:06:45 +00001253 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001254 unsigned breakWord = getNumWords() - offset -1;
1255 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001256 val[i] = (pVal[i+offset] >> wordShift) |
1257 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001258 // Shift the break word.
1259 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1260
1261 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001262 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001263 val[i] = 0;
1264 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001265}
1266
Zhou Shengff4304f2007-02-09 07:48:24 +00001267/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001268/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001269APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001270 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001271 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001272}
1273
Chris Lattner455e9ab2009-01-21 18:09:24 +00001274APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001275 // If all the bits were shifted out, the result is 0. This avoids issues
1276 // with shifting by the size of the integer type, which produces undefined
1277 // results. We define these "undefined results" to always be 0.
1278 if (shiftAmt == BitWidth)
1279 return APInt(BitWidth, 0);
1280
Reid Spencer92c72832007-05-12 18:01:57 +00001281 // If none of the bits are shifted out, the result is *this. This avoids a
1282 // lshr by the words size in the loop below which can produce incorrect
1283 // results. It also avoids the expensive computation below for a common case.
1284 if (shiftAmt == 0)
1285 return *this;
1286
Reid Spencer87553802007-02-25 00:56:44 +00001287 // Create some space for the result.
1288 uint64_t * val = new uint64_t[getNumWords()];
1289
1290 // If we are shifting less than a word, do it the easy way
1291 if (shiftAmt < APINT_BITS_PER_WORD) {
1292 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001293 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001294 val[i] = pVal[i] << shiftAmt | carry;
1295 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1296 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001297 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001298 }
1299
Reid Spencer87553802007-02-25 00:56:44 +00001300 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001301 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1302 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001303
1304 // If we are shifting whole words, just move whole words
1305 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001306 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001307 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001308 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001309 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001310 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001311 }
Reid Spencer87553802007-02-25 00:56:44 +00001312
1313 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001314 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001315 for (; i > offset; --i)
1316 val[i] = pVal[i-offset] << wordShift |
1317 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001318 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001319 for (i = 0; i < offset; ++i)
1320 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001321 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001322}
1323
Dan Gohmancf609572008-02-29 01:40:47 +00001324APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001325 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001326}
1327
Chris Lattner455e9ab2009-01-21 18:09:24 +00001328APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001329 if (rotateAmt == 0)
1330 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001331 // Don't get too fancy, just use existing shift/or facilities
1332 APInt hi(*this);
1333 APInt lo(*this);
1334 hi.shl(rotateAmt);
1335 lo.lshr(BitWidth - rotateAmt);
1336 return hi | lo;
1337}
1338
Dan Gohmancf609572008-02-29 01:40:47 +00001339APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001340 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001341}
1342
Chris Lattner455e9ab2009-01-21 18:09:24 +00001343APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001344 if (rotateAmt == 0)
1345 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001346 // Don't get too fancy, just use existing shift/or facilities
1347 APInt hi(*this);
1348 APInt lo(*this);
1349 lo.lshr(rotateAmt);
1350 hi.shl(BitWidth - rotateAmt);
1351 return hi | lo;
1352}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001353
1354// Square Root - this method computes and returns the square root of "this".
1355// Three mechanisms are used for computation. For small values (<= 5 bits),
1356// a table lookup is done. This gets some performance for common cases. For
1357// values using less than 52 bits, the value is converted to double and then
1358// the libc sqrt function is called. The result is rounded and then converted
1359// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001360// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001361APInt APInt::sqrt() const {
1362
1363 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001364 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001365
1366 // Use a fast table for some small values. This also gets rid of some
1367 // rounding errors in libc sqrt for small values.
1368 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001369 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001370 /* 0 */ 0,
1371 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001372 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001373 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1374 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1375 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1376 /* 31 */ 6
1377 };
1378 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001379 }
1380
1381 // If the magnitude of the value fits in less than 52 bits (the precision of
1382 // an IEEE double precision floating point value), then we can use the
1383 // libc sqrt function which will probably use a hardware sqrt computation.
1384 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001385 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001386#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001387 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001388 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001389#else
1390 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001391 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001392#endif
1393 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001394
1395 // Okay, all the short cuts are exhausted. We must compute it. The following
1396 // is a classical Babylonian method for computing the square root. This code
1397 // was adapted to APINt from a wikipedia article on such computations.
1398 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001399 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001400 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001401 APInt testy(BitWidth, 16);
1402 APInt x_old(BitWidth, 1);
1403 APInt x_new(BitWidth, 0);
1404 APInt two(BitWidth, 2);
1405
1406 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001407 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001408 if (i >= nbits || this->ule(testy)) {
1409 x_old = x_old.shl(i / 2);
1410 break;
1411 }
1412
Eric Christopherd37eda82009-08-21 04:06:45 +00001413 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001414 for (;;) {
1415 x_new = (this->udiv(x_old) + x_old).udiv(two);
1416 if (x_old.ule(x_new))
1417 break;
1418 x_old = x_new;
1419 }
1420
1421 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001422 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001423 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001424 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001425 // floating point representation after 192 bits. There are no discrepancies
1426 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001427 APInt square(x_old * x_old);
1428 APInt nextSquare((x_old + 1) * (x_old +1));
1429 if (this->ult(square))
1430 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001431 else if (this->ule(nextSquare)) {
1432 APInt midpoint((nextSquare - square).udiv(two));
1433 APInt offset(*this - square);
1434 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001435 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001436 else
1437 return x_old + 1;
1438 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001439 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001440 return x_old + 1;
1441}
1442
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001443/// Computes the multiplicative inverse of this APInt for a given modulo. The
1444/// iterative extended Euclidean algorithm is used to solve for this value,
1445/// however we simplify it to speed up calculating only the inverse, and take
1446/// advantage of div+rem calculations. We also use some tricks to avoid copying
1447/// (potentially large) APInts around.
1448APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1449 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1450
1451 // Using the properties listed at the following web page (accessed 06/21/08):
1452 // http://www.numbertheory.org/php/euclid.html
1453 // (especially the properties numbered 3, 4 and 9) it can be proved that
1454 // BitWidth bits suffice for all the computations in the algorithm implemented
1455 // below. More precisely, this number of bits suffice if the multiplicative
1456 // inverse exists, but may not suffice for the general extended Euclidean
1457 // algorithm.
1458
1459 APInt r[2] = { modulo, *this };
1460 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1461 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001462
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001463 unsigned i;
1464 for (i = 0; r[i^1] != 0; i ^= 1) {
1465 // An overview of the math without the confusing bit-flipping:
1466 // q = r[i-2] / r[i-1]
1467 // r[i] = r[i-2] % r[i-1]
1468 // t[i] = t[i-2] - t[i-1] * q
1469 udivrem(r[i], r[i^1], q, r[i]);
1470 t[i] -= t[i^1] * q;
1471 }
1472
1473 // If this APInt and the modulo are not coprime, there is no multiplicative
1474 // inverse, so return 0. We check this by looking at the next-to-last
1475 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1476 // algorithm.
1477 if (r[i] != 1)
1478 return APInt(BitWidth, 0);
1479
1480 // The next-to-last t is the multiplicative inverse. However, we are
1481 // interested in a positive inverse. Calcuate a positive one from a negative
1482 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001483 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001484 return t[i].isNegative() ? t[i] + modulo : t[i];
1485}
1486
Jay Foad4e5ea552009-04-30 10:15:35 +00001487/// Calculate the magic numbers required to implement a signed integer division
1488/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1489/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1490/// Warren, Jr., chapter 10.
1491APInt::ms APInt::magic() const {
1492 const APInt& d = *this;
1493 unsigned p;
1494 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001495 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001496 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001497
Jay Foad4e5ea552009-04-30 10:15:35 +00001498 ad = d.abs();
1499 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1500 anc = t - 1 - t.urem(ad); // absolute value of nc
1501 p = d.getBitWidth() - 1; // initialize p
1502 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1503 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1504 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1505 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1506 do {
1507 p = p + 1;
1508 q1 = q1<<1; // update q1 = 2p/abs(nc)
1509 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1510 if (r1.uge(anc)) { // must be unsigned comparison
1511 q1 = q1 + 1;
1512 r1 = r1 - anc;
1513 }
1514 q2 = q2<<1; // update q2 = 2p/abs(d)
1515 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1516 if (r2.uge(ad)) { // must be unsigned comparison
1517 q2 = q2 + 1;
1518 r2 = r2 - ad;
1519 }
1520 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001521 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001522
Jay Foad4e5ea552009-04-30 10:15:35 +00001523 mag.m = q2 + 1;
1524 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1525 mag.s = p - d.getBitWidth(); // resulting shift
1526 return mag;
1527}
1528
1529/// Calculate the magic numbers required to implement an unsigned integer
1530/// division by a constant as a sequence of multiplies, adds and shifts.
1531/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1532/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001533/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001534/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001535APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001536 const APInt& d = *this;
1537 unsigned p;
1538 APInt nc, delta, q1, r1, q2, r2;
1539 struct mu magu;
1540 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001541 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001542 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1543 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1544
1545 nc = allOnes - (-d).urem(d);
1546 p = d.getBitWidth() - 1; // initialize p
1547 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1548 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1549 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1550 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1551 do {
1552 p = p + 1;
1553 if (r1.uge(nc - r1)) {
1554 q1 = q1 + q1 + 1; // update q1
1555 r1 = r1 + r1 - nc; // update r1
1556 }
1557 else {
1558 q1 = q1+q1; // update q1
1559 r1 = r1+r1; // update r1
1560 }
1561 if ((r2 + 1).uge(d - r2)) {
1562 if (q2.uge(signedMax)) magu.a = 1;
1563 q2 = q2+q2 + 1; // update q2
1564 r2 = r2+r2 + 1 - d; // update r2
1565 }
1566 else {
1567 if (q2.uge(signedMin)) magu.a = 1;
1568 q2 = q2+q2; // update q2
1569 r2 = r2+r2 + 1; // update r2
1570 }
1571 delta = d - 1 - r2;
1572 } while (p < d.getBitWidth()*2 &&
1573 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1574 magu.m = q2 + 1; // resulting magic number
1575 magu.s = p - d.getBitWidth(); // resulting shift
1576 return magu;
1577}
1578
Reid Spencer9c0696f2007-02-20 08:51:03 +00001579/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1580/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1581/// variables here have the same names as in the algorithm. Comments explain
1582/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001583static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1584 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001585 assert(u && "Must provide dividend");
1586 assert(v && "Must provide divisor");
1587 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001588 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001589 assert(n>1 && "n must be > 1");
1590
1591 // Knuth uses the value b as the base of the number system. In our case b
1592 // is 2^31 so we just set it to -1u.
1593 uint64_t b = uint64_t(1) << 32;
1594
Chris Lattnerfad86b02008-08-17 07:19:36 +00001595#if 0
David Greene465abed2010-01-05 01:28:52 +00001596 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1597 DEBUG(dbgs() << "KnuthDiv: original:");
1598 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1599 DEBUG(dbgs() << " by");
1600 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1601 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001602#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001603 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1604 // u and v by d. Note that we have taken Knuth's advice here to use a power
1605 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1606 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001607 // shift amount from the leading zeros. We are basically normalizing the u
1608 // and v so that its high bits are shifted to the top of v's range without
1609 // overflow. Note that this can require an extra word in u so that u must
1610 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001611 unsigned shift = CountLeadingZeros_32(v[n-1]);
1612 unsigned v_carry = 0;
1613 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001614 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001615 for (unsigned i = 0; i < m+n; ++i) {
1616 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001617 u[i] = (u[i] << shift) | u_carry;
1618 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001619 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001620 for (unsigned i = 0; i < n; ++i) {
1621 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001622 v[i] = (v[i] << shift) | v_carry;
1623 v_carry = v_tmp;
1624 }
1625 }
1626 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001627#if 0
David Greene465abed2010-01-05 01:28:52 +00001628 DEBUG(dbgs() << "KnuthDiv: normal:");
1629 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1630 DEBUG(dbgs() << " by");
1631 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1632 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001633#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001634
1635 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1636 int j = m;
1637 do {
David Greene465abed2010-01-05 01:28:52 +00001638 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001639 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001640 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1641 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1642 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1643 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1644 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001645 // value qp is one too large, and it eliminates all cases where qp is two
1646 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001647 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001648 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001649 uint64_t qp = dividend / v[n-1];
1650 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001651 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1652 qp--;
1653 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001654 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001655 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001656 }
David Greene465abed2010-01-05 01:28:52 +00001657 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001658
Reid Spencer92904632007-02-23 01:57:13 +00001659 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1660 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1661 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001662 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001663 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001664 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001665 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001666 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001667 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001668 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001669 << ", subtrahend == " << subtrahend
1670 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001671
Reid Spencer610fad82007-02-24 10:01:42 +00001672 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001673 unsigned k = j + i;
1674 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1675 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001676 while (borrow && k <= m+n) { // deal with borrow to the left
1677 borrow = u[k] == 0;
1678 u[k]--;
1679 k++;
1680 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001681 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001682 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001683 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001684 }
David Greene465abed2010-01-05 01:28:52 +00001685 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1686 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1687 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001688 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1689 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001690 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001691 // the true value, and a "borrow" to the left should be remembered.
1692 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001693 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001694 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001695 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001696 u[i] = ~u[i] + carry; // b's complement
1697 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001698 }
Reid Spencer92904632007-02-23 01:57:13 +00001699 }
David Greene465abed2010-01-05 01:28:52 +00001700 DEBUG(dbgs() << "KnuthDiv: after complement:");
1701 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1702 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001703
Eric Christopherd37eda82009-08-21 04:06:45 +00001704 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001705 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001706 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001707 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001708 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001709 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001710 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001711 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001712 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1713 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001714 // since it cancels with the borrow that occurred in D4.
1715 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001716 for (unsigned i = 0; i < n; i++) {
1717 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001718 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001719 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001720 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001721 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001722 }
David Greene465abed2010-01-05 01:28:52 +00001723 DEBUG(dbgs() << "KnuthDiv: after correction:");
1724 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1725 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001726
Reid Spencer92904632007-02-23 01:57:13 +00001727 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1728 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001729
David Greene465abed2010-01-05 01:28:52 +00001730 DEBUG(dbgs() << "KnuthDiv: quotient:");
1731 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1732 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001733
Reid Spencer9c0696f2007-02-20 08:51:03 +00001734 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1735 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1736 // compute the remainder (urem uses this).
1737 if (r) {
1738 // The value d is expressed by the "shift" value above since we avoided
1739 // multiplication by d by using a shift left. So, all we have to do is
1740 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001741 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001742 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001743 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001744 for (int i = n-1; i >= 0; i--) {
1745 r[i] = (u[i] >> shift) | carry;
1746 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001747 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001748 }
1749 } else {
1750 for (int i = n-1; i >= 0; i--) {
1751 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001752 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001753 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001754 }
David Greene465abed2010-01-05 01:28:52 +00001755 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001756 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001757#if 0
David Greene465abed2010-01-05 01:28:52 +00001758 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001759#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001760}
1761
Chris Lattner455e9ab2009-01-21 18:09:24 +00001762void APInt::divide(const APInt LHS, unsigned lhsWords,
1763 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001764 APInt *Quotient, APInt *Remainder)
1765{
1766 assert(lhsWords >= rhsWords && "Fractional result");
1767
Eric Christopherd37eda82009-08-21 04:06:45 +00001768 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001769 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001770 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001771 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1772 // can't use 64-bit operands here because we don't have native results of
1773 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001774 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001775 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001776 unsigned n = rhsWords * 2;
1777 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001778
1779 // Allocate space for the temporary values we need either on the stack, if
1780 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001781 unsigned SPACE[128];
1782 unsigned *U = 0;
1783 unsigned *V = 0;
1784 unsigned *Q = 0;
1785 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001786 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1787 U = &SPACE[0];
1788 V = &SPACE[m+n+1];
1789 Q = &SPACE[(m+n+1) + n];
1790 if (Remainder)
1791 R = &SPACE[(m+n+1) + n + (m+n)];
1792 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001793 U = new unsigned[m + n + 1];
1794 V = new unsigned[n];
1795 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001796 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001797 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001798 }
1799
1800 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001801 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001802 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001803 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001804 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001805 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 }
1807 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1808
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001809 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001810 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001811 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001812 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001813 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001814 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001815 }
1816
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001817 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001818 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001819 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001820 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001821
Eric Christopherd37eda82009-08-21 04:06:45 +00001822 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001823 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001824 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001825 // contain any zero words or the Knuth algorithm fails.
1826 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1827 n--;
1828 m++;
1829 }
1830 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1831 m--;
1832
1833 // If we're left with only a single word for the divisor, Knuth doesn't work
1834 // so we implement the short division algorithm here. This is much simpler
1835 // and faster because we are certain that we can divide a 64-bit quantity
1836 // by a 32-bit quantity at hardware speed and short division is simply a
1837 // series of such operations. This is just like doing short division but we
1838 // are using base 2^32 instead of base 10.
1839 assert(n != 0 && "Divide by zero?");
1840 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001841 unsigned divisor = V[0];
1842 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001843 for (int i = m+n-1; i >= 0; i--) {
1844 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1845 if (partial_dividend == 0) {
1846 Q[i] = 0;
1847 remainder = 0;
1848 } else if (partial_dividend < divisor) {
1849 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001850 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001851 } else if (partial_dividend == divisor) {
1852 Q[i] = 1;
1853 remainder = 0;
1854 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001855 Q[i] = (unsigned)(partial_dividend / divisor);
1856 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001857 }
1858 }
1859 if (R)
1860 R[0] = remainder;
1861 } else {
1862 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1863 // case n > 1.
1864 KnuthDiv(U, V, Q, R, m, n);
1865 }
1866
1867 // If the caller wants the quotient
1868 if (Quotient) {
1869 // Set up the Quotient value's memory.
1870 if (Quotient->BitWidth != LHS.BitWidth) {
1871 if (Quotient->isSingleWord())
1872 Quotient->VAL = 0;
1873 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001874 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001875 Quotient->BitWidth = LHS.BitWidth;
1876 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001877 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001878 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001879 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001880
Eric Christopherd37eda82009-08-21 04:06:45 +00001881 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001882 // order words.
1883 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001884 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001885 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1886 if (Quotient->isSingleWord())
1887 Quotient->VAL = tmp;
1888 else
1889 Quotient->pVal[0] = tmp;
1890 } else {
1891 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1892 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001893 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001894 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1895 }
1896 }
1897
1898 // If the caller wants the remainder
1899 if (Remainder) {
1900 // Set up the Remainder value's memory.
1901 if (Remainder->BitWidth != RHS.BitWidth) {
1902 if (Remainder->isSingleWord())
1903 Remainder->VAL = 0;
1904 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001905 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001906 Remainder->BitWidth = RHS.BitWidth;
1907 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001908 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001909 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001910 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001911
1912 // The remainder is in R. Reconstitute the remainder into Remainder's low
1913 // order words.
1914 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001915 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001916 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1917 if (Remainder->isSingleWord())
1918 Remainder->VAL = tmp;
1919 else
1920 Remainder->pVal[0] = tmp;
1921 } else {
1922 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1923 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001924 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001925 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1926 }
1927 }
1928
1929 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001930 if (U != &SPACE[0]) {
1931 delete [] U;
1932 delete [] V;
1933 delete [] Q;
1934 delete [] R;
1935 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001936}
1937
Reid Spencere81d2da2007-02-16 22:36:51 +00001938APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001939 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001940
1941 // First, deal with the easy case
1942 if (isSingleWord()) {
1943 assert(RHS.VAL != 0 && "Divide by zero?");
1944 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001945 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001946
Reid Spencer71bd08f2007-02-17 02:07:07 +00001947 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001948 unsigned rhsBits = RHS.getActiveBits();
1949 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001950 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001951 unsigned lhsBits = this->getActiveBits();
1952 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001953
1954 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001955 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001956 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001957 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001958 else if (lhsWords < rhsWords || this->ult(RHS)) {
1959 // X / Y ===> 0, iff X < Y
1960 return APInt(BitWidth, 0);
1961 } else if (*this == RHS) {
1962 // X / X ===> 1
1963 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001964 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001965 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001966 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001967 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001968
1969 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1970 APInt Quotient(1,0); // to hold result.
1971 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1972 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001973}
1974
Reid Spencere81d2da2007-02-16 22:36:51 +00001975APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001976 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001977 if (isSingleWord()) {
1978 assert(RHS.VAL != 0 && "Remainder by zero?");
1979 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001980 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001981
Reid Spencere0cdd332007-02-21 08:21:52 +00001982 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001983 unsigned lhsBits = getActiveBits();
1984 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001985
1986 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001987 unsigned rhsBits = RHS.getActiveBits();
1988 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001989 assert(rhsWords && "Performing remainder operation by zero ???");
1990
Reid Spencer71bd08f2007-02-17 02:07:07 +00001991 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001992 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001993 // 0 % Y ===> 0
1994 return APInt(BitWidth, 0);
1995 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1996 // X % Y ===> X, iff X < Y
1997 return *this;
1998 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001999 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00002000 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002001 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00002002 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00002003 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00002004 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002005
Reid Spencer19dc32a2007-05-13 23:44:59 +00002006 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00002007 APInt Remainder(1,0);
2008 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2009 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002010}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002011
Eric Christopherd37eda82009-08-21 04:06:45 +00002012void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002013 APInt &Quotient, APInt &Remainder) {
2014 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002015 unsigned lhsBits = LHS.getActiveBits();
2016 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2017 unsigned rhsBits = RHS.getActiveBits();
2018 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002019
2020 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002021 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002022 Quotient = 0; // 0 / Y ===> 0
2023 Remainder = 0; // 0 % Y ===> 0
2024 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002025 }
2026
2027 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002028 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002029 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002030 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002031 }
2032
Reid Spencer19dc32a2007-05-13 23:44:59 +00002033 if (LHS == RHS) {
2034 Quotient = 1; // X / X ===> 1
2035 Remainder = 0; // X % X ===> 0;
2036 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002037 }
2038
Reid Spencer19dc32a2007-05-13 23:44:59 +00002039 if (lhsWords == 1 && rhsWords == 1) {
2040 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002041 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2042 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2043 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2044 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002045 return;
2046 }
2047
2048 // Okay, lets do it the long way
2049 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2050}
2051
Chris Lattner0a0a5852010-10-13 23:54:10 +00002052APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002053 APInt Res = *this+RHS;
2054 Overflow = isNonNegative() == RHS.isNonNegative() &&
2055 Res.isNonNegative() != isNonNegative();
2056 return Res;
2057}
2058
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002059APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2060 APInt Res = *this+RHS;
2061 Overflow = Res.ult(RHS);
2062 return Res;
2063}
2064
Chris Lattner0a0a5852010-10-13 23:54:10 +00002065APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002066 APInt Res = *this - RHS;
2067 Overflow = isNonNegative() != RHS.isNonNegative() &&
2068 Res.isNonNegative() != isNonNegative();
2069 return Res;
2070}
2071
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002072APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002073 APInt Res = *this-RHS;
2074 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002075 return Res;
2076}
2077
Chris Lattner0a0a5852010-10-13 23:54:10 +00002078APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002079 // MININT/-1 --> overflow.
2080 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2081 return sdiv(RHS);
2082}
2083
Chris Lattner0a0a5852010-10-13 23:54:10 +00002084APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002085 APInt Res = *this * RHS;
2086
2087 if (*this != 0 && RHS != 0)
2088 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2089 else
2090 Overflow = false;
2091 return Res;
2092}
2093
Frits van Bommel62086102011-03-27 14:26:13 +00002094APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2095 APInt Res = *this * RHS;
2096
2097 if (*this != 0 && RHS != 0)
2098 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2099 else
2100 Overflow = false;
2101 return Res;
2102}
2103
Chris Lattner0a0a5852010-10-13 23:54:10 +00002104APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002105 Overflow = ShAmt >= getBitWidth();
2106 if (Overflow)
2107 ShAmt = getBitWidth()-1;
2108
2109 if (isNonNegative()) // Don't allow sign change.
2110 Overflow = ShAmt >= countLeadingZeros();
2111 else
2112 Overflow = ShAmt >= countLeadingOnes();
2113
2114 return *this << ShAmt;
2115}
2116
2117
2118
2119
Benjamin Kramer38e59892010-07-14 22:38:02 +00002120void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002121 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002122 assert(!str.empty() && "Invalid string length");
Douglas Gregordcd99962011-09-14 15:54:46 +00002123 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2124 radix == 36) &&
2125 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002126
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002127 StringRef::iterator p = str.begin();
2128 size_t slen = str.size();
2129 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002130 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002131 p++;
2132 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002133 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002134 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002135 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002136 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2137 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002138 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2139 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002140
2141 // Allocate memory
2142 if (!isSingleWord())
2143 pVal = getClearedMemory(getNumWords());
2144
2145 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002146 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002147
2148 // Set up an APInt for the digit to add outside the loop so we don't
2149 // constantly construct/destruct it.
2150 APInt apdigit(getBitWidth(), 0);
2151 APInt apradix(getBitWidth(), radix);
2152
2153 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002154 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002155 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002156 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002157
Reid Spencer6551dcd2007-05-16 19:18:22 +00002158 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002159 if (slen > 1) {
2160 if (shift)
2161 *this <<= shift;
2162 else
2163 *this *= apradix;
2164 }
Reid Spencer385f7542007-02-21 03:55:44 +00002165
2166 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002167 if (apdigit.isSingleWord())
2168 apdigit.VAL = digit;
2169 else
2170 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002171 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002172 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002173 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002174 if (isNeg) {
2175 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002176 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002177 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002178}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002179
Chris Lattnerfad86b02008-08-17 07:19:36 +00002180void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002181 bool Signed, bool formatAsCLiteral) const {
Douglas Gregordcd99962011-09-14 15:54:46 +00002182 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2183 Radix == 36) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002184 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002185
Ted Kremenekcf886182011-06-15 00:51:55 +00002186 const char *Prefix = "";
2187 if (formatAsCLiteral) {
2188 switch (Radix) {
2189 case 2:
2190 // Binary literals are a non-standard extension added in gcc 4.3:
2191 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2192 Prefix = "0b";
2193 break;
2194 case 8:
2195 Prefix = "0";
2196 break;
2197 case 16:
2198 Prefix = "0x";
2199 break;
2200 }
2201 }
2202
Chris Lattnerfad86b02008-08-17 07:19:36 +00002203 // First, check for a zero value and just short circuit the logic below.
2204 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002205 while (*Prefix) {
2206 Str.push_back(*Prefix);
2207 ++Prefix;
2208 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002209 Str.push_back('0');
2210 return;
2211 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002212
Douglas Gregordcd99962011-09-14 15:54:46 +00002213 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopherd37eda82009-08-21 04:06:45 +00002214
Reid Spencer9c0696f2007-02-20 08:51:03 +00002215 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002216 char Buffer[65];
2217 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002218
Chris Lattnerfad86b02008-08-17 07:19:36 +00002219 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002220 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002221 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002222 } else {
2223 int64_t I = getSExtValue();
2224 if (I >= 0) {
2225 N = I;
2226 } else {
2227 Str.push_back('-');
2228 N = -(uint64_t)I;
2229 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002230 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002231
Ted Kremenekcf886182011-06-15 00:51:55 +00002232 while (*Prefix) {
2233 Str.push_back(*Prefix);
2234 ++Prefix;
2235 };
2236
Chris Lattnerfad86b02008-08-17 07:19:36 +00002237 while (N) {
2238 *--BufPtr = Digits[N % Radix];
2239 N /= Radix;
2240 }
2241 Str.append(BufPtr, Buffer+65);
2242 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002243 }
2244
Chris Lattnerfad86b02008-08-17 07:19:36 +00002245 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002246
Chris Lattnerfad86b02008-08-17 07:19:36 +00002247 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002248 // They want to print the signed version and it is a negative value
2249 // Flip the bits and add one to turn it into the equivalent positive
2250 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002251 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002252 Tmp++;
2253 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002254 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002255
Ted Kremenekcf886182011-06-15 00:51:55 +00002256 while (*Prefix) {
2257 Str.push_back(*Prefix);
2258 ++Prefix;
2259 };
2260
Chris Lattnerfad86b02008-08-17 07:19:36 +00002261 // We insert the digits backward, then reverse them to get the right order.
2262 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002263
2264 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2265 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002266 // equaly. We just shift until the value is zero.
Douglas Gregordcd99962011-09-14 15:54:46 +00002267 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002268 // Just shift tmp right for each digit width until it becomes zero
2269 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2270 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002271
Chris Lattnerfad86b02008-08-17 07:19:36 +00002272 while (Tmp != 0) {
2273 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2274 Str.push_back(Digits[Digit]);
2275 Tmp = Tmp.lshr(ShiftAmt);
2276 }
2277 } else {
Douglas Gregordcd99962011-09-14 15:54:46 +00002278 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattnerfad86b02008-08-17 07:19:36 +00002279 while (Tmp != 0) {
2280 APInt APdigit(1, 0);
2281 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002282 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002283 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002284 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002285 assert(Digit < Radix && "divide failed");
2286 Str.push_back(Digits[Digit]);
2287 Tmp = tmp2;
2288 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002289 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002290
Chris Lattnerfad86b02008-08-17 07:19:36 +00002291 // Reverse the digits before returning.
2292 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002293}
2294
Chris Lattnerfad86b02008-08-17 07:19:36 +00002295/// toString - This returns the APInt as a std::string. Note that this is an
2296/// inefficient method. It is better to pass in a SmallVector/SmallString
2297/// to the methods above.
2298std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2299 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002300 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002301 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002302}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002303
Chris Lattnerfad86b02008-08-17 07:19:36 +00002304
2305void APInt::dump() const {
2306 SmallString<40> S, U;
2307 this->toStringUnsigned(U);
2308 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002309 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002310 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002311}
2312
Chris Lattner944fac72008-08-23 22:23:09 +00002313void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002314 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002315 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002316 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002317}
2318
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002319// This implements a variety of operations on a representation of
2320// arbitrary precision, two's-complement, bignum integer values.
2321
Chris Lattner91021d32009-08-23 23:11:28 +00002322// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2323// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002324#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002325COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002326
2327/* Some handy functions local to this file. */
2328namespace {
2329
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002330 /* Returns the integer part with the least significant BITS set.
2331 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002332 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002333 lowBitMask(unsigned int bits)
2334 {
Dan Gohman16e02092010-03-24 19:38:02 +00002335 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002336
2337 return ~(integerPart) 0 >> (integerPartWidth - bits);
2338 }
2339
Neil Booth055c0b32007-10-06 00:43:45 +00002340 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002341 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002342 lowHalf(integerPart part)
2343 {
2344 return part & lowBitMask(integerPartWidth / 2);
2345 }
2346
Neil Booth055c0b32007-10-06 00:43:45 +00002347 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002348 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002349 highHalf(integerPart part)
2350 {
2351 return part >> (integerPartWidth / 2);
2352 }
2353
Neil Booth055c0b32007-10-06 00:43:45 +00002354 /* Returns the bit number of the most significant set bit of a part.
2355 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002356 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002357 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002358 {
2359 unsigned int n, msb;
2360
2361 if (value == 0)
2362 return -1U;
2363
2364 n = integerPartWidth / 2;
2365
2366 msb = 0;
2367 do {
2368 if (value >> n) {
2369 value >>= n;
2370 msb += n;
2371 }
2372
2373 n >>= 1;
2374 } while (n);
2375
2376 return msb;
2377 }
2378
Neil Booth055c0b32007-10-06 00:43:45 +00002379 /* Returns the bit number of the least significant set bit of a
2380 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002381 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002382 partLSB(integerPart value)
2383 {
2384 unsigned int n, lsb;
2385
2386 if (value == 0)
2387 return -1U;
2388
2389 lsb = integerPartWidth - 1;
2390 n = integerPartWidth / 2;
2391
2392 do {
2393 if (value << n) {
2394 value <<= n;
2395 lsb -= n;
2396 }
2397
2398 n >>= 1;
2399 } while (n);
2400
2401 return lsb;
2402 }
2403}
2404
2405/* Sets the least significant part of a bignum to the input value, and
2406 zeroes out higher parts. */
2407void
2408APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2409{
2410 unsigned int i;
2411
Dan Gohman16e02092010-03-24 19:38:02 +00002412 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002413
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002414 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002415 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002416 dst[i] = 0;
2417}
2418
2419/* Assign one bignum to another. */
2420void
2421APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2422{
2423 unsigned int i;
2424
Dan Gohman16e02092010-03-24 19:38:02 +00002425 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002426 dst[i] = src[i];
2427}
2428
2429/* Returns true if a bignum is zero, false otherwise. */
2430bool
2431APInt::tcIsZero(const integerPart *src, unsigned int parts)
2432{
2433 unsigned int i;
2434
Dan Gohman16e02092010-03-24 19:38:02 +00002435 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002436 if (src[i])
2437 return false;
2438
2439 return true;
2440}
2441
2442/* Extract the given bit of a bignum; returns 0 or 1. */
2443int
2444APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2445{
Dan Gohman16e02092010-03-24 19:38:02 +00002446 return (parts[bit / integerPartWidth] &
2447 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002448}
2449
John McCalle12b7382010-02-28 02:51:25 +00002450/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002451void
2452APInt::tcSetBit(integerPart *parts, unsigned int bit)
2453{
2454 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2455}
2456
John McCalle12b7382010-02-28 02:51:25 +00002457/* Clears the given bit of a bignum. */
2458void
2459APInt::tcClearBit(integerPart *parts, unsigned int bit)
2460{
2461 parts[bit / integerPartWidth] &=
2462 ~((integerPart) 1 << (bit % integerPartWidth));
2463}
2464
Neil Booth055c0b32007-10-06 00:43:45 +00002465/* Returns the bit number of the least significant set bit of a
2466 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002467unsigned int
2468APInt::tcLSB(const integerPart *parts, unsigned int n)
2469{
2470 unsigned int i, lsb;
2471
Dan Gohman16e02092010-03-24 19:38:02 +00002472 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002473 if (parts[i] != 0) {
2474 lsb = partLSB(parts[i]);
2475
2476 return lsb + i * integerPartWidth;
2477 }
2478 }
2479
2480 return -1U;
2481}
2482
Neil Booth055c0b32007-10-06 00:43:45 +00002483/* Returns the bit number of the most significant set bit of a number.
2484 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002485unsigned int
2486APInt::tcMSB(const integerPart *parts, unsigned int n)
2487{
2488 unsigned int msb;
2489
2490 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002491 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002492
Dan Gohman16e02092010-03-24 19:38:02 +00002493 if (parts[n] != 0) {
2494 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002495
Dan Gohman16e02092010-03-24 19:38:02 +00002496 return msb + n * integerPartWidth;
2497 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002498 } while (n);
2499
2500 return -1U;
2501}
2502
Neil Booth68e53ad2007-10-08 13:47:12 +00002503/* Copy the bit vector of width srcBITS from SRC, starting at bit
2504 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2505 the least significant bit of DST. All high bits above srcBITS in
2506 DST are zero-filled. */
2507void
Evan Chengcf69a742009-05-21 23:47:47 +00002508APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002509 unsigned int srcBits, unsigned int srcLSB)
2510{
2511 unsigned int firstSrcPart, dstParts, shift, n;
2512
2513 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002514 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002515
2516 firstSrcPart = srcLSB / integerPartWidth;
2517 tcAssign (dst, src + firstSrcPart, dstParts);
2518
2519 shift = srcLSB % integerPartWidth;
2520 tcShiftRight (dst, dstParts, shift);
2521
2522 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2523 in DST. If this is less that srcBits, append the rest, else
2524 clear the high bits. */
2525 n = dstParts * integerPartWidth - shift;
2526 if (n < srcBits) {
2527 integerPart mask = lowBitMask (srcBits - n);
2528 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2529 << n % integerPartWidth);
2530 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002531 if (srcBits % integerPartWidth)
2532 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002533 }
2534
2535 /* Clear high parts. */
2536 while (dstParts < dstCount)
2537 dst[dstParts++] = 0;
2538}
2539
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002540/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2541integerPart
2542APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2543 integerPart c, unsigned int parts)
2544{
2545 unsigned int i;
2546
2547 assert(c <= 1);
2548
Dan Gohman16e02092010-03-24 19:38:02 +00002549 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002550 integerPart l;
2551
2552 l = dst[i];
2553 if (c) {
2554 dst[i] += rhs[i] + 1;
2555 c = (dst[i] <= l);
2556 } else {
2557 dst[i] += rhs[i];
2558 c = (dst[i] < l);
2559 }
2560 }
2561
2562 return c;
2563}
2564
2565/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2566integerPart
2567APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2568 integerPart c, unsigned int parts)
2569{
2570 unsigned int i;
2571
2572 assert(c <= 1);
2573
Dan Gohman16e02092010-03-24 19:38:02 +00002574 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002575 integerPart l;
2576
2577 l = dst[i];
2578 if (c) {
2579 dst[i] -= rhs[i] + 1;
2580 c = (dst[i] >= l);
2581 } else {
2582 dst[i] -= rhs[i];
2583 c = (dst[i] > l);
2584 }
2585 }
2586
2587 return c;
2588}
2589
2590/* Negate a bignum in-place. */
2591void
2592APInt::tcNegate(integerPart *dst, unsigned int parts)
2593{
2594 tcComplement(dst, parts);
2595 tcIncrement(dst, parts);
2596}
2597
Neil Booth055c0b32007-10-06 00:43:45 +00002598/* DST += SRC * MULTIPLIER + CARRY if add is true
2599 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002600
2601 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2602 they must start at the same point, i.e. DST == SRC.
2603
2604 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2605 returned. Otherwise DST is filled with the least significant
2606 DSTPARTS parts of the result, and if all of the omitted higher
2607 parts were zero return zero, otherwise overflow occurred and
2608 return one. */
2609int
2610APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2611 integerPart multiplier, integerPart carry,
2612 unsigned int srcParts, unsigned int dstParts,
2613 bool add)
2614{
2615 unsigned int i, n;
2616
2617 /* Otherwise our writes of DST kill our later reads of SRC. */
2618 assert(dst <= src || dst >= src + srcParts);
2619 assert(dstParts <= srcParts + 1);
2620
2621 /* N loops; minimum of dstParts and srcParts. */
2622 n = dstParts < srcParts ? dstParts: srcParts;
2623
Dan Gohman16e02092010-03-24 19:38:02 +00002624 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002625 integerPart low, mid, high, srcPart;
2626
2627 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2628
2629 This cannot overflow, because
2630
2631 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2632
2633 which is less than n^2. */
2634
2635 srcPart = src[i];
2636
2637 if (multiplier == 0 || srcPart == 0) {
2638 low = carry;
2639 high = 0;
2640 } else {
2641 low = lowHalf(srcPart) * lowHalf(multiplier);
2642 high = highHalf(srcPart) * highHalf(multiplier);
2643
2644 mid = lowHalf(srcPart) * highHalf(multiplier);
2645 high += highHalf(mid);
2646 mid <<= integerPartWidth / 2;
2647 if (low + mid < low)
2648 high++;
2649 low += mid;
2650
2651 mid = highHalf(srcPart) * lowHalf(multiplier);
2652 high += highHalf(mid);
2653 mid <<= integerPartWidth / 2;
2654 if (low + mid < low)
2655 high++;
2656 low += mid;
2657
2658 /* Now add carry. */
2659 if (low + carry < low)
2660 high++;
2661 low += carry;
2662 }
2663
2664 if (add) {
2665 /* And now DST[i], and store the new low part there. */
2666 if (low + dst[i] < low)
2667 high++;
2668 dst[i] += low;
2669 } else
2670 dst[i] = low;
2671
2672 carry = high;
2673 }
2674
2675 if (i < dstParts) {
2676 /* Full multiplication, there is no overflow. */
2677 assert(i + 1 == dstParts);
2678 dst[i] = carry;
2679 return 0;
2680 } else {
2681 /* We overflowed if there is carry. */
2682 if (carry)
2683 return 1;
2684
2685 /* We would overflow if any significant unwritten parts would be
2686 non-zero. This is true if any remaining src parts are non-zero
2687 and the multiplier is non-zero. */
2688 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002689 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002690 if (src[i])
2691 return 1;
2692
2693 /* We fitted in the narrow destination. */
2694 return 0;
2695 }
2696}
2697
2698/* DST = LHS * RHS, where DST has the same width as the operands and
2699 is filled with the least significant parts of the result. Returns
2700 one if overflow occurred, otherwise zero. DST must be disjoint
2701 from both operands. */
2702int
2703APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2704 const integerPart *rhs, unsigned int parts)
2705{
2706 unsigned int i;
2707 int overflow;
2708
2709 assert(dst != lhs && dst != rhs);
2710
2711 overflow = 0;
2712 tcSet(dst, 0, parts);
2713
Dan Gohman16e02092010-03-24 19:38:02 +00002714 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002715 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2716 parts - i, true);
2717
2718 return overflow;
2719}
2720
Neil Booth978661d2007-10-06 00:24:48 +00002721/* DST = LHS * RHS, where DST has width the sum of the widths of the
2722 operands. No overflow occurs. DST must be disjoint from both
2723 operands. Returns the number of parts required to hold the
2724 result. */
2725unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002726APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002727 const integerPart *rhs, unsigned int lhsParts,
2728 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002729{
Neil Booth978661d2007-10-06 00:24:48 +00002730 /* Put the narrower number on the LHS for less loops below. */
2731 if (lhsParts > rhsParts) {
2732 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2733 } else {
2734 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002735
Neil Booth978661d2007-10-06 00:24:48 +00002736 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002737
Neil Booth978661d2007-10-06 00:24:48 +00002738 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002739
Dan Gohman16e02092010-03-24 19:38:02 +00002740 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002741 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002742
Neil Booth978661d2007-10-06 00:24:48 +00002743 n = lhsParts + rhsParts;
2744
2745 return n - (dst[n - 1] == 0);
2746 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002747}
2748
2749/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2750 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2751 set REMAINDER to the remainder, return zero. i.e.
2752
2753 OLD_LHS = RHS * LHS + REMAINDER
2754
2755 SCRATCH is a bignum of the same size as the operands and result for
2756 use by the routine; its contents need not be initialized and are
2757 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2758*/
2759int
2760APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2761 integerPart *remainder, integerPart *srhs,
2762 unsigned int parts)
2763{
2764 unsigned int n, shiftCount;
2765 integerPart mask;
2766
2767 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2768
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002769 shiftCount = tcMSB(rhs, parts) + 1;
2770 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002771 return true;
2772
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002773 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002774 n = shiftCount / integerPartWidth;
2775 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2776
2777 tcAssign(srhs, rhs, parts);
2778 tcShiftLeft(srhs, parts, shiftCount);
2779 tcAssign(remainder, lhs, parts);
2780 tcSet(lhs, 0, parts);
2781
2782 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2783 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002784 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002785 int compare;
2786
2787 compare = tcCompare(remainder, srhs, parts);
2788 if (compare >= 0) {
2789 tcSubtract(remainder, srhs, 0, parts);
2790 lhs[n] |= mask;
2791 }
2792
2793 if (shiftCount == 0)
2794 break;
2795 shiftCount--;
2796 tcShiftRight(srhs, parts, 1);
2797 if ((mask >>= 1) == 0)
2798 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2799 }
2800
2801 return false;
2802}
2803
2804/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2805 There are no restrictions on COUNT. */
2806void
2807APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2808{
Neil Booth68e53ad2007-10-08 13:47:12 +00002809 if (count) {
2810 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002811
Neil Booth68e53ad2007-10-08 13:47:12 +00002812 /* Jump is the inter-part jump; shift is is intra-part shift. */
2813 jump = count / integerPartWidth;
2814 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002815
Neil Booth68e53ad2007-10-08 13:47:12 +00002816 while (parts > jump) {
2817 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002818
Neil Booth68e53ad2007-10-08 13:47:12 +00002819 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002820
Neil Booth68e53ad2007-10-08 13:47:12 +00002821 /* dst[i] comes from the two parts src[i - jump] and, if we have
2822 an intra-part shift, src[i - jump - 1]. */
2823 part = dst[parts - jump];
2824 if (shift) {
2825 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002826 if (parts >= jump + 1)
2827 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2828 }
2829
Neil Booth68e53ad2007-10-08 13:47:12 +00002830 dst[parts] = part;
2831 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002832
Neil Booth68e53ad2007-10-08 13:47:12 +00002833 while (parts > 0)
2834 dst[--parts] = 0;
2835 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002836}
2837
2838/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2839 zero. There are no restrictions on COUNT. */
2840void
2841APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2842{
Neil Booth68e53ad2007-10-08 13:47:12 +00002843 if (count) {
2844 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002845
Neil Booth68e53ad2007-10-08 13:47:12 +00002846 /* Jump is the inter-part jump; shift is is intra-part shift. */
2847 jump = count / integerPartWidth;
2848 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002849
Neil Booth68e53ad2007-10-08 13:47:12 +00002850 /* Perform the shift. This leaves the most significant COUNT bits
2851 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002852 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002853 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002854
Neil Booth68e53ad2007-10-08 13:47:12 +00002855 if (i + jump >= parts) {
2856 part = 0;
2857 } else {
2858 part = dst[i + jump];
2859 if (shift) {
2860 part >>= shift;
2861 if (i + jump + 1 < parts)
2862 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2863 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002864 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002865
Neil Booth68e53ad2007-10-08 13:47:12 +00002866 dst[i] = part;
2867 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002868 }
2869}
2870
2871/* Bitwise and of two bignums. */
2872void
2873APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2874{
2875 unsigned int i;
2876
Dan Gohman16e02092010-03-24 19:38:02 +00002877 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002878 dst[i] &= rhs[i];
2879}
2880
2881/* Bitwise inclusive or of two bignums. */
2882void
2883APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2884{
2885 unsigned int i;
2886
Dan Gohman16e02092010-03-24 19:38:02 +00002887 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002888 dst[i] |= rhs[i];
2889}
2890
2891/* Bitwise exclusive or of two bignums. */
2892void
2893APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2894{
2895 unsigned int i;
2896
Dan Gohman16e02092010-03-24 19:38:02 +00002897 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002898 dst[i] ^= rhs[i];
2899}
2900
2901/* Complement a bignum in-place. */
2902void
2903APInt::tcComplement(integerPart *dst, unsigned int parts)
2904{
2905 unsigned int i;
2906
Dan Gohman16e02092010-03-24 19:38:02 +00002907 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002908 dst[i] = ~dst[i];
2909}
2910
2911/* Comparison (unsigned) of two bignums. */
2912int
2913APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2914 unsigned int parts)
2915{
2916 while (parts) {
2917 parts--;
2918 if (lhs[parts] == rhs[parts])
2919 continue;
2920
2921 if (lhs[parts] > rhs[parts])
2922 return 1;
2923 else
2924 return -1;
2925 }
2926
2927 return 0;
2928}
2929
2930/* Increment a bignum in-place, return the carry flag. */
2931integerPart
2932APInt::tcIncrement(integerPart *dst, unsigned int parts)
2933{
2934 unsigned int i;
2935
Dan Gohman16e02092010-03-24 19:38:02 +00002936 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002937 if (++dst[i] != 0)
2938 break;
2939
2940 return i == parts;
2941}
2942
2943/* Set the least significant BITS bits of a bignum, clear the
2944 rest. */
2945void
2946APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2947 unsigned int bits)
2948{
2949 unsigned int i;
2950
2951 i = 0;
2952 while (bits > integerPartWidth) {
2953 dst[i++] = ~(integerPart) 0;
2954 bits -= integerPartWidth;
2955 }
2956
2957 if (bits)
2958 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2959
2960 while (i < parts)
2961 dst[i++] = 0;
2962}