blob: 0b2536031f13726d4d2cc17706ae72e4d0211407 [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
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000051 if (radix == 16) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000052 r = cdigit - '0';
53 if (r <= 9)
54 return r;
55
56 r = cdigit - 'A';
57 if (r <= 5)
58 return r + 10;
59
60 r = cdigit - 'a';
61 if (r <= 5)
62 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");
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000624 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
625 "Radix should be 2, 8, 10, or 16!");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000626
627 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000628
Eric Christophere250f2a2009-08-21 04:10:31 +0000629 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000630 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000631 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000632 if (*p == '-' || *p == '+') {
633 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000634 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000635 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000636 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000637
Reid Spencer57ae4f52007-04-13 19:19:07 +0000638 // For radixes of power-of-two values, the bits required is accurately and
639 // easily computed
640 if (radix == 2)
641 return slen + isNegative;
642 if (radix == 8)
643 return slen * 3 + isNegative;
644 if (radix == 16)
645 return slen * 4 + isNegative;
646
Reid Spencer57ae4f52007-04-13 19:19:07 +0000647 // This is grossly inefficient but accurate. We could probably do something
648 // with a computation of roughly slen*64/20 and then adjust by the value of
649 // the first few digits. But, I'm not sure how accurate that could be.
650
651 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000652 // be too large. This avoids the assertion in the constructor. This
653 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
654 // bits in that case.
655 unsigned sufficient = slen == 1 ? 4 : slen * 64/18;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000656
657 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000658 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000659
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +0000660 // Compute how many bits are required. If the log is infinite, assume we need
661 // just bit.
662 unsigned log = tmp.logBase2();
663 if (log == (unsigned)-1) {
664 return isNegative + 1;
665 } else {
666 return isNegative + log + 1;
667 }
Reid Spencer57ae4f52007-04-13 19:19:07 +0000668}
669
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000670// From http://www.burtleburtle.net, byBob Jenkins.
671// When targeting x86, both GCC and LLVM seem to recognize this as a
672// rotate instruction.
673#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencer794f4722007-02-26 21:02:27 +0000674
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000675// From http://www.burtleburtle.net, by Bob Jenkins.
676#define mix(a,b,c) \
677 { \
678 a -= c; a ^= rot(c, 4); c += b; \
679 b -= a; b ^= rot(a, 6); a += c; \
680 c -= b; c ^= rot(b, 8); b += a; \
681 a -= c; a ^= rot(c,16); c += b; \
682 b -= a; b ^= rot(a,19); a += c; \
683 c -= b; c ^= rot(b, 4); b += a; \
684 }
685
686// From http://www.burtleburtle.net, by Bob Jenkins.
687#define final(a,b,c) \
688 { \
689 c ^= b; c -= rot(b,14); \
690 a ^= c; a -= rot(c,11); \
691 b ^= a; b -= rot(a,25); \
692 c ^= b; c -= rot(b,16); \
693 a ^= c; a -= rot(c,4); \
694 b ^= a; b -= rot(a,14); \
695 c ^= b; c -= rot(b,24); \
696 }
697
698// hashword() was adapted from http://www.burtleburtle.net, by Bob
699// Jenkins. k is a pointer to an array of uint32_t values; length is
700// the length of the key, in 32-bit chunks. This version only handles
701// keys that are a multiple of 32 bits in size.
702static inline uint32_t hashword(const uint64_t *k64, size_t length)
703{
704 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
705 uint32_t a,b,c;
706
707 /* Set up the internal state */
708 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
709
710 /*------------------------------------------------- handle most of the key */
Dan Gohman16e02092010-03-24 19:38:02 +0000711 while (length > 3) {
712 a += k[0];
713 b += k[1];
714 c += k[2];
715 mix(a,b,c);
716 length -= 3;
717 k += 3;
718 }
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000719
720 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-05-13 23:23:20 +0000721 switch (length) { /* all the case statements fall through */
722 case 3 : c+=k[2];
723 case 2 : b+=k[1];
724 case 1 : a+=k[0];
725 final(a,b,c);
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000726 case 0: /* case 0: nothing left to add */
727 break;
728 }
729 /*------------------------------------------------------ report the result */
730 return c;
731}
732
733// hashword8() was adapted from http://www.burtleburtle.net, by Bob
734// Jenkins. This computes a 32-bit hash from one 64-bit word. When
735// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
736// function into about 35 instructions when inlined.
737static inline uint32_t hashword8(const uint64_t k64)
738{
739 uint32_t a,b,c;
740 a = b = c = 0xdeadbeef + 4;
741 b += k64 >> 32;
742 a += k64 & 0xffffffff;
743 final(a,b,c);
744 return c;
745}
746#undef final
747#undef mix
748#undef rot
749
750uint64_t APInt::getHashValue() const {
751 uint64_t hash;
Reid Spencer794f4722007-02-26 21:02:27 +0000752 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000753 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000754 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000755 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000756 return hash;
757}
758
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000759/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000760APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000761 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000762}
763
764/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000765APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000766 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000767 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000768}
769
Chris Lattner455e9ab2009-01-21 18:09:24 +0000770unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000771 // Treat the most significand word differently because it might have
772 // meaningless bits set beyond the precision.
773 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
774 integerPart MSWMask;
775 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
776 else {
777 MSWMask = ~integerPart(0);
778 BitsInMSW = APINT_BITS_PER_WORD;
779 }
780
781 unsigned i = getNumWords();
782 integerPart MSW = pVal[i-1] & MSWMask;
783 if (MSW)
784 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
785
786 unsigned Count = BitsInMSW;
787 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000788 if (pVal[i-1] == 0)
789 Count += APINT_BITS_PER_WORD;
790 else {
791 Count += CountLeadingZeros_64(pVal[i-1]);
792 break;
Reid Spencere549c492007-02-21 00:29:48 +0000793 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000794 }
John McCall281d0512010-02-03 03:42:44 +0000795 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000796}
797
Chris Lattner455e9ab2009-01-21 18:09:24 +0000798static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
799 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000800 if (skip)
801 V <<= skip;
802 while (V && (V & (1ULL << 63))) {
803 Count++;
804 V <<= 1;
805 }
806 return Count;
807}
808
Chris Lattner455e9ab2009-01-21 18:09:24 +0000809unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000810 if (isSingleWord())
811 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
812
Chris Lattner455e9ab2009-01-21 18:09:24 +0000813 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000814 unsigned shift;
815 if (!highWordBits) {
816 highWordBits = APINT_BITS_PER_WORD;
817 shift = 0;
818 } else {
819 shift = APINT_BITS_PER_WORD - highWordBits;
820 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000821 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000822 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000823 if (Count == highWordBits) {
824 for (i--; i >= 0; --i) {
825 if (pVal[i] == -1ULL)
826 Count += APINT_BITS_PER_WORD;
827 else {
828 Count += countLeadingOnes_64(pVal[i], 0);
829 break;
830 }
831 }
832 }
833 return Count;
834}
835
Chris Lattner455e9ab2009-01-21 18:09:24 +0000836unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000837 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000838 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
839 unsigned Count = 0;
840 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000841 for (; i < getNumWords() && pVal[i] == 0; ++i)
842 Count += APINT_BITS_PER_WORD;
843 if (i < getNumWords())
844 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000845 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000846}
847
Chris Lattner455e9ab2009-01-21 18:09:24 +0000848unsigned APInt::countTrailingOnesSlowCase() const {
849 unsigned Count = 0;
850 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000851 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000852 Count += APINT_BITS_PER_WORD;
853 if (i < getNumWords())
854 Count += CountTrailingOnes_64(pVal[i]);
855 return std::min(Count, BitWidth);
856}
857
Chris Lattner455e9ab2009-01-21 18:09:24 +0000858unsigned APInt::countPopulationSlowCase() const {
859 unsigned Count = 0;
860 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000861 Count += CountPopulation_64(pVal[i]);
862 return Count;
863}
864
Reid Spencere81d2da2007-02-16 22:36:51 +0000865APInt APInt::byteSwap() const {
866 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
867 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000868 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000869 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000870 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000871 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000872 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000873 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000874 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000875 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000876 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000877 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000878 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000879 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000880 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000881 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000882 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000883 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000884 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
885 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000886 }
887 return Result;
888 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000889}
890
Eric Christopherd37eda82009-08-21 04:06:45 +0000891APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000892 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000893 APInt A = API1, B = API2;
894 while (!!B) {
895 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000896 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000897 A = T;
898 }
899 return A;
900}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000901
Chris Lattner455e9ab2009-01-21 18:09:24 +0000902APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000903 union {
904 double D;
905 uint64_t I;
906 } T;
907 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000908
909 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000910 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000911
912 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000913 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000914
915 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000916 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000917 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000918
919 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
920 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
921
922 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000923 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000924 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000925 APInt(width, mantissa >> (52 - exp));
926
927 // If the client didn't provide enough bits for us to shift the mantissa into
928 // then the result is undefined, just return 0
929 if (width <= exp - 52)
930 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000931
932 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000933 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000934 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000935 return isNeg ? -Tmp : Tmp;
936}
937
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000938/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000939/// The layout for double is as following (IEEE Standard 754):
940/// --------------------------------------
941/// | Sign Exponent Fraction Bias |
942/// |-------------------------------------- |
943/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000944/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000945double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000946
947 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000948 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000949 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
950 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000951 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000952 return double(sext);
953 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000954 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000955 }
956
Reid Spencer9c0696f2007-02-20 08:51:03 +0000957 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000958 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000959
960 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000961 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000962
963 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000964 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000965
Reid Spencer9c0696f2007-02-20 08:51:03 +0000966 // The exponent (without bias normalization) is just the number of bits
967 // we are using. Note that the sign bit is gone since we constructed the
968 // absolute value.
969 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000970
Reid Spencer9c0696f2007-02-20 08:51:03 +0000971 // Return infinity for exponent overflow
972 if (exp > 1023) {
973 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000974 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000975 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000976 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000977 }
978 exp += 1023; // Increment for 1023 bias
979
980 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
981 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000982 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000983 unsigned hiWord = whichWord(n-1);
984 if (hiWord == 0) {
985 mantissa = Tmp.pVal[0];
986 if (n > 52)
987 mantissa >>= n - 52; // shift down, we want the top 52 bits.
988 } else {
989 assert(hiWord > 0 && "huh?");
990 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
991 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
992 mantissa = hibits | lobits;
993 }
994
Zhou Shengd93f00c2007-02-12 20:02:55 +0000995 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000996 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000997 union {
998 double D;
999 uint64_t I;
1000 } T;
1001 T.I = sign | (exp << 52) | mantissa;
1002 return T.D;
1003}
1004
Reid Spencere81d2da2007-02-16 22:36:51 +00001005// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001006APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001007 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +00001008 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-12-07 08:25:19 +00001009
1010 if (width <= APINT_BITS_PER_WORD)
1011 return APInt(width, getRawData()[0]);
1012
1013 APInt Result(getMemory(getNumWords(width)), width);
1014
1015 // Copy full words.
1016 unsigned i;
1017 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1018 Result.pVal[i] = pVal[i];
1019
1020 // Truncate and copy any partial word.
1021 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1022 if (bits != 0)
1023 Result.pVal[i] = pVal[i] << bits >> bits;
1024
1025 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001026}
1027
1028// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001029APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001030 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001031
1032 if (width <= APINT_BITS_PER_WORD) {
1033 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1034 val = (int64_t)val >> (width - BitWidth);
1035 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencer9eec2412007-02-25 23:44:53 +00001036 }
1037
Jay Foad40f8f622010-12-07 08:25:19 +00001038 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +00001039
Jay Foad40f8f622010-12-07 08:25:19 +00001040 // Copy full words.
1041 unsigned i;
1042 uint64_t word = 0;
1043 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1044 word = getRawData()[i];
1045 Result.pVal[i] = word;
Reid Spencer9eec2412007-02-25 23:44:53 +00001046 }
1047
Jay Foad40f8f622010-12-07 08:25:19 +00001048 // Read and sign-extend any partial word.
1049 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1050 if (bits != 0)
1051 word = (int64_t)getRawData()[i] << bits >> bits;
1052 else
1053 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1054
1055 // Write remaining full words.
1056 for (; i != width / APINT_BITS_PER_WORD; i++) {
1057 Result.pVal[i] = word;
1058 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencer9eec2412007-02-25 23:44:53 +00001059 }
Jay Foad40f8f622010-12-07 08:25:19 +00001060
1061 // Write any partial word.
1062 bits = (0 - width) % APINT_BITS_PER_WORD;
1063 if (bits != 0)
1064 Result.pVal[i] = word << bits >> bits;
1065
1066 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001067}
1068
1069// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001070APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001071 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-12-07 08:25:19 +00001072
1073 if (width <= APINT_BITS_PER_WORD)
1074 return APInt(width, VAL);
1075
1076 APInt Result(getMemory(getNumWords(width)), width);
1077
1078 // Copy words.
1079 unsigned i;
1080 for (i = 0; i != getNumWords(); i++)
1081 Result.pVal[i] = getRawData()[i];
1082
1083 // Zero remaining words.
1084 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1085
1086 return Result;
Reid Spencere81d2da2007-02-16 22:36:51 +00001087}
1088
Jay Foad40f8f622010-12-07 08:25:19 +00001089APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001090 if (BitWidth < width)
1091 return zext(width);
1092 if (BitWidth > width)
1093 return trunc(width);
1094 return *this;
1095}
1096
Jay Foad40f8f622010-12-07 08:25:19 +00001097APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-03-01 17:15:32 +00001098 if (BitWidth < width)
1099 return sext(width);
1100 if (BitWidth > width)
1101 return trunc(width);
1102 return *this;
1103}
1104
Zhou Shengff4304f2007-02-09 07:48:24 +00001105/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001106/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001107APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001108 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001109}
1110
1111/// Arithmetic right-shift this APInt by shiftAmt.
1112/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001113APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001114 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001115 // Handle a degenerate case
1116 if (shiftAmt == 0)
1117 return *this;
1118
1119 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001120 if (isSingleWord()) {
1121 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001122 return APInt(BitWidth, 0); // undefined
1123 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001124 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001125 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001126 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1127 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001128 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001129
Reid Spencer46f9c942007-03-02 22:39:11 +00001130 // If all the bits were shifted out, the result is, technically, undefined.
1131 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1132 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001133 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001134 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001135 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001136 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001137 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001138 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001139
1140 // Create some space for the result.
1141 uint64_t * val = new uint64_t[getNumWords()];
1142
Reid Spencer46f9c942007-03-02 22:39:11 +00001143 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001144 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1145 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1146 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1147 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001148 if (bitsInWord == 0)
1149 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001150
1151 // If we are shifting whole words, just move whole words
1152 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001153 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001154 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001155 val[i] = pVal[i+offset]; // move whole word
1156
1157 // Adjust the top significant word for sign bit fill, if negative
1158 if (isNegative())
1159 if (bitsInWord < APINT_BITS_PER_WORD)
1160 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1161 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001162 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001163 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001164 // This combines the shifted corresponding word with the low bits from
1165 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001166 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001167 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1168 }
1169
1170 // Shift the break word. In this case there are no bits from the next word
1171 // to include in this word.
1172 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1173
1174 // Deal with sign extenstion in the break word, and possibly the word before
1175 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001176 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001177 if (wordShift > bitsInWord) {
1178 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001179 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001180 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1181 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001182 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001183 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001184 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001185 }
1186
Reid Spencer46f9c942007-03-02 22:39:11 +00001187 // Remaining words are 0 or -1, just assign them.
1188 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001189 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001190 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001191 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001192}
1193
Zhou Shengff4304f2007-02-09 07:48:24 +00001194/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001195/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001196APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001197 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001198}
1199
1200/// Logical right-shift this APInt by shiftAmt.
1201/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001202APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001203 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001204 if (shiftAmt == BitWidth)
1205 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001206 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001207 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001208 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001209
Reid Spencerba81c2b2007-02-26 01:19:48 +00001210 // If all the bits were shifted out, the result is 0. This avoids issues
1211 // with shifting by the size of the integer type, which produces undefined
1212 // results. We define these "undefined results" to always be 0.
1213 if (shiftAmt == BitWidth)
1214 return APInt(BitWidth, 0);
1215
Reid Spencer02ae8b72007-05-17 06:26:29 +00001216 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001217 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001218 // undefined results in the code below. This is also an optimization.
1219 if (shiftAmt == 0)
1220 return *this;
1221
Reid Spencerba81c2b2007-02-26 01:19:48 +00001222 // Create some space for the result.
1223 uint64_t * val = new uint64_t[getNumWords()];
1224
1225 // If we are shifting less than a word, compute the shift with a simple carry
1226 if (shiftAmt < APINT_BITS_PER_WORD) {
1227 uint64_t carry = 0;
1228 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001229 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001230 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1231 }
1232 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001233 }
1234
Reid Spencerba81c2b2007-02-26 01:19:48 +00001235 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001236 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1237 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001238
1239 // If we are shifting whole words, just move whole words
1240 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001241 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001242 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001243 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001244 val[i] = 0;
1245 return APInt(val,BitWidth).clearUnusedBits();
1246 }
1247
Eric Christopherd37eda82009-08-21 04:06:45 +00001248 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001249 unsigned breakWord = getNumWords() - offset -1;
1250 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001251 val[i] = (pVal[i+offset] >> wordShift) |
1252 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001253 // Shift the break word.
1254 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1255
1256 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001257 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001258 val[i] = 0;
1259 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001260}
1261
Zhou Shengff4304f2007-02-09 07:48:24 +00001262/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001263/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001264APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001265 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001266 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001267}
1268
Chris Lattner455e9ab2009-01-21 18:09:24 +00001269APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001270 // If all the bits were shifted out, the result is 0. This avoids issues
1271 // with shifting by the size of the integer type, which produces undefined
1272 // results. We define these "undefined results" to always be 0.
1273 if (shiftAmt == BitWidth)
1274 return APInt(BitWidth, 0);
1275
Reid Spencer92c72832007-05-12 18:01:57 +00001276 // If none of the bits are shifted out, the result is *this. This avoids a
1277 // lshr by the words size in the loop below which can produce incorrect
1278 // results. It also avoids the expensive computation below for a common case.
1279 if (shiftAmt == 0)
1280 return *this;
1281
Reid Spencer87553802007-02-25 00:56:44 +00001282 // Create some space for the result.
1283 uint64_t * val = new uint64_t[getNumWords()];
1284
1285 // If we are shifting less than a word, do it the easy way
1286 if (shiftAmt < APINT_BITS_PER_WORD) {
1287 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001288 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001289 val[i] = pVal[i] << shiftAmt | carry;
1290 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1291 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001292 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001293 }
1294
Reid Spencer87553802007-02-25 00:56:44 +00001295 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001296 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1297 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001298
1299 // If we are shifting whole words, just move whole words
1300 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001301 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001302 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001303 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001304 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001305 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001306 }
Reid Spencer87553802007-02-25 00:56:44 +00001307
1308 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001309 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001310 for (; i > offset; --i)
1311 val[i] = pVal[i-offset] << wordShift |
1312 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001313 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001314 for (i = 0; i < offset; ++i)
1315 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001316 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001317}
1318
Dan Gohmancf609572008-02-29 01:40:47 +00001319APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001320 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001321}
1322
Chris Lattner455e9ab2009-01-21 18:09:24 +00001323APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001324 if (rotateAmt == 0)
1325 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001326 // Don't get too fancy, just use existing shift/or facilities
1327 APInt hi(*this);
1328 APInt lo(*this);
1329 hi.shl(rotateAmt);
1330 lo.lshr(BitWidth - rotateAmt);
1331 return hi | lo;
1332}
1333
Dan Gohmancf609572008-02-29 01:40:47 +00001334APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001335 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001336}
1337
Chris Lattner455e9ab2009-01-21 18:09:24 +00001338APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001339 if (rotateAmt == 0)
1340 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001341 // Don't get too fancy, just use existing shift/or facilities
1342 APInt hi(*this);
1343 APInt lo(*this);
1344 lo.lshr(rotateAmt);
1345 hi.shl(BitWidth - rotateAmt);
1346 return hi | lo;
1347}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001348
1349// Square Root - this method computes and returns the square root of "this".
1350// Three mechanisms are used for computation. For small values (<= 5 bits),
1351// a table lookup is done. This gets some performance for common cases. For
1352// values using less than 52 bits, the value is converted to double and then
1353// the libc sqrt function is called. The result is rounded and then converted
1354// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001355// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001356APInt APInt::sqrt() const {
1357
1358 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001359 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001360
1361 // Use a fast table for some small values. This also gets rid of some
1362 // rounding errors in libc sqrt for small values.
1363 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001364 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001365 /* 0 */ 0,
1366 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001367 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001368 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1369 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1370 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1371 /* 31 */ 6
1372 };
1373 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001374 }
1375
1376 // If the magnitude of the value fits in less than 52 bits (the precision of
1377 // an IEEE double precision floating point value), then we can use the
1378 // libc sqrt function which will probably use a hardware sqrt computation.
1379 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001380 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001381#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001382 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001383 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001384#else
1385 return APInt(BitWidth,
Chris Lattnerc4cb2372011-05-22 06:03:53 +00001386 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001387#endif
1388 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001389
1390 // Okay, all the short cuts are exhausted. We must compute it. The following
1391 // is a classical Babylonian method for computing the square root. This code
1392 // was adapted to APINt from a wikipedia article on such computations.
1393 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001394 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001395 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001396 APInt testy(BitWidth, 16);
1397 APInt x_old(BitWidth, 1);
1398 APInt x_new(BitWidth, 0);
1399 APInt two(BitWidth, 2);
1400
1401 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001402 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001403 if (i >= nbits || this->ule(testy)) {
1404 x_old = x_old.shl(i / 2);
1405 break;
1406 }
1407
Eric Christopherd37eda82009-08-21 04:06:45 +00001408 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001409 for (;;) {
1410 x_new = (this->udiv(x_old) + x_old).udiv(two);
1411 if (x_old.ule(x_new))
1412 break;
1413 x_old = x_new;
1414 }
1415
1416 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001417 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001418 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001419 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001420 // floating point representation after 192 bits. There are no discrepancies
1421 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001422 APInt square(x_old * x_old);
1423 APInt nextSquare((x_old + 1) * (x_old +1));
1424 if (this->ult(square))
1425 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001426 else if (this->ule(nextSquare)) {
1427 APInt midpoint((nextSquare - square).udiv(two));
1428 APInt offset(*this - square);
1429 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001430 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001431 else
1432 return x_old + 1;
1433 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001434 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001435 return x_old + 1;
1436}
1437
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001438/// Computes the multiplicative inverse of this APInt for a given modulo. The
1439/// iterative extended Euclidean algorithm is used to solve for this value,
1440/// however we simplify it to speed up calculating only the inverse, and take
1441/// advantage of div+rem calculations. We also use some tricks to avoid copying
1442/// (potentially large) APInts around.
1443APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1444 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1445
1446 // Using the properties listed at the following web page (accessed 06/21/08):
1447 // http://www.numbertheory.org/php/euclid.html
1448 // (especially the properties numbered 3, 4 and 9) it can be proved that
1449 // BitWidth bits suffice for all the computations in the algorithm implemented
1450 // below. More precisely, this number of bits suffice if the multiplicative
1451 // inverse exists, but may not suffice for the general extended Euclidean
1452 // algorithm.
1453
1454 APInt r[2] = { modulo, *this };
1455 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1456 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001457
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001458 unsigned i;
1459 for (i = 0; r[i^1] != 0; i ^= 1) {
1460 // An overview of the math without the confusing bit-flipping:
1461 // q = r[i-2] / r[i-1]
1462 // r[i] = r[i-2] % r[i-1]
1463 // t[i] = t[i-2] - t[i-1] * q
1464 udivrem(r[i], r[i^1], q, r[i]);
1465 t[i] -= t[i^1] * q;
1466 }
1467
1468 // If this APInt and the modulo are not coprime, there is no multiplicative
1469 // inverse, so return 0. We check this by looking at the next-to-last
1470 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1471 // algorithm.
1472 if (r[i] != 1)
1473 return APInt(BitWidth, 0);
1474
1475 // The next-to-last t is the multiplicative inverse. However, we are
1476 // interested in a positive inverse. Calcuate a positive one from a negative
1477 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001478 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001479 return t[i].isNegative() ? t[i] + modulo : t[i];
1480}
1481
Jay Foad4e5ea552009-04-30 10:15:35 +00001482/// Calculate the magic numbers required to implement a signed integer division
1483/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1484/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1485/// Warren, Jr., chapter 10.
1486APInt::ms APInt::magic() const {
1487 const APInt& d = *this;
1488 unsigned p;
1489 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001490 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001491 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001492
Jay Foad4e5ea552009-04-30 10:15:35 +00001493 ad = d.abs();
1494 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1495 anc = t - 1 - t.urem(ad); // absolute value of nc
1496 p = d.getBitWidth() - 1; // initialize p
1497 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1498 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1499 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1500 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1501 do {
1502 p = p + 1;
1503 q1 = q1<<1; // update q1 = 2p/abs(nc)
1504 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1505 if (r1.uge(anc)) { // must be unsigned comparison
1506 q1 = q1 + 1;
1507 r1 = r1 - anc;
1508 }
1509 q2 = q2<<1; // update q2 = 2p/abs(d)
1510 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1511 if (r2.uge(ad)) { // must be unsigned comparison
1512 q2 = q2 + 1;
1513 r2 = r2 - ad;
1514 }
1515 delta = ad - r2;
Cameron Zwarich8d7285d2011-02-21 00:22:02 +00001516 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001517
Jay Foad4e5ea552009-04-30 10:15:35 +00001518 mag.m = q2 + 1;
1519 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1520 mag.s = p - d.getBitWidth(); // resulting shift
1521 return mag;
1522}
1523
1524/// Calculate the magic numbers required to implement an unsigned integer
1525/// division by a constant as a sequence of multiplies, adds and shifts.
1526/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1527/// S. Warren, Jr., chapter 10.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001528/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001529/// of the divided value are known zero.
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001530APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foad4e5ea552009-04-30 10:15:35 +00001531 const APInt& d = *this;
1532 unsigned p;
1533 APInt nc, delta, q1, r1, q2, r2;
1534 struct mu magu;
1535 magu.a = 0; // initialize "add" indicator
Benjamin Kramerd9103df2011-03-17 20:39:06 +00001536 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foad4e5ea552009-04-30 10:15:35 +00001537 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1538 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1539
1540 nc = allOnes - (-d).urem(d);
1541 p = d.getBitWidth() - 1; // initialize p
1542 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1543 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1544 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1545 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1546 do {
1547 p = p + 1;
1548 if (r1.uge(nc - r1)) {
1549 q1 = q1 + q1 + 1; // update q1
1550 r1 = r1 + r1 - nc; // update r1
1551 }
1552 else {
1553 q1 = q1+q1; // update q1
1554 r1 = r1+r1; // update r1
1555 }
1556 if ((r2 + 1).uge(d - r2)) {
1557 if (q2.uge(signedMax)) magu.a = 1;
1558 q2 = q2+q2 + 1; // update q2
1559 r2 = r2+r2 + 1 - d; // update r2
1560 }
1561 else {
1562 if (q2.uge(signedMin)) magu.a = 1;
1563 q2 = q2+q2; // update q2
1564 r2 = r2+r2 + 1; // update r2
1565 }
1566 delta = d - 1 - r2;
1567 } while (p < d.getBitWidth()*2 &&
1568 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1569 magu.m = q2 + 1; // resulting magic number
1570 magu.s = p - d.getBitWidth(); // resulting shift
1571 return magu;
1572}
1573
Reid Spencer9c0696f2007-02-20 08:51:03 +00001574/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1575/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1576/// variables here have the same names as in the algorithm. Comments explain
1577/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001578static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1579 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001580 assert(u && "Must provide dividend");
1581 assert(v && "Must provide divisor");
1582 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001583 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001584 assert(n>1 && "n must be > 1");
1585
1586 // Knuth uses the value b as the base of the number system. In our case b
1587 // is 2^31 so we just set it to -1u.
1588 uint64_t b = uint64_t(1) << 32;
1589
Chris Lattnerfad86b02008-08-17 07:19:36 +00001590#if 0
David Greene465abed2010-01-05 01:28:52 +00001591 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1592 DEBUG(dbgs() << "KnuthDiv: original:");
1593 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1594 DEBUG(dbgs() << " by");
1595 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1596 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001597#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001598 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1599 // u and v by d. Note that we have taken Knuth's advice here to use a power
1600 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1601 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001602 // shift amount from the leading zeros. We are basically normalizing the u
1603 // and v so that its high bits are shifted to the top of v's range without
1604 // overflow. Note that this can require an extra word in u so that u must
1605 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001606 unsigned shift = CountLeadingZeros_32(v[n-1]);
1607 unsigned v_carry = 0;
1608 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001609 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001610 for (unsigned i = 0; i < m+n; ++i) {
1611 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001612 u[i] = (u[i] << shift) | u_carry;
1613 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001614 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001615 for (unsigned i = 0; i < n; ++i) {
1616 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001617 v[i] = (v[i] << shift) | v_carry;
1618 v_carry = v_tmp;
1619 }
1620 }
1621 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001622#if 0
David Greene465abed2010-01-05 01:28:52 +00001623 DEBUG(dbgs() << "KnuthDiv: normal:");
1624 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1625 DEBUG(dbgs() << " by");
1626 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1627 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001628#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001629
1630 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1631 int j = m;
1632 do {
David Greene465abed2010-01-05 01:28:52 +00001633 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001634 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001635 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1636 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1637 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1638 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1639 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001640 // value qp is one too large, and it eliminates all cases where qp is two
1641 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001642 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001643 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001644 uint64_t qp = dividend / v[n-1];
1645 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001646 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1647 qp--;
1648 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001649 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001650 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001651 }
David Greene465abed2010-01-05 01:28:52 +00001652 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001653
Reid Spencer92904632007-02-23 01:57:13 +00001654 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1655 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1656 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001657 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001658 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001659 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001660 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001661 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001662 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001663 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001664 << ", subtrahend == " << subtrahend
1665 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001666
Reid Spencer610fad82007-02-24 10:01:42 +00001667 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001668 unsigned k = j + i;
1669 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1670 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001671 while (borrow && k <= m+n) { // deal with borrow to the left
1672 borrow = u[k] == 0;
1673 u[k]--;
1674 k++;
1675 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001676 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001677 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001678 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001679 }
David Greene465abed2010-01-05 01:28:52 +00001680 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1681 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1682 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001683 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1684 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001685 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001686 // the true value, and a "borrow" to the left should be remembered.
1687 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001688 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001689 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001690 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001691 u[i] = ~u[i] + carry; // b's complement
1692 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001693 }
Reid Spencer92904632007-02-23 01:57:13 +00001694 }
David Greene465abed2010-01-05 01:28:52 +00001695 DEBUG(dbgs() << "KnuthDiv: after complement:");
1696 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1697 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001698
Eric Christopherd37eda82009-08-21 04:06:45 +00001699 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001700 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001701 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001702 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001703 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001704 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001705 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001706 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001707 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1708 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001709 // since it cancels with the borrow that occurred in D4.
1710 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001711 for (unsigned i = 0; i < n; i++) {
1712 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001713 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001714 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001715 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001716 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001717 }
David Greene465abed2010-01-05 01:28:52 +00001718 DEBUG(dbgs() << "KnuthDiv: after correction:");
1719 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1720 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001721
Reid Spencer92904632007-02-23 01:57:13 +00001722 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1723 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001724
David Greene465abed2010-01-05 01:28:52 +00001725 DEBUG(dbgs() << "KnuthDiv: quotient:");
1726 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1727 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001728
Reid Spencer9c0696f2007-02-20 08:51:03 +00001729 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1730 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1731 // compute the remainder (urem uses this).
1732 if (r) {
1733 // The value d is expressed by the "shift" value above since we avoided
1734 // multiplication by d by using a shift left. So, all we have to do is
1735 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001736 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001737 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001738 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001739 for (int i = n-1; i >= 0; i--) {
1740 r[i] = (u[i] >> shift) | carry;
1741 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001742 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001743 }
1744 } else {
1745 for (int i = n-1; i >= 0; i--) {
1746 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001747 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001748 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001749 }
David Greene465abed2010-01-05 01:28:52 +00001750 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001751 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001752#if 0
David Greene465abed2010-01-05 01:28:52 +00001753 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001754#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001755}
1756
Chris Lattner455e9ab2009-01-21 18:09:24 +00001757void APInt::divide(const APInt LHS, unsigned lhsWords,
1758 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001759 APInt *Quotient, APInt *Remainder)
1760{
1761 assert(lhsWords >= rhsWords && "Fractional result");
1762
Eric Christopherd37eda82009-08-21 04:06:45 +00001763 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001764 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001765 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001766 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1767 // can't use 64-bit operands here because we don't have native results of
1768 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001769 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001770 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001771 unsigned n = rhsWords * 2;
1772 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001773
1774 // Allocate space for the temporary values we need either on the stack, if
1775 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001776 unsigned SPACE[128];
1777 unsigned *U = 0;
1778 unsigned *V = 0;
1779 unsigned *Q = 0;
1780 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001781 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1782 U = &SPACE[0];
1783 V = &SPACE[m+n+1];
1784 Q = &SPACE[(m+n+1) + n];
1785 if (Remainder)
1786 R = &SPACE[(m+n+1) + n + (m+n)];
1787 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001788 U = new unsigned[m + n + 1];
1789 V = new unsigned[n];
1790 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001791 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001792 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001793 }
1794
1795 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001796 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001797 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001798 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001799 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001800 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001801 }
1802 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1803
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001804 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001805 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001807 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001808 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001809 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001810 }
1811
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001812 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001813 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001814 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001815 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001816
Eric Christopherd37eda82009-08-21 04:06:45 +00001817 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001818 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001819 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001820 // contain any zero words or the Knuth algorithm fails.
1821 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1822 n--;
1823 m++;
1824 }
1825 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1826 m--;
1827
1828 // If we're left with only a single word for the divisor, Knuth doesn't work
1829 // so we implement the short division algorithm here. This is much simpler
1830 // and faster because we are certain that we can divide a 64-bit quantity
1831 // by a 32-bit quantity at hardware speed and short division is simply a
1832 // series of such operations. This is just like doing short division but we
1833 // are using base 2^32 instead of base 10.
1834 assert(n != 0 && "Divide by zero?");
1835 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001836 unsigned divisor = V[0];
1837 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001838 for (int i = m+n-1; i >= 0; i--) {
1839 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1840 if (partial_dividend == 0) {
1841 Q[i] = 0;
1842 remainder = 0;
1843 } else if (partial_dividend < divisor) {
1844 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001845 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001846 } else if (partial_dividend == divisor) {
1847 Q[i] = 1;
1848 remainder = 0;
1849 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001850 Q[i] = (unsigned)(partial_dividend / divisor);
1851 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001852 }
1853 }
1854 if (R)
1855 R[0] = remainder;
1856 } else {
1857 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1858 // case n > 1.
1859 KnuthDiv(U, V, Q, R, m, n);
1860 }
1861
1862 // If the caller wants the quotient
1863 if (Quotient) {
1864 // Set up the Quotient value's memory.
1865 if (Quotient->BitWidth != LHS.BitWidth) {
1866 if (Quotient->isSingleWord())
1867 Quotient->VAL = 0;
1868 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001869 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001870 Quotient->BitWidth = LHS.BitWidth;
1871 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001872 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001873 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001874 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001875
Eric Christopherd37eda82009-08-21 04:06:45 +00001876 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001877 // order words.
1878 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001879 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001880 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1881 if (Quotient->isSingleWord())
1882 Quotient->VAL = tmp;
1883 else
1884 Quotient->pVal[0] = tmp;
1885 } else {
1886 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1887 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001888 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001889 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1890 }
1891 }
1892
1893 // If the caller wants the remainder
1894 if (Remainder) {
1895 // Set up the Remainder value's memory.
1896 if (Remainder->BitWidth != RHS.BitWidth) {
1897 if (Remainder->isSingleWord())
1898 Remainder->VAL = 0;
1899 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001900 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001901 Remainder->BitWidth = RHS.BitWidth;
1902 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001903 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001904 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001905 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001906
1907 // The remainder is in R. Reconstitute the remainder into Remainder's low
1908 // order words.
1909 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001910 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001911 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1912 if (Remainder->isSingleWord())
1913 Remainder->VAL = tmp;
1914 else
1915 Remainder->pVal[0] = tmp;
1916 } else {
1917 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1918 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001919 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001920 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1921 }
1922 }
1923
1924 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001925 if (U != &SPACE[0]) {
1926 delete [] U;
1927 delete [] V;
1928 delete [] Q;
1929 delete [] R;
1930 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001931}
1932
Reid Spencere81d2da2007-02-16 22:36:51 +00001933APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001934 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001935
1936 // First, deal with the easy case
1937 if (isSingleWord()) {
1938 assert(RHS.VAL != 0 && "Divide by zero?");
1939 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001940 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001941
Reid Spencer71bd08f2007-02-17 02:07:07 +00001942 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001943 unsigned rhsBits = RHS.getActiveBits();
1944 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001945 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001946 unsigned lhsBits = this->getActiveBits();
1947 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001948
1949 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001950 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001951 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001952 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001953 else if (lhsWords < rhsWords || this->ult(RHS)) {
1954 // X / Y ===> 0, iff X < Y
1955 return APInt(BitWidth, 0);
1956 } else if (*this == RHS) {
1957 // X / X ===> 1
1958 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001959 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001960 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001961 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001962 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001963
1964 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1965 APInt Quotient(1,0); // to hold result.
1966 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1967 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001968}
1969
Reid Spencere81d2da2007-02-16 22:36:51 +00001970APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001971 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001972 if (isSingleWord()) {
1973 assert(RHS.VAL != 0 && "Remainder by zero?");
1974 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001975 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001976
Reid Spencere0cdd332007-02-21 08:21:52 +00001977 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001978 unsigned lhsBits = getActiveBits();
1979 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001980
1981 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001982 unsigned rhsBits = RHS.getActiveBits();
1983 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001984 assert(rhsWords && "Performing remainder operation by zero ???");
1985
Reid Spencer71bd08f2007-02-17 02:07:07 +00001986 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001987 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001988 // 0 % Y ===> 0
1989 return APInt(BitWidth, 0);
1990 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1991 // X % Y ===> X, iff X < Y
1992 return *this;
1993 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001994 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001995 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001996 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001997 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001998 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001999 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002000
Reid Spencer19dc32a2007-05-13 23:44:59 +00002001 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00002002 APInt Remainder(1,0);
2003 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2004 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002005}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002006
Eric Christopherd37eda82009-08-21 04:06:45 +00002007void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002008 APInt &Quotient, APInt &Remainder) {
2009 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002010 unsigned lhsBits = LHS.getActiveBits();
2011 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2012 unsigned rhsBits = RHS.getActiveBits();
2013 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002014
2015 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002016 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002017 Quotient = 0; // 0 / Y ===> 0
2018 Remainder = 0; // 0 % Y ===> 0
2019 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002020 }
2021
2022 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002023 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002024 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002025 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002026 }
2027
Reid Spencer19dc32a2007-05-13 23:44:59 +00002028 if (LHS == RHS) {
2029 Quotient = 1; // X / X ===> 1
2030 Remainder = 0; // X % X ===> 0;
2031 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002032 }
2033
Reid Spencer19dc32a2007-05-13 23:44:59 +00002034 if (lhsWords == 1 && rhsWords == 1) {
2035 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002036 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2037 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2038 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2039 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002040 return;
2041 }
2042
2043 // Okay, lets do it the long way
2044 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2045}
2046
Chris Lattner0a0a5852010-10-13 23:54:10 +00002047APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002048 APInt Res = *this+RHS;
2049 Overflow = isNonNegative() == RHS.isNonNegative() &&
2050 Res.isNonNegative() != isNonNegative();
2051 return Res;
2052}
2053
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002054APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2055 APInt Res = *this+RHS;
2056 Overflow = Res.ult(RHS);
2057 return Res;
2058}
2059
Chris Lattner0a0a5852010-10-13 23:54:10 +00002060APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002061 APInt Res = *this - RHS;
2062 Overflow = isNonNegative() != RHS.isNonNegative() &&
2063 Res.isNonNegative() != isNonNegative();
2064 return Res;
2065}
2066
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002067APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002068 APInt Res = *this-RHS;
2069 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002070 return Res;
2071}
2072
Chris Lattner0a0a5852010-10-13 23:54:10 +00002073APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002074 // MININT/-1 --> overflow.
2075 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2076 return sdiv(RHS);
2077}
2078
Chris Lattner0a0a5852010-10-13 23:54:10 +00002079APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002080 APInt Res = *this * RHS;
2081
2082 if (*this != 0 && RHS != 0)
2083 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2084 else
2085 Overflow = false;
2086 return Res;
2087}
2088
Frits van Bommel62086102011-03-27 14:26:13 +00002089APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2090 APInt Res = *this * RHS;
2091
2092 if (*this != 0 && RHS != 0)
2093 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2094 else
2095 Overflow = false;
2096 return Res;
2097}
2098
Chris Lattner0a0a5852010-10-13 23:54:10 +00002099APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002100 Overflow = ShAmt >= getBitWidth();
2101 if (Overflow)
2102 ShAmt = getBitWidth()-1;
2103
2104 if (isNonNegative()) // Don't allow sign change.
2105 Overflow = ShAmt >= countLeadingZeros();
2106 else
2107 Overflow = ShAmt >= countLeadingOnes();
2108
2109 return *this << ShAmt;
2110}
2111
2112
2113
2114
Benjamin Kramer38e59892010-07-14 22:38:02 +00002115void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002116 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002117 assert(!str.empty() && "Invalid string length");
Reid Spencer5e0a8512007-02-17 03:16:00 +00002118 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2119 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002120
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002121 StringRef::iterator p = str.begin();
2122 size_t slen = str.size();
2123 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002124 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002125 p++;
2126 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002127 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002128 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002129 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002130 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2131 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002132 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2133 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002134
2135 // Allocate memory
2136 if (!isSingleWord())
2137 pVal = getClearedMemory(getNumWords());
2138
2139 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002140 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002141
2142 // Set up an APInt for the digit to add outside the loop so we don't
2143 // constantly construct/destruct it.
2144 APInt apdigit(getBitWidth(), 0);
2145 APInt apradix(getBitWidth(), radix);
2146
2147 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002148 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002149 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002150 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002151
Reid Spencer6551dcd2007-05-16 19:18:22 +00002152 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002153 if (slen > 1) {
2154 if (shift)
2155 *this <<= shift;
2156 else
2157 *this *= apradix;
2158 }
Reid Spencer385f7542007-02-21 03:55:44 +00002159
2160 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002161 if (apdigit.isSingleWord())
2162 apdigit.VAL = digit;
2163 else
2164 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002165 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002166 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002167 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002168 if (isNeg) {
2169 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002170 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002171 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002172}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002173
Chris Lattnerfad86b02008-08-17 07:19:36 +00002174void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekcf886182011-06-15 00:51:55 +00002175 bool Signed, bool formatAsCLiteral) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002176 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002177 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002178
Ted Kremenekcf886182011-06-15 00:51:55 +00002179 const char *Prefix = "";
2180 if (formatAsCLiteral) {
2181 switch (Radix) {
2182 case 2:
2183 // Binary literals are a non-standard extension added in gcc 4.3:
2184 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2185 Prefix = "0b";
2186 break;
2187 case 8:
2188 Prefix = "0";
2189 break;
2190 case 16:
2191 Prefix = "0x";
2192 break;
2193 }
2194 }
2195
Chris Lattnerfad86b02008-08-17 07:19:36 +00002196 // First, check for a zero value and just short circuit the logic below.
2197 if (*this == 0) {
Ted Kremenekcf886182011-06-15 00:51:55 +00002198 while (*Prefix) {
2199 Str.push_back(*Prefix);
2200 ++Prefix;
2201 };
Chris Lattnerfad86b02008-08-17 07:19:36 +00002202 Str.push_back('0');
2203 return;
2204 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002205
Chris Lattnerfad86b02008-08-17 07:19:36 +00002206 static const char Digits[] = "0123456789ABCDEF";
Eric Christopherd37eda82009-08-21 04:06:45 +00002207
Reid Spencer9c0696f2007-02-20 08:51:03 +00002208 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002209 char Buffer[65];
2210 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002211
Chris Lattnerfad86b02008-08-17 07:19:36 +00002212 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002213 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002214 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002215 } else {
2216 int64_t I = getSExtValue();
2217 if (I >= 0) {
2218 N = I;
2219 } else {
2220 Str.push_back('-');
2221 N = -(uint64_t)I;
2222 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002223 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002224
Ted Kremenekcf886182011-06-15 00:51:55 +00002225 while (*Prefix) {
2226 Str.push_back(*Prefix);
2227 ++Prefix;
2228 };
2229
Chris Lattnerfad86b02008-08-17 07:19:36 +00002230 while (N) {
2231 *--BufPtr = Digits[N % Radix];
2232 N /= Radix;
2233 }
2234 Str.append(BufPtr, Buffer+65);
2235 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002236 }
2237
Chris Lattnerfad86b02008-08-17 07:19:36 +00002238 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002239
Chris Lattnerfad86b02008-08-17 07:19:36 +00002240 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002241 // They want to print the signed version and it is a negative value
2242 // Flip the bits and add one to turn it into the equivalent positive
2243 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002244 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002245 Tmp++;
2246 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002247 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002248
Ted Kremenekcf886182011-06-15 00:51:55 +00002249 while (*Prefix) {
2250 Str.push_back(*Prefix);
2251 ++Prefix;
2252 };
2253
Chris Lattnerfad86b02008-08-17 07:19:36 +00002254 // We insert the digits backward, then reverse them to get the right order.
2255 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002256
2257 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2258 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002259 // equaly. We just shift until the value is zero.
2260 if (Radix != 10) {
2261 // Just shift tmp right for each digit width until it becomes zero
2262 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2263 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002264
Chris Lattnerfad86b02008-08-17 07:19:36 +00002265 while (Tmp != 0) {
2266 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2267 Str.push_back(Digits[Digit]);
2268 Tmp = Tmp.lshr(ShiftAmt);
2269 }
2270 } else {
2271 APInt divisor(4, 10);
2272 while (Tmp != 0) {
2273 APInt APdigit(1, 0);
2274 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002275 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002276 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002277 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002278 assert(Digit < Radix && "divide failed");
2279 Str.push_back(Digits[Digit]);
2280 Tmp = tmp2;
2281 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002282 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002283
Chris Lattnerfad86b02008-08-17 07:19:36 +00002284 // Reverse the digits before returning.
2285 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002286}
2287
Chris Lattnerfad86b02008-08-17 07:19:36 +00002288/// toString - This returns the APInt as a std::string. Note that this is an
2289/// inefficient method. It is better to pass in a SmallVector/SmallString
2290/// to the methods above.
2291std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2292 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002293 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002294 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002295}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002296
Chris Lattnerfad86b02008-08-17 07:19:36 +00002297
2298void APInt::dump() const {
2299 SmallString<40> S, U;
2300 this->toStringUnsigned(U);
2301 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002302 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002303 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002304}
2305
Chris Lattner944fac72008-08-23 22:23:09 +00002306void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002307 SmallString<40> S;
Ted Kremenekcf886182011-06-15 00:51:55 +00002308 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002309 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002310}
2311
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002312// This implements a variety of operations on a representation of
2313// arbitrary precision, two's-complement, bignum integer values.
2314
Chris Lattner91021d32009-08-23 23:11:28 +00002315// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2316// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002317#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002318COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002319
2320/* Some handy functions local to this file. */
2321namespace {
2322
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002323 /* Returns the integer part with the least significant BITS set.
2324 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002325 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002326 lowBitMask(unsigned int bits)
2327 {
Dan Gohman16e02092010-03-24 19:38:02 +00002328 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002329
2330 return ~(integerPart) 0 >> (integerPartWidth - bits);
2331 }
2332
Neil Booth055c0b32007-10-06 00:43:45 +00002333 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002334 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002335 lowHalf(integerPart part)
2336 {
2337 return part & lowBitMask(integerPartWidth / 2);
2338 }
2339
Neil Booth055c0b32007-10-06 00:43:45 +00002340 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002341 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002342 highHalf(integerPart part)
2343 {
2344 return part >> (integerPartWidth / 2);
2345 }
2346
Neil Booth055c0b32007-10-06 00:43:45 +00002347 /* Returns the bit number of the most significant set bit of a part.
2348 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002349 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002350 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002351 {
2352 unsigned int n, msb;
2353
2354 if (value == 0)
2355 return -1U;
2356
2357 n = integerPartWidth / 2;
2358
2359 msb = 0;
2360 do {
2361 if (value >> n) {
2362 value >>= n;
2363 msb += n;
2364 }
2365
2366 n >>= 1;
2367 } while (n);
2368
2369 return msb;
2370 }
2371
Neil Booth055c0b32007-10-06 00:43:45 +00002372 /* Returns the bit number of the least significant set bit of a
2373 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002374 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002375 partLSB(integerPart value)
2376 {
2377 unsigned int n, lsb;
2378
2379 if (value == 0)
2380 return -1U;
2381
2382 lsb = integerPartWidth - 1;
2383 n = integerPartWidth / 2;
2384
2385 do {
2386 if (value << n) {
2387 value <<= n;
2388 lsb -= n;
2389 }
2390
2391 n >>= 1;
2392 } while (n);
2393
2394 return lsb;
2395 }
2396}
2397
2398/* Sets the least significant part of a bignum to the input value, and
2399 zeroes out higher parts. */
2400void
2401APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2402{
2403 unsigned int i;
2404
Dan Gohman16e02092010-03-24 19:38:02 +00002405 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002406
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002407 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002408 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002409 dst[i] = 0;
2410}
2411
2412/* Assign one bignum to another. */
2413void
2414APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2415{
2416 unsigned int i;
2417
Dan Gohman16e02092010-03-24 19:38:02 +00002418 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002419 dst[i] = src[i];
2420}
2421
2422/* Returns true if a bignum is zero, false otherwise. */
2423bool
2424APInt::tcIsZero(const integerPart *src, unsigned int parts)
2425{
2426 unsigned int i;
2427
Dan Gohman16e02092010-03-24 19:38:02 +00002428 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002429 if (src[i])
2430 return false;
2431
2432 return true;
2433}
2434
2435/* Extract the given bit of a bignum; returns 0 or 1. */
2436int
2437APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2438{
Dan Gohman16e02092010-03-24 19:38:02 +00002439 return (parts[bit / integerPartWidth] &
2440 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002441}
2442
John McCalle12b7382010-02-28 02:51:25 +00002443/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002444void
2445APInt::tcSetBit(integerPart *parts, unsigned int bit)
2446{
2447 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2448}
2449
John McCalle12b7382010-02-28 02:51:25 +00002450/* Clears the given bit of a bignum. */
2451void
2452APInt::tcClearBit(integerPart *parts, unsigned int bit)
2453{
2454 parts[bit / integerPartWidth] &=
2455 ~((integerPart) 1 << (bit % integerPartWidth));
2456}
2457
Neil Booth055c0b32007-10-06 00:43:45 +00002458/* Returns the bit number of the least significant set bit of a
2459 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002460unsigned int
2461APInt::tcLSB(const integerPart *parts, unsigned int n)
2462{
2463 unsigned int i, lsb;
2464
Dan Gohman16e02092010-03-24 19:38:02 +00002465 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002466 if (parts[i] != 0) {
2467 lsb = partLSB(parts[i]);
2468
2469 return lsb + i * integerPartWidth;
2470 }
2471 }
2472
2473 return -1U;
2474}
2475
Neil Booth055c0b32007-10-06 00:43:45 +00002476/* Returns the bit number of the most significant set bit of a number.
2477 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002478unsigned int
2479APInt::tcMSB(const integerPart *parts, unsigned int n)
2480{
2481 unsigned int msb;
2482
2483 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002484 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002485
Dan Gohman16e02092010-03-24 19:38:02 +00002486 if (parts[n] != 0) {
2487 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002488
Dan Gohman16e02092010-03-24 19:38:02 +00002489 return msb + n * integerPartWidth;
2490 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002491 } while (n);
2492
2493 return -1U;
2494}
2495
Neil Booth68e53ad2007-10-08 13:47:12 +00002496/* Copy the bit vector of width srcBITS from SRC, starting at bit
2497 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2498 the least significant bit of DST. All high bits above srcBITS in
2499 DST are zero-filled. */
2500void
Evan Chengcf69a742009-05-21 23:47:47 +00002501APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002502 unsigned int srcBits, unsigned int srcLSB)
2503{
2504 unsigned int firstSrcPart, dstParts, shift, n;
2505
2506 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002507 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002508
2509 firstSrcPart = srcLSB / integerPartWidth;
2510 tcAssign (dst, src + firstSrcPart, dstParts);
2511
2512 shift = srcLSB % integerPartWidth;
2513 tcShiftRight (dst, dstParts, shift);
2514
2515 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2516 in DST. If this is less that srcBits, append the rest, else
2517 clear the high bits. */
2518 n = dstParts * integerPartWidth - shift;
2519 if (n < srcBits) {
2520 integerPart mask = lowBitMask (srcBits - n);
2521 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2522 << n % integerPartWidth);
2523 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002524 if (srcBits % integerPartWidth)
2525 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002526 }
2527
2528 /* Clear high parts. */
2529 while (dstParts < dstCount)
2530 dst[dstParts++] = 0;
2531}
2532
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002533/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2534integerPart
2535APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2536 integerPart c, unsigned int parts)
2537{
2538 unsigned int i;
2539
2540 assert(c <= 1);
2541
Dan Gohman16e02092010-03-24 19:38:02 +00002542 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002543 integerPart l;
2544
2545 l = dst[i];
2546 if (c) {
2547 dst[i] += rhs[i] + 1;
2548 c = (dst[i] <= l);
2549 } else {
2550 dst[i] += rhs[i];
2551 c = (dst[i] < l);
2552 }
2553 }
2554
2555 return c;
2556}
2557
2558/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2559integerPart
2560APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2561 integerPart c, unsigned int parts)
2562{
2563 unsigned int i;
2564
2565 assert(c <= 1);
2566
Dan Gohman16e02092010-03-24 19:38:02 +00002567 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002568 integerPart l;
2569
2570 l = dst[i];
2571 if (c) {
2572 dst[i] -= rhs[i] + 1;
2573 c = (dst[i] >= l);
2574 } else {
2575 dst[i] -= rhs[i];
2576 c = (dst[i] > l);
2577 }
2578 }
2579
2580 return c;
2581}
2582
2583/* Negate a bignum in-place. */
2584void
2585APInt::tcNegate(integerPart *dst, unsigned int parts)
2586{
2587 tcComplement(dst, parts);
2588 tcIncrement(dst, parts);
2589}
2590
Neil Booth055c0b32007-10-06 00:43:45 +00002591/* DST += SRC * MULTIPLIER + CARRY if add is true
2592 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002593
2594 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2595 they must start at the same point, i.e. DST == SRC.
2596
2597 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2598 returned. Otherwise DST is filled with the least significant
2599 DSTPARTS parts of the result, and if all of the omitted higher
2600 parts were zero return zero, otherwise overflow occurred and
2601 return one. */
2602int
2603APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2604 integerPart multiplier, integerPart carry,
2605 unsigned int srcParts, unsigned int dstParts,
2606 bool add)
2607{
2608 unsigned int i, n;
2609
2610 /* Otherwise our writes of DST kill our later reads of SRC. */
2611 assert(dst <= src || dst >= src + srcParts);
2612 assert(dstParts <= srcParts + 1);
2613
2614 /* N loops; minimum of dstParts and srcParts. */
2615 n = dstParts < srcParts ? dstParts: srcParts;
2616
Dan Gohman16e02092010-03-24 19:38:02 +00002617 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002618 integerPart low, mid, high, srcPart;
2619
2620 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2621
2622 This cannot overflow, because
2623
2624 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2625
2626 which is less than n^2. */
2627
2628 srcPart = src[i];
2629
2630 if (multiplier == 0 || srcPart == 0) {
2631 low = carry;
2632 high = 0;
2633 } else {
2634 low = lowHalf(srcPart) * lowHalf(multiplier);
2635 high = highHalf(srcPart) * highHalf(multiplier);
2636
2637 mid = lowHalf(srcPart) * highHalf(multiplier);
2638 high += highHalf(mid);
2639 mid <<= integerPartWidth / 2;
2640 if (low + mid < low)
2641 high++;
2642 low += mid;
2643
2644 mid = highHalf(srcPart) * lowHalf(multiplier);
2645 high += highHalf(mid);
2646 mid <<= integerPartWidth / 2;
2647 if (low + mid < low)
2648 high++;
2649 low += mid;
2650
2651 /* Now add carry. */
2652 if (low + carry < low)
2653 high++;
2654 low += carry;
2655 }
2656
2657 if (add) {
2658 /* And now DST[i], and store the new low part there. */
2659 if (low + dst[i] < low)
2660 high++;
2661 dst[i] += low;
2662 } else
2663 dst[i] = low;
2664
2665 carry = high;
2666 }
2667
2668 if (i < dstParts) {
2669 /* Full multiplication, there is no overflow. */
2670 assert(i + 1 == dstParts);
2671 dst[i] = carry;
2672 return 0;
2673 } else {
2674 /* We overflowed if there is carry. */
2675 if (carry)
2676 return 1;
2677
2678 /* We would overflow if any significant unwritten parts would be
2679 non-zero. This is true if any remaining src parts are non-zero
2680 and the multiplier is non-zero. */
2681 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002682 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002683 if (src[i])
2684 return 1;
2685
2686 /* We fitted in the narrow destination. */
2687 return 0;
2688 }
2689}
2690
2691/* DST = LHS * RHS, where DST has the same width as the operands and
2692 is filled with the least significant parts of the result. Returns
2693 one if overflow occurred, otherwise zero. DST must be disjoint
2694 from both operands. */
2695int
2696APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2697 const integerPart *rhs, unsigned int parts)
2698{
2699 unsigned int i;
2700 int overflow;
2701
2702 assert(dst != lhs && dst != rhs);
2703
2704 overflow = 0;
2705 tcSet(dst, 0, parts);
2706
Dan Gohman16e02092010-03-24 19:38:02 +00002707 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002708 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2709 parts - i, true);
2710
2711 return overflow;
2712}
2713
Neil Booth978661d2007-10-06 00:24:48 +00002714/* DST = LHS * RHS, where DST has width the sum of the widths of the
2715 operands. No overflow occurs. DST must be disjoint from both
2716 operands. Returns the number of parts required to hold the
2717 result. */
2718unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002719APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002720 const integerPart *rhs, unsigned int lhsParts,
2721 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002722{
Neil Booth978661d2007-10-06 00:24:48 +00002723 /* Put the narrower number on the LHS for less loops below. */
2724 if (lhsParts > rhsParts) {
2725 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2726 } else {
2727 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002728
Neil Booth978661d2007-10-06 00:24:48 +00002729 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002730
Neil Booth978661d2007-10-06 00:24:48 +00002731 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002732
Dan Gohman16e02092010-03-24 19:38:02 +00002733 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002734 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002735
Neil Booth978661d2007-10-06 00:24:48 +00002736 n = lhsParts + rhsParts;
2737
2738 return n - (dst[n - 1] == 0);
2739 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002740}
2741
2742/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2743 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2744 set REMAINDER to the remainder, return zero. i.e.
2745
2746 OLD_LHS = RHS * LHS + REMAINDER
2747
2748 SCRATCH is a bignum of the same size as the operands and result for
2749 use by the routine; its contents need not be initialized and are
2750 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2751*/
2752int
2753APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2754 integerPart *remainder, integerPart *srhs,
2755 unsigned int parts)
2756{
2757 unsigned int n, shiftCount;
2758 integerPart mask;
2759
2760 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2761
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002762 shiftCount = tcMSB(rhs, parts) + 1;
2763 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002764 return true;
2765
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002766 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002767 n = shiftCount / integerPartWidth;
2768 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2769
2770 tcAssign(srhs, rhs, parts);
2771 tcShiftLeft(srhs, parts, shiftCount);
2772 tcAssign(remainder, lhs, parts);
2773 tcSet(lhs, 0, parts);
2774
2775 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2776 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002777 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002778 int compare;
2779
2780 compare = tcCompare(remainder, srhs, parts);
2781 if (compare >= 0) {
2782 tcSubtract(remainder, srhs, 0, parts);
2783 lhs[n] |= mask;
2784 }
2785
2786 if (shiftCount == 0)
2787 break;
2788 shiftCount--;
2789 tcShiftRight(srhs, parts, 1);
2790 if ((mask >>= 1) == 0)
2791 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2792 }
2793
2794 return false;
2795}
2796
2797/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2798 There are no restrictions on COUNT. */
2799void
2800APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2801{
Neil Booth68e53ad2007-10-08 13:47:12 +00002802 if (count) {
2803 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002804
Neil Booth68e53ad2007-10-08 13:47:12 +00002805 /* Jump is the inter-part jump; shift is is intra-part shift. */
2806 jump = count / integerPartWidth;
2807 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002808
Neil Booth68e53ad2007-10-08 13:47:12 +00002809 while (parts > jump) {
2810 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002811
Neil Booth68e53ad2007-10-08 13:47:12 +00002812 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002813
Neil Booth68e53ad2007-10-08 13:47:12 +00002814 /* dst[i] comes from the two parts src[i - jump] and, if we have
2815 an intra-part shift, src[i - jump - 1]. */
2816 part = dst[parts - jump];
2817 if (shift) {
2818 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002819 if (parts >= jump + 1)
2820 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2821 }
2822
Neil Booth68e53ad2007-10-08 13:47:12 +00002823 dst[parts] = part;
2824 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002825
Neil Booth68e53ad2007-10-08 13:47:12 +00002826 while (parts > 0)
2827 dst[--parts] = 0;
2828 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002829}
2830
2831/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2832 zero. There are no restrictions on COUNT. */
2833void
2834APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2835{
Neil Booth68e53ad2007-10-08 13:47:12 +00002836 if (count) {
2837 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002838
Neil Booth68e53ad2007-10-08 13:47:12 +00002839 /* Jump is the inter-part jump; shift is is intra-part shift. */
2840 jump = count / integerPartWidth;
2841 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002842
Neil Booth68e53ad2007-10-08 13:47:12 +00002843 /* Perform the shift. This leaves the most significant COUNT bits
2844 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002845 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002846 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002847
Neil Booth68e53ad2007-10-08 13:47:12 +00002848 if (i + jump >= parts) {
2849 part = 0;
2850 } else {
2851 part = dst[i + jump];
2852 if (shift) {
2853 part >>= shift;
2854 if (i + jump + 1 < parts)
2855 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2856 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002857 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002858
Neil Booth68e53ad2007-10-08 13:47:12 +00002859 dst[i] = part;
2860 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002861 }
2862}
2863
2864/* Bitwise and of two bignums. */
2865void
2866APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2867{
2868 unsigned int i;
2869
Dan Gohman16e02092010-03-24 19:38:02 +00002870 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002871 dst[i] &= rhs[i];
2872}
2873
2874/* Bitwise inclusive or of two bignums. */
2875void
2876APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2877{
2878 unsigned int i;
2879
Dan Gohman16e02092010-03-24 19:38:02 +00002880 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002881 dst[i] |= rhs[i];
2882}
2883
2884/* Bitwise exclusive or of two bignums. */
2885void
2886APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2887{
2888 unsigned int i;
2889
Dan Gohman16e02092010-03-24 19:38:02 +00002890 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002891 dst[i] ^= rhs[i];
2892}
2893
2894/* Complement a bignum in-place. */
2895void
2896APInt::tcComplement(integerPart *dst, unsigned int parts)
2897{
2898 unsigned int i;
2899
Dan Gohman16e02092010-03-24 19:38:02 +00002900 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002901 dst[i] = ~dst[i];
2902}
2903
2904/* Comparison (unsigned) of two bignums. */
2905int
2906APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2907 unsigned int parts)
2908{
2909 while (parts) {
2910 parts--;
2911 if (lhs[parts] == rhs[parts])
2912 continue;
2913
2914 if (lhs[parts] > rhs[parts])
2915 return 1;
2916 else
2917 return -1;
2918 }
2919
2920 return 0;
2921}
2922
2923/* Increment a bignum in-place, return the carry flag. */
2924integerPart
2925APInt::tcIncrement(integerPart *dst, unsigned int parts)
2926{
2927 unsigned int i;
2928
Dan Gohman16e02092010-03-24 19:38:02 +00002929 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002930 if (++dst[i] != 0)
2931 break;
2932
2933 return i == parts;
2934}
2935
2936/* Set the least significant BITS bits of a bignum, clear the
2937 rest. */
2938void
2939APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2940 unsigned int bits)
2941{
2942 unsigned int i;
2943
2944 i = 0;
2945 while (bits > integerPartWidth) {
2946 dst[i++] = ~(integerPart) 0;
2947 bits -= integerPartWidth;
2948 }
2949
2950 if (bits)
2951 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2952
2953 while (i < parts)
2954 dst[i++] = 0;
2955}