blob: 5789721c3a885a654adfbef80d1da6dc7e8ae900 [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
Erick Tryzelaardadb15712009-08-21 03:15:28 +000051 if (radix == 16) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000052 r = cdigit - '0';
53 if (r <= 9)
54 return r;
55
56 r = cdigit - 'A';
57 if (r <= 5)
58 return r + 10;
59
60 r = cdigit - 'a';
61 if (r <= 5)
62 return r + 10;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000063 }
64
Erick Tryzelaar60964092009-08-21 06:48:37 +000065 r = cdigit - '0';
66 if (r < radix)
67 return r;
68
69 return -1U;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000070}
71
72
Chris Lattner77527f52009-01-21 18:09:24 +000073void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner1ac3e252008-08-20 17:02:31 +000074 pVal = getClearedMemory(getNumWords());
75 pVal[0] = val;
Eric Christopher820256b2009-08-21 04:06:45 +000076 if (isSigned && int64_t(val) < 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +000077 for (unsigned i = 1; i < getNumWords(); ++i)
78 pVal[i] = -1ULL;
Zhou Shengdac63782007-02-06 03:00:16 +000079}
80
Chris Lattnerd57b7602008-10-11 22:07:19 +000081void APInt::initSlowCase(const APInt& that) {
82 pVal = getMemory(getNumWords());
83 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
84}
85
86
Chris Lattner77527f52009-01-21 18:09:24 +000087APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Chris Lattner0c19df42008-08-23 22:23:09 +000088 : BitWidth(numBits), VAL(0) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +000089 assert(BitWidth && "Bitwidth too small");
Zhou Shengdac63782007-02-06 03:00:16 +000090 assert(bigVal && "Null pointer detected!");
91 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
Chris Lattner77527f52009-01-21 18:09:24 +000097 unsigned words = std::min<unsigned>(numWords, getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000098 // Copy the words from bigVal to pVal
99 memcpy(pVal, bigVal, 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
Benjamin Kramer92d89982010-07-14 22:38:02 +0000105APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer1ba83352007-02-21 03:55:44 +0000106 : BitWidth(numbits), VAL(0) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000107 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000108 fromString(numbits, Str, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000109}
110
Chris Lattner1ac3e252008-08-20 17:02:31 +0000111APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000112 // Don't do anything for X = X
113 if (this == &RHS)
114 return *this;
115
Reid Spencer7c16cd22007-02-26 23:38:21 +0000116 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner1ac3e252008-08-20 17:02:31 +0000117 // assume same bit-width single-word case is already handled
118 assert(!isSingleWord());
119 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer7c16cd22007-02-26 23:38:21 +0000120 return *this;
121 }
122
Chris Lattner1ac3e252008-08-20 17:02:31 +0000123 if (isSingleWord()) {
124 // assume case where both are single words is already handled
125 assert(!RHS.isSingleWord());
126 VAL = 0;
127 pVal = getMemory(RHS.getNumWords());
128 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopher820256b2009-08-21 04:06:45 +0000129 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer7c16cd22007-02-26 23:38:21 +0000130 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
131 else if (RHS.isSingleWord()) {
132 delete [] pVal;
Reid Spencera856b6e2007-02-18 18:38:44 +0000133 VAL = RHS.VAL;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000134 } else {
135 delete [] pVal;
136 pVal = getMemory(RHS.getNumWords());
137 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
138 }
139 BitWidth = RHS.BitWidth;
140 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000141}
142
Zhou Shengdac63782007-02-06 03:00:16 +0000143APInt& APInt::operator=(uint64_t RHS) {
Eric Christopher820256b2009-08-21 04:06:45 +0000144 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000145 VAL = RHS;
Zhou Shengdac63782007-02-06 03:00:16 +0000146 else {
147 pVal[0] = RHS;
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000148 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000149 }
Reid Spencer7c16cd22007-02-26 23:38:21 +0000150 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000151}
152
Ted Kremenek5c75d542008-01-19 04:23:33 +0000153/// Profile - This method 'profiles' an APInt for use with FoldingSet.
154void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek901540f2008-02-19 20:50:41 +0000155 ID.AddInteger(BitWidth);
Eric Christopher820256b2009-08-21 04:06:45 +0000156
Ted Kremenek5c75d542008-01-19 04:23:33 +0000157 if (isSingleWord()) {
158 ID.AddInteger(VAL);
159 return;
160 }
161
Chris Lattner77527f52009-01-21 18:09:24 +0000162 unsigned NumWords = getNumWords();
Ted Kremenek5c75d542008-01-19 04:23:33 +0000163 for (unsigned i = 0; i < NumWords; ++i)
164 ID.AddInteger(pVal[i]);
165}
166
Eric Christopher820256b2009-08-21 04:06:45 +0000167/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spencera856b6e2007-02-18 18:38:44 +0000168/// "digit" integer array, x[]. x[] is modified to reflect the addition and
169/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer100502d2007-02-17 03:16:00 +0000170/// @returns the carry of the addition.
Chris Lattner77527f52009-01-21 18:09:24 +0000171static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
172 for (unsigned i = 0; i < len; ++i) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000173 dest[i] = y + x[i];
174 if (dest[i] < y)
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000175 y = 1; // Carry one to next digit.
Reid Spenceree0a6852007-02-18 06:39:42 +0000176 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000177 y = 0; // No need to carry so exit early
Reid Spenceree0a6852007-02-18 06:39:42 +0000178 break;
179 }
Reid Spencer100502d2007-02-17 03:16:00 +0000180 }
Reid Spenceree0a6852007-02-18 06:39:42 +0000181 return y;
Reid Spencer100502d2007-02-17 03:16:00 +0000182}
183
Zhou Shengdac63782007-02-06 03:00:16 +0000184/// @brief Prefix increment operator. Increments the APInt by one.
185APInt& APInt::operator++() {
Eric Christopher820256b2009-08-21 04:06:45 +0000186 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000187 ++VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000188 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000189 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000190 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000191}
192
Eric Christopher820256b2009-08-21 04:06:45 +0000193/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
194/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spencera856b6e2007-02-18 18:38:44 +0000195/// no further borrowing is neeeded or it runs out of "digits" in x. The result
196/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
197/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencera41e93b2007-02-25 19:32:03 +0000198/// @returns the borrow out of the subtraction
Chris Lattner77527f52009-01-21 18:09:24 +0000199static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
200 for (unsigned i = 0; i < len; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000201 uint64_t X = x[i];
Reid Spenceree0a6852007-02-18 06:39:42 +0000202 x[i] -= y;
Eric Christopher820256b2009-08-21 04:06:45 +0000203 if (y > X)
Reid Spencera856b6e2007-02-18 18:38:44 +0000204 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer100502d2007-02-17 03:16:00 +0000205 else {
Reid Spencera856b6e2007-02-18 18:38:44 +0000206 y = 0; // No need to borrow
207 break; // Remaining digits are unchanged so exit early
Reid Spencer100502d2007-02-17 03:16:00 +0000208 }
209 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000210 return bool(y);
Reid Spencer100502d2007-02-17 03:16:00 +0000211}
212
Zhou Shengdac63782007-02-06 03:00:16 +0000213/// @brief Prefix decrement operator. Decrements the APInt by one.
214APInt& APInt::operator--() {
Eric Christopher820256b2009-08-21 04:06:45 +0000215 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000216 --VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000217 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000218 sub_1(pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000219 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000220}
221
Reid Spencera41e93b2007-02-25 19:32:03 +0000222/// add - This function adds the integer array x to the integer array Y and
Eric Christopher820256b2009-08-21 04:06:45 +0000223/// places the result in dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000224/// @returns the carry out from the addition
225/// @brief General addition of 64-bit integer arrays
Eric Christopher820256b2009-08-21 04:06:45 +0000226static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000227 unsigned len) {
Reid Spencera5e0d202007-02-24 03:58:46 +0000228 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000229 for (unsigned i = 0; i< len; ++i) {
Reid Spencercb292e42007-02-23 01:57:13 +0000230 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000231 dest[i] = x[i] + y[i] + carry;
Reid Spencerdb2abec2007-02-21 05:44:56 +0000232 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer100502d2007-02-17 03:16:00 +0000233 }
234 return carry;
235}
236
Reid Spencera41e93b2007-02-25 19:32:03 +0000237/// Adds the RHS APint to this APInt.
238/// @returns this, after addition of RHS.
Eric Christopher820256b2009-08-21 04:06:45 +0000239/// @brief Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000240APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000241 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000242 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000243 VAL += RHS.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000244 else {
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000245 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000246 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000247 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000248}
249
Eric Christopher820256b2009-08-21 04:06:45 +0000250/// Subtracts the integer array y from the integer array x
Reid Spencera41e93b2007-02-25 19:32:03 +0000251/// @returns returns the borrow out.
252/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopher820256b2009-08-21 04:06:45 +0000253static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000254 unsigned len) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000255 bool borrow = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000256 for (unsigned i = 0; i < len; ++i) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000257 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
258 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
259 dest[i] = x_tmp - y[i];
Reid Spencer100502d2007-02-17 03:16:00 +0000260 }
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000261 return borrow;
Reid Spencer100502d2007-02-17 03:16:00 +0000262}
263
Reid Spencera41e93b2007-02-25 19:32:03 +0000264/// Subtracts the RHS APInt from this APInt
265/// @returns this, after subtraction
Eric Christopher820256b2009-08-21 04:06:45 +0000266/// @brief Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000267APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000268 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000269 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000270 VAL -= RHS.VAL;
271 else
272 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000273 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000274}
275
Dan Gohman4a618822010-02-10 16:03:48 +0000276/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopher820256b2009-08-21 04:06:45 +0000277/// into dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000278/// @returns the carry out of the multiplication.
279/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner77527f52009-01-21 18:09:24 +0000280static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000281 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer100502d2007-02-17 03:16:00 +0000282 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencera41e93b2007-02-25 19:32:03 +0000283 uint64_t carry = 0;
284
285 // For each digit of x.
Chris Lattner77527f52009-01-21 18:09:24 +0000286 for (unsigned i = 0; i < len; ++i) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000287 // Split x into high and low words
288 uint64_t lx = x[i] & 0xffffffffULL;
289 uint64_t hx = x[i] >> 32;
290 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer100502d2007-02-17 03:16:00 +0000291 // hasCarry == 0, no carry
292 // hasCarry == 1, has carry
293 // hasCarry == 2, no carry and the calculation result == 0.
294 uint8_t hasCarry = 0;
295 dest[i] = carry + lx * ly;
296 // Determine if the add above introduces carry.
297 hasCarry = (dest[i] < carry) ? 1 : 0;
298 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopher820256b2009-08-21 04:06:45 +0000299 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer100502d2007-02-17 03:16:00 +0000300 // (2^32 - 1) + 2^32 = 2^64.
301 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
302
303 carry += (lx * hy) & 0xffffffffULL;
304 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopher820256b2009-08-21 04:06:45 +0000305 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000306 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
307 }
Reid Spencer100502d2007-02-17 03:16:00 +0000308 return carry;
309}
310
Eric Christopher820256b2009-08-21 04:06:45 +0000311/// Multiplies integer array x by integer array y and stores the result into
Reid Spencera41e93b2007-02-25 19:32:03 +0000312/// the integer array dest. Note that dest's size must be >= xlen + ylen.
313/// @brief Generalized multiplicate of integer arrays.
Chris Lattner77527f52009-01-21 18:09:24 +0000314static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
315 unsigned ylen) {
Reid Spencer100502d2007-02-17 03:16:00 +0000316 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner77527f52009-01-21 18:09:24 +0000317 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000318 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencer58a6a432007-02-21 08:21:52 +0000319 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner77527f52009-01-21 18:09:24 +0000320 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer100502d2007-02-17 03:16:00 +0000321 lx = x[j] & 0xffffffffULL;
322 hx = x[j] >> 32;
323 // hasCarry - A flag to indicate if has carry.
324 // hasCarry == 0, no carry
325 // hasCarry == 1, has carry
326 // hasCarry == 2, no carry and the calculation result == 0.
327 uint8_t hasCarry = 0;
328 uint64_t resul = carry + lx * ly;
329 hasCarry = (resul < carry) ? 1 : 0;
330 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
331 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
332
333 carry += (lx * hy) & 0xffffffffULL;
334 resul = (carry << 32) | (resul & 0xffffffffULL);
335 dest[i+j] += resul;
336 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopher820256b2009-08-21 04:06:45 +0000337 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000338 ((lx * hy) >> 32) + hx * hy;
339 }
340 dest[i+xlen] = carry;
341 }
342}
343
Zhou Shengdac63782007-02-06 03:00:16 +0000344APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000345 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer58a6a432007-02-21 08:21:52 +0000346 if (isSingleWord()) {
Reid Spencer4bb430c2007-02-20 20:42:10 +0000347 VAL *= RHS.VAL;
Reid Spencer58a6a432007-02-21 08:21:52 +0000348 clearUnusedBits();
349 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000350 }
Reid Spencer58a6a432007-02-21 08:21:52 +0000351
352 // Get some bit facts about LHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000353 unsigned lhsBits = getActiveBits();
354 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopher820256b2009-08-21 04:06:45 +0000355 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +0000356 // 0 * X ===> 0
357 return *this;
358
359 // Get some bit facts about RHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000360 unsigned rhsBits = RHS.getActiveBits();
361 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencer58a6a432007-02-21 08:21:52 +0000362 if (!rhsWords) {
363 // X * 0 ===> 0
Jay Foad25a5e4c2010-12-01 08:53:58 +0000364 clearAllBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000365 return *this;
366 }
367
368 // Allocate space for the result
Chris Lattner77527f52009-01-21 18:09:24 +0000369 unsigned destWords = rhsWords + lhsWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000370 uint64_t *dest = getMemory(destWords);
371
372 // Perform the long multiply
373 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
374
375 // Copy result back into *this
Jay Foad25a5e4c2010-12-01 08:53:58 +0000376 clearAllBits();
Chris Lattner77527f52009-01-21 18:09:24 +0000377 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000378 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
379
380 // delete dest array and return
381 delete[] dest;
Zhou Shengdac63782007-02-06 03:00:16 +0000382 return *this;
383}
384
Zhou Shengdac63782007-02-06 03:00:16 +0000385APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000386 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000387 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000388 VAL &= RHS.VAL;
389 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000390 }
Chris Lattner77527f52009-01-21 18:09:24 +0000391 unsigned numWords = getNumWords();
392 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000393 pVal[i] &= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000394 return *this;
395}
396
Zhou Shengdac63782007-02-06 03:00:16 +0000397APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000398 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000399 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000400 VAL |= RHS.VAL;
401 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000402 }
Chris Lattner77527f52009-01-21 18:09:24 +0000403 unsigned numWords = getNumWords();
404 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000405 pVal[i] |= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000406 return *this;
407}
408
Zhou Shengdac63782007-02-06 03:00:16 +0000409APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000410 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000411 if (isSingleWord()) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000412 VAL ^= RHS.VAL;
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000413 this->clearUnusedBits();
Reid Spenceree0a6852007-02-18 06:39:42 +0000414 return *this;
Eric Christopher820256b2009-08-21 04:06:45 +0000415 }
Chris Lattner77527f52009-01-21 18:09:24 +0000416 unsigned numWords = getNumWords();
417 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000418 pVal[i] ^= RHS.pVal[i];
Reid Spencera41e93b2007-02-25 19:32:03 +0000419 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000420}
421
Chris Lattner1ac3e252008-08-20 17:02:31 +0000422APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000423 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000424 uint64_t* val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000425 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000426 val[i] = pVal[i] & RHS.pVal[i];
427 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000428}
429
Chris Lattner1ac3e252008-08-20 17:02:31 +0000430APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000431 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000432 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000433 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000434 val[i] = pVal[i] | RHS.pVal[i];
435 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000436}
437
Chris Lattner1ac3e252008-08-20 17:02:31 +0000438APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000439 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000440 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000441 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000442 val[i] = pVal[i] ^ RHS.pVal[i];
443
444 // 0^0==1 so clear the high bits in case they got set.
445 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000446}
447
Zhou Shengdac63782007-02-06 03:00:16 +0000448bool APInt::operator !() const {
449 if (isSingleWord())
450 return !VAL;
Reid Spencera856b6e2007-02-18 18:38:44 +0000451
Chris Lattner77527f52009-01-21 18:09:24 +0000452 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopher820256b2009-08-21 04:06:45 +0000453 if (pVal[i])
Reid Spencera856b6e2007-02-18 18:38:44 +0000454 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000455 return true;
456}
457
Zhou Shengdac63782007-02-06 03:00:16 +0000458APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000459 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000460 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000461 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer4bb430c2007-02-20 20:42:10 +0000462 APInt Result(*this);
463 Result *= RHS;
Reid Spencera41e93b2007-02-25 19:32:03 +0000464 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000465}
466
Zhou Shengdac63782007-02-06 03:00:16 +0000467APInt APInt::operator+(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000468 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000469 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000470 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000471 APInt Result(BitWidth, 0);
472 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000473 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000474}
475
Zhou Shengdac63782007-02-06 03:00:16 +0000476APInt APInt::operator-(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000477 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000478 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000479 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000480 APInt Result(BitWidth, 0);
481 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000482 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000483}
484
Chris Lattner77527f52009-01-21 18:09:24 +0000485bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman5ed61fe2010-11-18 17:14:56 +0000486 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopher820256b2009-08-21 04:06:45 +0000487 return (maskBit(bitPosition) &
Reid Spencera41e93b2007-02-25 19:32:03 +0000488 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengdac63782007-02-06 03:00:16 +0000489}
490
Chris Lattner1ac3e252008-08-20 17:02:31 +0000491bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencera41e93b2007-02-25 19:32:03 +0000492 // Get some facts about the number of bits used in the two operands.
Chris Lattner77527f52009-01-21 18:09:24 +0000493 unsigned n1 = getActiveBits();
494 unsigned n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000495
496 // If the number of bits isn't the same, they aren't equal
Eric Christopher820256b2009-08-21 04:06:45 +0000497 if (n1 != n2)
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000498 return false;
499
Reid Spencera41e93b2007-02-25 19:32:03 +0000500 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000501 if (n1 <= APINT_BITS_PER_WORD)
502 return pVal[0] == RHS.pVal[0];
503
Reid Spencera41e93b2007-02-25 19:32:03 +0000504 // Otherwise, compare everything
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000505 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopher820256b2009-08-21 04:06:45 +0000506 if (pVal[i] != RHS.pVal[i])
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000507 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000508 return true;
509}
510
Chris Lattner1ac3e252008-08-20 17:02:31 +0000511bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000512 unsigned n = getActiveBits();
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000513 if (n <= APINT_BITS_PER_WORD)
514 return pVal[0] == Val;
515 else
516 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000517}
518
Reid Spencer1d072122007-02-16 22:36:51 +0000519bool APInt::ult(const APInt& RHS) const {
520 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
521 if (isSingleWord())
522 return VAL < RHS.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000523
524 // Get active bit length of both operands
Chris Lattner77527f52009-01-21 18:09:24 +0000525 unsigned n1 = getActiveBits();
526 unsigned n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000527
528 // If magnitude of LHS is less than RHS, return true.
529 if (n1 < n2)
530 return true;
531
532 // If magnitude of RHS is greather than LHS, return false.
533 if (n2 < n1)
534 return false;
535
536 // If they bot fit in a word, just compare the low order word
537 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
538 return pVal[0] < RHS.pVal[0];
539
540 // Otherwise, compare all words
Chris Lattner77527f52009-01-21 18:09:24 +0000541 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000542 for (int i = topWord; i >= 0; --i) {
Eric Christopher820256b2009-08-21 04:06:45 +0000543 if (pVal[i] > RHS.pVal[i])
Reid Spencer1d072122007-02-16 22:36:51 +0000544 return false;
Eric Christopher820256b2009-08-21 04:06:45 +0000545 if (pVal[i] < RHS.pVal[i])
Reid Spencera41e93b2007-02-25 19:32:03 +0000546 return true;
Zhou Shengdac63782007-02-06 03:00:16 +0000547 }
548 return false;
549}
550
Reid Spencer1d072122007-02-16 22:36:51 +0000551bool APInt::slt(const APInt& RHS) const {
552 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000553 if (isSingleWord()) {
554 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
555 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
556 return lhsSext < rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000557 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000558
559 APInt lhs(*this);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000560 APInt rhs(RHS);
561 bool lhsNeg = isNegative();
562 bool rhsNeg = rhs.isNegative();
563 if (lhsNeg) {
564 // Sign bit is set so perform two's complement to make it positive
Jay Foad25a5e4c2010-12-01 08:53:58 +0000565 lhs.flipAllBits();
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000566 lhs++;
567 }
Reid Spencer54abdcf2007-02-27 18:23:40 +0000568 if (rhsNeg) {
569 // Sign bit is set so perform two's complement to make it positive
Jay Foad25a5e4c2010-12-01 08:53:58 +0000570 rhs.flipAllBits();
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000571 rhs++;
572 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000573
574 // Now we have unsigned values to compare so do the comparison if necessary
575 // based on the negativeness of the values.
Reid Spencer54abdcf2007-02-27 18:23:40 +0000576 if (lhsNeg)
577 if (rhsNeg)
578 return lhs.ugt(rhs);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000579 else
580 return true;
Reid Spencer54abdcf2007-02-27 18:23:40 +0000581 else if (rhsNeg)
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000582 return false;
Eric Christopher820256b2009-08-21 04:06:45 +0000583 else
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000584 return lhs.ult(rhs);
Zhou Shengdac63782007-02-06 03:00:16 +0000585}
586
Jay Foad25a5e4c2010-12-01 08:53:58 +0000587void APInt::setBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000588 if (isSingleWord())
Reid Spencera41e93b2007-02-25 19:32:03 +0000589 VAL |= maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000590 else
Reid Spencera41e93b2007-02-25 19:32:03 +0000591 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000592}
593
Zhou Shengdac63782007-02-06 03:00:16 +0000594/// Set the given bit to 0 whose position is given as "bitPosition".
595/// @brief Set a given bit to 0.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000596void APInt::clearBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000597 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000598 VAL &= ~maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000599 else
Reid Spencera856b6e2007-02-18 18:38:44 +0000600 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000601}
602
Zhou Shengdac63782007-02-06 03:00:16 +0000603/// @brief Toggle every bit to its opposite value.
Zhou Shengdac63782007-02-06 03:00:16 +0000604
Eric Christopher820256b2009-08-21 04:06:45 +0000605/// Toggle a given bit to its opposite value whose position is given
Zhou Shengdac63782007-02-06 03:00:16 +0000606/// as "bitPosition".
607/// @brief Toggles a given bit to its opposite value.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000608void APInt::flipBit(unsigned bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000609 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad25a5e4c2010-12-01 08:53:58 +0000610 if ((*this)[bitPosition]) clearBit(bitPosition);
611 else setBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000612}
613
Benjamin Kramer92d89982010-07-14 22:38:02 +0000614unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000615 assert(!str.empty() && "Invalid string length");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000616 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
617 "Radix should be 2, 8, 10, or 16!");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000618
619 size_t slen = str.size();
Reid Spencer9329e7b2007-04-13 19:19:07 +0000620
Eric Christopher43a1dec2009-08-21 04:10:31 +0000621 // Each computation below needs to know if it's negative.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000622 StringRef::iterator p = str.begin();
Eric Christopher43a1dec2009-08-21 04:10:31 +0000623 unsigned isNegative = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000624 if (*p == '-' || *p == '+') {
625 p++;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000626 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +0000627 assert(slen && "String is only a sign, needs a value.");
Reid Spencer9329e7b2007-04-13 19:19:07 +0000628 }
Eric Christopher43a1dec2009-08-21 04:10:31 +0000629
Reid Spencer9329e7b2007-04-13 19:19:07 +0000630 // For radixes of power-of-two values, the bits required is accurately and
631 // easily computed
632 if (radix == 2)
633 return slen + isNegative;
634 if (radix == 8)
635 return slen * 3 + isNegative;
636 if (radix == 16)
637 return slen * 4 + isNegative;
638
Reid Spencer9329e7b2007-04-13 19:19:07 +0000639 // This is grossly inefficient but accurate. We could probably do something
640 // with a computation of roughly slen*64/20 and then adjust by the value of
641 // the first few digits. But, I'm not sure how accurate that could be.
642
643 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000644 // be too large. This avoids the assertion in the constructor. This
645 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
646 // bits in that case.
647 unsigned sufficient = slen == 1 ? 4 : slen * 64/18;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000648
649 // Convert to the actual binary value.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000650 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000651
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000652 // Compute how many bits are required. If the log is infinite, assume we need
653 // just bit.
654 unsigned log = tmp.logBase2();
655 if (log == (unsigned)-1) {
656 return isNegative + 1;
657 } else {
658 return isNegative + log + 1;
659 }
Reid Spencer9329e7b2007-04-13 19:19:07 +0000660}
661
Stuart Hastings7440952c2009-03-13 21:51:13 +0000662// From http://www.burtleburtle.net, byBob Jenkins.
663// When targeting x86, both GCC and LLVM seem to recognize this as a
664// rotate instruction.
665#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
Reid Spencerb2bc9852007-02-26 21:02:27 +0000666
Stuart Hastings7440952c2009-03-13 21:51:13 +0000667// From http://www.burtleburtle.net, by Bob Jenkins.
668#define mix(a,b,c) \
669 { \
670 a -= c; a ^= rot(c, 4); c += b; \
671 b -= a; b ^= rot(a, 6); a += c; \
672 c -= b; c ^= rot(b, 8); b += a; \
673 a -= c; a ^= rot(c,16); c += b; \
674 b -= a; b ^= rot(a,19); a += c; \
675 c -= b; c ^= rot(b, 4); b += a; \
676 }
677
678// From http://www.burtleburtle.net, by Bob Jenkins.
679#define final(a,b,c) \
680 { \
681 c ^= b; c -= rot(b,14); \
682 a ^= c; a -= rot(c,11); \
683 b ^= a; b -= rot(a,25); \
684 c ^= b; c -= rot(b,16); \
685 a ^= c; a -= rot(c,4); \
686 b ^= a; b -= rot(a,14); \
687 c ^= b; c -= rot(b,24); \
688 }
689
690// hashword() was adapted from http://www.burtleburtle.net, by Bob
691// Jenkins. k is a pointer to an array of uint32_t values; length is
692// the length of the key, in 32-bit chunks. This version only handles
693// keys that are a multiple of 32 bits in size.
694static inline uint32_t hashword(const uint64_t *k64, size_t length)
695{
696 const uint32_t *k = reinterpret_cast<const uint32_t *>(k64);
697 uint32_t a,b,c;
698
699 /* Set up the internal state */
700 a = b = c = 0xdeadbeef + (((uint32_t)length)<<2);
701
702 /*------------------------------------------------- handle most of the key */
Dan Gohmanb452d4e2010-03-24 19:38:02 +0000703 while (length > 3) {
704 a += k[0];
705 b += k[1];
706 c += k[2];
707 mix(a,b,c);
708 length -= 3;
709 k += 3;
710 }
Stuart Hastings7440952c2009-03-13 21:51:13 +0000711
712 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stump889285d2009-05-13 23:23:20 +0000713 switch (length) { /* all the case statements fall through */
714 case 3 : c+=k[2];
715 case 2 : b+=k[1];
716 case 1 : a+=k[0];
717 final(a,b,c);
Stuart Hastings7440952c2009-03-13 21:51:13 +0000718 case 0: /* case 0: nothing left to add */
719 break;
720 }
721 /*------------------------------------------------------ report the result */
722 return c;
723}
724
725// hashword8() was adapted from http://www.burtleburtle.net, by Bob
726// Jenkins. This computes a 32-bit hash from one 64-bit word. When
727// targeting x86 (32 or 64 bit), both LLVM and GCC compile this
728// function into about 35 instructions when inlined.
729static inline uint32_t hashword8(const uint64_t k64)
730{
731 uint32_t a,b,c;
732 a = b = c = 0xdeadbeef + 4;
733 b += k64 >> 32;
734 a += k64 & 0xffffffff;
735 final(a,b,c);
736 return c;
737}
738#undef final
739#undef mix
740#undef rot
741
742uint64_t APInt::getHashValue() const {
743 uint64_t hash;
Reid Spencerb2bc9852007-02-26 21:02:27 +0000744 if (isSingleWord())
Stuart Hastings7440952c2009-03-13 21:51:13 +0000745 hash = hashword8(VAL);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000746 else
Stuart Hastings7440952c2009-03-13 21:51:13 +0000747 hash = hashword(pVal, getNumWords()*2);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000748 return hash;
749}
750
Zhou Shengdac63782007-02-06 03:00:16 +0000751/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000752APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000753 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000754}
755
756/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000757APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopher820256b2009-08-21 04:06:45 +0000758 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencer1d072122007-02-16 22:36:51 +0000759 BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000760}
761
Chris Lattner77527f52009-01-21 18:09:24 +0000762unsigned APInt::countLeadingZerosSlowCase() const {
John McCalldf951bd2010-02-03 03:42:44 +0000763 // Treat the most significand word differently because it might have
764 // meaningless bits set beyond the precision.
765 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
766 integerPart MSWMask;
767 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
768 else {
769 MSWMask = ~integerPart(0);
770 BitsInMSW = APINT_BITS_PER_WORD;
771 }
772
773 unsigned i = getNumWords();
774 integerPart MSW = pVal[i-1] & MSWMask;
775 if (MSW)
776 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
777
778 unsigned Count = BitsInMSW;
779 for (--i; i > 0u; --i) {
Chris Lattner1ac3e252008-08-20 17:02:31 +0000780 if (pVal[i-1] == 0)
781 Count += APINT_BITS_PER_WORD;
782 else {
783 Count += CountLeadingZeros_64(pVal[i-1]);
784 break;
Reid Spencer74cf82e2007-02-21 00:29:48 +0000785 }
Zhou Shengdac63782007-02-06 03:00:16 +0000786 }
John McCalldf951bd2010-02-03 03:42:44 +0000787 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000788}
789
Chris Lattner77527f52009-01-21 18:09:24 +0000790static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
791 unsigned Count = 0;
Reid Spencer31acef52007-02-27 21:59:26 +0000792 if (skip)
793 V <<= skip;
794 while (V && (V & (1ULL << 63))) {
795 Count++;
796 V <<= 1;
797 }
798 return Count;
799}
800
Chris Lattner77527f52009-01-21 18:09:24 +0000801unsigned APInt::countLeadingOnes() const {
Reid Spencer31acef52007-02-27 21:59:26 +0000802 if (isSingleWord())
803 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
804
Chris Lattner77527f52009-01-21 18:09:24 +0000805 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwinec39eb82009-01-27 18:06:03 +0000806 unsigned shift;
807 if (!highWordBits) {
808 highWordBits = APINT_BITS_PER_WORD;
809 shift = 0;
810 } else {
811 shift = APINT_BITS_PER_WORD - highWordBits;
812 }
Reid Spencer31acef52007-02-27 21:59:26 +0000813 int i = getNumWords() - 1;
Chris Lattner77527f52009-01-21 18:09:24 +0000814 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer31acef52007-02-27 21:59:26 +0000815 if (Count == highWordBits) {
816 for (i--; i >= 0; --i) {
817 if (pVal[i] == -1ULL)
818 Count += APINT_BITS_PER_WORD;
819 else {
820 Count += countLeadingOnes_64(pVal[i], 0);
821 break;
822 }
823 }
824 }
825 return Count;
826}
827
Chris Lattner77527f52009-01-21 18:09:24 +0000828unsigned APInt::countTrailingZeros() const {
Zhou Shengdac63782007-02-06 03:00:16 +0000829 if (isSingleWord())
Chris Lattner77527f52009-01-21 18:09:24 +0000830 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
831 unsigned Count = 0;
832 unsigned i = 0;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000833 for (; i < getNumWords() && pVal[i] == 0; ++i)
834 Count += APINT_BITS_PER_WORD;
835 if (i < getNumWords())
836 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattnerc2c4c742007-11-23 22:36:25 +0000837 return std::min(Count, BitWidth);
Zhou Shengdac63782007-02-06 03:00:16 +0000838}
839
Chris Lattner77527f52009-01-21 18:09:24 +0000840unsigned APInt::countTrailingOnesSlowCase() const {
841 unsigned Count = 0;
842 unsigned i = 0;
Dan Gohmanc354ebd2008-02-14 22:38:45 +0000843 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000844 Count += APINT_BITS_PER_WORD;
845 if (i < getNumWords())
846 Count += CountTrailingOnes_64(pVal[i]);
847 return std::min(Count, BitWidth);
848}
849
Chris Lattner77527f52009-01-21 18:09:24 +0000850unsigned APInt::countPopulationSlowCase() const {
851 unsigned Count = 0;
852 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengdac63782007-02-06 03:00:16 +0000853 Count += CountPopulation_64(pVal[i]);
854 return Count;
855}
856
Reid Spencer1d072122007-02-16 22:36:51 +0000857APInt APInt::byteSwap() const {
858 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
859 if (BitWidth == 16)
Jeff Cohene06855e2007-03-20 20:42:36 +0000860 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencer1d072122007-02-16 22:36:51 +0000861 else if (BitWidth == 32)
Chris Lattner77527f52009-01-21 18:09:24 +0000862 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencer1d072122007-02-16 22:36:51 +0000863 else if (BitWidth == 48) {
Chris Lattner77527f52009-01-21 18:09:24 +0000864 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000865 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohene06855e2007-03-20 20:42:36 +0000866 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000867 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohene06855e2007-03-20 20:42:36 +0000868 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencer1d072122007-02-16 22:36:51 +0000869 } else if (BitWidth == 64)
Reid Spencera32372d12007-02-17 00:18:01 +0000870 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000871 else {
Reid Spencera32372d12007-02-17 00:18:01 +0000872 APInt Result(BitWidth, 0);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000873 char *pByte = (char*)Result.pVal;
Chris Lattner77527f52009-01-21 18:09:24 +0000874 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000875 char Tmp = pByte[i];
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000876 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
877 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000878 }
879 return Result;
880 }
Zhou Shengdac63782007-02-06 03:00:16 +0000881}
882
Eric Christopher820256b2009-08-21 04:06:45 +0000883APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000884 const APInt& API2) {
Zhou Shengdac63782007-02-06 03:00:16 +0000885 APInt A = API1, B = API2;
886 while (!!B) {
887 APInt T = B;
Reid Spencer1d072122007-02-16 22:36:51 +0000888 B = APIntOps::urem(A, B);
Zhou Shengdac63782007-02-06 03:00:16 +0000889 A = T;
890 }
891 return A;
892}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000893
Chris Lattner77527f52009-01-21 18:09:24 +0000894APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000895 union {
896 double D;
897 uint64_t I;
898 } T;
899 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000900
901 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000902 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000903
904 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000905 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000906
907 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000908 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000909 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000910
911 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
912 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
913
914 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000915 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000916 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000917 APInt(width, mantissa >> (52 - exp));
918
919 // If the client didn't provide enough bits for us to shift the mantissa into
920 // then the result is undefined, just return 0
921 if (width <= exp - 52)
922 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000923
924 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000925 APInt Tmp(width, mantissa);
Chris Lattner77527f52009-01-21 18:09:24 +0000926 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd707d632007-02-12 20:02:55 +0000927 return isNeg ? -Tmp : Tmp;
928}
929
Dale Johannesen54be7852009-08-12 18:04:11 +0000930/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000931/// The layout for double is as following (IEEE Standard 754):
932/// --------------------------------------
933/// | Sign Exponent Fraction Bias |
934/// |-------------------------------------- |
935/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000936/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000937double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000938
939 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000940 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000941 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
942 if (isSigned) {
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000943 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000944 return double(sext);
945 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000946 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000947 }
948
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000949 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000950 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000951
952 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000953 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000954
955 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000956 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000957
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000958 // The exponent (without bias normalization) is just the number of bits
959 // we are using. Note that the sign bit is gone since we constructed the
960 // absolute value.
961 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000962
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000963 // Return infinity for exponent overflow
964 if (exp > 1023) {
965 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000966 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000967 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000968 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000969 }
970 exp += 1023; // Increment for 1023 bias
971
972 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
973 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000974 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000975 unsigned hiWord = whichWord(n-1);
976 if (hiWord == 0) {
977 mantissa = Tmp.pVal[0];
978 if (n > 52)
979 mantissa >>= n - 52; // shift down, we want the top 52 bits.
980 } else {
981 assert(hiWord > 0 && "huh?");
982 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
983 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
984 mantissa = hibits | lobits;
985 }
986
Zhou Shengd707d632007-02-12 20:02:55 +0000987 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000988 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +0000989 union {
990 double D;
991 uint64_t I;
992 } T;
993 T.I = sign | (exp << 52) | mantissa;
994 return T.D;
995}
996
Reid Spencer1d072122007-02-16 22:36:51 +0000997// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000998APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000999 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +00001000 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +00001001
1002 if (width <= APINT_BITS_PER_WORD)
1003 return APInt(width, getRawData()[0]);
1004
1005 APInt Result(getMemory(getNumWords(width)), width);
1006
1007 // Copy full words.
1008 unsigned i;
1009 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1010 Result.pVal[i] = pVal[i];
1011
1012 // Truncate and copy any partial word.
1013 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1014 if (bits != 0)
1015 Result.pVal[i] = pVal[i] << bits >> bits;
1016
1017 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001018}
1019
1020// Sign extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001021APInt APInt::sext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001022 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001023
1024 if (width <= APINT_BITS_PER_WORD) {
1025 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1026 val = (int64_t)val >> (width - BitWidth);
1027 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001028 }
1029
Jay Foad583abbc2010-12-07 08:25:19 +00001030 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001031
Jay Foad583abbc2010-12-07 08:25:19 +00001032 // Copy full words.
1033 unsigned i;
1034 uint64_t word = 0;
1035 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1036 word = getRawData()[i];
1037 Result.pVal[i] = word;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001038 }
1039
Jay Foad583abbc2010-12-07 08:25:19 +00001040 // Read and sign-extend any partial word.
1041 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1042 if (bits != 0)
1043 word = (int64_t)getRawData()[i] << bits >> bits;
1044 else
1045 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1046
1047 // Write remaining full words.
1048 for (; i != width / APINT_BITS_PER_WORD; i++) {
1049 Result.pVal[i] = word;
1050 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001051 }
Jay Foad583abbc2010-12-07 08:25:19 +00001052
1053 // Write any partial word.
1054 bits = (0 - width) % APINT_BITS_PER_WORD;
1055 if (bits != 0)
1056 Result.pVal[i] = word << bits >> bits;
1057
1058 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001059}
1060
1061// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001062APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001063 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001064
1065 if (width <= APINT_BITS_PER_WORD)
1066 return APInt(width, VAL);
1067
1068 APInt Result(getMemory(getNumWords(width)), width);
1069
1070 // Copy words.
1071 unsigned i;
1072 for (i = 0; i != getNumWords(); i++)
1073 Result.pVal[i] = getRawData()[i];
1074
1075 // Zero remaining words.
1076 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1077
1078 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001079}
1080
Jay Foad583abbc2010-12-07 08:25:19 +00001081APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001082 if (BitWidth < width)
1083 return zext(width);
1084 if (BitWidth > width)
1085 return trunc(width);
1086 return *this;
1087}
1088
Jay Foad583abbc2010-12-07 08:25:19 +00001089APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001090 if (BitWidth < width)
1091 return sext(width);
1092 if (BitWidth > width)
1093 return trunc(width);
1094 return *this;
1095}
1096
Zhou Shenge93db8f2007-02-09 07:48:24 +00001097/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001098/// @brief Arithmetic right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001099APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001100 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001101}
1102
1103/// Arithmetic right-shift this APInt by shiftAmt.
1104/// @brief Arithmetic right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001105APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001106 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer1825dd02007-03-02 22:39:11 +00001107 // Handle a degenerate case
1108 if (shiftAmt == 0)
1109 return *this;
1110
1111 // Handle single word shifts with built-in ashr
Reid Spencer522ca7c2007-02-25 01:56:07 +00001112 if (isSingleWord()) {
1113 if (shiftAmt == BitWidth)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001114 return APInt(BitWidth, 0); // undefined
1115 else {
Chris Lattner77527f52009-01-21 18:09:24 +00001116 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopher820256b2009-08-21 04:06:45 +00001117 return APInt(BitWidth,
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001118 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1119 }
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001120 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001121
Reid Spencer1825dd02007-03-02 22:39:11 +00001122 // If all the bits were shifted out, the result is, technically, undefined.
1123 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1124 // issues in the algorithm below.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001125 if (shiftAmt == BitWidth) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001126 if (isNegative())
Zhou Sheng1247c072008-06-05 13:27:38 +00001127 return APInt(BitWidth, -1ULL, true);
Reid Spencera41e93b2007-02-25 19:32:03 +00001128 else
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001129 return APInt(BitWidth, 0);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001130 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001131
1132 // Create some space for the result.
1133 uint64_t * val = new uint64_t[getNumWords()];
1134
Reid Spencer1825dd02007-03-02 22:39:11 +00001135 // Compute some values needed by the following shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001136 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1137 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1138 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1139 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer1825dd02007-03-02 22:39:11 +00001140 if (bitsInWord == 0)
1141 bitsInWord = APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001142
1143 // If we are shifting whole words, just move whole words
1144 if (wordShift == 0) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001145 // Move the words containing significant bits
Chris Lattner77527f52009-01-21 18:09:24 +00001146 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001147 val[i] = pVal[i+offset]; // move whole word
1148
1149 // Adjust the top significant word for sign bit fill, if negative
1150 if (isNegative())
1151 if (bitsInWord < APINT_BITS_PER_WORD)
1152 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1153 } else {
Eric Christopher820256b2009-08-21 04:06:45 +00001154 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001155 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001156 // This combines the shifted corresponding word with the low bits from
1157 // the next word (shifted into this word's high bits).
Eric Christopher820256b2009-08-21 04:06:45 +00001158 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer1825dd02007-03-02 22:39:11 +00001159 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1160 }
1161
1162 // Shift the break word. In this case there are no bits from the next word
1163 // to include in this word.
1164 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1165
1166 // Deal with sign extenstion in the break word, and possibly the word before
1167 // it.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001168 if (isNegative()) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001169 if (wordShift > bitsInWord) {
1170 if (breakWord > 0)
Eric Christopher820256b2009-08-21 04:06:45 +00001171 val[breakWord-1] |=
Reid Spencer1825dd02007-03-02 22:39:11 +00001172 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1173 val[breakWord] |= ~0ULL;
Eric Christopher820256b2009-08-21 04:06:45 +00001174 } else
Reid Spencer1825dd02007-03-02 22:39:11 +00001175 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnerdad2d092007-05-03 18:15:36 +00001176 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001177 }
1178
Reid Spencer1825dd02007-03-02 22:39:11 +00001179 // Remaining words are 0 or -1, just assign them.
1180 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner77527f52009-01-21 18:09:24 +00001181 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001182 val[i] = fillValue;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001183 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001184}
1185
Zhou Shenge93db8f2007-02-09 07:48:24 +00001186/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001187/// @brief Logical right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001188APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001189 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001190}
1191
1192/// Logical right-shift this APInt by shiftAmt.
1193/// @brief Logical right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001194APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnerdad2d092007-05-03 18:15:36 +00001195 if (isSingleWord()) {
Reid Spencer522ca7c2007-02-25 01:56:07 +00001196 if (shiftAmt == BitWidth)
1197 return APInt(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001198 else
Reid Spencer522ca7c2007-02-25 01:56:07 +00001199 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001200 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001201
Reid Spencer44eef162007-02-26 01:19:48 +00001202 // If all the bits were shifted out, the result is 0. This avoids issues
1203 // with shifting by the size of the integer type, which produces undefined
1204 // results. We define these "undefined results" to always be 0.
1205 if (shiftAmt == BitWidth)
1206 return APInt(BitWidth, 0);
1207
Reid Spencerfffdf102007-05-17 06:26:29 +00001208 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopher820256b2009-08-21 04:06:45 +00001209 // issues with shifting by the size of the integer type, which produces
Reid Spencerfffdf102007-05-17 06:26:29 +00001210 // undefined results in the code below. This is also an optimization.
1211 if (shiftAmt == 0)
1212 return *this;
1213
Reid Spencer44eef162007-02-26 01:19:48 +00001214 // Create some space for the result.
1215 uint64_t * val = new uint64_t[getNumWords()];
1216
1217 // If we are shifting less than a word, compute the shift with a simple carry
1218 if (shiftAmt < APINT_BITS_PER_WORD) {
1219 uint64_t carry = 0;
1220 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spencerd99feaf2007-03-01 05:39:56 +00001221 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencer44eef162007-02-26 01:19:48 +00001222 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1223 }
1224 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencera41e93b2007-02-25 19:32:03 +00001225 }
1226
Reid Spencer44eef162007-02-26 01:19:48 +00001227 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001228 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1229 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer44eef162007-02-26 01:19:48 +00001230
1231 // If we are shifting whole words, just move whole words
1232 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001233 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001234 val[i] = pVal[i+offset];
Chris Lattner77527f52009-01-21 18:09:24 +00001235 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencer44eef162007-02-26 01:19:48 +00001236 val[i] = 0;
1237 return APInt(val,BitWidth).clearUnusedBits();
1238 }
1239
Eric Christopher820256b2009-08-21 04:06:45 +00001240 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001241 unsigned breakWord = getNumWords() - offset -1;
1242 for (unsigned i = 0; i < breakWord; ++i)
Reid Spencerd99feaf2007-03-01 05:39:56 +00001243 val[i] = (pVal[i+offset] >> wordShift) |
1244 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencer44eef162007-02-26 01:19:48 +00001245 // Shift the break word.
1246 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1247
1248 // Remaining words are 0
Chris Lattner77527f52009-01-21 18:09:24 +00001249 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001250 val[i] = 0;
1251 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001252}
1253
Zhou Shenge93db8f2007-02-09 07:48:24 +00001254/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001255/// @brief Left-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001256APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky030c4502009-01-19 17:42:33 +00001257 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner77527f52009-01-21 18:09:24 +00001258 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001259}
1260
Chris Lattner77527f52009-01-21 18:09:24 +00001261APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencera5c84d92007-02-25 00:56:44 +00001262 // If all the bits were shifted out, the result is 0. This avoids issues
1263 // with shifting by the size of the integer type, which produces undefined
1264 // results. We define these "undefined results" to always be 0.
1265 if (shiftAmt == BitWidth)
1266 return APInt(BitWidth, 0);
1267
Reid Spencer81ee0202007-05-12 18:01:57 +00001268 // If none of the bits are shifted out, the result is *this. This avoids a
1269 // lshr by the words size in the loop below which can produce incorrect
1270 // results. It also avoids the expensive computation below for a common case.
1271 if (shiftAmt == 0)
1272 return *this;
1273
Reid Spencera5c84d92007-02-25 00:56:44 +00001274 // Create some space for the result.
1275 uint64_t * val = new uint64_t[getNumWords()];
1276
1277 // If we are shifting less than a word, do it the easy way
1278 if (shiftAmt < APINT_BITS_PER_WORD) {
1279 uint64_t carry = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001280 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencera5c84d92007-02-25 00:56:44 +00001281 val[i] = pVal[i] << shiftAmt | carry;
1282 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1283 }
Reid Spencera41e93b2007-02-25 19:32:03 +00001284 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer632ebdf2007-02-24 20:19:37 +00001285 }
1286
Reid Spencera5c84d92007-02-25 00:56:44 +00001287 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001288 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1289 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencera5c84d92007-02-25 00:56:44 +00001290
1291 // If we are shifting whole words, just move whole words
1292 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001293 for (unsigned i = 0; i < offset; i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001294 val[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001295 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001296 val[i] = pVal[i-offset];
Reid Spencera41e93b2007-02-25 19:32:03 +00001297 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer632ebdf2007-02-24 20:19:37 +00001298 }
Reid Spencera5c84d92007-02-25 00:56:44 +00001299
1300 // Copy whole words from this to Result.
Chris Lattner77527f52009-01-21 18:09:24 +00001301 unsigned i = getNumWords() - 1;
Reid Spencera5c84d92007-02-25 00:56:44 +00001302 for (; i > offset; --i)
1303 val[i] = pVal[i-offset] << wordShift |
1304 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencerab0e08a2007-02-25 01:08:58 +00001305 val[offset] = pVal[0] << wordShift;
Reid Spencera5c84d92007-02-25 00:56:44 +00001306 for (i = 0; i < offset; ++i)
1307 val[i] = 0;
Reid Spencera41e93b2007-02-25 19:32:03 +00001308 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001309}
1310
Dan Gohman105c1d42008-02-29 01:40:47 +00001311APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001312 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001313}
1314
Chris Lattner77527f52009-01-21 18:09:24 +00001315APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer98ed7db2007-05-14 00:15:28 +00001316 if (rotateAmt == 0)
1317 return *this;
Reid Spencer4c50b522007-05-13 23:44:59 +00001318 // Don't get too fancy, just use existing shift/or facilities
1319 APInt hi(*this);
1320 APInt lo(*this);
1321 hi.shl(rotateAmt);
1322 lo.lshr(BitWidth - rotateAmt);
1323 return hi | lo;
1324}
1325
Dan Gohman105c1d42008-02-29 01:40:47 +00001326APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001327 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001328}
1329
Chris Lattner77527f52009-01-21 18:09:24 +00001330APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer98ed7db2007-05-14 00:15:28 +00001331 if (rotateAmt == 0)
1332 return *this;
Reid Spencer4c50b522007-05-13 23:44:59 +00001333 // Don't get too fancy, just use existing shift/or facilities
1334 APInt hi(*this);
1335 APInt lo(*this);
1336 lo.lshr(rotateAmt);
1337 hi.shl(BitWidth - rotateAmt);
1338 return hi | lo;
1339}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001340
1341// Square Root - this method computes and returns the square root of "this".
1342// Three mechanisms are used for computation. For small values (<= 5 bits),
1343// a table lookup is done. This gets some performance for common cases. For
1344// values using less than 52 bits, the value is converted to double and then
1345// the libc sqrt function is called. The result is rounded and then converted
1346// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001347// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001348APInt APInt::sqrt() const {
1349
1350 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001351 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001352
1353 // Use a fast table for some small values. This also gets rid of some
1354 // rounding errors in libc sqrt for small values.
1355 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001356 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001357 /* 0 */ 0,
1358 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001359 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001360 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1361 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1362 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1363 /* 31 */ 6
1364 };
1365 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001366 }
1367
1368 // If the magnitude of the value fits in less than 52 bits (the precision of
1369 // an IEEE double precision floating point value), then we can use the
1370 // libc sqrt function which will probably use a hardware sqrt computation.
1371 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001372 if (magnitude < 52) {
Chris Lattner9e01b612010-05-15 17:11:55 +00001373#if HAVE_ROUND
Eric Christopher820256b2009-08-21 04:06:45 +00001374 return APInt(BitWidth,
Reid Spencerd99feaf2007-03-01 05:39:56 +00001375 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner9e01b612010-05-15 17:11:55 +00001376#else
1377 return APInt(BitWidth,
1378 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
Jeff Cohenb622c112007-03-05 00:00:42 +00001379#endif
1380 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001381
1382 // Okay, all the short cuts are exhausted. We must compute it. The following
1383 // is a classical Babylonian method for computing the square root. This code
1384 // was adapted to APINt from a wikipedia article on such computations.
1385 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001386 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001387 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001388 APInt testy(BitWidth, 16);
1389 APInt x_old(BitWidth, 1);
1390 APInt x_new(BitWidth, 0);
1391 APInt two(BitWidth, 2);
1392
1393 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001394 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001395 if (i >= nbits || this->ule(testy)) {
1396 x_old = x_old.shl(i / 2);
1397 break;
1398 }
1399
Eric Christopher820256b2009-08-21 04:06:45 +00001400 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001401 for (;;) {
1402 x_new = (this->udiv(x_old) + x_old).udiv(two);
1403 if (x_old.ule(x_new))
1404 break;
1405 x_old = x_new;
1406 }
1407
1408 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001409 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001410 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001411 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001412 // floating point representation after 192 bits. There are no discrepancies
1413 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001414 APInt square(x_old * x_old);
1415 APInt nextSquare((x_old + 1) * (x_old +1));
1416 if (this->ult(square))
1417 return x_old;
Reid Spencercf817562007-03-02 04:21:55 +00001418 else if (this->ule(nextSquare)) {
1419 APInt midpoint((nextSquare - square).udiv(two));
1420 APInt offset(*this - square);
1421 if (offset.ult(midpoint))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001422 return x_old;
Reid Spencercf817562007-03-02 04:21:55 +00001423 else
1424 return x_old + 1;
1425 } else
Torok Edwinfbcc6632009-07-14 16:55:14 +00001426 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spencerd99feaf2007-03-01 05:39:56 +00001427 return x_old + 1;
1428}
1429
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001430/// Computes the multiplicative inverse of this APInt for a given modulo. The
1431/// iterative extended Euclidean algorithm is used to solve for this value,
1432/// however we simplify it to speed up calculating only the inverse, and take
1433/// advantage of div+rem calculations. We also use some tricks to avoid copying
1434/// (potentially large) APInts around.
1435APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1436 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1437
1438 // Using the properties listed at the following web page (accessed 06/21/08):
1439 // http://www.numbertheory.org/php/euclid.html
1440 // (especially the properties numbered 3, 4 and 9) it can be proved that
1441 // BitWidth bits suffice for all the computations in the algorithm implemented
1442 // below. More precisely, this number of bits suffice if the multiplicative
1443 // inverse exists, but may not suffice for the general extended Euclidean
1444 // algorithm.
1445
1446 APInt r[2] = { modulo, *this };
1447 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1448 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001449
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001450 unsigned i;
1451 for (i = 0; r[i^1] != 0; i ^= 1) {
1452 // An overview of the math without the confusing bit-flipping:
1453 // q = r[i-2] / r[i-1]
1454 // r[i] = r[i-2] % r[i-1]
1455 // t[i] = t[i-2] - t[i-1] * q
1456 udivrem(r[i], r[i^1], q, r[i]);
1457 t[i] -= t[i^1] * q;
1458 }
1459
1460 // If this APInt and the modulo are not coprime, there is no multiplicative
1461 // inverse, so return 0. We check this by looking at the next-to-last
1462 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1463 // algorithm.
1464 if (r[i] != 1)
1465 return APInt(BitWidth, 0);
1466
1467 // The next-to-last t is the multiplicative inverse. However, we are
1468 // interested in a positive inverse. Calcuate a positive one from a negative
1469 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001470 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001471 return t[i].isNegative() ? t[i] + modulo : t[i];
1472}
1473
Jay Foadfe0c6482009-04-30 10:15:35 +00001474/// Calculate the magic numbers required to implement a signed integer division
1475/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1476/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1477/// Warren, Jr., chapter 10.
1478APInt::ms APInt::magic() const {
1479 const APInt& d = *this;
1480 unsigned p;
1481 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001482 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001483 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001484
Jay Foadfe0c6482009-04-30 10:15:35 +00001485 ad = d.abs();
1486 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1487 anc = t - 1 - t.urem(ad); // absolute value of nc
1488 p = d.getBitWidth() - 1; // initialize p
1489 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1490 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1491 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1492 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1493 do {
1494 p = p + 1;
1495 q1 = q1<<1; // update q1 = 2p/abs(nc)
1496 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1497 if (r1.uge(anc)) { // must be unsigned comparison
1498 q1 = q1 + 1;
1499 r1 = r1 - anc;
1500 }
1501 q2 = q2<<1; // update q2 = 2p/abs(d)
1502 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1503 if (r2.uge(ad)) { // must be unsigned comparison
1504 q2 = q2 + 1;
1505 r2 = r2 - ad;
1506 }
1507 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001508 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001509
Jay Foadfe0c6482009-04-30 10:15:35 +00001510 mag.m = q2 + 1;
1511 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1512 mag.s = p - d.getBitWidth(); // resulting shift
1513 return mag;
1514}
1515
1516/// Calculate the magic numbers required to implement an unsigned integer
1517/// division by a constant as a sequence of multiplies, adds and shifts.
1518/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1519/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001520/// LeadingZeros can be used to simplify the calculation if the upper bits
1521/// of the devided value are known zero.
1522APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001523 const APInt& d = *this;
1524 unsigned p;
1525 APInt nc, delta, q1, r1, q2, r2;
1526 struct mu magu;
1527 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001528 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001529 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1530 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1531
1532 nc = allOnes - (-d).urem(d);
1533 p = d.getBitWidth() - 1; // initialize p
1534 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1535 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1536 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1537 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1538 do {
1539 p = p + 1;
1540 if (r1.uge(nc - r1)) {
1541 q1 = q1 + q1 + 1; // update q1
1542 r1 = r1 + r1 - nc; // update r1
1543 }
1544 else {
1545 q1 = q1+q1; // update q1
1546 r1 = r1+r1; // update r1
1547 }
1548 if ((r2 + 1).uge(d - r2)) {
1549 if (q2.uge(signedMax)) magu.a = 1;
1550 q2 = q2+q2 + 1; // update q2
1551 r2 = r2+r2 + 1 - d; // update r2
1552 }
1553 else {
1554 if (q2.uge(signedMin)) magu.a = 1;
1555 q2 = q2+q2; // update q2
1556 r2 = r2+r2 + 1; // update r2
1557 }
1558 delta = d - 1 - r2;
1559 } while (p < d.getBitWidth()*2 &&
1560 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1561 magu.m = q2 + 1; // resulting magic number
1562 magu.s = p - d.getBitWidth(); // resulting shift
1563 return magu;
1564}
1565
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001566/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1567/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1568/// variables here have the same names as in the algorithm. Comments explain
1569/// the algorithm and any deviation from it.
Chris Lattner77527f52009-01-21 18:09:24 +00001570static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1571 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001572 assert(u && "Must provide dividend");
1573 assert(v && "Must provide divisor");
1574 assert(q && "Must provide quotient");
Reid Spencera5e0d202007-02-24 03:58:46 +00001575 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001576 assert(n>1 && "n must be > 1");
1577
1578 // Knuth uses the value b as the base of the number system. In our case b
1579 // is 2^31 so we just set it to -1u.
1580 uint64_t b = uint64_t(1) << 32;
1581
Chris Lattner17f71652008-08-17 07:19:36 +00001582#if 0
David Greenef32fcb42010-01-05 01:28:52 +00001583 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1584 DEBUG(dbgs() << "KnuthDiv: original:");
1585 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1586 DEBUG(dbgs() << " by");
1587 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1588 DEBUG(dbgs() << '\n');
Chris Lattner17f71652008-08-17 07:19:36 +00001589#endif
Eric Christopher820256b2009-08-21 04:06:45 +00001590 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1591 // u and v by d. Note that we have taken Knuth's advice here to use a power
1592 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1593 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001594 // shift amount from the leading zeros. We are basically normalizing the u
1595 // and v so that its high bits are shifted to the top of v's range without
1596 // overflow. Note that this can require an extra word in u so that u must
1597 // be of length m+n+1.
Chris Lattner77527f52009-01-21 18:09:24 +00001598 unsigned shift = CountLeadingZeros_32(v[n-1]);
1599 unsigned v_carry = 0;
1600 unsigned u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001601 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001602 for (unsigned i = 0; i < m+n; ++i) {
1603 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001604 u[i] = (u[i] << shift) | u_carry;
1605 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001606 }
Chris Lattner77527f52009-01-21 18:09:24 +00001607 for (unsigned i = 0; i < n; ++i) {
1608 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001609 v[i] = (v[i] << shift) | v_carry;
1610 v_carry = v_tmp;
1611 }
1612 }
1613 u[m+n] = u_carry;
Chris Lattner17f71652008-08-17 07:19:36 +00001614#if 0
David Greenef32fcb42010-01-05 01:28:52 +00001615 DEBUG(dbgs() << "KnuthDiv: normal:");
1616 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1617 DEBUG(dbgs() << " by");
1618 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1619 DEBUG(dbgs() << '\n');
Chris Lattner17f71652008-08-17 07:19:36 +00001620#endif
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001621
1622 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1623 int j = m;
1624 do {
David Greenef32fcb42010-01-05 01:28:52 +00001625 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001626 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001627 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1628 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1629 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1630 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1631 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001632 // value qp is one too large, and it eliminates all cases where qp is two
1633 // too large.
Reid Spencercb292e42007-02-23 01:57:13 +00001634 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greenef32fcb42010-01-05 01:28:52 +00001635 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001636 uint64_t qp = dividend / v[n-1];
1637 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001638 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1639 qp--;
1640 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001641 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001642 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001643 }
David Greenef32fcb42010-01-05 01:28:52 +00001644 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001645
Reid Spencercb292e42007-02-23 01:57:13 +00001646 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1647 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1648 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001649 // a subtraction.
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001650 bool isNeg = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001651 for (unsigned i = 0; i < n; ++i) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001652 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencera5e0d202007-02-24 03:58:46 +00001653 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001654 bool borrow = subtrahend > u_tmp;
David Greenef32fcb42010-01-05 01:28:52 +00001655 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbar763ace92009-07-13 05:27:30 +00001656 << ", subtrahend == " << subtrahend
1657 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001658
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001659 uint64_t result = u_tmp - subtrahend;
Chris Lattner77527f52009-01-21 18:09:24 +00001660 unsigned k = j + i;
1661 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1662 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001663 while (borrow && k <= m+n) { // deal with borrow to the left
1664 borrow = u[k] == 0;
1665 u[k]--;
1666 k++;
1667 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001668 isNeg |= borrow;
David Greenef32fcb42010-01-05 01:28:52 +00001669 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopher820256b2009-08-21 04:06:45 +00001670 u[j+i+1] << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001671 }
David Greenef32fcb42010-01-05 01:28:52 +00001672 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1673 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1674 DEBUG(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001675 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1676 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001677 // true value plus b**(n+1), namely as the b's complement of
Reid Spencercb292e42007-02-23 01:57:13 +00001678 // the true value, and a "borrow" to the left should be remembered.
1679 //
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001680 if (isNeg) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001681 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner77527f52009-01-21 18:09:24 +00001682 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001683 u[i] = ~u[i] + carry; // b's complement
1684 carry = carry && u[i] == 0;
Reid Spencera5e0d202007-02-24 03:58:46 +00001685 }
Reid Spencercb292e42007-02-23 01:57:13 +00001686 }
David Greenef32fcb42010-01-05 01:28:52 +00001687 DEBUG(dbgs() << "KnuthDiv: after complement:");
1688 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1689 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001690
Eric Christopher820256b2009-08-21 04:06:45 +00001691 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001692 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner77527f52009-01-21 18:09:24 +00001693 q[j] = (unsigned)qp;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001694 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001695 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001696 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001697 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001698 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001699 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1700 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001701 // since it cancels with the borrow that occurred in D4.
1702 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001703 for (unsigned i = 0; i < n; i++) {
1704 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001705 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001706 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001707 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001708 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001709 }
David Greenef32fcb42010-01-05 01:28:52 +00001710 DEBUG(dbgs() << "KnuthDiv: after correction:");
1711 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1712 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001713
Reid Spencercb292e42007-02-23 01:57:13 +00001714 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1715 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001716
David Greenef32fcb42010-01-05 01:28:52 +00001717 DEBUG(dbgs() << "KnuthDiv: quotient:");
1718 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1719 DEBUG(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001720
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001721 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1722 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1723 // compute the remainder (urem uses this).
1724 if (r) {
1725 // The value d is expressed by the "shift" value above since we avoided
1726 // multiplication by d by using a shift left. So, all we have to do is
1727 // shift right here. In order to mak
Reid Spencer468ad9112007-02-24 20:38:01 +00001728 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001729 unsigned carry = 0;
David Greenef32fcb42010-01-05 01:28:52 +00001730 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001731 for (int i = n-1; i >= 0; i--) {
1732 r[i] = (u[i] >> shift) | carry;
1733 carry = u[i] << (32 - shift);
David Greenef32fcb42010-01-05 01:28:52 +00001734 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001735 }
1736 } else {
1737 for (int i = n-1; i >= 0; i--) {
1738 r[i] = u[i];
David Greenef32fcb42010-01-05 01:28:52 +00001739 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001740 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001741 }
David Greenef32fcb42010-01-05 01:28:52 +00001742 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001743 }
Chris Lattner17f71652008-08-17 07:19:36 +00001744#if 0
David Greenef32fcb42010-01-05 01:28:52 +00001745 DEBUG(dbgs() << '\n');
Chris Lattner17f71652008-08-17 07:19:36 +00001746#endif
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001747}
1748
Chris Lattner77527f52009-01-21 18:09:24 +00001749void APInt::divide(const APInt LHS, unsigned lhsWords,
1750 const APInt &RHS, unsigned rhsWords,
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001751 APInt *Quotient, APInt *Remainder)
1752{
1753 assert(lhsWords >= rhsWords && "Fractional result");
1754
Eric Christopher820256b2009-08-21 04:06:45 +00001755 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001756 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001757 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001758 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1759 // can't use 64-bit operands here because we don't have native results of
1760 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001761 // work on large-endian machines.
Dan Gohmancff69532009-04-01 18:45:54 +00001762 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner77527f52009-01-21 18:09:24 +00001763 unsigned n = rhsWords * 2;
1764 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001765
1766 // Allocate space for the temporary values we need either on the stack, if
1767 // it will fit, or on the heap if it won't.
Chris Lattner77527f52009-01-21 18:09:24 +00001768 unsigned SPACE[128];
1769 unsigned *U = 0;
1770 unsigned *V = 0;
1771 unsigned *Q = 0;
1772 unsigned *R = 0;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001773 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1774 U = &SPACE[0];
1775 V = &SPACE[m+n+1];
1776 Q = &SPACE[(m+n+1) + n];
1777 if (Remainder)
1778 R = &SPACE[(m+n+1) + n + (m+n)];
1779 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001780 U = new unsigned[m + n + 1];
1781 V = new unsigned[n];
1782 Q = new unsigned[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001783 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001784 R = new unsigned[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001785 }
1786
1787 // Initialize the dividend
Chris Lattner77527f52009-01-21 18:09:24 +00001788 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001789 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001790 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001791 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001792 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001793 }
1794 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1795
Reid Spencer522ca7c2007-02-25 01:56:07 +00001796 // Initialize the divisor
Chris Lattner77527f52009-01-21 18:09:24 +00001797 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001798 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001799 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001800 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001801 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001802 }
1803
Reid Spencer522ca7c2007-02-25 01:56:07 +00001804 // initialize the quotient and remainder
Chris Lattner77527f52009-01-21 18:09:24 +00001805 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001806 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001807 memset(R, 0, n * sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001808
Eric Christopher820256b2009-08-21 04:06:45 +00001809 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001810 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001811 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001812 // contain any zero words or the Knuth algorithm fails.
1813 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1814 n--;
1815 m++;
1816 }
1817 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1818 m--;
1819
1820 // If we're left with only a single word for the divisor, Knuth doesn't work
1821 // so we implement the short division algorithm here. This is much simpler
1822 // and faster because we are certain that we can divide a 64-bit quantity
1823 // by a 32-bit quantity at hardware speed and short division is simply a
1824 // series of such operations. This is just like doing short division but we
1825 // are using base 2^32 instead of base 10.
1826 assert(n != 0 && "Divide by zero?");
1827 if (n == 1) {
Chris Lattner77527f52009-01-21 18:09:24 +00001828 unsigned divisor = V[0];
1829 unsigned remainder = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001830 for (int i = m+n-1; i >= 0; i--) {
1831 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1832 if (partial_dividend == 0) {
1833 Q[i] = 0;
1834 remainder = 0;
1835 } else if (partial_dividend < divisor) {
1836 Q[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001837 remainder = (unsigned)partial_dividend;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001838 } else if (partial_dividend == divisor) {
1839 Q[i] = 1;
1840 remainder = 0;
1841 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001842 Q[i] = (unsigned)(partial_dividend / divisor);
1843 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001844 }
1845 }
1846 if (R)
1847 R[0] = remainder;
1848 } else {
1849 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1850 // case n > 1.
1851 KnuthDiv(U, V, Q, R, m, n);
1852 }
1853
1854 // If the caller wants the quotient
1855 if (Quotient) {
1856 // Set up the Quotient value's memory.
1857 if (Quotient->BitWidth != LHS.BitWidth) {
1858 if (Quotient->isSingleWord())
1859 Quotient->VAL = 0;
1860 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001861 delete [] Quotient->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001862 Quotient->BitWidth = LHS.BitWidth;
1863 if (!Quotient->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001864 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001865 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001866 Quotient->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001867
Eric Christopher820256b2009-08-21 04:06:45 +00001868 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001869 // order words.
1870 if (lhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001871 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001872 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1873 if (Quotient->isSingleWord())
1874 Quotient->VAL = tmp;
1875 else
1876 Quotient->pVal[0] = tmp;
1877 } else {
1878 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1879 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001880 Quotient->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001881 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1882 }
1883 }
1884
1885 // If the caller wants the remainder
1886 if (Remainder) {
1887 // Set up the Remainder value's memory.
1888 if (Remainder->BitWidth != RHS.BitWidth) {
1889 if (Remainder->isSingleWord())
1890 Remainder->VAL = 0;
1891 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001892 delete [] Remainder->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001893 Remainder->BitWidth = RHS.BitWidth;
1894 if (!Remainder->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001895 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001896 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001897 Remainder->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001898
1899 // The remainder is in R. Reconstitute the remainder into Remainder's low
1900 // order words.
1901 if (rhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001902 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001903 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1904 if (Remainder->isSingleWord())
1905 Remainder->VAL = tmp;
1906 else
1907 Remainder->pVal[0] = tmp;
1908 } else {
1909 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1910 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001911 Remainder->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001912 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1913 }
1914 }
1915
1916 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001917 if (U != &SPACE[0]) {
1918 delete [] U;
1919 delete [] V;
1920 delete [] Q;
1921 delete [] R;
1922 }
Reid Spencer100502d2007-02-17 03:16:00 +00001923}
1924
Reid Spencer1d072122007-02-16 22:36:51 +00001925APInt APInt::udiv(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001926 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001927
1928 // First, deal with the easy case
1929 if (isSingleWord()) {
1930 assert(RHS.VAL != 0 && "Divide by zero?");
1931 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001932 }
Reid Spencer39867762007-02-17 02:07:07 +00001933
Reid Spencer39867762007-02-17 02:07:07 +00001934 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner77527f52009-01-21 18:09:24 +00001935 unsigned rhsBits = RHS.getActiveBits();
1936 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001937 assert(rhsWords && "Divided by zero???");
Chris Lattner77527f52009-01-21 18:09:24 +00001938 unsigned lhsBits = this->getActiveBits();
1939 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001940
1941 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001942 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001943 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001944 return APInt(BitWidth, 0);
Reid Spencer58a6a432007-02-21 08:21:52 +00001945 else if (lhsWords < rhsWords || this->ult(RHS)) {
1946 // X / Y ===> 0, iff X < Y
1947 return APInt(BitWidth, 0);
1948 } else if (*this == RHS) {
1949 // X / X ===> 1
1950 return APInt(BitWidth, 1);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001951 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001952 // All high words are zero, just use native divide
Reid Spencer58a6a432007-02-21 08:21:52 +00001953 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001954 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001955
1956 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1957 APInt Quotient(1,0); // to hold result.
1958 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1959 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001960}
1961
Reid Spencer1d072122007-02-16 22:36:51 +00001962APInt APInt::urem(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001963 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001964 if (isSingleWord()) {
1965 assert(RHS.VAL != 0 && "Remainder by zero?");
1966 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001967 }
Reid Spencer39867762007-02-17 02:07:07 +00001968
Reid Spencer58a6a432007-02-21 08:21:52 +00001969 // Get some facts about the LHS
Chris Lattner77527f52009-01-21 18:09:24 +00001970 unsigned lhsBits = getActiveBits();
1971 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001972
1973 // Get some facts about the RHS
Chris Lattner77527f52009-01-21 18:09:24 +00001974 unsigned rhsBits = RHS.getActiveBits();
1975 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001976 assert(rhsWords && "Performing remainder operation by zero ???");
1977
Reid Spencer39867762007-02-17 02:07:07 +00001978 // Check the degenerate cases
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001979 if (lhsWords == 0) {
Reid Spencer58a6a432007-02-21 08:21:52 +00001980 // 0 % Y ===> 0
1981 return APInt(BitWidth, 0);
1982 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1983 // X % Y ===> X, iff X < Y
1984 return *this;
1985 } else if (*this == RHS) {
Reid Spencer39867762007-02-17 02:07:07 +00001986 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001987 return APInt(BitWidth, 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001988 } else if (lhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001989 // All high words are zero, just use native remainder
Reid Spencer58a6a432007-02-21 08:21:52 +00001990 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001991 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001992
Reid Spencer4c50b522007-05-13 23:44:59 +00001993 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001994 APInt Remainder(1,0);
1995 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1996 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001997}
Reid Spencer100502d2007-02-17 03:16:00 +00001998
Eric Christopher820256b2009-08-21 04:06:45 +00001999void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00002000 APInt &Quotient, APInt &Remainder) {
2001 // Get some size facts about the dividend and divisor
Chris Lattner77527f52009-01-21 18:09:24 +00002002 unsigned lhsBits = LHS.getActiveBits();
2003 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2004 unsigned rhsBits = RHS.getActiveBits();
2005 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer4c50b522007-05-13 23:44:59 +00002006
2007 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00002008 if (lhsWords == 0) {
Reid Spencer4c50b522007-05-13 23:44:59 +00002009 Quotient = 0; // 0 / Y ===> 0
2010 Remainder = 0; // 0 % Y ===> 0
2011 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002012 }
2013
2014 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer4c50b522007-05-13 23:44:59 +00002015 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCallbd8d1e32009-12-24 08:52:06 +00002016 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00002017 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002018 }
2019
Reid Spencer4c50b522007-05-13 23:44:59 +00002020 if (LHS == RHS) {
2021 Quotient = 1; // X / X ===> 1
2022 Remainder = 0; // X % X ===> 0;
2023 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002024 }
2025
Reid Spencer4c50b522007-05-13 23:44:59 +00002026 if (lhsWords == 1 && rhsWords == 1) {
2027 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00002028 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2029 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2030 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2031 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer4c50b522007-05-13 23:44:59 +00002032 return;
2033 }
2034
2035 // Okay, lets do it the long way
2036 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2037}
2038
Chris Lattner2c819b02010-10-13 23:54:10 +00002039APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002040 APInt Res = *this+RHS;
2041 Overflow = isNonNegative() == RHS.isNonNegative() &&
2042 Res.isNonNegative() != isNonNegative();
2043 return Res;
2044}
2045
Chris Lattner698661c2010-10-14 00:05:07 +00002046APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2047 APInt Res = *this+RHS;
2048 Overflow = Res.ult(RHS);
2049 return Res;
2050}
2051
Chris Lattner2c819b02010-10-13 23:54:10 +00002052APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002053 APInt Res = *this - RHS;
2054 Overflow = isNonNegative() != RHS.isNonNegative() &&
2055 Res.isNonNegative() != isNonNegative();
2056 return Res;
2057}
2058
Chris Lattner698661c2010-10-14 00:05:07 +00002059APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00002060 APInt Res = *this-RHS;
2061 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00002062 return Res;
2063}
2064
Chris Lattner2c819b02010-10-13 23:54:10 +00002065APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002066 // MININT/-1 --> overflow.
2067 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2068 return sdiv(RHS);
2069}
2070
Chris Lattner2c819b02010-10-13 23:54:10 +00002071APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002072 APInt Res = *this * RHS;
2073
2074 if (*this != 0 && RHS != 0)
2075 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2076 else
2077 Overflow = false;
2078 return Res;
2079}
2080
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00002081APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2082 APInt Res = *this * RHS;
2083
2084 if (*this != 0 && RHS != 0)
2085 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2086 else
2087 Overflow = false;
2088 return Res;
2089}
2090
Chris Lattner2c819b02010-10-13 23:54:10 +00002091APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002092 Overflow = ShAmt >= getBitWidth();
2093 if (Overflow)
2094 ShAmt = getBitWidth()-1;
2095
2096 if (isNonNegative()) // Don't allow sign change.
2097 Overflow = ShAmt >= countLeadingZeros();
2098 else
2099 Overflow = ShAmt >= countLeadingOnes();
2100
2101 return *this << ShAmt;
2102}
2103
2104
2105
2106
Benjamin Kramer92d89982010-07-14 22:38:02 +00002107void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00002108 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002109 assert(!str.empty() && "Invalid string length");
Reid Spencer100502d2007-02-17 03:16:00 +00002110 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2111 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002112
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002113 StringRef::iterator p = str.begin();
2114 size_t slen = str.size();
2115 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002116 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002117 p++;
2118 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00002119 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002120 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00002121 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002122 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2123 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002124 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2125 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00002126
2127 // Allocate memory
2128 if (!isSingleWord())
2129 pVal = getClearedMemory(getNumWords());
2130
2131 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00002132 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00002133
2134 // Set up an APInt for the digit to add outside the loop so we don't
2135 // constantly construct/destruct it.
2136 APInt apdigit(getBitWidth(), 0);
2137 APInt apradix(getBitWidth(), radix);
2138
2139 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002140 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00002141 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00002142 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00002143
Reid Spencera93c9812007-05-16 19:18:22 +00002144 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002145 if (slen > 1) {
2146 if (shift)
2147 *this <<= shift;
2148 else
2149 *this *= apradix;
2150 }
Reid Spencer1ba83352007-02-21 03:55:44 +00002151
2152 // Add in the digit we just interpreted
Reid Spencer632ebdf2007-02-24 20:19:37 +00002153 if (apdigit.isSingleWord())
2154 apdigit.VAL = digit;
2155 else
2156 apdigit.pVal[0] = digit;
Reid Spencer1ba83352007-02-21 03:55:44 +00002157 *this += apdigit;
Reid Spencer100502d2007-02-17 03:16:00 +00002158 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002159 // If its negative, put it in two's complement form
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00002160 if (isNeg) {
2161 (*this)--;
Jay Foad25a5e4c2010-12-01 08:53:58 +00002162 this->flipAllBits();
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002163 }
Reid Spencer100502d2007-02-17 03:16:00 +00002164}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002165
Chris Lattner17f71652008-08-17 07:19:36 +00002166void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2167 bool Signed) const {
2168 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002169 "Radix should be 2, 8, 10, or 16!");
Eric Christopher820256b2009-08-21 04:06:45 +00002170
Chris Lattner17f71652008-08-17 07:19:36 +00002171 // First, check for a zero value and just short circuit the logic below.
2172 if (*this == 0) {
2173 Str.push_back('0');
2174 return;
2175 }
Eric Christopher820256b2009-08-21 04:06:45 +00002176
Chris Lattner17f71652008-08-17 07:19:36 +00002177 static const char Digits[] = "0123456789ABCDEF";
Eric Christopher820256b2009-08-21 04:06:45 +00002178
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002179 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002180 char Buffer[65];
2181 char *BufPtr = Buffer+65;
Eric Christopher820256b2009-08-21 04:06:45 +00002182
Chris Lattner17f71652008-08-17 07:19:36 +00002183 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002184 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002185 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002186 } else {
2187 int64_t I = getSExtValue();
2188 if (I >= 0) {
2189 N = I;
2190 } else {
2191 Str.push_back('-');
2192 N = -(uint64_t)I;
2193 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002194 }
Eric Christopher820256b2009-08-21 04:06:45 +00002195
Chris Lattner17f71652008-08-17 07:19:36 +00002196 while (N) {
2197 *--BufPtr = Digits[N % Radix];
2198 N /= Radix;
2199 }
2200 Str.append(BufPtr, Buffer+65);
2201 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002202 }
2203
Chris Lattner17f71652008-08-17 07:19:36 +00002204 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002205
Chris Lattner17f71652008-08-17 07:19:36 +00002206 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002207 // They want to print the signed version and it is a negative value
2208 // Flip the bits and add one to turn it into the equivalent positive
2209 // value and put a '-' in the result.
Jay Foad25a5e4c2010-12-01 08:53:58 +00002210 Tmp.flipAllBits();
Chris Lattner17f71652008-08-17 07:19:36 +00002211 Tmp++;
2212 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002213 }
Eric Christopher820256b2009-08-21 04:06:45 +00002214
Chris Lattner17f71652008-08-17 07:19:36 +00002215 // We insert the digits backward, then reverse them to get the right order.
2216 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002217
2218 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2219 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattner17f71652008-08-17 07:19:36 +00002220 // equaly. We just shift until the value is zero.
2221 if (Radix != 10) {
2222 // Just shift tmp right for each digit width until it becomes zero
2223 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2224 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002225
Chris Lattner17f71652008-08-17 07:19:36 +00002226 while (Tmp != 0) {
2227 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2228 Str.push_back(Digits[Digit]);
2229 Tmp = Tmp.lshr(ShiftAmt);
2230 }
2231 } else {
2232 APInt divisor(4, 10);
2233 while (Tmp != 0) {
2234 APInt APdigit(1, 0);
2235 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopher820256b2009-08-21 04:06:45 +00002236 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattner17f71652008-08-17 07:19:36 +00002237 &APdigit);
Chris Lattner77527f52009-01-21 18:09:24 +00002238 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner17f71652008-08-17 07:19:36 +00002239 assert(Digit < Radix && "divide failed");
2240 Str.push_back(Digits[Digit]);
2241 Tmp = tmp2;
2242 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002243 }
Eric Christopher820256b2009-08-21 04:06:45 +00002244
Chris Lattner17f71652008-08-17 07:19:36 +00002245 // Reverse the digits before returning.
2246 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002247}
2248
Chris Lattner17f71652008-08-17 07:19:36 +00002249/// toString - This returns the APInt as a std::string. Note that this is an
2250/// inefficient method. It is better to pass in a SmallVector/SmallString
2251/// to the methods above.
2252std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2253 SmallString<40> S;
2254 toString(S, Radix, Signed);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002255 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002256}
Chris Lattner6b695682007-08-16 15:56:55 +00002257
Chris Lattner17f71652008-08-17 07:19:36 +00002258
2259void APInt::dump() const {
2260 SmallString<40> S, U;
2261 this->toStringUnsigned(U);
2262 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002263 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002264 << U.str() << "u " << S.str() << "s)";
Chris Lattner17f71652008-08-17 07:19:36 +00002265}
2266
Chris Lattner0c19df42008-08-23 22:23:09 +00002267void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002268 SmallString<40> S;
2269 this->toString(S, 10, isSigned);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002270 OS << S.str();
Chris Lattner17f71652008-08-17 07:19:36 +00002271}
2272
Chris Lattner6b695682007-08-16 15:56:55 +00002273// This implements a variety of operations on a representation of
2274// arbitrary precision, two's-complement, bignum integer values.
2275
Chris Lattner96cffa62009-08-23 23:11:28 +00002276// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2277// and unrestricting assumption.
Chris Lattner8fcea672008-08-17 04:58:58 +00002278#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002279COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattner6b695682007-08-16 15:56:55 +00002280
2281/* Some handy functions local to this file. */
2282namespace {
2283
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002284 /* Returns the integer part with the least significant BITS set.
2285 BITS cannot be zero. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002286 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002287 lowBitMask(unsigned int bits)
2288 {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002289 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002290
2291 return ~(integerPart) 0 >> (integerPartWidth - bits);
2292 }
2293
Neil Boothc8b650a2007-10-06 00:43:45 +00002294 /* Returns the value of the lower half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002295 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002296 lowHalf(integerPart part)
2297 {
2298 return part & lowBitMask(integerPartWidth / 2);
2299 }
2300
Neil Boothc8b650a2007-10-06 00:43:45 +00002301 /* Returns the value of the upper half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002302 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002303 highHalf(integerPart part)
2304 {
2305 return part >> (integerPartWidth / 2);
2306 }
2307
Neil Boothc8b650a2007-10-06 00:43:45 +00002308 /* Returns the bit number of the most significant set bit of a part.
2309 If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002310 static unsigned int
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002311 partMSB(integerPart value)
Chris Lattner6b695682007-08-16 15:56:55 +00002312 {
2313 unsigned int n, msb;
2314
2315 if (value == 0)
2316 return -1U;
2317
2318 n = integerPartWidth / 2;
2319
2320 msb = 0;
2321 do {
2322 if (value >> n) {
2323 value >>= n;
2324 msb += n;
2325 }
2326
2327 n >>= 1;
2328 } while (n);
2329
2330 return msb;
2331 }
2332
Neil Boothc8b650a2007-10-06 00:43:45 +00002333 /* Returns the bit number of the least significant set bit of a
2334 part. If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002335 static unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002336 partLSB(integerPart value)
2337 {
2338 unsigned int n, lsb;
2339
2340 if (value == 0)
2341 return -1U;
2342
2343 lsb = integerPartWidth - 1;
2344 n = integerPartWidth / 2;
2345
2346 do {
2347 if (value << n) {
2348 value <<= n;
2349 lsb -= n;
2350 }
2351
2352 n >>= 1;
2353 } while (n);
2354
2355 return lsb;
2356 }
2357}
2358
2359/* Sets the least significant part of a bignum to the input value, and
2360 zeroes out higher parts. */
2361void
2362APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2363{
2364 unsigned int i;
2365
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002366 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002367
Chris Lattner6b695682007-08-16 15:56:55 +00002368 dst[0] = part;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002369 for (i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002370 dst[i] = 0;
2371}
2372
2373/* Assign one bignum to another. */
2374void
2375APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2376{
2377 unsigned int i;
2378
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002379 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002380 dst[i] = src[i];
2381}
2382
2383/* Returns true if a bignum is zero, false otherwise. */
2384bool
2385APInt::tcIsZero(const integerPart *src, unsigned int parts)
2386{
2387 unsigned int i;
2388
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002389 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002390 if (src[i])
2391 return false;
2392
2393 return true;
2394}
2395
2396/* Extract the given bit of a bignum; returns 0 or 1. */
2397int
2398APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2399{
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002400 return (parts[bit / integerPartWidth] &
2401 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002402}
2403
John McCalldcb9a7a2010-02-28 02:51:25 +00002404/* Set the given bit of a bignum. */
Chris Lattner6b695682007-08-16 15:56:55 +00002405void
2406APInt::tcSetBit(integerPart *parts, unsigned int bit)
2407{
2408 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2409}
2410
John McCalldcb9a7a2010-02-28 02:51:25 +00002411/* Clears the given bit of a bignum. */
2412void
2413APInt::tcClearBit(integerPart *parts, unsigned int bit)
2414{
2415 parts[bit / integerPartWidth] &=
2416 ~((integerPart) 1 << (bit % integerPartWidth));
2417}
2418
Neil Boothc8b650a2007-10-06 00:43:45 +00002419/* Returns the bit number of the least significant set bit of a
2420 number. If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002421unsigned int
2422APInt::tcLSB(const integerPart *parts, unsigned int n)
2423{
2424 unsigned int i, lsb;
2425
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002426 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002427 if (parts[i] != 0) {
2428 lsb = partLSB(parts[i]);
2429
2430 return lsb + i * integerPartWidth;
2431 }
2432 }
2433
2434 return -1U;
2435}
2436
Neil Boothc8b650a2007-10-06 00:43:45 +00002437/* Returns the bit number of the most significant set bit of a number.
2438 If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002439unsigned int
2440APInt::tcMSB(const integerPart *parts, unsigned int n)
2441{
2442 unsigned int msb;
2443
2444 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002445 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002446
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002447 if (parts[n] != 0) {
2448 msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002449
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002450 return msb + n * integerPartWidth;
2451 }
Chris Lattner6b695682007-08-16 15:56:55 +00002452 } while (n);
2453
2454 return -1U;
2455}
2456
Neil Boothb6182162007-10-08 13:47:12 +00002457/* Copy the bit vector of width srcBITS from SRC, starting at bit
2458 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2459 the least significant bit of DST. All high bits above srcBITS in
2460 DST are zero-filled. */
2461void
Evan Chengdb338f32009-05-21 23:47:47 +00002462APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Boothb6182162007-10-08 13:47:12 +00002463 unsigned int srcBits, unsigned int srcLSB)
2464{
2465 unsigned int firstSrcPart, dstParts, shift, n;
2466
2467 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002468 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002469
2470 firstSrcPart = srcLSB / integerPartWidth;
2471 tcAssign (dst, src + firstSrcPart, dstParts);
2472
2473 shift = srcLSB % integerPartWidth;
2474 tcShiftRight (dst, dstParts, shift);
2475
2476 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2477 in DST. If this is less that srcBits, append the rest, else
2478 clear the high bits. */
2479 n = dstParts * integerPartWidth - shift;
2480 if (n < srcBits) {
2481 integerPart mask = lowBitMask (srcBits - n);
2482 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2483 << n % integerPartWidth);
2484 } else if (n > srcBits) {
Neil Booth7e74b172007-10-12 15:31:31 +00002485 if (srcBits % integerPartWidth)
2486 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Boothb6182162007-10-08 13:47:12 +00002487 }
2488
2489 /* Clear high parts. */
2490 while (dstParts < dstCount)
2491 dst[dstParts++] = 0;
2492}
2493
Chris Lattner6b695682007-08-16 15:56:55 +00002494/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2495integerPart
2496APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2497 integerPart c, unsigned int parts)
2498{
2499 unsigned int i;
2500
2501 assert(c <= 1);
2502
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002503 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002504 integerPart l;
2505
2506 l = dst[i];
2507 if (c) {
2508 dst[i] += rhs[i] + 1;
2509 c = (dst[i] <= l);
2510 } else {
2511 dst[i] += rhs[i];
2512 c = (dst[i] < l);
2513 }
2514 }
2515
2516 return c;
2517}
2518
2519/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2520integerPart
2521APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2522 integerPart c, unsigned int parts)
2523{
2524 unsigned int i;
2525
2526 assert(c <= 1);
2527
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002528 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002529 integerPart l;
2530
2531 l = dst[i];
2532 if (c) {
2533 dst[i] -= rhs[i] + 1;
2534 c = (dst[i] >= l);
2535 } else {
2536 dst[i] -= rhs[i];
2537 c = (dst[i] > l);
2538 }
2539 }
2540
2541 return c;
2542}
2543
2544/* Negate a bignum in-place. */
2545void
2546APInt::tcNegate(integerPart *dst, unsigned int parts)
2547{
2548 tcComplement(dst, parts);
2549 tcIncrement(dst, parts);
2550}
2551
Neil Boothc8b650a2007-10-06 00:43:45 +00002552/* DST += SRC * MULTIPLIER + CARRY if add is true
2553 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002554
2555 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2556 they must start at the same point, i.e. DST == SRC.
2557
2558 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2559 returned. Otherwise DST is filled with the least significant
2560 DSTPARTS parts of the result, and if all of the omitted higher
2561 parts were zero return zero, otherwise overflow occurred and
2562 return one. */
2563int
2564APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2565 integerPart multiplier, integerPart carry,
2566 unsigned int srcParts, unsigned int dstParts,
2567 bool add)
2568{
2569 unsigned int i, n;
2570
2571 /* Otherwise our writes of DST kill our later reads of SRC. */
2572 assert(dst <= src || dst >= src + srcParts);
2573 assert(dstParts <= srcParts + 1);
2574
2575 /* N loops; minimum of dstParts and srcParts. */
2576 n = dstParts < srcParts ? dstParts: srcParts;
2577
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002578 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002579 integerPart low, mid, high, srcPart;
2580
2581 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2582
2583 This cannot overflow, because
2584
2585 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2586
2587 which is less than n^2. */
2588
2589 srcPart = src[i];
2590
2591 if (multiplier == 0 || srcPart == 0) {
2592 low = carry;
2593 high = 0;
2594 } else {
2595 low = lowHalf(srcPart) * lowHalf(multiplier);
2596 high = highHalf(srcPart) * highHalf(multiplier);
2597
2598 mid = lowHalf(srcPart) * highHalf(multiplier);
2599 high += highHalf(mid);
2600 mid <<= integerPartWidth / 2;
2601 if (low + mid < low)
2602 high++;
2603 low += mid;
2604
2605 mid = highHalf(srcPart) * lowHalf(multiplier);
2606 high += highHalf(mid);
2607 mid <<= integerPartWidth / 2;
2608 if (low + mid < low)
2609 high++;
2610 low += mid;
2611
2612 /* Now add carry. */
2613 if (low + carry < low)
2614 high++;
2615 low += carry;
2616 }
2617
2618 if (add) {
2619 /* And now DST[i], and store the new low part there. */
2620 if (low + dst[i] < low)
2621 high++;
2622 dst[i] += low;
2623 } else
2624 dst[i] = low;
2625
2626 carry = high;
2627 }
2628
2629 if (i < dstParts) {
2630 /* Full multiplication, there is no overflow. */
2631 assert(i + 1 == dstParts);
2632 dst[i] = carry;
2633 return 0;
2634 } else {
2635 /* We overflowed if there is carry. */
2636 if (carry)
2637 return 1;
2638
2639 /* We would overflow if any significant unwritten parts would be
2640 non-zero. This is true if any remaining src parts are non-zero
2641 and the multiplier is non-zero. */
2642 if (multiplier)
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002643 for (; i < srcParts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002644 if (src[i])
2645 return 1;
2646
2647 /* We fitted in the narrow destination. */
2648 return 0;
2649 }
2650}
2651
2652/* DST = LHS * RHS, where DST has the same width as the operands and
2653 is filled with the least significant parts of the result. Returns
2654 one if overflow occurred, otherwise zero. DST must be disjoint
2655 from both operands. */
2656int
2657APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2658 const integerPart *rhs, unsigned int parts)
2659{
2660 unsigned int i;
2661 int overflow;
2662
2663 assert(dst != lhs && dst != rhs);
2664
2665 overflow = 0;
2666 tcSet(dst, 0, parts);
2667
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002668 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002669 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2670 parts - i, true);
2671
2672 return overflow;
2673}
2674
Neil Booth0ea72a92007-10-06 00:24:48 +00002675/* DST = LHS * RHS, where DST has width the sum of the widths of the
2676 operands. No overflow occurs. DST must be disjoint from both
2677 operands. Returns the number of parts required to hold the
2678 result. */
2679unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002680APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth0ea72a92007-10-06 00:24:48 +00002681 const integerPart *rhs, unsigned int lhsParts,
2682 unsigned int rhsParts)
Chris Lattner6b695682007-08-16 15:56:55 +00002683{
Neil Booth0ea72a92007-10-06 00:24:48 +00002684 /* Put the narrower number on the LHS for less loops below. */
2685 if (lhsParts > rhsParts) {
2686 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2687 } else {
2688 unsigned int n;
Chris Lattner6b695682007-08-16 15:56:55 +00002689
Neil Booth0ea72a92007-10-06 00:24:48 +00002690 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002691
Neil Booth0ea72a92007-10-06 00:24:48 +00002692 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002693
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002694 for (n = 0; n < lhsParts; n++)
Neil Booth0ea72a92007-10-06 00:24:48 +00002695 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002696
Neil Booth0ea72a92007-10-06 00:24:48 +00002697 n = lhsParts + rhsParts;
2698
2699 return n - (dst[n - 1] == 0);
2700 }
Chris Lattner6b695682007-08-16 15:56:55 +00002701}
2702
2703/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2704 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2705 set REMAINDER to the remainder, return zero. i.e.
2706
2707 OLD_LHS = RHS * LHS + REMAINDER
2708
2709 SCRATCH is a bignum of the same size as the operands and result for
2710 use by the routine; its contents need not be initialized and are
2711 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2712*/
2713int
2714APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2715 integerPart *remainder, integerPart *srhs,
2716 unsigned int parts)
2717{
2718 unsigned int n, shiftCount;
2719 integerPart mask;
2720
2721 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2722
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002723 shiftCount = tcMSB(rhs, parts) + 1;
2724 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002725 return true;
2726
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002727 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattner6b695682007-08-16 15:56:55 +00002728 n = shiftCount / integerPartWidth;
2729 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2730
2731 tcAssign(srhs, rhs, parts);
2732 tcShiftLeft(srhs, parts, shiftCount);
2733 tcAssign(remainder, lhs, parts);
2734 tcSet(lhs, 0, parts);
2735
2736 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2737 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002738 for (;;) {
Chris Lattner6b695682007-08-16 15:56:55 +00002739 int compare;
2740
2741 compare = tcCompare(remainder, srhs, parts);
2742 if (compare >= 0) {
2743 tcSubtract(remainder, srhs, 0, parts);
2744 lhs[n] |= mask;
2745 }
2746
2747 if (shiftCount == 0)
2748 break;
2749 shiftCount--;
2750 tcShiftRight(srhs, parts, 1);
2751 if ((mask >>= 1) == 0)
2752 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2753 }
2754
2755 return false;
2756}
2757
2758/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2759 There are no restrictions on COUNT. */
2760void
2761APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2762{
Neil Boothb6182162007-10-08 13:47:12 +00002763 if (count) {
2764 unsigned int jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002765
Neil Boothb6182162007-10-08 13:47:12 +00002766 /* Jump is the inter-part jump; shift is is intra-part shift. */
2767 jump = count / integerPartWidth;
2768 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002769
Neil Boothb6182162007-10-08 13:47:12 +00002770 while (parts > jump) {
2771 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002772
Neil Boothb6182162007-10-08 13:47:12 +00002773 parts--;
Chris Lattner6b695682007-08-16 15:56:55 +00002774
Neil Boothb6182162007-10-08 13:47:12 +00002775 /* dst[i] comes from the two parts src[i - jump] and, if we have
2776 an intra-part shift, src[i - jump - 1]. */
2777 part = dst[parts - jump];
2778 if (shift) {
2779 part <<= shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002780 if (parts >= jump + 1)
2781 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2782 }
2783
Neil Boothb6182162007-10-08 13:47:12 +00002784 dst[parts] = part;
2785 }
Chris Lattner6b695682007-08-16 15:56:55 +00002786
Neil Boothb6182162007-10-08 13:47:12 +00002787 while (parts > 0)
2788 dst[--parts] = 0;
2789 }
Chris Lattner6b695682007-08-16 15:56:55 +00002790}
2791
2792/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2793 zero. There are no restrictions on COUNT. */
2794void
2795APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2796{
Neil Boothb6182162007-10-08 13:47:12 +00002797 if (count) {
2798 unsigned int i, jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002799
Neil Boothb6182162007-10-08 13:47:12 +00002800 /* Jump is the inter-part jump; shift is is intra-part shift. */
2801 jump = count / integerPartWidth;
2802 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002803
Neil Boothb6182162007-10-08 13:47:12 +00002804 /* Perform the shift. This leaves the most significant COUNT bits
2805 of the result at zero. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002806 for (i = 0; i < parts; i++) {
Neil Boothb6182162007-10-08 13:47:12 +00002807 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002808
Neil Boothb6182162007-10-08 13:47:12 +00002809 if (i + jump >= parts) {
2810 part = 0;
2811 } else {
2812 part = dst[i + jump];
2813 if (shift) {
2814 part >>= shift;
2815 if (i + jump + 1 < parts)
2816 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2817 }
Chris Lattner6b695682007-08-16 15:56:55 +00002818 }
Chris Lattner6b695682007-08-16 15:56:55 +00002819
Neil Boothb6182162007-10-08 13:47:12 +00002820 dst[i] = part;
2821 }
Chris Lattner6b695682007-08-16 15:56:55 +00002822 }
2823}
2824
2825/* Bitwise and of two bignums. */
2826void
2827APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2828{
2829 unsigned int i;
2830
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002831 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002832 dst[i] &= rhs[i];
2833}
2834
2835/* Bitwise inclusive or of two bignums. */
2836void
2837APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2838{
2839 unsigned int i;
2840
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002841 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002842 dst[i] |= rhs[i];
2843}
2844
2845/* Bitwise exclusive or of two bignums. */
2846void
2847APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2848{
2849 unsigned int i;
2850
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002851 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002852 dst[i] ^= rhs[i];
2853}
2854
2855/* Complement a bignum in-place. */
2856void
2857APInt::tcComplement(integerPart *dst, unsigned int parts)
2858{
2859 unsigned int i;
2860
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002861 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002862 dst[i] = ~dst[i];
2863}
2864
2865/* Comparison (unsigned) of two bignums. */
2866int
2867APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2868 unsigned int parts)
2869{
2870 while (parts) {
2871 parts--;
2872 if (lhs[parts] == rhs[parts])
2873 continue;
2874
2875 if (lhs[parts] > rhs[parts])
2876 return 1;
2877 else
2878 return -1;
2879 }
2880
2881 return 0;
2882}
2883
2884/* Increment a bignum in-place, return the carry flag. */
2885integerPart
2886APInt::tcIncrement(integerPart *dst, unsigned int parts)
2887{
2888 unsigned int i;
2889
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002890 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002891 if (++dst[i] != 0)
2892 break;
2893
2894 return i == parts;
2895}
2896
2897/* Set the least significant BITS bits of a bignum, clear the
2898 rest. */
2899void
2900APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2901 unsigned int bits)
2902{
2903 unsigned int i;
2904
2905 i = 0;
2906 while (bits > integerPartWidth) {
2907 dst[i++] = ~(integerPart) 0;
2908 bits -= integerPartWidth;
2909 }
2910
2911 if (bits)
2912 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2913
2914 while (i < parts)
2915 dst[i++] = 0;
2916}