blob: 0d4e0f9f752aff20b341283196aacadcb2e871b8 [file] [log] [blame]
Zhou Shengdac63782007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-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 Shengdac63782007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencera41e93b2007-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 Shengdac63782007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencera5e0d202007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengdac63782007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
Daniel Dunbar3a1efd112009-08-13 02:33:34 +000017#include "llvm/ADT/StringRef.h"
Ted Kremenek5c75d542008-01-19 04:23:33 +000018#include "llvm/ADT/FoldingSet.h"
Chris Lattner17f71652008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Reid Spencera5e0d202007-02-24 03:58:46 +000020#include "llvm/Support/Debug.h"
Torok Edwin56d06592009-07-11 20:10:48 +000021#include "llvm/Support/ErrorHandling.h"
Zhou Shengdac63782007-02-06 03:00:16 +000022#include "llvm/Support/MathExtras.h"
Chris Lattner0c19df42008-08-23 22:23:09 +000023#include "llvm/Support/raw_ostream.h"
Chris Lattner17f71652008-08-17 07:19:36 +000024#include <cmath>
Jeff Cohene06855e2007-03-20 20:42:36 +000025#include <limits>
Zhou Sheng3e8022d2007-02-07 06:14:53 +000026#include <cstring>
Zhou Shengdac63782007-02-06 03:00:16 +000027#include <cstdlib>
28using namespace llvm;
29
Reid Spencera41e93b2007-02-25 19:32:03 +000030/// A utility function for allocating memory, checking for allocation failures,
31/// and ensuring the contents are zeroed.
Chris Lattner77527f52009-01-21 18:09:24 +000032inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spencera856b6e2007-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 Sheng94b623a2007-02-06 06:04:53 +000037}
38
Eric Christopher820256b2009-08-21 04:06:45 +000039/// A utility function for allocating memory and checking for allocation
Reid Spencera41e93b2007-02-25 19:32:03 +000040/// failure. The content is not zeroed.
Chris Lattner77527f52009-01-21 18:09:24 +000041inline static uint64_t* getMemory(unsigned numWords) {
Reid Spencera856b6e2007-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 Tryzelaardadb15712009-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 Tryzelaar60964092009-08-21 06:48:37 +000049 unsigned r;
50
Douglas Gregor663c0682011-09-14 15:54:46 +000051 if (radix == 16 || radix == 36) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000052 r = cdigit - '0';
53 if (r <= 9)
54 return r;
55
56 r = cdigit - 'A';
Douglas Gregorc98ac852011-09-20 18:33:29 +000057 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000058 return r + 10;
59
60 r = cdigit - 'a';
Douglas Gregorc98ac852011-09-20 18:33:29 +000061 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000062 return r + 10;
Douglas Gregore4e20f42011-09-20 18:11:52 +000063
64 radix = 10;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000065 }
66
Erick Tryzelaar60964092009-08-21 06:48:37 +000067 r = cdigit - '0';
68 if (r < radix)
69 return r;
70
71 return -1U;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000072}
73
74
Chris Lattner77527f52009-01-21 18:09:24 +000075void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner1ac3e252008-08-20 17:02:31 +000076 pVal = getClearedMemory(getNumWords());
77 pVal[0] = val;
Eric Christopher820256b2009-08-21 04:06:45 +000078 if (isSigned && int64_t(val) < 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +000079 for (unsigned i = 1; i < getNumWords(); ++i)
80 pVal[i] = -1ULL;
Zhou Shengdac63782007-02-06 03:00:16 +000081}
82
Chris Lattnerd57b7602008-10-11 22:07:19 +000083void APInt::initSlowCase(const APInt& that) {
84 pVal = getMemory(getNumWords());
85 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
86}
87
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000088void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +000089 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000090 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengdac63782007-02-06 03:00:16 +000091 if (isSingleWord())
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000092 VAL = bigVal[0];
Zhou Shengdac63782007-02-06 03:00:16 +000093 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000094 // Get memory, cleared to 0
95 pVal = getClearedMemory(getNumWords());
96 // Calculate the number of words to copy
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000097 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000098 // Copy the words from bigVal to pVal
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000099 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000100 }
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000101 // Make sure unused high bits are cleared
102 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000103}
104
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000105APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
106 : BitWidth(numBits), VAL(0) {
107 initFromArray(bigVal);
108}
109
110APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
111 : BitWidth(numBits), VAL(0) {
112 initFromArray(makeArrayRef(bigVal, numWords));
113}
114
Benjamin Kramer92d89982010-07-14 22:38:02 +0000115APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer1ba83352007-02-21 03:55:44 +0000116 : BitWidth(numbits), VAL(0) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000117 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000118 fromString(numbits, Str, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000119}
120
Chris Lattner1ac3e252008-08-20 17:02:31 +0000121APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000122 // Don't do anything for X = X
123 if (this == &RHS)
124 return *this;
125
Reid Spencer7c16cd22007-02-26 23:38:21 +0000126 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner1ac3e252008-08-20 17:02:31 +0000127 // assume same bit-width single-word case is already handled
128 assert(!isSingleWord());
129 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer7c16cd22007-02-26 23:38:21 +0000130 return *this;
131 }
132
Chris Lattner1ac3e252008-08-20 17:02:31 +0000133 if (isSingleWord()) {
134 // assume case where both are single words is already handled
135 assert(!RHS.isSingleWord());
136 VAL = 0;
137 pVal = getMemory(RHS.getNumWords());
138 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopher820256b2009-08-21 04:06:45 +0000139 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer7c16cd22007-02-26 23:38:21 +0000140 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
141 else if (RHS.isSingleWord()) {
142 delete [] pVal;
Reid Spencera856b6e2007-02-18 18:38:44 +0000143 VAL = RHS.VAL;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000144 } else {
145 delete [] pVal;
146 pVal = getMemory(RHS.getNumWords());
147 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
148 }
149 BitWidth = RHS.BitWidth;
150 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000151}
152
Zhou Shengdac63782007-02-06 03:00:16 +0000153APInt& APInt::operator=(uint64_t RHS) {
Eric Christopher820256b2009-08-21 04:06:45 +0000154 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000155 VAL = RHS;
Zhou Shengdac63782007-02-06 03:00:16 +0000156 else {
157 pVal[0] = RHS;
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000158 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000159 }
Reid Spencer7c16cd22007-02-26 23:38:21 +0000160 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000161}
162
Ted Kremenek5c75d542008-01-19 04:23:33 +0000163/// Profile - This method 'profiles' an APInt for use with FoldingSet.
164void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek901540f2008-02-19 20:50:41 +0000165 ID.AddInteger(BitWidth);
Eric Christopher820256b2009-08-21 04:06:45 +0000166
Ted Kremenek5c75d542008-01-19 04:23:33 +0000167 if (isSingleWord()) {
168 ID.AddInteger(VAL);
169 return;
170 }
171
Chris Lattner77527f52009-01-21 18:09:24 +0000172 unsigned NumWords = getNumWords();
Ted Kremenek5c75d542008-01-19 04:23:33 +0000173 for (unsigned i = 0; i < NumWords; ++i)
174 ID.AddInteger(pVal[i]);
175}
176
Eric Christopher820256b2009-08-21 04:06:45 +0000177/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spencera856b6e2007-02-18 18:38:44 +0000178/// "digit" integer array, x[]. x[] is modified to reflect the addition and
179/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer100502d2007-02-17 03:16:00 +0000180/// @returns the carry of the addition.
Chris Lattner77527f52009-01-21 18:09:24 +0000181static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
182 for (unsigned i = 0; i < len; ++i) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000183 dest[i] = y + x[i];
184 if (dest[i] < y)
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000185 y = 1; // Carry one to next digit.
Reid Spenceree0a6852007-02-18 06:39:42 +0000186 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000187 y = 0; // No need to carry so exit early
Reid Spenceree0a6852007-02-18 06:39:42 +0000188 break;
189 }
Reid Spencer100502d2007-02-17 03:16:00 +0000190 }
Reid Spenceree0a6852007-02-18 06:39:42 +0000191 return y;
Reid Spencer100502d2007-02-17 03:16:00 +0000192}
193
Zhou Shengdac63782007-02-06 03:00:16 +0000194/// @brief Prefix increment operator. Increments the APInt by one.
195APInt& APInt::operator++() {
Eric Christopher820256b2009-08-21 04:06:45 +0000196 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000197 ++VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000198 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000199 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000200 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000201}
202
Eric Christopher820256b2009-08-21 04:06:45 +0000203/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
204/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spencera856b6e2007-02-18 18:38:44 +0000205/// no further borrowing is neeeded or it runs out of "digits" in x. The result
206/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
207/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencera41e93b2007-02-25 19:32:03 +0000208/// @returns the borrow out of the subtraction
Chris Lattner77527f52009-01-21 18:09:24 +0000209static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
210 for (unsigned i = 0; i < len; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000211 uint64_t X = x[i];
Reid Spenceree0a6852007-02-18 06:39:42 +0000212 x[i] -= y;
Eric Christopher820256b2009-08-21 04:06:45 +0000213 if (y > X)
Reid Spencera856b6e2007-02-18 18:38:44 +0000214 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer100502d2007-02-17 03:16:00 +0000215 else {
Reid Spencera856b6e2007-02-18 18:38:44 +0000216 y = 0; // No need to borrow
217 break; // Remaining digits are unchanged so exit early
Reid Spencer100502d2007-02-17 03:16:00 +0000218 }
219 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000220 return bool(y);
Reid Spencer100502d2007-02-17 03:16:00 +0000221}
222
Zhou Shengdac63782007-02-06 03:00:16 +0000223/// @brief Prefix decrement operator. Decrements the APInt by one.
224APInt& APInt::operator--() {
Eric Christopher820256b2009-08-21 04:06:45 +0000225 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000226 --VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000227 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000228 sub_1(pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000229 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000230}
231
Reid Spencera41e93b2007-02-25 19:32:03 +0000232/// add - This function adds the integer array x to the integer array Y and
Eric Christopher820256b2009-08-21 04:06:45 +0000233/// places the result in dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000234/// @returns the carry out from the addition
235/// @brief General addition of 64-bit integer arrays
Eric Christopher820256b2009-08-21 04:06:45 +0000236static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000237 unsigned len) {
Reid Spencera5e0d202007-02-24 03:58:46 +0000238 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000239 for (unsigned i = 0; i< len; ++i) {
Reid Spencercb292e42007-02-23 01:57:13 +0000240 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000241 dest[i] = x[i] + y[i] + carry;
Reid Spencerdb2abec2007-02-21 05:44:56 +0000242 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer100502d2007-02-17 03:16:00 +0000243 }
244 return carry;
245}
246
Reid Spencera41e93b2007-02-25 19:32:03 +0000247/// Adds the RHS APint to this APInt.
248/// @returns this, after addition of RHS.
Eric Christopher820256b2009-08-21 04:06:45 +0000249/// @brief Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000250APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000251 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000252 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000253 VAL += RHS.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000254 else {
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000255 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000256 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000257 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000258}
259
Eric Christopher820256b2009-08-21 04:06:45 +0000260/// Subtracts the integer array y from the integer array x
Reid Spencera41e93b2007-02-25 19:32:03 +0000261/// @returns returns the borrow out.
262/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopher820256b2009-08-21 04:06:45 +0000263static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000264 unsigned len) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000265 bool borrow = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000266 for (unsigned i = 0; i < len; ++i) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000267 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
268 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
269 dest[i] = x_tmp - y[i];
Reid Spencer100502d2007-02-17 03:16:00 +0000270 }
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000271 return borrow;
Reid Spencer100502d2007-02-17 03:16:00 +0000272}
273
Reid Spencera41e93b2007-02-25 19:32:03 +0000274/// Subtracts the RHS APInt from this APInt
275/// @returns this, after subtraction
Eric Christopher820256b2009-08-21 04:06:45 +0000276/// @brief Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000277APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000278 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000279 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000280 VAL -= RHS.VAL;
281 else
282 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000283 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000284}
285
Dan Gohman4a618822010-02-10 16:03:48 +0000286/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopher820256b2009-08-21 04:06:45 +0000287/// into dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000288/// @returns the carry out of the multiplication.
289/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner77527f52009-01-21 18:09:24 +0000290static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000291 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer100502d2007-02-17 03:16:00 +0000292 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencera41e93b2007-02-25 19:32:03 +0000293 uint64_t carry = 0;
294
295 // For each digit of x.
Chris Lattner77527f52009-01-21 18:09:24 +0000296 for (unsigned i = 0; i < len; ++i) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000297 // Split x into high and low words
298 uint64_t lx = x[i] & 0xffffffffULL;
299 uint64_t hx = x[i] >> 32;
300 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer100502d2007-02-17 03:16:00 +0000301 // hasCarry == 0, no carry
302 // hasCarry == 1, has carry
303 // hasCarry == 2, no carry and the calculation result == 0.
304 uint8_t hasCarry = 0;
305 dest[i] = carry + lx * ly;
306 // Determine if the add above introduces carry.
307 hasCarry = (dest[i] < carry) ? 1 : 0;
308 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopher820256b2009-08-21 04:06:45 +0000309 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer100502d2007-02-17 03:16:00 +0000310 // (2^32 - 1) + 2^32 = 2^64.
311 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
312
313 carry += (lx * hy) & 0xffffffffULL;
314 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopher820256b2009-08-21 04:06:45 +0000315 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000316 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
317 }
Reid Spencer100502d2007-02-17 03:16:00 +0000318 return carry;
319}
320
Eric Christopher820256b2009-08-21 04:06:45 +0000321/// Multiplies integer array x by integer array y and stores the result into
Reid Spencera41e93b2007-02-25 19:32:03 +0000322/// the integer array dest. Note that dest's size must be >= xlen + ylen.
323/// @brief Generalized multiplicate of integer arrays.
Chris Lattner77527f52009-01-21 18:09:24 +0000324static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
325 unsigned ylen) {
Reid Spencer100502d2007-02-17 03:16:00 +0000326 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner77527f52009-01-21 18:09:24 +0000327 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000328 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencer58a6a432007-02-21 08:21:52 +0000329 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner77527f52009-01-21 18:09:24 +0000330 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer100502d2007-02-17 03:16:00 +0000331 lx = x[j] & 0xffffffffULL;
332 hx = x[j] >> 32;
333 // hasCarry - A flag to indicate if has carry.
334 // hasCarry == 0, no carry
335 // hasCarry == 1, has carry
336 // hasCarry == 2, no carry and the calculation result == 0.
337 uint8_t hasCarry = 0;
338 uint64_t resul = carry + lx * ly;
339 hasCarry = (resul < carry) ? 1 : 0;
340 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
341 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
342
343 carry += (lx * hy) & 0xffffffffULL;
344 resul = (carry << 32) | (resul & 0xffffffffULL);
345 dest[i+j] += resul;
346 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopher820256b2009-08-21 04:06:45 +0000347 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000348 ((lx * hy) >> 32) + hx * hy;
349 }
350 dest[i+xlen] = carry;
351 }
352}
353
Zhou Shengdac63782007-02-06 03:00:16 +0000354APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000355 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer58a6a432007-02-21 08:21:52 +0000356 if (isSingleWord()) {
Reid Spencer4bb430c2007-02-20 20:42:10 +0000357 VAL *= RHS.VAL;
Reid Spencer58a6a432007-02-21 08:21:52 +0000358 clearUnusedBits();
359 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000360 }
Reid Spencer58a6a432007-02-21 08:21:52 +0000361
362 // Get some bit facts about LHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000363 unsigned lhsBits = getActiveBits();
364 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopher820256b2009-08-21 04:06:45 +0000365 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +0000366 // 0 * X ===> 0
367 return *this;
368
369 // Get some bit facts about RHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000370 unsigned rhsBits = RHS.getActiveBits();
371 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencer58a6a432007-02-21 08:21:52 +0000372 if (!rhsWords) {
373 // X * 0 ===> 0
Jay Foad25a5e4c2010-12-01 08:53:58 +0000374 clearAllBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000375 return *this;
376 }
377
378 // Allocate space for the result
Chris Lattner77527f52009-01-21 18:09:24 +0000379 unsigned destWords = rhsWords + lhsWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000380 uint64_t *dest = getMemory(destWords);
381
382 // Perform the long multiply
383 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
384
385 // Copy result back into *this
Jay Foad25a5e4c2010-12-01 08:53:58 +0000386 clearAllBits();
Chris Lattner77527f52009-01-21 18:09:24 +0000387 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000388 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
Eli Friedman19546412011-10-07 23:40:49 +0000389 clearUnusedBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000390
391 // delete dest array and return
392 delete[] dest;
Zhou Shengdac63782007-02-06 03:00:16 +0000393 return *this;
394}
395
Zhou Shengdac63782007-02-06 03:00:16 +0000396APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000397 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000398 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000399 VAL &= RHS.VAL;
400 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000401 }
Chris Lattner77527f52009-01-21 18:09:24 +0000402 unsigned numWords = getNumWords();
403 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000404 pVal[i] &= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000405 return *this;
406}
407
Zhou Shengdac63782007-02-06 03:00:16 +0000408APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000409 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000410 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000411 VAL |= RHS.VAL;
412 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000413 }
Chris Lattner77527f52009-01-21 18:09:24 +0000414 unsigned numWords = getNumWords();
415 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000416 pVal[i] |= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000417 return *this;
418}
419
Zhou Shengdac63782007-02-06 03:00:16 +0000420APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000421 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000422 if (isSingleWord()) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000423 VAL ^= RHS.VAL;
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000424 this->clearUnusedBits();
Reid Spenceree0a6852007-02-18 06:39:42 +0000425 return *this;
Eric Christopher820256b2009-08-21 04:06:45 +0000426 }
Chris Lattner77527f52009-01-21 18:09:24 +0000427 unsigned numWords = getNumWords();
428 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000429 pVal[i] ^= RHS.pVal[i];
Reid Spencera41e93b2007-02-25 19:32:03 +0000430 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000431}
432
Chris Lattner1ac3e252008-08-20 17:02:31 +0000433APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000434 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000435 uint64_t* val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000436 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000437 val[i] = pVal[i] & RHS.pVal[i];
438 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000439}
440
Chris Lattner1ac3e252008-08-20 17:02:31 +0000441APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000442 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000443 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000444 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000445 val[i] = pVal[i] | RHS.pVal[i];
446 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000447}
448
Chris Lattner1ac3e252008-08-20 17:02:31 +0000449APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000450 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000451 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000452 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000453 val[i] = pVal[i] ^ RHS.pVal[i];
454
455 // 0^0==1 so clear the high bits in case they got set.
456 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000457}
458
Zhou Shengdac63782007-02-06 03:00:16 +0000459bool APInt::operator !() const {
460 if (isSingleWord())
461 return !VAL;
Reid Spencera856b6e2007-02-18 18:38:44 +0000462
Chris Lattner77527f52009-01-21 18:09:24 +0000463 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopher820256b2009-08-21 04:06:45 +0000464 if (pVal[i])
Reid Spencera856b6e2007-02-18 18:38:44 +0000465 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000466 return true;
467}
468
Zhou Shengdac63782007-02-06 03:00:16 +0000469APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000470 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000471 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000472 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer4bb430c2007-02-20 20:42:10 +0000473 APInt Result(*this);
474 Result *= RHS;
Eli Friedman19546412011-10-07 23:40:49 +0000475 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000476}
477
Zhou Shengdac63782007-02-06 03:00:16 +0000478APInt APInt::operator+(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000479 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000480 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000481 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000482 APInt Result(BitWidth, 0);
483 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000484 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000485}
486
Zhou Shengdac63782007-02-06 03:00:16 +0000487APInt APInt::operator-(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000488 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000489 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000490 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000491 APInt Result(BitWidth, 0);
492 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000493 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000494}
495
Chris Lattner77527f52009-01-21 18:09:24 +0000496bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman5ed61fe2010-11-18 17:14:56 +0000497 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopher820256b2009-08-21 04:06:45 +0000498 return (maskBit(bitPosition) &
Reid Spencera41e93b2007-02-25 19:32:03 +0000499 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengdac63782007-02-06 03:00:16 +0000500}
501
Chris Lattner1ac3e252008-08-20 17:02:31 +0000502bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencera41e93b2007-02-25 19:32:03 +0000503 // Get some facts about the number of bits used in the two operands.
Chris Lattner77527f52009-01-21 18:09:24 +0000504 unsigned n1 = getActiveBits();
505 unsigned n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000506
507 // If the number of bits isn't the same, they aren't equal
Eric Christopher820256b2009-08-21 04:06:45 +0000508 if (n1 != n2)
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000509 return false;
510
Reid Spencera41e93b2007-02-25 19:32:03 +0000511 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000512 if (n1 <= APINT_BITS_PER_WORD)
513 return pVal[0] == RHS.pVal[0];
514
Reid Spencera41e93b2007-02-25 19:32:03 +0000515 // Otherwise, compare everything
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000516 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopher820256b2009-08-21 04:06:45 +0000517 if (pVal[i] != RHS.pVal[i])
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000518 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000519 return true;
520}
521
Chris Lattner1ac3e252008-08-20 17:02:31 +0000522bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000523 unsigned n = getActiveBits();
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000524 if (n <= APINT_BITS_PER_WORD)
525 return pVal[0] == Val;
526 else
527 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000528}
529
Reid Spencer1d072122007-02-16 22:36:51 +0000530bool APInt::ult(const APInt& RHS) const {
531 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
532 if (isSingleWord())
533 return VAL < RHS.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000534
535 // Get active bit length of both operands
Chris Lattner77527f52009-01-21 18:09:24 +0000536 unsigned n1 = getActiveBits();
537 unsigned n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000538
539 // If magnitude of LHS is less than RHS, return true.
540 if (n1 < n2)
541 return true;
542
543 // If magnitude of RHS is greather than LHS, return false.
544 if (n2 < n1)
545 return false;
546
547 // If they bot fit in a word, just compare the low order word
548 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
549 return pVal[0] < RHS.pVal[0];
550
551 // Otherwise, compare all words
Chris Lattner77527f52009-01-21 18:09:24 +0000552 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000553 for (int i = topWord; i >= 0; --i) {
Eric Christopher820256b2009-08-21 04:06:45 +0000554 if (pVal[i] > RHS.pVal[i])
Reid Spencer1d072122007-02-16 22:36:51 +0000555 return false;
Eric Christopher820256b2009-08-21 04:06:45 +0000556 if (pVal[i] < RHS.pVal[i])
Reid Spencera41e93b2007-02-25 19:32:03 +0000557 return true;
Zhou Shengdac63782007-02-06 03:00:16 +0000558 }
559 return false;
560}
561
Reid Spencer1d072122007-02-16 22:36:51 +0000562bool APInt::slt(const APInt& RHS) const {
563 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000564 if (isSingleWord()) {
565 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
566 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
567 return lhsSext < rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000568 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000569
570 APInt lhs(*this);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000571 APInt rhs(RHS);
572 bool lhsNeg = isNegative();
573 bool rhsNeg = rhs.isNegative();
574 if (lhsNeg) {
575 // Sign bit is set so perform two's complement to make it positive
Jay Foad25a5e4c2010-12-01 08:53:58 +0000576 lhs.flipAllBits();
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000577 lhs++;
578 }
Reid Spencer54abdcf2007-02-27 18:23:40 +0000579 if (rhsNeg) {
580 // Sign bit is set so perform two's complement to make it positive
Jay Foad25a5e4c2010-12-01 08:53:58 +0000581 rhs.flipAllBits();
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000582 rhs++;
583 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000584
585 // Now we have unsigned values to compare so do the comparison if necessary
586 // based on the negativeness of the values.
Reid Spencer54abdcf2007-02-27 18:23:40 +0000587 if (lhsNeg)
588 if (rhsNeg)
589 return lhs.ugt(rhs);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000590 else
591 return true;
Reid Spencer54abdcf2007-02-27 18:23:40 +0000592 else if (rhsNeg)
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000593 return false;
Eric Christopher820256b2009-08-21 04:06:45 +0000594 else
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000595 return lhs.ult(rhs);
Zhou Shengdac63782007-02-06 03:00:16 +0000596}
597
Jay Foad25a5e4c2010-12-01 08:53:58 +0000598void APInt::setBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000599 if (isSingleWord())
Reid Spencera41e93b2007-02-25 19:32:03 +0000600 VAL |= maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000601 else
Reid Spencera41e93b2007-02-25 19:32:03 +0000602 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000603}
604
Zhou Shengdac63782007-02-06 03:00:16 +0000605/// Set the given bit to 0 whose position is given as "bitPosition".
606/// @brief Set a given bit to 0.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000607void APInt::clearBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000608 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000609 VAL &= ~maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000610 else
Reid Spencera856b6e2007-02-18 18:38:44 +0000611 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000612}
613
Zhou Shengdac63782007-02-06 03:00:16 +0000614/// @brief Toggle every bit to its opposite value.
Zhou Shengdac63782007-02-06 03:00:16 +0000615
Eric Christopher820256b2009-08-21 04:06:45 +0000616/// Toggle a given bit to its opposite value whose position is given
Zhou Shengdac63782007-02-06 03:00:16 +0000617/// as "bitPosition".
618/// @brief Toggles a given bit to its opposite value.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000619void APInt::flipBit(unsigned bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000620 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad25a5e4c2010-12-01 08:53:58 +0000621 if ((*this)[bitPosition]) clearBit(bitPosition);
622 else setBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000623}
624
Benjamin Kramer92d89982010-07-14 22:38:02 +0000625unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000626 assert(!str.empty() && "Invalid string length");
Douglas Gregor663c0682011-09-14 15:54:46 +0000627 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
628 radix == 36) &&
629 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000630
631 size_t slen = str.size();
Reid Spencer9329e7b2007-04-13 19:19:07 +0000632
Eric Christopher43a1dec2009-08-21 04:10:31 +0000633 // Each computation below needs to know if it's negative.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000634 StringRef::iterator p = str.begin();
Eric Christopher43a1dec2009-08-21 04:10:31 +0000635 unsigned isNegative = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000636 if (*p == '-' || *p == '+') {
637 p++;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000638 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +0000639 assert(slen && "String is only a sign, needs a value.");
Reid Spencer9329e7b2007-04-13 19:19:07 +0000640 }
Eric Christopher43a1dec2009-08-21 04:10:31 +0000641
Reid Spencer9329e7b2007-04-13 19:19:07 +0000642 // For radixes of power-of-two values, the bits required is accurately and
643 // easily computed
644 if (radix == 2)
645 return slen + isNegative;
646 if (radix == 8)
647 return slen * 3 + isNegative;
648 if (radix == 16)
649 return slen * 4 + isNegative;
650
Douglas Gregor663c0682011-09-14 15:54:46 +0000651 // FIXME: base 36
652
Reid Spencer9329e7b2007-04-13 19:19:07 +0000653 // This is grossly inefficient but accurate. We could probably do something
654 // with a computation of roughly slen*64/20 and then adjust by the value of
655 // the first few digits. But, I'm not sure how accurate that could be.
656
657 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000658 // be too large. This avoids the assertion in the constructor. This
659 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
660 // bits in that case.
Douglas Gregor663c0682011-09-14 15:54:46 +0000661 unsigned sufficient
662 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
663 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000664
665 // Convert to the actual binary value.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000666 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000667
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000668 // Compute how many bits are required. If the log is infinite, assume we need
669 // just bit.
670 unsigned log = tmp.logBase2();
671 if (log == (unsigned)-1) {
672 return isNegative + 1;
673 } else {
674 return isNegative + log + 1;
675 }
Reid Spencer9329e7b2007-04-13 19:19:07 +0000676}
677
Stuart Hastings7440952c2009-03-13 21:51:13 +0000678// From http://www.burtleburtle.net, byBob Jenkins.
679// When targeting x86, both GCC and LLVM seem to recognize this as a
680// rotate instruction.
681#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencerb2bc9852007-02-26 21:02:27 +0000682
Stuart Hastings7440952c2009-03-13 21:51:13 +0000683// From http://www.burtleburtle.net, by Bob Jenkins.
684#define mix(a,b,c) \
685 { \
686 a -= c; a ^= rot(c, 4); c += b; \
687 b -= a; b ^= rot(a, 6); a += c; \
688 c -= b; c ^= rot(b, 8); b += a; \
689 a -= c; a ^= rot(c,16); c += b; \
690 b -= a; b ^= rot(a,19); a += c; \
691 c -= b; c ^= rot(b, 4); b += a; \
692 }
693
694// From http://www.burtleburtle.net, by Bob Jenkins.
695#define final(a,b,c) \
696 { \
697 c ^= b; c -= rot(b,14); \
698 a ^= c; a -= rot(c,11); \
699 b ^= a; b -= rot(a,25); \
700 c ^= b; c -= rot(b,16); \
701 a ^= c; a -= rot(c,4); \
702 b ^= a; b -= rot(a,14); \
703 c ^= b; c -= rot(b,24); \
704 }
705
706// hashword() was adapted from http://www.burtleburtle.net, by Bob
707// Jenkins. k is a pointer to an array of uint32_t values; length is
708// the length of the key, in 32-bit chunks. This version only handles
709// keys that are a multiple of 32 bits in size.
710static inline uint32_t hashword(const uint64_t *k64, size_t length)
711{
712 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
713 uint32_t a,b,c;
714
715 /* Set up the internal state */
716 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
717
718 /*------------------------------------------------- handle most of the key */
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000719 while (length > 3) {
720 a += k[0];
721 b += k[1];
722 c += k[2];
723 mix(a,b,c);
724 length -= 3;
725 k += 3;
726 }
Stuart Hastings7440952c2009-03-13 21:51:13 +0000727
728 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stump889285d2009-05-13 23:23:20 +0000729 switch (length) { /* all the case statements fall through */
730 case 3 : c+=k[2];
731 case 2 : b+=k[1];
732 case 1 : a+=k[0];
733 final(a,b,c);
Stuart Hastings7440952c2009-03-13 21:51:13 +0000734 case 0: /* case 0: nothing left to add */
735 break;
736 }
737 /*------------------------------------------------------ report the result */
738 return c;
739}
740
741// hashword8() was adapted from http://www.burtleburtle.net, by Bob
742// Jenkins. This computes a 32-bit hash from one 64-bit word. When
743// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
744// function into about 35 instructions when inlined.
745static inline uint32_t hashword8(const uint64_t k64)
746{
747 uint32_t a,b,c;
748 a = b = c = 0xdeadbeef + 4;
749 b += k64 >> 32;
750 a += k64 & 0xffffffff;
751 final(a,b,c);
752 return c;
753}
754#undef final
755#undef mix
756#undef rot
757
758uint64_t APInt::getHashValue() const {
759 uint64_t hash;
Reid Spencerb2bc9852007-02-26 21:02:27 +0000760 if (isSingleWord())
Stuart Hastings7440952c2009-03-13 21:51:13 +0000761 hash = hashword8(VAL);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000762 else
Stuart Hastings7440952c2009-03-13 21:51:13 +0000763 hash = hashword(pVal, getNumWords()*2);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000764 return hash;
765}
766
Zhou Shengdac63782007-02-06 03:00:16 +0000767/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000768APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000769 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000770}
771
772/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000773APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopher820256b2009-08-21 04:06:45 +0000774 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencer1d072122007-02-16 22:36:51 +0000775 BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000776}
777
Chris Lattner77527f52009-01-21 18:09:24 +0000778unsigned APInt::countLeadingZerosSlowCase() const {
John McCalldf951bd2010-02-03 03:42:44 +0000779 // Treat the most significand word differently because it might have
780 // meaningless bits set beyond the precision.
781 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
782 integerPart MSWMask;
783 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
784 else {
785 MSWMask = ~integerPart(0);
786 BitsInMSW = APINT_BITS_PER_WORD;
787 }
788
789 unsigned i = getNumWords();
790 integerPart MSW = pVal[i-1] & MSWMask;
791 if (MSW)
792 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
793
794 unsigned Count = BitsInMSW;
795 for (--i; i > 0u; --i) {
Chris Lattner1ac3e252008-08-20 17:02:31 +0000796 if (pVal[i-1] == 0)
797 Count += APINT_BITS_PER_WORD;
798 else {
799 Count += CountLeadingZeros_64(pVal[i-1]);
800 break;
Reid Spencer74cf82e2007-02-21 00:29:48 +0000801 }
Zhou Shengdac63782007-02-06 03:00:16 +0000802 }
John McCalldf951bd2010-02-03 03:42:44 +0000803 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000804}
805
Chris Lattner77527f52009-01-21 18:09:24 +0000806static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
807 unsigned Count = 0;
Reid Spencer31acef52007-02-27 21:59:26 +0000808 if (skip)
809 V <<= skip;
810 while (V && (V & (1ULL << 63))) {
811 Count++;
812 V <<= 1;
813 }
814 return Count;
815}
816
Chris Lattner77527f52009-01-21 18:09:24 +0000817unsigned APInt::countLeadingOnes() const {
Reid Spencer31acef52007-02-27 21:59:26 +0000818 if (isSingleWord())
819 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
820
Chris Lattner77527f52009-01-21 18:09:24 +0000821 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwinec39eb82009-01-27 18:06:03 +0000822 unsigned shift;
823 if (!highWordBits) {
824 highWordBits = APINT_BITS_PER_WORD;
825 shift = 0;
826 } else {
827 shift = APINT_BITS_PER_WORD - highWordBits;
828 }
Reid Spencer31acef52007-02-27 21:59:26 +0000829 int i = getNumWords() - 1;
Chris Lattner77527f52009-01-21 18:09:24 +0000830 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer31acef52007-02-27 21:59:26 +0000831 if (Count == highWordBits) {
832 for (i--; i >= 0; --i) {
833 if (pVal[i] == -1ULL)
834 Count += APINT_BITS_PER_WORD;
835 else {
836 Count += countLeadingOnes_64(pVal[i], 0);
837 break;
838 }
839 }
840 }
841 return Count;
842}
843
Chris Lattner77527f52009-01-21 18:09:24 +0000844unsigned APInt::countTrailingZeros() const {
Zhou Shengdac63782007-02-06 03:00:16 +0000845 if (isSingleWord())
Chris Lattner77527f52009-01-21 18:09:24 +0000846 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
847 unsigned Count = 0;
848 unsigned i = 0;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000849 for (; i < getNumWords() && pVal[i] == 0; ++i)
850 Count += APINT_BITS_PER_WORD;
851 if (i < getNumWords())
852 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattnerc2c4c742007-11-23 22:36:25 +0000853 return std::min(Count, BitWidth);
Zhou Shengdac63782007-02-06 03:00:16 +0000854}
855
Chris Lattner77527f52009-01-21 18:09:24 +0000856unsigned APInt::countTrailingOnesSlowCase() const {
857 unsigned Count = 0;
858 unsigned i = 0;
Dan Gohmanc354ebd2008-02-14 22:38:45 +0000859 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000860 Count += APINT_BITS_PER_WORD;
861 if (i < getNumWords())
862 Count += CountTrailingOnes_64(pVal[i]);
863 return std::min(Count, BitWidth);
864}
865
Chris Lattner77527f52009-01-21 18:09:24 +0000866unsigned APInt::countPopulationSlowCase() const {
867 unsigned Count = 0;
868 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengdac63782007-02-06 03:00:16 +0000869 Count += CountPopulation_64(pVal[i]);
870 return Count;
871}
872
Richard Smith4f9a8082011-11-23 21:33:37 +0000873/// Perform a logical right-shift from Src to Dst, which must be equal or
874/// non-overlapping, of Words words, by Shift, which must be less than 64.
875static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
876 unsigned Shift) {
877 uint64_t Carry = 0;
878 for (int I = Words - 1; I >= 0; --I) {
879 uint64_t Tmp = Src[I];
880 Dst[I] = (Tmp >> Shift) | Carry;
881 Carry = Tmp << (64 - Shift);
882 }
883}
884
Reid Spencer1d072122007-02-16 22:36:51 +0000885APInt APInt::byteSwap() const {
886 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
887 if (BitWidth == 16)
Jeff Cohene06855e2007-03-20 20:42:36 +0000888 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000889 if (BitWidth == 32)
Chris Lattner77527f52009-01-21 18:09:24 +0000890 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000891 if (BitWidth == 48) {
Chris Lattner77527f52009-01-21 18:09:24 +0000892 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000893 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohene06855e2007-03-20 20:42:36 +0000894 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000895 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohene06855e2007-03-20 20:42:36 +0000896 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000897 }
Richard Smith4f9a8082011-11-23 21:33:37 +0000898 if (BitWidth == 64)
899 return APInt(BitWidth, ByteSwap_64(VAL));
900
901 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
902 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
903 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
904 if (Result.BitWidth != BitWidth) {
905 lshrNear(Result.pVal, Result.pVal, getNumWords(),
906 Result.BitWidth - BitWidth);
907 Result.BitWidth = BitWidth;
908 }
909 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000910}
911
Eric Christopher820256b2009-08-21 04:06:45 +0000912APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000913 const APInt& API2) {
Zhou Shengdac63782007-02-06 03:00:16 +0000914 APInt A = API1, B = API2;
915 while (!!B) {
916 APInt T = B;
Reid Spencer1d072122007-02-16 22:36:51 +0000917 B = APIntOps::urem(A, B);
Zhou Shengdac63782007-02-06 03:00:16 +0000918 A = T;
919 }
920 return A;
921}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000922
Chris Lattner77527f52009-01-21 18:09:24 +0000923APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000924 union {
925 double D;
926 uint64_t I;
927 } T;
928 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000929
930 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000931 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000932
933 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000934 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000935
936 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000937 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000938 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000939
940 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
941 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
942
943 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000944 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000945 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000946 APInt(width, mantissa >> (52 - exp));
947
948 // If the client didn't provide enough bits for us to shift the mantissa into
949 // then the result is undefined, just return 0
950 if (width <= exp - 52)
951 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000952
953 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000954 APInt Tmp(width, mantissa);
Chris Lattner77527f52009-01-21 18:09:24 +0000955 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd707d632007-02-12 20:02:55 +0000956 return isNeg ? -Tmp : Tmp;
957}
958
Dale Johannesen54be7852009-08-12 18:04:11 +0000959/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000960/// The layout for double is as following (IEEE Standard 754):
961/// --------------------------------------
962/// | Sign Exponent Fraction Bias |
963/// |-------------------------------------- |
964/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000965/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000966double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000967
968 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000969 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000970 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
971 if (isSigned) {
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000972 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000973 return double(sext);
974 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000975 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000976 }
977
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000978 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000979 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000980
981 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000982 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000983
984 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000985 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000986
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000987 // The exponent (without bias normalization) is just the number of bits
988 // we are using. Note that the sign bit is gone since we constructed the
989 // absolute value.
990 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000991
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000992 // Return infinity for exponent overflow
993 if (exp > 1023) {
994 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000995 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000996 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000997 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000998 }
999 exp += 1023; // Increment for 1023 bias
1000
1001 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
1002 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +00001003 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001004 unsigned hiWord = whichWord(n-1);
1005 if (hiWord == 0) {
1006 mantissa = Tmp.pVal[0];
1007 if (n > 52)
1008 mantissa >>= n - 52; // shift down, we want the top 52 bits.
1009 } else {
1010 assert(hiWord > 0 && "huh?");
1011 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
1012 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
1013 mantissa = hibits | lobits;
1014 }
1015
Zhou Shengd707d632007-02-12 20:02:55 +00001016 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +00001017 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +00001018 union {
1019 double D;
1020 uint64_t I;
1021 } T;
1022 T.I = sign | (exp << 52) | mantissa;
1023 return T.D;
1024}
1025
Reid Spencer1d072122007-02-16 22:36:51 +00001026// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001027APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001028 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +00001029 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +00001030
1031 if (width <= APINT_BITS_PER_WORD)
1032 return APInt(width, getRawData()[0]);
1033
1034 APInt Result(getMemory(getNumWords(width)), width);
1035
1036 // Copy full words.
1037 unsigned i;
1038 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1039 Result.pVal[i] = pVal[i];
1040
1041 // Truncate and copy any partial word.
1042 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1043 if (bits != 0)
1044 Result.pVal[i] = pVal[i] << bits >> bits;
1045
1046 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001047}
1048
1049// Sign extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001050APInt APInt::sext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001051 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001052
1053 if (width <= APINT_BITS_PER_WORD) {
1054 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1055 val = (int64_t)val >> (width - BitWidth);
1056 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001057 }
1058
Jay Foad583abbc2010-12-07 08:25:19 +00001059 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001060
Jay Foad583abbc2010-12-07 08:25:19 +00001061 // Copy full words.
1062 unsigned i;
1063 uint64_t word = 0;
1064 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1065 word = getRawData()[i];
1066 Result.pVal[i] = word;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001067 }
1068
Jay Foad583abbc2010-12-07 08:25:19 +00001069 // Read and sign-extend any partial word.
1070 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1071 if (bits != 0)
1072 word = (int64_t)getRawData()[i] << bits >> bits;
1073 else
1074 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1075
1076 // Write remaining full words.
1077 for (; i != width / APINT_BITS_PER_WORD; i++) {
1078 Result.pVal[i] = word;
1079 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001080 }
Jay Foad583abbc2010-12-07 08:25:19 +00001081
1082 // Write any partial word.
1083 bits = (0 - width) % APINT_BITS_PER_WORD;
1084 if (bits != 0)
1085 Result.pVal[i] = word << bits >> bits;
1086
1087 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001088}
1089
1090// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001091APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001092 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001093
1094 if (width <= APINT_BITS_PER_WORD)
1095 return APInt(width, VAL);
1096
1097 APInt Result(getMemory(getNumWords(width)), width);
1098
1099 // Copy words.
1100 unsigned i;
1101 for (i = 0; i != getNumWords(); i++)
1102 Result.pVal[i] = getRawData()[i];
1103
1104 // Zero remaining words.
1105 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1106
1107 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001108}
1109
Jay Foad583abbc2010-12-07 08:25:19 +00001110APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001111 if (BitWidth < width)
1112 return zext(width);
1113 if (BitWidth > width)
1114 return trunc(width);
1115 return *this;
1116}
1117
Jay Foad583abbc2010-12-07 08:25:19 +00001118APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001119 if (BitWidth < width)
1120 return sext(width);
1121 if (BitWidth > width)
1122 return trunc(width);
1123 return *this;
1124}
1125
Rafael Espindolabb893fe2012-01-27 23:33:07 +00001126APInt APInt::zextOrSelf(unsigned width) const {
1127 if (BitWidth < width)
1128 return zext(width);
1129 return *this;
1130}
1131
1132APInt APInt::sextOrSelf(unsigned width) const {
1133 if (BitWidth < width)
1134 return sext(width);
1135 return *this;
1136}
1137
Zhou Shenge93db8f2007-02-09 07:48:24 +00001138/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001139/// @brief Arithmetic right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001140APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001141 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001142}
1143
1144/// Arithmetic right-shift this APInt by shiftAmt.
1145/// @brief Arithmetic right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001146APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001147 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer1825dd02007-03-02 22:39:11 +00001148 // Handle a degenerate case
1149 if (shiftAmt == 0)
1150 return *this;
1151
1152 // Handle single word shifts with built-in ashr
Reid Spencer522ca7c2007-02-25 01:56:07 +00001153 if (isSingleWord()) {
1154 if (shiftAmt == BitWidth)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001155 return APInt(BitWidth, 0); // undefined
1156 else {
Chris Lattner77527f52009-01-21 18:09:24 +00001157 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopher820256b2009-08-21 04:06:45 +00001158 return APInt(BitWidth,
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001159 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1160 }
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001161 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001162
Reid Spencer1825dd02007-03-02 22:39:11 +00001163 // If all the bits were shifted out, the result is, technically, undefined.
1164 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1165 // issues in the algorithm below.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001166 if (shiftAmt == BitWidth) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001167 if (isNegative())
Zhou Sheng1247c072008-06-05 13:27:38 +00001168 return APInt(BitWidth, -1ULL, true);
Reid Spencera41e93b2007-02-25 19:32:03 +00001169 else
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001170 return APInt(BitWidth, 0);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001171 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001172
1173 // Create some space for the result.
1174 uint64_t * val = new uint64_t[getNumWords()];
1175
Reid Spencer1825dd02007-03-02 22:39:11 +00001176 // Compute some values needed by the following shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001177 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1178 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1179 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1180 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer1825dd02007-03-02 22:39:11 +00001181 if (bitsInWord == 0)
1182 bitsInWord = APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001183
1184 // If we are shifting whole words, just move whole words
1185 if (wordShift == 0) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001186 // Move the words containing significant bits
Chris Lattner77527f52009-01-21 18:09:24 +00001187 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001188 val[i] = pVal[i+offset]; // move whole word
1189
1190 // Adjust the top significant word for sign bit fill, if negative
1191 if (isNegative())
1192 if (bitsInWord < APINT_BITS_PER_WORD)
1193 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1194 } else {
Eric Christopher820256b2009-08-21 04:06:45 +00001195 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001196 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001197 // This combines the shifted corresponding word with the low bits from
1198 // the next word (shifted into this word's high bits).
Eric Christopher820256b2009-08-21 04:06:45 +00001199 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer1825dd02007-03-02 22:39:11 +00001200 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1201 }
1202
1203 // Shift the break word. In this case there are no bits from the next word
1204 // to include in this word.
1205 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1206
1207 // Deal with sign extenstion in the break word, and possibly the word before
1208 // it.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001209 if (isNegative()) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001210 if (wordShift > bitsInWord) {
1211 if (breakWord > 0)
Eric Christopher820256b2009-08-21 04:06:45 +00001212 val[breakWord-1] |=
Reid Spencer1825dd02007-03-02 22:39:11 +00001213 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1214 val[breakWord] |= ~0ULL;
Eric Christopher820256b2009-08-21 04:06:45 +00001215 } else
Reid Spencer1825dd02007-03-02 22:39:11 +00001216 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnerdad2d092007-05-03 18:15:36 +00001217 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001218 }
1219
Reid Spencer1825dd02007-03-02 22:39:11 +00001220 // Remaining words are 0 or -1, just assign them.
1221 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner77527f52009-01-21 18:09:24 +00001222 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001223 val[i] = fillValue;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001224 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001225}
1226
Zhou Shenge93db8f2007-02-09 07:48:24 +00001227/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001228/// @brief Logical right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001229APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001230 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001231}
1232
1233/// Logical right-shift this APInt by shiftAmt.
1234/// @brief Logical right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001235APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnerdad2d092007-05-03 18:15:36 +00001236 if (isSingleWord()) {
Ahmed Charles0dca5d82012-02-24 19:06:15 +00001237 if (shiftAmt >= BitWidth)
Reid Spencer522ca7c2007-02-25 01:56:07 +00001238 return APInt(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001239 else
Reid Spencer522ca7c2007-02-25 01:56:07 +00001240 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001241 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001242
Reid Spencer44eef162007-02-26 01:19:48 +00001243 // If all the bits were shifted out, the result is 0. This avoids issues
1244 // with shifting by the size of the integer type, which produces undefined
1245 // results. We define these "undefined results" to always be 0.
1246 if (shiftAmt == BitWidth)
1247 return APInt(BitWidth, 0);
1248
Reid Spencerfffdf102007-05-17 06:26:29 +00001249 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopher820256b2009-08-21 04:06:45 +00001250 // issues with shifting by the size of the integer type, which produces
Reid Spencerfffdf102007-05-17 06:26:29 +00001251 // undefined results in the code below. This is also an optimization.
1252 if (shiftAmt == 0)
1253 return *this;
1254
Reid Spencer44eef162007-02-26 01:19:48 +00001255 // Create some space for the result.
1256 uint64_t * val = new uint64_t[getNumWords()];
1257
1258 // If we are shifting less than a word, compute the shift with a simple carry
1259 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smith4f9a8082011-11-23 21:33:37 +00001260 lshrNear(val, pVal, getNumWords(), shiftAmt);
Reid Spencer44eef162007-02-26 01:19:48 +00001261 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencera41e93b2007-02-25 19:32:03 +00001262 }
1263
Reid Spencer44eef162007-02-26 01:19:48 +00001264 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001265 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1266 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer44eef162007-02-26 01:19:48 +00001267
1268 // If we are shifting whole words, just move whole words
1269 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001270 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001271 val[i] = pVal[i+offset];
Chris Lattner77527f52009-01-21 18:09:24 +00001272 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencer44eef162007-02-26 01:19:48 +00001273 val[i] = 0;
1274 return APInt(val,BitWidth).clearUnusedBits();
1275 }
1276
Eric Christopher820256b2009-08-21 04:06:45 +00001277 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001278 unsigned breakWord = getNumWords() - offset -1;
1279 for (unsigned i = 0; i < breakWord; ++i)
Reid Spencerd99feaf2007-03-01 05:39:56 +00001280 val[i] = (pVal[i+offset] >> wordShift) |
1281 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencer44eef162007-02-26 01:19:48 +00001282 // Shift the break word.
1283 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1284
1285 // Remaining words are 0
Chris Lattner77527f52009-01-21 18:09:24 +00001286 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001287 val[i] = 0;
1288 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001289}
1290
Zhou Shenge93db8f2007-02-09 07:48:24 +00001291/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001292/// @brief Left-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001293APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky030c4502009-01-19 17:42:33 +00001294 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner77527f52009-01-21 18:09:24 +00001295 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001296}
1297
Chris Lattner77527f52009-01-21 18:09:24 +00001298APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencera5c84d92007-02-25 00:56:44 +00001299 // If all the bits were shifted out, the result is 0. This avoids issues
1300 // with shifting by the size of the integer type, which produces undefined
1301 // results. We define these "undefined results" to always be 0.
1302 if (shiftAmt == BitWidth)
1303 return APInt(BitWidth, 0);
1304
Reid Spencer81ee0202007-05-12 18:01:57 +00001305 // If none of the bits are shifted out, the result is *this. This avoids a
1306 // lshr by the words size in the loop below which can produce incorrect
1307 // results. It also avoids the expensive computation below for a common case.
1308 if (shiftAmt == 0)
1309 return *this;
1310
Reid Spencera5c84d92007-02-25 00:56:44 +00001311 // Create some space for the result.
1312 uint64_t * val = new uint64_t[getNumWords()];
1313
1314 // If we are shifting less than a word, do it the easy way
1315 if (shiftAmt < APINT_BITS_PER_WORD) {
1316 uint64_t carry = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001317 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencera5c84d92007-02-25 00:56:44 +00001318 val[i] = pVal[i] << shiftAmt | carry;
1319 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1320 }
Reid Spencera41e93b2007-02-25 19:32:03 +00001321 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer632ebdf2007-02-24 20:19:37 +00001322 }
1323
Reid Spencera5c84d92007-02-25 00:56:44 +00001324 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001325 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1326 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencera5c84d92007-02-25 00:56:44 +00001327
1328 // If we are shifting whole words, just move whole words
1329 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001330 for (unsigned i = 0; i < offset; i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001331 val[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001332 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001333 val[i] = pVal[i-offset];
Reid Spencera41e93b2007-02-25 19:32:03 +00001334 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer632ebdf2007-02-24 20:19:37 +00001335 }
Reid Spencera5c84d92007-02-25 00:56:44 +00001336
1337 // Copy whole words from this to Result.
Chris Lattner77527f52009-01-21 18:09:24 +00001338 unsigned i = getNumWords() - 1;
Reid Spencera5c84d92007-02-25 00:56:44 +00001339 for (; i > offset; --i)
1340 val[i] = pVal[i-offset] << wordShift |
1341 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencerab0e08a2007-02-25 01:08:58 +00001342 val[offset] = pVal[0] << wordShift;
Reid Spencera5c84d92007-02-25 00:56:44 +00001343 for (i = 0; i < offset; ++i)
1344 val[i] = 0;
Reid Spencera41e93b2007-02-25 19:32:03 +00001345 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001346}
1347
Dan Gohman105c1d42008-02-29 01:40:47 +00001348APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001349 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001350}
1351
Chris Lattner77527f52009-01-21 18:09:24 +00001352APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001353 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001354 if (rotateAmt == 0)
1355 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001356 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001357}
1358
Dan Gohman105c1d42008-02-29 01:40:47 +00001359APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001360 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001361}
1362
Chris Lattner77527f52009-01-21 18:09:24 +00001363APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001364 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001365 if (rotateAmt == 0)
1366 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001367 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001368}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001369
1370// Square Root - this method computes and returns the square root of "this".
1371// Three mechanisms are used for computation. For small values (<= 5 bits),
1372// a table lookup is done. This gets some performance for common cases. For
1373// values using less than 52 bits, the value is converted to double and then
1374// the libc sqrt function is called. The result is rounded and then converted
1375// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001376// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001377APInt APInt::sqrt() const {
1378
1379 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001380 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001381
1382 // Use a fast table for some small values. This also gets rid of some
1383 // rounding errors in libc sqrt for small values.
1384 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001385 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001386 /* 0 */ 0,
1387 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001388 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001389 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1390 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1391 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1392 /* 31 */ 6
1393 };
1394 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001395 }
1396
1397 // If the magnitude of the value fits in less than 52 bits (the precision of
1398 // an IEEE double precision floating point value), then we can use the
1399 // libc sqrt function which will probably use a hardware sqrt computation.
1400 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001401 if (magnitude < 52) {
Chris Lattner9e01b612010-05-15 17:11:55 +00001402#if HAVE_ROUND
Eric Christopher820256b2009-08-21 04:06:45 +00001403 return APInt(BitWidth,
Reid Spencerd99feaf2007-03-01 05:39:56 +00001404 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner9e01b612010-05-15 17:11:55 +00001405#else
1406 return APInt(BitWidth,
Chris Lattner9f1d2de2011-05-22 06:03:53 +00001407 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0])) + 0.5));
Jeff Cohenb622c112007-03-05 00:00:42 +00001408#endif
1409 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001410
1411 // Okay, all the short cuts are exhausted. We must compute it. The following
1412 // is a classical Babylonian method for computing the square root. This code
1413 // was adapted to APINt from a wikipedia article on such computations.
1414 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001415 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001416 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001417 APInt testy(BitWidth, 16);
1418 APInt x_old(BitWidth, 1);
1419 APInt x_new(BitWidth, 0);
1420 APInt two(BitWidth, 2);
1421
1422 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001423 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001424 if (i >= nbits || this->ule(testy)) {
1425 x_old = x_old.shl(i / 2);
1426 break;
1427 }
1428
Eric Christopher820256b2009-08-21 04:06:45 +00001429 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001430 for (;;) {
1431 x_new = (this->udiv(x_old) + x_old).udiv(two);
1432 if (x_old.ule(x_new))
1433 break;
1434 x_old = x_new;
1435 }
1436
1437 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001438 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001439 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001440 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001441 // floating point representation after 192 bits. There are no discrepancies
1442 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001443 APInt square(x_old * x_old);
1444 APInt nextSquare((x_old + 1) * (x_old +1));
1445 if (this->ult(square))
1446 return x_old;
David Blaikie54c94622011-12-01 20:58:30 +00001447 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1448 APInt midpoint((nextSquare - square).udiv(two));
1449 APInt offset(*this - square);
1450 if (offset.ult(midpoint))
1451 return x_old;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001452 return x_old + 1;
1453}
1454
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001455/// Computes the multiplicative inverse of this APInt for a given modulo. The
1456/// iterative extended Euclidean algorithm is used to solve for this value,
1457/// however we simplify it to speed up calculating only the inverse, and take
1458/// advantage of div+rem calculations. We also use some tricks to avoid copying
1459/// (potentially large) APInts around.
1460APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1461 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1462
1463 // Using the properties listed at the following web page (accessed 06/21/08):
1464 // http://www.numbertheory.org/php/euclid.html
1465 // (especially the properties numbered 3, 4 and 9) it can be proved that
1466 // BitWidth bits suffice for all the computations in the algorithm implemented
1467 // below. More precisely, this number of bits suffice if the multiplicative
1468 // inverse exists, but may not suffice for the general extended Euclidean
1469 // algorithm.
1470
1471 APInt r[2] = { modulo, *this };
1472 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1473 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001474
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001475 unsigned i;
1476 for (i = 0; r[i^1] != 0; i ^= 1) {
1477 // An overview of the math without the confusing bit-flipping:
1478 // q = r[i-2] / r[i-1]
1479 // r[i] = r[i-2] % r[i-1]
1480 // t[i] = t[i-2] - t[i-1] * q
1481 udivrem(r[i], r[i^1], q, r[i]);
1482 t[i] -= t[i^1] * q;
1483 }
1484
1485 // If this APInt and the modulo are not coprime, there is no multiplicative
1486 // inverse, so return 0. We check this by looking at the next-to-last
1487 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1488 // algorithm.
1489 if (r[i] != 1)
1490 return APInt(BitWidth, 0);
1491
1492 // The next-to-last t is the multiplicative inverse. However, we are
1493 // interested in a positive inverse. Calcuate a positive one from a negative
1494 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001495 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001496 return t[i].isNegative() ? t[i] + modulo : t[i];
1497}
1498
Jay Foadfe0c6482009-04-30 10:15:35 +00001499/// Calculate the magic numbers required to implement a signed integer division
1500/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1501/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1502/// Warren, Jr., chapter 10.
1503APInt::ms APInt::magic() const {
1504 const APInt& d = *this;
1505 unsigned p;
1506 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001507 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001508 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001509
Jay Foadfe0c6482009-04-30 10:15:35 +00001510 ad = d.abs();
1511 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1512 anc = t - 1 - t.urem(ad); // absolute value of nc
1513 p = d.getBitWidth() - 1; // initialize p
1514 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1515 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1516 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1517 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1518 do {
1519 p = p + 1;
1520 q1 = q1<<1; // update q1 = 2p/abs(nc)
1521 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1522 if (r1.uge(anc)) { // must be unsigned comparison
1523 q1 = q1 + 1;
1524 r1 = r1 - anc;
1525 }
1526 q2 = q2<<1; // update q2 = 2p/abs(d)
1527 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1528 if (r2.uge(ad)) { // must be unsigned comparison
1529 q2 = q2 + 1;
1530 r2 = r2 - ad;
1531 }
1532 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001533 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001534
Jay Foadfe0c6482009-04-30 10:15:35 +00001535 mag.m = q2 + 1;
1536 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1537 mag.s = p - d.getBitWidth(); // resulting shift
1538 return mag;
1539}
1540
1541/// Calculate the magic numbers required to implement an unsigned integer
1542/// division by a constant as a sequence of multiplies, adds and shifts.
1543/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1544/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001545/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001546/// of the divided value are known zero.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001547APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001548 const APInt& d = *this;
1549 unsigned p;
1550 APInt nc, delta, q1, r1, q2, r2;
1551 struct mu magu;
1552 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001553 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001554 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1555 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1556
1557 nc = allOnes - (-d).urem(d);
1558 p = d.getBitWidth() - 1; // initialize p
1559 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1560 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1561 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1562 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1563 do {
1564 p = p + 1;
1565 if (r1.uge(nc - r1)) {
1566 q1 = q1 + q1 + 1; // update q1
1567 r1 = r1 + r1 - nc; // update r1
1568 }
1569 else {
1570 q1 = q1+q1; // update q1
1571 r1 = r1+r1; // update r1
1572 }
1573 if ((r2 + 1).uge(d - r2)) {
1574 if (q2.uge(signedMax)) magu.a = 1;
1575 q2 = q2+q2 + 1; // update q2
1576 r2 = r2+r2 + 1 - d; // update r2
1577 }
1578 else {
1579 if (q2.uge(signedMin)) magu.a = 1;
1580 q2 = q2+q2; // update q2
1581 r2 = r2+r2 + 1; // update r2
1582 }
1583 delta = d - 1 - r2;
1584 } while (p < d.getBitWidth()*2 &&
1585 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1586 magu.m = q2 + 1; // resulting magic number
1587 magu.s = p - d.getBitWidth(); // resulting shift
1588 return magu;
1589}
1590
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001591/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1592/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1593/// variables here have the same names as in the algorithm. Comments explain
1594/// the algorithm and any deviation from it.
Chris Lattner77527f52009-01-21 18:09:24 +00001595static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1596 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001597 assert(u && "Must provide dividend");
1598 assert(v && "Must provide divisor");
1599 assert(q && "Must provide quotient");
Reid Spencera5e0d202007-02-24 03:58:46 +00001600 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001601 assert(n>1 && "n must be > 1");
1602
1603 // Knuth uses the value b as the base of the number system. In our case b
1604 // is 2^31 so we just set it to -1u.
1605 uint64_t b = uint64_t(1) << 32;
1606
Chris Lattner17f71652008-08-17 07:19:36 +00001607#if 0
David Greenef32fcb42010-01-05 01:28:52 +00001608 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1609 DEBUG(dbgs() << "KnuthDiv: original:");
1610 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1611 DEBUG(dbgs() << " by");
1612 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1613 DEBUG(dbgs() << '\n');
Chris Lattner17f71652008-08-17 07:19:36 +00001614#endif
Eric Christopher820256b2009-08-21 04:06:45 +00001615 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1616 // u and v by d. Note that we have taken Knuth's advice here to use a power
1617 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1618 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001619 // shift amount from the leading zeros. We are basically normalizing the u
1620 // and v so that its high bits are shifted to the top of v's range without
1621 // overflow. Note that this can require an extra word in u so that u must
1622 // be of length m+n+1.
Chris Lattner77527f52009-01-21 18:09:24 +00001623 unsigned shift = CountLeadingZeros_32(v[n-1]);
1624 unsigned v_carry = 0;
1625 unsigned u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001626 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001627 for (unsigned i = 0; i < m+n; ++i) {
1628 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001629 u[i] = (u[i] << shift) | u_carry;
1630 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001631 }
Chris Lattner77527f52009-01-21 18:09:24 +00001632 for (unsigned i = 0; i < n; ++i) {
1633 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001634 v[i] = (v[i] << shift) | v_carry;
1635 v_carry = v_tmp;
1636 }
1637 }
1638 u[m+n] = u_carry;
Chris Lattner17f71652008-08-17 07:19:36 +00001639#if 0
David Greenef32fcb42010-01-05 01:28:52 +00001640 DEBUG(dbgs() << "KnuthDiv: normal:");
1641 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1642 DEBUG(dbgs() << " by");
1643 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1644 DEBUG(dbgs() << '\n');
Chris Lattner17f71652008-08-17 07:19:36 +00001645#endif
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001646
1647 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1648 int j = m;
1649 do {
David Greenef32fcb42010-01-05 01:28:52 +00001650 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001651 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001652 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1653 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1654 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1655 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1656 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001657 // value qp is one too large, and it eliminates all cases where qp is two
1658 // too large.
Reid Spencercb292e42007-02-23 01:57:13 +00001659 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greenef32fcb42010-01-05 01:28:52 +00001660 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001661 uint64_t qp = dividend / v[n-1];
1662 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001663 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1664 qp--;
1665 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001666 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001667 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001668 }
David Greenef32fcb42010-01-05 01:28:52 +00001669 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001670
Reid Spencercb292e42007-02-23 01:57:13 +00001671 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1672 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1673 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001674 // a subtraction.
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001675 bool isNeg = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001676 for (unsigned i = 0; i < n; ++i) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001677 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencera5e0d202007-02-24 03:58:46 +00001678 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001679 bool borrow = subtrahend > u_tmp;
David Greenef32fcb42010-01-05 01:28:52 +00001680 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbar763ace92009-07-13 05:27:30 +00001681 << ", subtrahend == " << subtrahend
1682 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001683
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001684 uint64_t result = u_tmp - subtrahend;
Chris Lattner77527f52009-01-21 18:09:24 +00001685 unsigned k = j + i;
1686 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1687 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001688 while (borrow && k <= m+n) { // deal with borrow to the left
1689 borrow = u[k] == 0;
1690 u[k]--;
1691 k++;
1692 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001693 isNeg |= borrow;
David Greenef32fcb42010-01-05 01:28:52 +00001694 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopher820256b2009-08-21 04:06:45 +00001695 u[j+i+1] << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001696 }
David Greenef32fcb42010-01-05 01:28:52 +00001697 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1698 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1699 DEBUG(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001700 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1701 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001702 // true value plus b**(n+1), namely as the b's complement of
Reid Spencercb292e42007-02-23 01:57:13 +00001703 // the true value, and a "borrow" to the left should be remembered.
1704 //
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001705 if (isNeg) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001706 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner77527f52009-01-21 18:09:24 +00001707 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001708 u[i] = ~u[i] + carry; // b's complement
1709 carry = carry && u[i] == 0;
Reid Spencera5e0d202007-02-24 03:58:46 +00001710 }
Reid Spencercb292e42007-02-23 01:57:13 +00001711 }
David Greenef32fcb42010-01-05 01:28:52 +00001712 DEBUG(dbgs() << "KnuthDiv: after complement:");
1713 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1714 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001715
Eric Christopher820256b2009-08-21 04:06:45 +00001716 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001717 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner77527f52009-01-21 18:09:24 +00001718 q[j] = (unsigned)qp;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001719 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001720 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001721 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001722 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001723 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001724 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1725 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001726 // since it cancels with the borrow that occurred in D4.
1727 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001728 for (unsigned i = 0; i < n; i++) {
1729 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001730 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001731 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001732 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001733 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001734 }
David Greenef32fcb42010-01-05 01:28:52 +00001735 DEBUG(dbgs() << "KnuthDiv: after correction:");
1736 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1737 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001738
Reid Spencercb292e42007-02-23 01:57:13 +00001739 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1740 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001741
David Greenef32fcb42010-01-05 01:28:52 +00001742 DEBUG(dbgs() << "KnuthDiv: quotient:");
1743 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1744 DEBUG(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001745
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001746 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1747 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1748 // compute the remainder (urem uses this).
1749 if (r) {
1750 // The value d is expressed by the "shift" value above since we avoided
1751 // multiplication by d by using a shift left. So, all we have to do is
1752 // shift right here. In order to mak
Reid Spencer468ad9112007-02-24 20:38:01 +00001753 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001754 unsigned carry = 0;
David Greenef32fcb42010-01-05 01:28:52 +00001755 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001756 for (int i = n-1; i >= 0; i--) {
1757 r[i] = (u[i] >> shift) | carry;
1758 carry = u[i] << (32 - shift);
David Greenef32fcb42010-01-05 01:28:52 +00001759 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001760 }
1761 } else {
1762 for (int i = n-1; i >= 0; i--) {
1763 r[i] = u[i];
David Greenef32fcb42010-01-05 01:28:52 +00001764 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001765 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001766 }
David Greenef32fcb42010-01-05 01:28:52 +00001767 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001768 }
Chris Lattner17f71652008-08-17 07:19:36 +00001769#if 0
David Greenef32fcb42010-01-05 01:28:52 +00001770 DEBUG(dbgs() << '\n');
Chris Lattner17f71652008-08-17 07:19:36 +00001771#endif
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001772}
1773
Chris Lattner77527f52009-01-21 18:09:24 +00001774void APInt::divide(const APInt LHS, unsigned lhsWords,
1775 const APInt &RHS, unsigned rhsWords,
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001776 APInt *Quotient, APInt *Remainder)
1777{
1778 assert(lhsWords >= rhsWords && "Fractional result");
1779
Eric Christopher820256b2009-08-21 04:06:45 +00001780 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001781 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001782 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001783 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1784 // can't use 64-bit operands here because we don't have native results of
1785 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001786 // work on large-endian machines.
Dan Gohmancff69532009-04-01 18:45:54 +00001787 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner77527f52009-01-21 18:09:24 +00001788 unsigned n = rhsWords * 2;
1789 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001790
1791 // Allocate space for the temporary values we need either on the stack, if
1792 // it will fit, or on the heap if it won't.
Chris Lattner77527f52009-01-21 18:09:24 +00001793 unsigned SPACE[128];
1794 unsigned *U = 0;
1795 unsigned *V = 0;
1796 unsigned *Q = 0;
1797 unsigned *R = 0;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001798 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1799 U = &SPACE[0];
1800 V = &SPACE[m+n+1];
1801 Q = &SPACE[(m+n+1) + n];
1802 if (Remainder)
1803 R = &SPACE[(m+n+1) + n + (m+n)];
1804 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001805 U = new unsigned[m + n + 1];
1806 V = new unsigned[n];
1807 Q = new unsigned[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001808 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001809 R = new unsigned[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001810 }
1811
1812 // Initialize the dividend
Chris Lattner77527f52009-01-21 18:09:24 +00001813 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001814 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001815 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001816 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001817 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001818 }
1819 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1820
Reid Spencer522ca7c2007-02-25 01:56:07 +00001821 // Initialize the divisor
Chris Lattner77527f52009-01-21 18:09:24 +00001822 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001823 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001824 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001825 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001826 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001827 }
1828
Reid Spencer522ca7c2007-02-25 01:56:07 +00001829 // initialize the quotient and remainder
Chris Lattner77527f52009-01-21 18:09:24 +00001830 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001831 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001832 memset(R, 0, n * sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001833
Eric Christopher820256b2009-08-21 04:06:45 +00001834 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001835 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001836 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001837 // contain any zero words or the Knuth algorithm fails.
1838 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1839 n--;
1840 m++;
1841 }
1842 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1843 m--;
1844
1845 // If we're left with only a single word for the divisor, Knuth doesn't work
1846 // so we implement the short division algorithm here. This is much simpler
1847 // and faster because we are certain that we can divide a 64-bit quantity
1848 // by a 32-bit quantity at hardware speed and short division is simply a
1849 // series of such operations. This is just like doing short division but we
1850 // are using base 2^32 instead of base 10.
1851 assert(n != 0 && "Divide by zero?");
1852 if (n == 1) {
Chris Lattner77527f52009-01-21 18:09:24 +00001853 unsigned divisor = V[0];
1854 unsigned remainder = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001855 for (int i = m+n-1; i >= 0; i--) {
1856 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1857 if (partial_dividend == 0) {
1858 Q[i] = 0;
1859 remainder = 0;
1860 } else if (partial_dividend < divisor) {
1861 Q[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001862 remainder = (unsigned)partial_dividend;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001863 } else if (partial_dividend == divisor) {
1864 Q[i] = 1;
1865 remainder = 0;
1866 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001867 Q[i] = (unsigned)(partial_dividend / divisor);
1868 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001869 }
1870 }
1871 if (R)
1872 R[0] = remainder;
1873 } else {
1874 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1875 // case n > 1.
1876 KnuthDiv(U, V, Q, R, m, n);
1877 }
1878
1879 // If the caller wants the quotient
1880 if (Quotient) {
1881 // Set up the Quotient value's memory.
1882 if (Quotient->BitWidth != LHS.BitWidth) {
1883 if (Quotient->isSingleWord())
1884 Quotient->VAL = 0;
1885 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001886 delete [] Quotient->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001887 Quotient->BitWidth = LHS.BitWidth;
1888 if (!Quotient->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001889 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001890 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001891 Quotient->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001892
Eric Christopher820256b2009-08-21 04:06:45 +00001893 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001894 // order words.
1895 if (lhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001896 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001897 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1898 if (Quotient->isSingleWord())
1899 Quotient->VAL = tmp;
1900 else
1901 Quotient->pVal[0] = tmp;
1902 } else {
1903 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1904 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001905 Quotient->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001906 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1907 }
1908 }
1909
1910 // If the caller wants the remainder
1911 if (Remainder) {
1912 // Set up the Remainder value's memory.
1913 if (Remainder->BitWidth != RHS.BitWidth) {
1914 if (Remainder->isSingleWord())
1915 Remainder->VAL = 0;
1916 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001917 delete [] Remainder->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001918 Remainder->BitWidth = RHS.BitWidth;
1919 if (!Remainder->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001920 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001921 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001922 Remainder->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001923
1924 // The remainder is in R. Reconstitute the remainder into Remainder's low
1925 // order words.
1926 if (rhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001927 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001928 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1929 if (Remainder->isSingleWord())
1930 Remainder->VAL = tmp;
1931 else
1932 Remainder->pVal[0] = tmp;
1933 } else {
1934 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1935 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001936 Remainder->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001937 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1938 }
1939 }
1940
1941 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001942 if (U != &SPACE[0]) {
1943 delete [] U;
1944 delete [] V;
1945 delete [] Q;
1946 delete [] R;
1947 }
Reid Spencer100502d2007-02-17 03:16:00 +00001948}
1949
Reid Spencer1d072122007-02-16 22:36:51 +00001950APInt APInt::udiv(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001951 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001952
1953 // First, deal with the easy case
1954 if (isSingleWord()) {
1955 assert(RHS.VAL != 0 && "Divide by zero?");
1956 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001957 }
Reid Spencer39867762007-02-17 02:07:07 +00001958
Reid Spencer39867762007-02-17 02:07:07 +00001959 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner77527f52009-01-21 18:09:24 +00001960 unsigned rhsBits = RHS.getActiveBits();
1961 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001962 assert(rhsWords && "Divided by zero???");
Chris Lattner77527f52009-01-21 18:09:24 +00001963 unsigned lhsBits = this->getActiveBits();
1964 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001965
1966 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001967 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001968 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001969 return APInt(BitWidth, 0);
Reid Spencer58a6a432007-02-21 08:21:52 +00001970 else if (lhsWords < rhsWords || this->ult(RHS)) {
1971 // X / Y ===> 0, iff X < Y
1972 return APInt(BitWidth, 0);
1973 } else if (*this == RHS) {
1974 // X / X ===> 1
1975 return APInt(BitWidth, 1);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001976 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001977 // All high words are zero, just use native divide
Reid Spencer58a6a432007-02-21 08:21:52 +00001978 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001979 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001980
1981 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1982 APInt Quotient(1,0); // to hold result.
1983 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1984 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001985}
1986
Reid Spencer1d072122007-02-16 22:36:51 +00001987APInt APInt::urem(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001988 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001989 if (isSingleWord()) {
1990 assert(RHS.VAL != 0 && "Remainder by zero?");
1991 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001992 }
Reid Spencer39867762007-02-17 02:07:07 +00001993
Reid Spencer58a6a432007-02-21 08:21:52 +00001994 // Get some facts about the LHS
Chris Lattner77527f52009-01-21 18:09:24 +00001995 unsigned lhsBits = getActiveBits();
1996 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001997
1998 // Get some facts about the RHS
Chris Lattner77527f52009-01-21 18:09:24 +00001999 unsigned rhsBits = RHS.getActiveBits();
2000 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00002001 assert(rhsWords && "Performing remainder operation by zero ???");
2002
Reid Spencer39867762007-02-17 02:07:07 +00002003 // Check the degenerate cases
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002004 if (lhsWords == 0) {
Reid Spencer58a6a432007-02-21 08:21:52 +00002005 // 0 % Y ===> 0
2006 return APInt(BitWidth, 0);
2007 } else if (lhsWords < rhsWords || this->ult(RHS)) {
2008 // X % Y ===> X, iff X < Y
2009 return *this;
2010 } else if (*this == RHS) {
Reid Spencer39867762007-02-17 02:07:07 +00002011 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00002012 return APInt(BitWidth, 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002013 } else if (lhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00002014 // All high words are zero, just use native remainder
Reid Spencer58a6a432007-02-21 08:21:52 +00002015 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00002016 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002017
Reid Spencer4c50b522007-05-13 23:44:59 +00002018 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002019 APInt Remainder(1,0);
2020 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2021 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00002022}
Reid Spencer100502d2007-02-17 03:16:00 +00002023
Eric Christopher820256b2009-08-21 04:06:45 +00002024void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00002025 APInt &Quotient, APInt &Remainder) {
2026 // Get some size facts about the dividend and divisor
Chris Lattner77527f52009-01-21 18:09:24 +00002027 unsigned lhsBits = LHS.getActiveBits();
2028 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2029 unsigned rhsBits = RHS.getActiveBits();
2030 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer4c50b522007-05-13 23:44:59 +00002031
2032 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00002033 if (lhsWords == 0) {
Reid Spencer4c50b522007-05-13 23:44:59 +00002034 Quotient = 0; // 0 / Y ===> 0
2035 Remainder = 0; // 0 % Y ===> 0
2036 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002037 }
2038
2039 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer4c50b522007-05-13 23:44:59 +00002040 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCallbd8d1e32009-12-24 08:52:06 +00002041 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00002042 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002043 }
2044
Reid Spencer4c50b522007-05-13 23:44:59 +00002045 if (LHS == RHS) {
2046 Quotient = 1; // X / X ===> 1
2047 Remainder = 0; // X % X ===> 0;
2048 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002049 }
2050
Reid Spencer4c50b522007-05-13 23:44:59 +00002051 if (lhsWords == 1 && rhsWords == 1) {
2052 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00002053 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2054 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2055 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2056 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer4c50b522007-05-13 23:44:59 +00002057 return;
2058 }
2059
2060 // Okay, lets do it the long way
2061 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2062}
2063
Chris Lattner2c819b02010-10-13 23:54:10 +00002064APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002065 APInt Res = *this+RHS;
2066 Overflow = isNonNegative() == RHS.isNonNegative() &&
2067 Res.isNonNegative() != isNonNegative();
2068 return Res;
2069}
2070
Chris Lattner698661c2010-10-14 00:05:07 +00002071APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2072 APInt Res = *this+RHS;
2073 Overflow = Res.ult(RHS);
2074 return Res;
2075}
2076
Chris Lattner2c819b02010-10-13 23:54:10 +00002077APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002078 APInt Res = *this - RHS;
2079 Overflow = isNonNegative() != RHS.isNonNegative() &&
2080 Res.isNonNegative() != isNonNegative();
2081 return Res;
2082}
2083
Chris Lattner698661c2010-10-14 00:05:07 +00002084APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00002085 APInt Res = *this-RHS;
2086 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00002087 return Res;
2088}
2089
Chris Lattner2c819b02010-10-13 23:54:10 +00002090APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002091 // MININT/-1 --> overflow.
2092 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2093 return sdiv(RHS);
2094}
2095
Chris Lattner2c819b02010-10-13 23:54:10 +00002096APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002097 APInt Res = *this * RHS;
2098
2099 if (*this != 0 && RHS != 0)
2100 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2101 else
2102 Overflow = false;
2103 return Res;
2104}
2105
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00002106APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2107 APInt Res = *this * RHS;
2108
2109 if (*this != 0 && RHS != 0)
2110 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2111 else
2112 Overflow = false;
2113 return Res;
2114}
2115
Chris Lattner2c819b02010-10-13 23:54:10 +00002116APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002117 Overflow = ShAmt >= getBitWidth();
2118 if (Overflow)
2119 ShAmt = getBitWidth()-1;
2120
2121 if (isNonNegative()) // Don't allow sign change.
2122 Overflow = ShAmt >= countLeadingZeros();
2123 else
2124 Overflow = ShAmt >= countLeadingOnes();
2125
2126 return *this << ShAmt;
2127}
2128
2129
2130
2131
Benjamin Kramer92d89982010-07-14 22:38:02 +00002132void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00002133 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002134 assert(!str.empty() && "Invalid string length");
Douglas Gregor663c0682011-09-14 15:54:46 +00002135 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2136 radix == 36) &&
2137 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002138
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002139 StringRef::iterator p = str.begin();
2140 size_t slen = str.size();
2141 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002142 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002143 p++;
2144 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00002145 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002146 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00002147 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002148 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2149 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002150 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2151 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00002152
2153 // Allocate memory
2154 if (!isSingleWord())
2155 pVal = getClearedMemory(getNumWords());
2156
2157 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00002158 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00002159
2160 // Set up an APInt for the digit to add outside the loop so we don't
2161 // constantly construct/destruct it.
2162 APInt apdigit(getBitWidth(), 0);
2163 APInt apradix(getBitWidth(), radix);
2164
2165 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002166 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00002167 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00002168 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00002169
Reid Spencera93c9812007-05-16 19:18:22 +00002170 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002171 if (slen > 1) {
2172 if (shift)
2173 *this <<= shift;
2174 else
2175 *this *= apradix;
2176 }
Reid Spencer1ba83352007-02-21 03:55:44 +00002177
2178 // Add in the digit we just interpreted
Reid Spencer632ebdf2007-02-24 20:19:37 +00002179 if (apdigit.isSingleWord())
2180 apdigit.VAL = digit;
2181 else
2182 apdigit.pVal[0] = digit;
Reid Spencer1ba83352007-02-21 03:55:44 +00002183 *this += apdigit;
Reid Spencer100502d2007-02-17 03:16:00 +00002184 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002185 // If its negative, put it in two's complement form
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00002186 if (isNeg) {
2187 (*this)--;
Jay Foad25a5e4c2010-12-01 08:53:58 +00002188 this->flipAllBits();
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002189 }
Reid Spencer100502d2007-02-17 03:16:00 +00002190}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002191
Chris Lattner17f71652008-08-17 07:19:36 +00002192void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002193 bool Signed, bool formatAsCLiteral) const {
Douglas Gregor663c0682011-09-14 15:54:46 +00002194 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2195 Radix == 36) &&
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002196 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopher820256b2009-08-21 04:06:45 +00002197
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002198 const char *Prefix = "";
2199 if (formatAsCLiteral) {
2200 switch (Radix) {
2201 case 2:
2202 // Binary literals are a non-standard extension added in gcc 4.3:
2203 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2204 Prefix = "0b";
2205 break;
2206 case 8:
2207 Prefix = "0";
2208 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002209 case 10:
2210 break; // No prefix
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002211 case 16:
2212 Prefix = "0x";
2213 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002214 default:
2215 llvm_unreachable("Invalid radix!");
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002216 }
2217 }
2218
Chris Lattner17f71652008-08-17 07:19:36 +00002219 // First, check for a zero value and just short circuit the logic below.
2220 if (*this == 0) {
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002221 while (*Prefix) {
2222 Str.push_back(*Prefix);
2223 ++Prefix;
2224 };
Chris Lattner17f71652008-08-17 07:19:36 +00002225 Str.push_back('0');
2226 return;
2227 }
Eric Christopher820256b2009-08-21 04:06:45 +00002228
Douglas Gregor663c0682011-09-14 15:54:46 +00002229 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopher820256b2009-08-21 04:06:45 +00002230
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002231 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002232 char Buffer[65];
2233 char *BufPtr = Buffer+65;
Eric Christopher820256b2009-08-21 04:06:45 +00002234
Chris Lattner17f71652008-08-17 07:19:36 +00002235 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002236 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002237 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002238 } else {
2239 int64_t I = getSExtValue();
2240 if (I >= 0) {
2241 N = I;
2242 } else {
2243 Str.push_back('-');
2244 N = -(uint64_t)I;
2245 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002246 }
Eric Christopher820256b2009-08-21 04:06:45 +00002247
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002248 while (*Prefix) {
2249 Str.push_back(*Prefix);
2250 ++Prefix;
2251 };
2252
Chris Lattner17f71652008-08-17 07:19:36 +00002253 while (N) {
2254 *--BufPtr = Digits[N % Radix];
2255 N /= Radix;
2256 }
2257 Str.append(BufPtr, Buffer+65);
2258 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002259 }
2260
Chris Lattner17f71652008-08-17 07:19:36 +00002261 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002262
Chris Lattner17f71652008-08-17 07:19:36 +00002263 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002264 // They want to print the signed version and it is a negative value
2265 // Flip the bits and add one to turn it into the equivalent positive
2266 // value and put a '-' in the result.
Jay Foad25a5e4c2010-12-01 08:53:58 +00002267 Tmp.flipAllBits();
Chris Lattner17f71652008-08-17 07:19:36 +00002268 Tmp++;
2269 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002270 }
Eric Christopher820256b2009-08-21 04:06:45 +00002271
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002272 while (*Prefix) {
2273 Str.push_back(*Prefix);
2274 ++Prefix;
2275 };
2276
Chris Lattner17f71652008-08-17 07:19:36 +00002277 // We insert the digits backward, then reverse them to get the right order.
2278 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002279
2280 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2281 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattner17f71652008-08-17 07:19:36 +00002282 // equaly. We just shift until the value is zero.
Douglas Gregor663c0682011-09-14 15:54:46 +00002283 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattner17f71652008-08-17 07:19:36 +00002284 // Just shift tmp right for each digit width until it becomes zero
2285 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2286 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002287
Chris Lattner17f71652008-08-17 07:19:36 +00002288 while (Tmp != 0) {
2289 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2290 Str.push_back(Digits[Digit]);
2291 Tmp = Tmp.lshr(ShiftAmt);
2292 }
2293 } else {
Douglas Gregor663c0682011-09-14 15:54:46 +00002294 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattner17f71652008-08-17 07:19:36 +00002295 while (Tmp != 0) {
2296 APInt APdigit(1, 0);
2297 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopher820256b2009-08-21 04:06:45 +00002298 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattner17f71652008-08-17 07:19:36 +00002299 &APdigit);
Chris Lattner77527f52009-01-21 18:09:24 +00002300 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner17f71652008-08-17 07:19:36 +00002301 assert(Digit < Radix && "divide failed");
2302 Str.push_back(Digits[Digit]);
2303 Tmp = tmp2;
2304 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002305 }
Eric Christopher820256b2009-08-21 04:06:45 +00002306
Chris Lattner17f71652008-08-17 07:19:36 +00002307 // Reverse the digits before returning.
2308 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002309}
2310
Chris Lattner17f71652008-08-17 07:19:36 +00002311/// toString - This returns the APInt as a std::string. Note that this is an
2312/// inefficient method. It is better to pass in a SmallVector/SmallString
2313/// to the methods above.
2314std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2315 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002316 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002317 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002318}
Chris Lattner6b695682007-08-16 15:56:55 +00002319
Chris Lattner17f71652008-08-17 07:19:36 +00002320
2321void APInt::dump() const {
2322 SmallString<40> S, U;
2323 this->toStringUnsigned(U);
2324 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002325 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002326 << U.str() << "u " << S.str() << "s)";
Chris Lattner17f71652008-08-17 07:19:36 +00002327}
2328
Chris Lattner0c19df42008-08-23 22:23:09 +00002329void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002330 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002331 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002332 OS << S.str();
Chris Lattner17f71652008-08-17 07:19:36 +00002333}
2334
Chris Lattner6b695682007-08-16 15:56:55 +00002335// This implements a variety of operations on a representation of
2336// arbitrary precision, two's-complement, bignum integer values.
2337
Chris Lattner96cffa62009-08-23 23:11:28 +00002338// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2339// and unrestricting assumption.
Chris Lattner8fcea672008-08-17 04:58:58 +00002340#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002341COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattner6b695682007-08-16 15:56:55 +00002342
2343/* Some handy functions local to this file. */
2344namespace {
2345
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002346 /* Returns the integer part with the least significant BITS set.
2347 BITS cannot be zero. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002348 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002349 lowBitMask(unsigned int bits)
2350 {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002351 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002352
2353 return ~(integerPart) 0 >> (integerPartWidth - bits);
2354 }
2355
Neil Boothc8b650a2007-10-06 00:43:45 +00002356 /* Returns the value of the lower half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002357 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002358 lowHalf(integerPart part)
2359 {
2360 return part & lowBitMask(integerPartWidth / 2);
2361 }
2362
Neil Boothc8b650a2007-10-06 00:43:45 +00002363 /* Returns the value of the upper half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002364 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002365 highHalf(integerPart part)
2366 {
2367 return part >> (integerPartWidth / 2);
2368 }
2369
Neil Boothc8b650a2007-10-06 00:43:45 +00002370 /* Returns the bit number of the most significant set bit of a part.
2371 If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002372 static unsigned int
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002373 partMSB(integerPart value)
Chris Lattner6b695682007-08-16 15:56:55 +00002374 {
2375 unsigned int n, msb;
2376
2377 if (value == 0)
2378 return -1U;
2379
2380 n = integerPartWidth / 2;
2381
2382 msb = 0;
2383 do {
2384 if (value >> n) {
2385 value >>= n;
2386 msb += n;
2387 }
2388
2389 n >>= 1;
2390 } while (n);
2391
2392 return msb;
2393 }
2394
Neil Boothc8b650a2007-10-06 00:43:45 +00002395 /* Returns the bit number of the least significant set bit of a
2396 part. If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002397 static unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002398 partLSB(integerPart value)
2399 {
2400 unsigned int n, lsb;
2401
2402 if (value == 0)
2403 return -1U;
2404
2405 lsb = integerPartWidth - 1;
2406 n = integerPartWidth / 2;
2407
2408 do {
2409 if (value << n) {
2410 value <<= n;
2411 lsb -= n;
2412 }
2413
2414 n >>= 1;
2415 } while (n);
2416
2417 return lsb;
2418 }
2419}
2420
2421/* Sets the least significant part of a bignum to the input value, and
2422 zeroes out higher parts. */
2423void
2424APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2425{
2426 unsigned int i;
2427
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002428 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002429
Chris Lattner6b695682007-08-16 15:56:55 +00002430 dst[0] = part;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002431 for (i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002432 dst[i] = 0;
2433}
2434
2435/* Assign one bignum to another. */
2436void
2437APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2438{
2439 unsigned int i;
2440
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002441 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002442 dst[i] = src[i];
2443}
2444
2445/* Returns true if a bignum is zero, false otherwise. */
2446bool
2447APInt::tcIsZero(const integerPart *src, unsigned int parts)
2448{
2449 unsigned int i;
2450
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002451 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002452 if (src[i])
2453 return false;
2454
2455 return true;
2456}
2457
2458/* Extract the given bit of a bignum; returns 0 or 1. */
2459int
2460APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2461{
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002462 return (parts[bit / integerPartWidth] &
2463 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002464}
2465
John McCalldcb9a7a2010-02-28 02:51:25 +00002466/* Set the given bit of a bignum. */
Chris Lattner6b695682007-08-16 15:56:55 +00002467void
2468APInt::tcSetBit(integerPart *parts, unsigned int bit)
2469{
2470 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2471}
2472
John McCalldcb9a7a2010-02-28 02:51:25 +00002473/* Clears the given bit of a bignum. */
2474void
2475APInt::tcClearBit(integerPart *parts, unsigned int bit)
2476{
2477 parts[bit / integerPartWidth] &=
2478 ~((integerPart) 1 << (bit % integerPartWidth));
2479}
2480
Neil Boothc8b650a2007-10-06 00:43:45 +00002481/* Returns the bit number of the least significant set bit of a
2482 number. If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002483unsigned int
2484APInt::tcLSB(const integerPart *parts, unsigned int n)
2485{
2486 unsigned int i, lsb;
2487
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002488 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002489 if (parts[i] != 0) {
2490 lsb = partLSB(parts[i]);
2491
2492 return lsb + i * integerPartWidth;
2493 }
2494 }
2495
2496 return -1U;
2497}
2498
Neil Boothc8b650a2007-10-06 00:43:45 +00002499/* Returns the bit number of the most significant set bit of a number.
2500 If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002501unsigned int
2502APInt::tcMSB(const integerPart *parts, unsigned int n)
2503{
2504 unsigned int msb;
2505
2506 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002507 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002508
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002509 if (parts[n] != 0) {
2510 msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002511
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002512 return msb + n * integerPartWidth;
2513 }
Chris Lattner6b695682007-08-16 15:56:55 +00002514 } while (n);
2515
2516 return -1U;
2517}
2518
Neil Boothb6182162007-10-08 13:47:12 +00002519/* Copy the bit vector of width srcBITS from SRC, starting at bit
2520 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2521 the least significant bit of DST. All high bits above srcBITS in
2522 DST are zero-filled. */
2523void
Evan Chengdb338f32009-05-21 23:47:47 +00002524APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Boothb6182162007-10-08 13:47:12 +00002525 unsigned int srcBits, unsigned int srcLSB)
2526{
2527 unsigned int firstSrcPart, dstParts, shift, n;
2528
2529 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002530 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002531
2532 firstSrcPart = srcLSB / integerPartWidth;
2533 tcAssign (dst, src + firstSrcPart, dstParts);
2534
2535 shift = srcLSB % integerPartWidth;
2536 tcShiftRight (dst, dstParts, shift);
2537
2538 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2539 in DST. If this is less that srcBits, append the rest, else
2540 clear the high bits. */
2541 n = dstParts * integerPartWidth - shift;
2542 if (n < srcBits) {
2543 integerPart mask = lowBitMask (srcBits - n);
2544 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2545 << n % integerPartWidth);
2546 } else if (n > srcBits) {
Neil Booth7e74b172007-10-12 15:31:31 +00002547 if (srcBits % integerPartWidth)
2548 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Boothb6182162007-10-08 13:47:12 +00002549 }
2550
2551 /* Clear high parts. */
2552 while (dstParts < dstCount)
2553 dst[dstParts++] = 0;
2554}
2555
Chris Lattner6b695682007-08-16 15:56:55 +00002556/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2557integerPart
2558APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2559 integerPart c, unsigned int parts)
2560{
2561 unsigned int i;
2562
2563 assert(c <= 1);
2564
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002565 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002566 integerPart l;
2567
2568 l = dst[i];
2569 if (c) {
2570 dst[i] += rhs[i] + 1;
2571 c = (dst[i] <= l);
2572 } else {
2573 dst[i] += rhs[i];
2574 c = (dst[i] < l);
2575 }
2576 }
2577
2578 return c;
2579}
2580
2581/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2582integerPart
2583APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2584 integerPart c, unsigned int parts)
2585{
2586 unsigned int i;
2587
2588 assert(c <= 1);
2589
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002590 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002591 integerPart l;
2592
2593 l = dst[i];
2594 if (c) {
2595 dst[i] -= rhs[i] + 1;
2596 c = (dst[i] >= l);
2597 } else {
2598 dst[i] -= rhs[i];
2599 c = (dst[i] > l);
2600 }
2601 }
2602
2603 return c;
2604}
2605
2606/* Negate a bignum in-place. */
2607void
2608APInt::tcNegate(integerPart *dst, unsigned int parts)
2609{
2610 tcComplement(dst, parts);
2611 tcIncrement(dst, parts);
2612}
2613
Neil Boothc8b650a2007-10-06 00:43:45 +00002614/* DST += SRC * MULTIPLIER + CARRY if add is true
2615 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002616
2617 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2618 they must start at the same point, i.e. DST == SRC.
2619
2620 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2621 returned. Otherwise DST is filled with the least significant
2622 DSTPARTS parts of the result, and if all of the omitted higher
2623 parts were zero return zero, otherwise overflow occurred and
2624 return one. */
2625int
2626APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2627 integerPart multiplier, integerPart carry,
2628 unsigned int srcParts, unsigned int dstParts,
2629 bool add)
2630{
2631 unsigned int i, n;
2632
2633 /* Otherwise our writes of DST kill our later reads of SRC. */
2634 assert(dst <= src || dst >= src + srcParts);
2635 assert(dstParts <= srcParts + 1);
2636
2637 /* N loops; minimum of dstParts and srcParts. */
2638 n = dstParts < srcParts ? dstParts: srcParts;
2639
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002640 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002641 integerPart low, mid, high, srcPart;
2642
2643 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2644
2645 This cannot overflow, because
2646
2647 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2648
2649 which is less than n^2. */
2650
2651 srcPart = src[i];
2652
2653 if (multiplier == 0 || srcPart == 0) {
2654 low = carry;
2655 high = 0;
2656 } else {
2657 low = lowHalf(srcPart) * lowHalf(multiplier);
2658 high = highHalf(srcPart) * highHalf(multiplier);
2659
2660 mid = lowHalf(srcPart) * highHalf(multiplier);
2661 high += highHalf(mid);
2662 mid <<= integerPartWidth / 2;
2663 if (low + mid < low)
2664 high++;
2665 low += mid;
2666
2667 mid = highHalf(srcPart) * lowHalf(multiplier);
2668 high += highHalf(mid);
2669 mid <<= integerPartWidth / 2;
2670 if (low + mid < low)
2671 high++;
2672 low += mid;
2673
2674 /* Now add carry. */
2675 if (low + carry < low)
2676 high++;
2677 low += carry;
2678 }
2679
2680 if (add) {
2681 /* And now DST[i], and store the new low part there. */
2682 if (low + dst[i] < low)
2683 high++;
2684 dst[i] += low;
2685 } else
2686 dst[i] = low;
2687
2688 carry = high;
2689 }
2690
2691 if (i < dstParts) {
2692 /* Full multiplication, there is no overflow. */
2693 assert(i + 1 == dstParts);
2694 dst[i] = carry;
2695 return 0;
2696 } else {
2697 /* We overflowed if there is carry. */
2698 if (carry)
2699 return 1;
2700
2701 /* We would overflow if any significant unwritten parts would be
2702 non-zero. This is true if any remaining src parts are non-zero
2703 and the multiplier is non-zero. */
2704 if (multiplier)
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002705 for (; i < srcParts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002706 if (src[i])
2707 return 1;
2708
2709 /* We fitted in the narrow destination. */
2710 return 0;
2711 }
2712}
2713
2714/* DST = LHS * RHS, where DST has the same width as the operands and
2715 is filled with the least significant parts of the result. Returns
2716 one if overflow occurred, otherwise zero. DST must be disjoint
2717 from both operands. */
2718int
2719APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2720 const integerPart *rhs, unsigned int parts)
2721{
2722 unsigned int i;
2723 int overflow;
2724
2725 assert(dst != lhs && dst != rhs);
2726
2727 overflow = 0;
2728 tcSet(dst, 0, parts);
2729
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002730 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002731 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2732 parts - i, true);
2733
2734 return overflow;
2735}
2736
Neil Booth0ea72a92007-10-06 00:24:48 +00002737/* DST = LHS * RHS, where DST has width the sum of the widths of the
2738 operands. No overflow occurs. DST must be disjoint from both
2739 operands. Returns the number of parts required to hold the
2740 result. */
2741unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002742APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth0ea72a92007-10-06 00:24:48 +00002743 const integerPart *rhs, unsigned int lhsParts,
2744 unsigned int rhsParts)
Chris Lattner6b695682007-08-16 15:56:55 +00002745{
Neil Booth0ea72a92007-10-06 00:24:48 +00002746 /* Put the narrower number on the LHS for less loops below. */
2747 if (lhsParts > rhsParts) {
2748 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2749 } else {
2750 unsigned int n;
Chris Lattner6b695682007-08-16 15:56:55 +00002751
Neil Booth0ea72a92007-10-06 00:24:48 +00002752 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002753
Neil Booth0ea72a92007-10-06 00:24:48 +00002754 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002755
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002756 for (n = 0; n < lhsParts; n++)
Neil Booth0ea72a92007-10-06 00:24:48 +00002757 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002758
Neil Booth0ea72a92007-10-06 00:24:48 +00002759 n = lhsParts + rhsParts;
2760
2761 return n - (dst[n - 1] == 0);
2762 }
Chris Lattner6b695682007-08-16 15:56:55 +00002763}
2764
2765/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2766 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2767 set REMAINDER to the remainder, return zero. i.e.
2768
2769 OLD_LHS = RHS * LHS + REMAINDER
2770
2771 SCRATCH is a bignum of the same size as the operands and result for
2772 use by the routine; its contents need not be initialized and are
2773 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2774*/
2775int
2776APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2777 integerPart *remainder, integerPart *srhs,
2778 unsigned int parts)
2779{
2780 unsigned int n, shiftCount;
2781 integerPart mask;
2782
2783 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2784
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002785 shiftCount = tcMSB(rhs, parts) + 1;
2786 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002787 return true;
2788
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002789 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattner6b695682007-08-16 15:56:55 +00002790 n = shiftCount / integerPartWidth;
2791 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2792
2793 tcAssign(srhs, rhs, parts);
2794 tcShiftLeft(srhs, parts, shiftCount);
2795 tcAssign(remainder, lhs, parts);
2796 tcSet(lhs, 0, parts);
2797
2798 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2799 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002800 for (;;) {
Chris Lattner6b695682007-08-16 15:56:55 +00002801 int compare;
2802
2803 compare = tcCompare(remainder, srhs, parts);
2804 if (compare >= 0) {
2805 tcSubtract(remainder, srhs, 0, parts);
2806 lhs[n] |= mask;
2807 }
2808
2809 if (shiftCount == 0)
2810 break;
2811 shiftCount--;
2812 tcShiftRight(srhs, parts, 1);
2813 if ((mask >>= 1) == 0)
2814 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2815 }
2816
2817 return false;
2818}
2819
2820/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2821 There are no restrictions on COUNT. */
2822void
2823APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2824{
Neil Boothb6182162007-10-08 13:47:12 +00002825 if (count) {
2826 unsigned int jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002827
Neil Boothb6182162007-10-08 13:47:12 +00002828 /* Jump is the inter-part jump; shift is is intra-part shift. */
2829 jump = count / integerPartWidth;
2830 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002831
Neil Boothb6182162007-10-08 13:47:12 +00002832 while (parts > jump) {
2833 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002834
Neil Boothb6182162007-10-08 13:47:12 +00002835 parts--;
Chris Lattner6b695682007-08-16 15:56:55 +00002836
Neil Boothb6182162007-10-08 13:47:12 +00002837 /* dst[i] comes from the two parts src[i - jump] and, if we have
2838 an intra-part shift, src[i - jump - 1]. */
2839 part = dst[parts - jump];
2840 if (shift) {
2841 part <<= shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002842 if (parts >= jump + 1)
2843 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2844 }
2845
Neil Boothb6182162007-10-08 13:47:12 +00002846 dst[parts] = part;
2847 }
Chris Lattner6b695682007-08-16 15:56:55 +00002848
Neil Boothb6182162007-10-08 13:47:12 +00002849 while (parts > 0)
2850 dst[--parts] = 0;
2851 }
Chris Lattner6b695682007-08-16 15:56:55 +00002852}
2853
2854/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2855 zero. There are no restrictions on COUNT. */
2856void
2857APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2858{
Neil Boothb6182162007-10-08 13:47:12 +00002859 if (count) {
2860 unsigned int i, jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002861
Neil Boothb6182162007-10-08 13:47:12 +00002862 /* Jump is the inter-part jump; shift is is intra-part shift. */
2863 jump = count / integerPartWidth;
2864 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002865
Neil Boothb6182162007-10-08 13:47:12 +00002866 /* Perform the shift. This leaves the most significant COUNT bits
2867 of the result at zero. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002868 for (i = 0; i < parts; i++) {
Neil Boothb6182162007-10-08 13:47:12 +00002869 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002870
Neil Boothb6182162007-10-08 13:47:12 +00002871 if (i + jump >= parts) {
2872 part = 0;
2873 } else {
2874 part = dst[i + jump];
2875 if (shift) {
2876 part >>= shift;
2877 if (i + jump + 1 < parts)
2878 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2879 }
Chris Lattner6b695682007-08-16 15:56:55 +00002880 }
Chris Lattner6b695682007-08-16 15:56:55 +00002881
Neil Boothb6182162007-10-08 13:47:12 +00002882 dst[i] = part;
2883 }
Chris Lattner6b695682007-08-16 15:56:55 +00002884 }
2885}
2886
2887/* Bitwise and of two bignums. */
2888void
2889APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2890{
2891 unsigned int i;
2892
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002893 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002894 dst[i] &= rhs[i];
2895}
2896
2897/* Bitwise inclusive or of two bignums. */
2898void
2899APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2900{
2901 unsigned int i;
2902
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002903 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002904 dst[i] |= rhs[i];
2905}
2906
2907/* Bitwise exclusive or of two bignums. */
2908void
2909APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2910{
2911 unsigned int i;
2912
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002913 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002914 dst[i] ^= rhs[i];
2915}
2916
2917/* Complement a bignum in-place. */
2918void
2919APInt::tcComplement(integerPart *dst, unsigned int parts)
2920{
2921 unsigned int i;
2922
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002923 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002924 dst[i] = ~dst[i];
2925}
2926
2927/* Comparison (unsigned) of two bignums. */
2928int
2929APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2930 unsigned int parts)
2931{
2932 while (parts) {
2933 parts--;
2934 if (lhs[parts] == rhs[parts])
2935 continue;
2936
2937 if (lhs[parts] > rhs[parts])
2938 return 1;
2939 else
2940 return -1;
2941 }
2942
2943 return 0;
2944}
2945
2946/* Increment a bignum in-place, return the carry flag. */
2947integerPart
2948APInt::tcIncrement(integerPart *dst, unsigned int parts)
2949{
2950 unsigned int i;
2951
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002952 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002953 if (++dst[i] != 0)
2954 break;
2955
2956 return i == parts;
2957}
2958
2959/* Set the least significant BITS bits of a bignum, clear the
2960 rest. */
2961void
2962APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2963 unsigned int bits)
2964{
2965 unsigned int i;
2966
2967 i = 0;
2968 while (bits > integerPartWidth) {
2969 dst[i++] = ~(integerPart) 0;
2970 bits -= integerPartWidth;
2971 }
2972
2973 if (bits)
2974 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2975
2976 while (i < parts)
2977 dst[i++] = 0;
2978}