blob: 77033428b577dd7aca8b2a19ea3be65febb3f868 [file] [log] [blame]
Zhou Shengfd43dcf2007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Zhou Shengfd43dcf2007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencer5d0d05c2007-02-25 19:32:03 +000010// This file implements a class to represent arbitrary precision integer
11// constant values and provide a variety of arithmetic operations on them.
Zhou Shengfd43dcf2007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer9d6c9192007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
Daniel Dunbar689ad6e2009-08-13 02:33:34 +000017#include "llvm/ADT/StringRef.h"
Ted Kremeneke420deb2008-01-19 04:23:33 +000018#include "llvm/ADT/FoldingSet.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000020#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000021#include "llvm/Support/ErrorHandling.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000022#include "llvm/Support/MathExtras.h"
Chris Lattner944fac72008-08-23 22:23:09 +000023#include "llvm/Support/raw_ostream.h"
Chris Lattnerfad86b02008-08-17 07:19:36 +000024#include <cmath>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000025#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000026#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000027#include <cstdlib>
28using namespace llvm;
29
Reid Spencer5d0d05c2007-02-25 19:32:03 +000030/// A utility function for allocating memory, checking for allocation failures,
31/// and ensuring the contents are zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000032inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000033 uint64_t * result = new uint64_t[numWords];
34 assert(result && "APInt memory allocation fails!");
35 memset(result, 0, numWords * sizeof(uint64_t));
36 return result;
Zhou Sheng353815d2007-02-06 06:04:53 +000037}
38
Eric Christopherd37eda82009-08-21 04:06:45 +000039/// A utility function for allocating memory and checking for allocation
Reid Spencer5d0d05c2007-02-25 19:32:03 +000040/// failure. The content is not zeroed.
Chris Lattner455e9ab2009-01-21 18:09:24 +000041inline static uint64_t* getMemory(unsigned numWords) {
Reid Spenceraf0e9562007-02-18 18:38:44 +000042 uint64_t * result = new uint64_t[numWords];
43 assert(result && "APInt memory allocation fails!");
44 return result;
45}
46
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000047/// A utility function that converts a character to a digit.
48inline static unsigned getDigit(char cdigit, uint8_t radix) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000049 unsigned r;
50
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000051 if (radix == 16) {
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000052 r = cdigit - '0';
53 if (r <= 9)
54 return r;
55
56 r = cdigit - 'A';
57 if (r <= 5)
58 return r + 10;
59
60 r = cdigit - 'a';
61 if (r <= 5)
62 return r + 10;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000063 }
64
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +000065 r = cdigit - '0';
66 if (r < radix)
67 return r;
68
69 return -1U;
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +000070}
71
72
Chris Lattner455e9ab2009-01-21 18:09:24 +000073void APInt::initSlowCase(unsigned numBits, uint64_t val, bool isSigned) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +000074 pVal = getClearedMemory(getNumWords());
75 pVal[0] = val;
Eric Christopherd37eda82009-08-21 04:06:45 +000076 if (isSigned && int64_t(val) < 0)
Chris Lattner98f8ccf2008-08-20 17:02:31 +000077 for (unsigned i = 1; i < getNumWords(); ++i)
78 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000079}
80
Chris Lattner119c30b2008-10-11 22:07:19 +000081void APInt::initSlowCase(const APInt& that) {
82 pVal = getMemory(getNumWords());
83 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
84}
85
86
Chris Lattner455e9ab2009-01-21 18:09:24 +000087APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Chris Lattner944fac72008-08-23 22:23:09 +000088 : BitWidth(numBits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +000089 assert(BitWidth && "Bitwidth too small");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000090 assert(bigVal && "Null pointer detected!");
91 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000092 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000093 else {
Reid Spencer610fad82007-02-24 10:01:42 +000094 // Get memory, cleared to 0
95 pVal = getClearedMemory(getNumWords());
96 // Calculate the number of words to copy
Chris Lattner455e9ab2009-01-21 18:09:24 +000097 unsigned words = std::min<unsigned>(numWords, getNumWords());
Reid Spencer610fad82007-02-24 10:01:42 +000098 // Copy the words from bigVal to pVal
99 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000100 }
Reid Spencer610fad82007-02-24 10:01:42 +0000101 // Make sure unused high bits are cleared
102 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000103}
104
Benjamin Kramer38e59892010-07-14 22:38:02 +0000105APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +0000106 : BitWidth(numbits), VAL(0) {
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000107 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000108 fromString(numbits, Str, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000109}
110
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000111APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000112 // Don't do anything for X = X
113 if (this == &RHS)
114 return *this;
115
Reid Spencer9ac44112007-02-26 23:38:21 +0000116 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner98f8ccf2008-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 Spencer9ac44112007-02-26 23:38:21 +0000120 return *this;
121 }
122
Chris Lattner98f8ccf2008-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 Christopherd37eda82009-08-21 04:06:45 +0000129 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer9ac44112007-02-26 23:38:21 +0000130 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
131 else if (RHS.isSingleWord()) {
132 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000133 VAL = RHS.VAL;
Reid Spencer9ac44112007-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 Shengfd43dcf2007-02-06 03:00:16 +0000141}
142
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000143APInt& APInt::operator=(uint64_t RHS) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000144 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000145 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000146 else {
147 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000148 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000149 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000150 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000151}
152
Ted Kremeneke420deb2008-01-19 04:23:33 +0000153/// Profile - This method 'profiles' an APInt for use with FoldingSet.
154void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000155 ID.AddInteger(BitWidth);
Eric Christopherd37eda82009-08-21 04:06:45 +0000156
Ted Kremeneke420deb2008-01-19 04:23:33 +0000157 if (isSingleWord()) {
158 ID.AddInteger(VAL);
159 return;
160 }
161
Chris Lattner455e9ab2009-01-21 18:09:24 +0000162 unsigned NumWords = getNumWords();
Ted Kremeneke420deb2008-01-19 04:23:33 +0000163 for (unsigned i = 0; i < NumWords; ++i)
164 ID.AddInteger(pVal[i]);
165}
166
Eric Christopherd37eda82009-08-21 04:06:45 +0000167/// add_1 - This function adds a single "digit" integer, y, to the multiple
Reid Spenceraf0e9562007-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 Spencer5e0a8512007-02-17 03:16:00 +0000170/// @returns the carry of the addition.
Chris Lattner455e9ab2009-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 Spencerf2c521c2007-02-18 06:39:42 +0000173 dest[i] = y + x[i];
174 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000175 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000176 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000177 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000178 break;
179 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000180 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000181 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000182}
183
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000184/// @brief Prefix increment operator. Increments the APInt by one.
185APInt& APInt::operator++() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000186 if (isSingleWord())
Reid Spencere81d2da2007-02-16 22:36:51 +0000187 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000188 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000189 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000190 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000191}
192
Eric Christopherd37eda82009-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 Spenceraf0e9562007-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 Spencer5d0d05c2007-02-25 19:32:03 +0000198/// @returns the borrow out of the subtraction
Chris Lattner455e9ab2009-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 Spencer5e0a8512007-02-17 03:16:00 +0000201 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000202 x[i] -= y;
Eric Christopherd37eda82009-08-21 04:06:45 +0000203 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000204 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000205 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000206 y = 0; // No need to borrow
207 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000208 }
209 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000210 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000211}
212
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000213/// @brief Prefix decrement operator. Decrements the APInt by one.
214APInt& APInt::operator--() {
Eric Christopherd37eda82009-08-21 04:06:45 +0000215 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000216 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000217 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000218 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000219 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000220}
221
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000222/// add - This function adds the integer array x to the integer array Y and
Eric Christopherd37eda82009-08-21 04:06:45 +0000223/// places the result in dest.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000224/// @returns the carry out from the addition
225/// @brief General addition of 64-bit integer arrays
Eric Christopherd37eda82009-08-21 04:06:45 +0000226static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000227 unsigned len) {
Reid Spencer9d6c9192007-02-24 03:58:46 +0000228 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000229 for (unsigned i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000230 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000231 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000232 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000233 }
234 return carry;
235}
236
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000237/// Adds the RHS APint to this APInt.
238/// @returns this, after addition of RHS.
Eric Christopherd37eda82009-08-21 04:06:45 +0000239/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000240APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000241 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000242 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000243 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000244 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000245 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000246 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000247 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000248}
249
Eric Christopherd37eda82009-08-21 04:06:45 +0000250/// Subtracts the integer array y from the integer array x
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000251/// @returns returns the borrow out.
252/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopherd37eda82009-08-21 04:06:45 +0000253static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner455e9ab2009-01-21 18:09:24 +0000254 unsigned len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000255 bool borrow = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000256 for (unsigned i = 0; i < len; ++i) {
Reid Spencer385f7542007-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 Spencer5e0a8512007-02-17 03:16:00 +0000260 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000261 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000262}
263
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000264/// Subtracts the RHS APInt from this APInt
265/// @returns this, after subtraction
Eric Christopherd37eda82009-08-21 04:06:45 +0000266/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000267APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000268 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopherd37eda82009-08-21 04:06:45 +0000269 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000270 VAL -= RHS.VAL;
271 else
272 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000273 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000274}
275
Dan Gohmanf451cb82010-02-10 16:03:48 +0000276/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopherd37eda82009-08-21 04:06:45 +0000277/// into dest.
Reid Spencer5d0d05c2007-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 Lattner455e9ab2009-01-21 18:09:24 +0000280static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencer610fad82007-02-24 10:01:42 +0000281 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000282 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000283 uint64_t carry = 0;
284
285 // For each digit of x.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000286 for (unsigned i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-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 Spencer5e0a8512007-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 Christopherd37eda82009-08-21 04:06:45 +0000299 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer5e0a8512007-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 Christopherd37eda82009-08-21 04:06:45 +0000305 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000306 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
307 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000308 return carry;
309}
310
Eric Christopherd37eda82009-08-21 04:06:45 +0000311/// Multiplies integer array x by integer array y and stores the result into
Reid Spencer5d0d05c2007-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 Lattner455e9ab2009-01-21 18:09:24 +0000314static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
315 unsigned ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000316 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000317 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000318 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000319 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000320 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-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 Christopherd37eda82009-08-21 04:06:45 +0000337 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer5e0a8512007-02-17 03:16:00 +0000338 ((lx * hy) >> 32) + hx * hy;
339 }
340 dest[i+xlen] = carry;
341 }
342}
343
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000344APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000345 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000346 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000347 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000348 clearUnusedBits();
349 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000350 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000351
352 // Get some bit facts about LHS and check for zero
Chris Lattner455e9ab2009-01-21 18:09:24 +0000353 unsigned lhsBits = getActiveBits();
354 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopherd37eda82009-08-21 04:06:45 +0000355 if (!lhsWords)
Reid Spencere0cdd332007-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 Lattner455e9ab2009-01-21 18:09:24 +0000360 unsigned rhsBits = RHS.getActiveBits();
361 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencere0cdd332007-02-21 08:21:52 +0000362 if (!rhsWords) {
363 // X * 0 ===> 0
Jay Foad7a874dd2010-12-01 08:53:58 +0000364 clearAllBits();
Reid Spencere0cdd332007-02-21 08:21:52 +0000365 return *this;
366 }
367
368 // Allocate space for the result
Chris Lattner455e9ab2009-01-21 18:09:24 +0000369 unsigned destWords = rhsWords + lhsWords;
Reid Spencere0cdd332007-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 Foad7a874dd2010-12-01 08:53:58 +0000376 clearAllBits();
Chris Lattner455e9ab2009-01-21 18:09:24 +0000377 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencere0cdd332007-02-21 08:21:52 +0000378 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
379
380 // delete dest array and return
381 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000382 return *this;
383}
384
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000385APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000386 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000387 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000388 VAL &= RHS.VAL;
389 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000390 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000391 unsigned numWords = getNumWords();
392 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000393 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000394 return *this;
395}
396
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000397APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000398 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000399 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000400 VAL |= RHS.VAL;
401 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000402 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000403 unsigned numWords = getNumWords();
404 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000405 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000406 return *this;
407}
408
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000409APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000410 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000411 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000412 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000413 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000414 return *this;
Eric Christopherd37eda82009-08-21 04:06:45 +0000415 }
Chris Lattner455e9ab2009-01-21 18:09:24 +0000416 unsigned numWords = getNumWords();
417 for (unsigned i = 0; i < numWords; ++i)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000418 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000419 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000420}
421
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000422APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000423 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000424 uint64_t* val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000425 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000426 val[i] = pVal[i] & RHS.pVal[i];
427 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000428}
429
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000430APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000431 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000432 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000433 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000434 val[i] = pVal[i] | RHS.pVal[i];
435 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000436}
437
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000438APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000439 unsigned numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000440 uint64_t *val = getMemory(numWords);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000441 for (unsigned i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000442 val[i] = pVal[i] ^ RHS.pVal[i];
443
444 // 0^0==1 so clear the high bits in case they got set.
445 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000446}
447
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000448bool APInt::operator !() const {
449 if (isSingleWord())
450 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000451
Chris Lattner455e9ab2009-01-21 18:09:24 +0000452 for (unsigned i = 0; i < getNumWords(); ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000453 if (pVal[i])
Reid Spenceraf0e9562007-02-18 18:38:44 +0000454 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000455 return true;
456}
457
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000458APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000459 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000460 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000461 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000462 APInt Result(*this);
463 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000464 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000465}
466
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000467APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000468 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000469 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000470 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000471 APInt Result(BitWidth, 0);
472 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000473 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000474}
475
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000476APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000477 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000478 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000479 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000480 APInt Result(BitWidth, 0);
481 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000482 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000483}
484
Chris Lattner455e9ab2009-01-21 18:09:24 +0000485bool APInt::operator[](unsigned bitPosition) const {
Dan Gohman078d9672010-11-18 17:14:56 +0000486 assert(bitPosition < getBitWidth() && "Bit position out of bounds!");
Eric Christopherd37eda82009-08-21 04:06:45 +0000487 return (maskBit(bitPosition) &
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000488 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000489}
490
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000491bool APInt::EqualSlowCase(const APInt& RHS) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000492 // Get some facts about the number of bits used in the two operands.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000493 unsigned n1 = getActiveBits();
494 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000495
496 // If the number of bits isn't the same, they aren't equal
Eric Christopherd37eda82009-08-21 04:06:45 +0000497 if (n1 != n2)
Reid Spencer54362ca2007-02-20 23:40:25 +0000498 return false;
499
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000500 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000501 if (n1 <= APINT_BITS_PER_WORD)
502 return pVal[0] == RHS.pVal[0];
503
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000504 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000505 for (int i = whichWord(n1 - 1); i >= 0; --i)
Eric Christopherd37eda82009-08-21 04:06:45 +0000506 if (pVal[i] != RHS.pVal[i])
Reid Spencer54362ca2007-02-20 23:40:25 +0000507 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000508 return true;
509}
510
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000511bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000512 unsigned n = getActiveBits();
Reid Spencer54362ca2007-02-20 23:40:25 +0000513 if (n <= APINT_BITS_PER_WORD)
514 return pVal[0] == Val;
515 else
516 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000517}
518
Reid Spencere81d2da2007-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 Spencer5d0d05c2007-02-25 19:32:03 +0000523
524 // Get active bit length of both operands
Chris Lattner455e9ab2009-01-21 18:09:24 +0000525 unsigned n1 = getActiveBits();
526 unsigned n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-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 Lattner455e9ab2009-01-21 18:09:24 +0000541 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000542 for (int i = topWord; i >= 0; --i) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000543 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000544 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000545 if (pVal[i] < RHS.pVal[i])
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000546 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000547 }
548 return false;
549}
550
Reid Spencere81d2da2007-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 Spencera58f0582007-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 Spencere81d2da2007-02-16 22:36:51 +0000557 }
Reid Spencera58f0582007-02-18 20:09:41 +0000558
559 APInt lhs(*this);
Reid Spencer1fa111e2007-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 Foad7a874dd2010-12-01 08:53:58 +0000565 lhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000566 lhs++;
567 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000568 if (rhsNeg) {
569 // Sign bit is set so perform two's complement to make it positive
Jay Foad7a874dd2010-12-01 08:53:58 +0000570 rhs.flipAllBits();
Reid Spencera58f0582007-02-18 20:09:41 +0000571 rhs++;
572 }
Reid Spencer5d0d05c2007-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 Spencer1fa111e2007-02-27 18:23:40 +0000576 if (lhsNeg)
577 if (rhsNeg)
578 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000579 else
580 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000581 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000582 return false;
Eric Christopherd37eda82009-08-21 04:06:45 +0000583 else
Reid Spencera58f0582007-02-18 20:09:41 +0000584 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000585}
586
Jay Foad7a874dd2010-12-01 08:53:58 +0000587void APInt::setBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000588 if (isSingleWord())
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000589 VAL |= maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000590 else
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000591 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000592}
593
Zhou Shengfd43dcf2007-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 Foad7a874dd2010-12-01 08:53:58 +0000596void APInt::clearBit(unsigned bitPosition) {
Eric Christopherd37eda82009-08-21 04:06:45 +0000597 if (isSingleWord())
Reid Spenceraf0e9562007-02-18 18:38:44 +0000598 VAL &= ~maskBit(bitPosition);
Eric Christopherd37eda82009-08-21 04:06:45 +0000599 else
Reid Spenceraf0e9562007-02-18 18:38:44 +0000600 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000601}
602
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000603/// @brief Toggle every bit to its opposite value.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000604
Eric Christopherd37eda82009-08-21 04:06:45 +0000605/// Toggle a given bit to its opposite value whose position is given
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000606/// as "bitPosition".
607/// @brief Toggles a given bit to its opposite value.
Jay Foad7a874dd2010-12-01 08:53:58 +0000608void APInt::flipBit(unsigned bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000609 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad7a874dd2010-12-01 08:53:58 +0000610 if ((*this)[bitPosition]) clearBit(bitPosition);
611 else setBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000612}
613
Benjamin Kramer38e59892010-07-14 22:38:02 +0000614unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +0000615 assert(!str.empty() && "Invalid string length");
Erick Tryzelaarbb975312009-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 Dunbar689ad6e2009-08-13 02:33:34 +0000618
619 size_t slen = str.size();
Reid Spencer57ae4f52007-04-13 19:19:07 +0000620
Eric Christophere250f2a2009-08-21 04:10:31 +0000621 // Each computation below needs to know if it's negative.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000622 StringRef::iterator p = str.begin();
Eric Christophere250f2a2009-08-21 04:10:31 +0000623 unsigned isNegative = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000624 if (*p == '-' || *p == '+') {
625 p++;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000626 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +0000627 assert(slen && "String is only a sign, needs a value.");
Reid Spencer57ae4f52007-04-13 19:19:07 +0000628 }
Eric Christophere250f2a2009-08-21 04:10:31 +0000629
Reid Spencer57ae4f52007-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 Spencer57ae4f52007-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 Tryzelaarae8f78d2009-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 Spencer57ae4f52007-04-13 19:19:07 +0000648
649 // Convert to the actual binary value.
Erick Tryzelaarbb975312009-08-21 03:15:14 +0000650 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer57ae4f52007-04-13 19:19:07 +0000651
Erick Tryzelaarae8f78d2009-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 Spencer57ae4f52007-04-13 19:19:07 +0000660}
661
Stuart Hastingsd52ec652009-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 Spencer794f4722007-02-26 21:02:27 +0000666
Stuart Hastingsd52ec652009-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 Gohman16e02092010-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 Hastingsd52ec652009-03-13 21:51:13 +0000711
712 /*------------------------------------------- handle the last 3 uint32_t's */
Mike Stumpf3dc0c02009-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 Hastingsd52ec652009-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 Spencer794f4722007-02-26 21:02:27 +0000744 if (isSingleWord())
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000745 hash = hashword8(VAL);
Reid Spencer794f4722007-02-26 21:02:27 +0000746 else
Stuart Hastingsd52ec652009-03-13 21:51:13 +0000747 hash = hashword(pVal, getNumWords()*2);
Reid Spencer794f4722007-02-26 21:02:27 +0000748 return hash;
749}
750
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000751/// HiBits - This function returns the high "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000752APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000753 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000754}
755
756/// LoBits - This function returns the low "numBits" bits of this APInt.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000757APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopherd37eda82009-08-21 04:06:45 +0000758 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencere81d2da2007-02-16 22:36:51 +0000759 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000760}
761
Chris Lattner455e9ab2009-01-21 18:09:24 +0000762unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-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 Lattner98f8ccf2008-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 Spencere549c492007-02-21 00:29:48 +0000785 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000786 }
John McCall281d0512010-02-03 03:42:44 +0000787 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000788}
789
Chris Lattner455e9ab2009-01-21 18:09:24 +0000790static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
791 unsigned Count = 0;
Reid Spencer681dcd12007-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 Lattner455e9ab2009-01-21 18:09:24 +0000801unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000802 if (isSingleWord())
803 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
804
Chris Lattner455e9ab2009-01-21 18:09:24 +0000805 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-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 Spencer681dcd12007-02-27 21:59:26 +0000813 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000814 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-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 Lattner455e9ab2009-01-21 18:09:24 +0000828unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000829 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000830 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
831 unsigned Count = 0;
832 unsigned i = 0;
Reid Spencer47fbe9e2007-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 Lattner5e557122007-11-23 22:36:25 +0000837 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000838}
839
Chris Lattner455e9ab2009-01-21 18:09:24 +0000840unsigned APInt::countTrailingOnesSlowCase() const {
841 unsigned Count = 0;
842 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000843 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-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 Lattner455e9ab2009-01-21 18:09:24 +0000850unsigned APInt::countPopulationSlowCase() const {
851 unsigned Count = 0;
852 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000853 Count += CountPopulation_64(pVal[i]);
854 return Count;
855}
856
Reid Spencere81d2da2007-02-16 22:36:51 +0000857APInt APInt::byteSwap() const {
858 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
859 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000860 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000861 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000862 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000863 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000864 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000865 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000866 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000867 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000868 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000869 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000870 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000871 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000872 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000873 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000874 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000875 char Tmp = pByte[i];
Reid Spencera58f0582007-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 Shengb04973e2007-02-15 06:36:31 +0000878 }
879 return Result;
880 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000881}
882
Eric Christopherd37eda82009-08-21 04:06:45 +0000883APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000884 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000885 APInt A = API1, B = API2;
886 while (!!B) {
887 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000888 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000889 A = T;
890 }
891 return A;
892}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000893
Chris Lattner455e9ab2009-01-21 18:09:24 +0000894APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000895 union {
896 double D;
897 uint64_t I;
898 } T;
899 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000900
901 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000902 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000903
904 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000905 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000906
907 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000908 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000909 return APInt(width, 0u);
Reid Spencer30f44f32007-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 Shengd93f00c2007-02-12 20:02:55 +0000915 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000916 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-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 Spencer30f44f32007-02-27 01:28:10 +0000923
924 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000925 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000926 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000927 return isNeg ? -Tmp : Tmp;
928}
929
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000930/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-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 Christopherd37eda82009-08-21 04:06:45 +0000936/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000937double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000938
939 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000940 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000941 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
942 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000943 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000944 return double(sext);
945 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000946 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000947 }
948
Reid Spencer9c0696f2007-02-20 08:51:03 +0000949 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000950 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000951
952 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000953 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000954
955 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000956 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000957
Reid Spencer9c0696f2007-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 Shengd93f00c2007-02-12 20:02:55 +0000962
Reid Spencer9c0696f2007-02-20 08:51:03 +0000963 // Return infinity for exponent overflow
964 if (exp > 1023) {
965 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000966 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000967 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000968 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-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 Shengd93f00c2007-02-12 20:02:55 +0000974 uint64_t mantissa;
Reid Spencer9c0696f2007-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 Shengd93f00c2007-02-12 20:02:55 +0000987 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000988 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-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 Spencere81d2da2007-02-16 22:36:51 +0000997// Truncate to new width.
Jay Foad40f8f622010-12-07 08:25:19 +0000998APInt APInt::trunc(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000999 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +00001000 assert(width && "Can't truncate to 0 bits");
Jay Foad40f8f622010-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 Spencere81d2da2007-02-16 22:36:51 +00001018}
1019
1020// Sign extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001021APInt APInt::sext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001022 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad40f8f622010-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 Spencer9eec2412007-02-25 23:44:53 +00001028 }
1029
Jay Foad40f8f622010-12-07 08:25:19 +00001030 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencer9eec2412007-02-25 23:44:53 +00001031
Jay Foad40f8f622010-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 Spencer9eec2412007-02-25 23:44:53 +00001038 }
1039
Jay Foad40f8f622010-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 Spencer9eec2412007-02-25 23:44:53 +00001051 }
Jay Foad40f8f622010-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 Spencere81d2da2007-02-16 22:36:51 +00001059}
1060
1061// Zero extend to a new width.
Jay Foad40f8f622010-12-07 08:25:19 +00001062APInt APInt::zext(unsigned width) const {
Reid Spencere81d2da2007-02-16 22:36:51 +00001063 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad40f8f622010-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 Spencere81d2da2007-02-16 22:36:51 +00001079}
1080
Jay Foad40f8f622010-12-07 08:25:19 +00001081APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-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 Foad40f8f622010-12-07 08:25:19 +00001089APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer68e23002007-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 Shengff4304f2007-02-09 07:48:24 +00001097/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001098/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001099APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001100 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001101}
1102
1103/// Arithmetic right-shift this APInt by shiftAmt.
1104/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001105APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001106 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-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 Spencer24c4a8f2007-02-25 01:56:07 +00001112 if (isSingleWord()) {
1113 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001114 return APInt(BitWidth, 0); // undefined
1115 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001116 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001117 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001118 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1119 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001120 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001121
Reid Spencer46f9c942007-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 Lattnera5ae15e2007-05-03 18:15:36 +00001125 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001126 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001127 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001128 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001129 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001130 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001131
1132 // Create some space for the result.
1133 uint64_t * val = new uint64_t[getNumWords()];
1134
Reid Spencer46f9c942007-03-02 22:39:11 +00001135 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-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 Spencer46f9c942007-03-02 22:39:11 +00001140 if (bitsInWord == 0)
1141 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001142
1143 // If we are shifting whole words, just move whole words
1144 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001145 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001146 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-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 Christopherd37eda82009-08-21 04:06:45 +00001154 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001155 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-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 Christopherd37eda82009-08-21 04:06:45 +00001158 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-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 Lattnera5ae15e2007-05-03 18:15:36 +00001168 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001169 if (wordShift > bitsInWord) {
1170 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001171 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001172 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1173 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001174 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001175 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001176 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001177 }
1178
Reid Spencer46f9c942007-03-02 22:39:11 +00001179 // Remaining words are 0 or -1, just assign them.
1180 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001181 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001182 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001183 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001184}
1185
Zhou Shengff4304f2007-02-09 07:48:24 +00001186/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001187/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001188APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001189 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001190}
1191
1192/// Logical right-shift this APInt by shiftAmt.
1193/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001194APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001195 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001196 if (shiftAmt == BitWidth)
1197 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001198 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001199 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001200 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001201
Reid Spencerba81c2b2007-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 Spencer02ae8b72007-05-17 06:26:29 +00001208 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001209 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-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 Spencerba81c2b2007-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 Spenceraf8fb192007-03-01 05:39:56 +00001221 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001222 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1223 }
1224 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001225 }
1226
Reid Spencerba81c2b2007-02-26 01:19:48 +00001227 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001228 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1229 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001230
1231 // If we are shifting whole words, just move whole words
1232 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001233 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001234 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001235 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001236 val[i] = 0;
1237 return APInt(val,BitWidth).clearUnusedBits();
1238 }
1239
Eric Christopherd37eda82009-08-21 04:06:45 +00001240 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001241 unsigned breakWord = getNumWords() - offset -1;
1242 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001243 val[i] = (pVal[i+offset] >> wordShift) |
1244 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001245 // Shift the break word.
1246 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1247
1248 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001249 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001250 val[i] = 0;
1251 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001252}
1253
Zhou Shengff4304f2007-02-09 07:48:24 +00001254/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001255/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001256APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001257 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001258 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001259}
1260
Chris Lattner455e9ab2009-01-21 18:09:24 +00001261APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-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 Spencer92c72832007-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 Spencer87553802007-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 Lattner455e9ab2009-01-21 18:09:24 +00001280 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001281 val[i] = pVal[i] << shiftAmt | carry;
1282 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1283 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001284 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001285 }
1286
Reid Spencer87553802007-02-25 00:56:44 +00001287 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001288 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1289 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001290
1291 // If we are shifting whole words, just move whole words
1292 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001293 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001294 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001295 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001296 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001297 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001298 }
Reid Spencer87553802007-02-25 00:56:44 +00001299
1300 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001301 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-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 Spencer438d71e2007-02-25 01:08:58 +00001305 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001306 for (i = 0; i < offset; ++i)
1307 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001308 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001309}
1310
Dan Gohmancf609572008-02-29 01:40:47 +00001311APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001312 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001313}
1314
Chris Lattner455e9ab2009-01-21 18:09:24 +00001315APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001316 if (rotateAmt == 0)
1317 return *this;
Reid Spencer19dc32a2007-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 Gohmancf609572008-02-29 01:40:47 +00001326APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001327 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001328}
1329
Chris Lattner455e9ab2009-01-21 18:09:24 +00001330APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001331 if (rotateAmt == 0)
1332 return *this;
Reid Spencer19dc32a2007-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 Spenceraf8fb192007-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 Christopherd37eda82009-08-21 04:06:45 +00001347// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001348APInt APInt::sqrt() const {
1349
1350 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001351 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-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 Spencer4e1e87f2007-03-01 17:47:31 +00001356 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001357 /* 0 */ 0,
1358 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001359 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-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 Spenceraf8fb192007-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 Cohenca5183d2007-03-05 00:00:42 +00001372 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001373#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001374 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001375 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001376#else
1377 return APInt(BitWidth,
1378 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
Jeff Cohenca5183d2007-03-05 00:00:42 +00001379#endif
1380 }
Reid Spenceraf8fb192007-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 Christopherd37eda82009-08-21 04:06:45 +00001386 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001387 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-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 Christopherd37eda82009-08-21 04:06:45 +00001394 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-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 Christopherd37eda82009-08-21 04:06:45 +00001400 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-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 Christopherd37eda82009-08-21 04:06:45 +00001409 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001410 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001411 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-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 Spenceraf8fb192007-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 Spencerf09aef72007-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 Spenceraf8fb192007-03-01 05:39:56 +00001422 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001423 else
1424 return x_old + 1;
1425 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001426 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001427 return x_old + 1;
1428}
1429
Wojciech Matyjewicz300c6c52008-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 Christopherd37eda82009-08-21 04:06:45 +00001449
Wojciech Matyjewicz300c6c52008-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 Matyjewiczde0f2382008-07-20 15:55:14 +00001470 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001471 return t[i].isNegative() ? t[i] + modulo : t[i];
1472}
1473
Jay Foad4e5ea552009-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 Foad4e5ea552009-04-30 10:15:35 +00001482 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001483 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001484
Jay Foad4e5ea552009-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;
1508 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001509
Jay Foad4e5ea552009-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.
1520APInt::mu APInt::magicu() const {
1521 const APInt& d = *this;
1522 unsigned p;
1523 APInt nc, delta, q1, r1, q2, r2;
1524 struct mu magu;
1525 magu.a = 0; // initialize "add" indicator
1526 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1527 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1528 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1529
1530 nc = allOnes - (-d).urem(d);
1531 p = d.getBitWidth() - 1; // initialize p
1532 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1533 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1534 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1535 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1536 do {
1537 p = p + 1;
1538 if (r1.uge(nc - r1)) {
1539 q1 = q1 + q1 + 1; // update q1
1540 r1 = r1 + r1 - nc; // update r1
1541 }
1542 else {
1543 q1 = q1+q1; // update q1
1544 r1 = r1+r1; // update r1
1545 }
1546 if ((r2 + 1).uge(d - r2)) {
1547 if (q2.uge(signedMax)) magu.a = 1;
1548 q2 = q2+q2 + 1; // update q2
1549 r2 = r2+r2 + 1 - d; // update r2
1550 }
1551 else {
1552 if (q2.uge(signedMin)) magu.a = 1;
1553 q2 = q2+q2; // update q2
1554 r2 = r2+r2 + 1; // update r2
1555 }
1556 delta = d - 1 - r2;
1557 } while (p < d.getBitWidth()*2 &&
1558 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1559 magu.m = q2 + 1; // resulting magic number
1560 magu.s = p - d.getBitWidth(); // resulting shift
1561 return magu;
1562}
1563
Reid Spencer9c0696f2007-02-20 08:51:03 +00001564/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1565/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1566/// variables here have the same names as in the algorithm. Comments explain
1567/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001568static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1569 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001570 assert(u && "Must provide dividend");
1571 assert(v && "Must provide divisor");
1572 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001573 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001574 assert(n>1 && "n must be > 1");
1575
1576 // Knuth uses the value b as the base of the number system. In our case b
1577 // is 2^31 so we just set it to -1u.
1578 uint64_t b = uint64_t(1) << 32;
1579
Chris Lattnerfad86b02008-08-17 07:19:36 +00001580#if 0
David Greene465abed2010-01-05 01:28:52 +00001581 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1582 DEBUG(dbgs() << "KnuthDiv: original:");
1583 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1584 DEBUG(dbgs() << " by");
1585 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1586 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001587#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001588 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1589 // u and v by d. Note that we have taken Knuth's advice here to use a power
1590 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1591 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001592 // shift amount from the leading zeros. We are basically normalizing the u
1593 // and v so that its high bits are shifted to the top of v's range without
1594 // overflow. Note that this can require an extra word in u so that u must
1595 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001596 unsigned shift = CountLeadingZeros_32(v[n-1]);
1597 unsigned v_carry = 0;
1598 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001599 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001600 for (unsigned i = 0; i < m+n; ++i) {
1601 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001602 u[i] = (u[i] << shift) | u_carry;
1603 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001604 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001605 for (unsigned i = 0; i < n; ++i) {
1606 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001607 v[i] = (v[i] << shift) | v_carry;
1608 v_carry = v_tmp;
1609 }
1610 }
1611 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001612#if 0
David Greene465abed2010-01-05 01:28:52 +00001613 DEBUG(dbgs() << "KnuthDiv: normal:");
1614 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1615 DEBUG(dbgs() << " by");
1616 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1617 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001618#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001619
1620 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1621 int j = m;
1622 do {
David Greene465abed2010-01-05 01:28:52 +00001623 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001624 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001625 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1626 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1627 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1628 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1629 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001630 // value qp is one too large, and it eliminates all cases where qp is two
1631 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001632 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001633 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001634 uint64_t qp = dividend / v[n-1];
1635 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001636 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1637 qp--;
1638 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001639 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001640 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001641 }
David Greene465abed2010-01-05 01:28:52 +00001642 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001643
Reid Spencer92904632007-02-23 01:57:13 +00001644 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1645 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1646 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001647 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001648 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001649 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001650 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001651 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001652 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001653 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001654 << ", subtrahend == " << subtrahend
1655 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001656
Reid Spencer610fad82007-02-24 10:01:42 +00001657 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001658 unsigned k = j + i;
1659 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1660 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001661 while (borrow && k <= m+n) { // deal with borrow to the left
1662 borrow = u[k] == 0;
1663 u[k]--;
1664 k++;
1665 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001666 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001667 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001668 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001669 }
David Greene465abed2010-01-05 01:28:52 +00001670 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1671 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1672 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001673 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1674 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001675 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001676 // the true value, and a "borrow" to the left should be remembered.
1677 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001678 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001679 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001680 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001681 u[i] = ~u[i] + carry; // b's complement
1682 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001683 }
Reid Spencer92904632007-02-23 01:57:13 +00001684 }
David Greene465abed2010-01-05 01:28:52 +00001685 DEBUG(dbgs() << "KnuthDiv: after complement:");
1686 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1687 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001688
Eric Christopherd37eda82009-08-21 04:06:45 +00001689 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001690 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001691 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001692 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001693 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001694 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001695 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001696 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001697 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1698 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001699 // since it cancels with the borrow that occurred in D4.
1700 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001701 for (unsigned i = 0; i < n; i++) {
1702 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001703 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001704 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001705 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001706 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001707 }
David Greene465abed2010-01-05 01:28:52 +00001708 DEBUG(dbgs() << "KnuthDiv: after correction:");
1709 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1710 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001711
Reid Spencer92904632007-02-23 01:57:13 +00001712 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1713 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001714
David Greene465abed2010-01-05 01:28:52 +00001715 DEBUG(dbgs() << "KnuthDiv: quotient:");
1716 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1717 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001718
Reid Spencer9c0696f2007-02-20 08:51:03 +00001719 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1720 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1721 // compute the remainder (urem uses this).
1722 if (r) {
1723 // The value d is expressed by the "shift" value above since we avoided
1724 // multiplication by d by using a shift left. So, all we have to do is
1725 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001726 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001727 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001728 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001729 for (int i = n-1; i >= 0; i--) {
1730 r[i] = (u[i] >> shift) | carry;
1731 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001732 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001733 }
1734 } else {
1735 for (int i = n-1; i >= 0; i--) {
1736 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001737 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001738 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001739 }
David Greene465abed2010-01-05 01:28:52 +00001740 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001741 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001742#if 0
David Greene465abed2010-01-05 01:28:52 +00001743 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001744#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001745}
1746
Chris Lattner455e9ab2009-01-21 18:09:24 +00001747void APInt::divide(const APInt LHS, unsigned lhsWords,
1748 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001749 APInt *Quotient, APInt *Remainder)
1750{
1751 assert(lhsWords >= rhsWords && "Fractional result");
1752
Eric Christopherd37eda82009-08-21 04:06:45 +00001753 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001754 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001755 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001756 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1757 // can't use 64-bit operands here because we don't have native results of
1758 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001759 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001760 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001761 unsigned n = rhsWords * 2;
1762 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001763
1764 // Allocate space for the temporary values we need either on the stack, if
1765 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001766 unsigned SPACE[128];
1767 unsigned *U = 0;
1768 unsigned *V = 0;
1769 unsigned *Q = 0;
1770 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001771 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1772 U = &SPACE[0];
1773 V = &SPACE[m+n+1];
1774 Q = &SPACE[(m+n+1) + n];
1775 if (Remainder)
1776 R = &SPACE[(m+n+1) + n + (m+n)];
1777 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001778 U = new unsigned[m + n + 1];
1779 V = new unsigned[n];
1780 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001781 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001782 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001783 }
1784
1785 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001786 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001787 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001788 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001789 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001790 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001791 }
1792 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1793
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001794 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001795 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001796 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001797 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001798 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001799 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001800 }
1801
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001802 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001803 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001804 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001805 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806
Eric Christopherd37eda82009-08-21 04:06:45 +00001807 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001808 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001809 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001810 // contain any zero words or the Knuth algorithm fails.
1811 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1812 n--;
1813 m++;
1814 }
1815 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1816 m--;
1817
1818 // If we're left with only a single word for the divisor, Knuth doesn't work
1819 // so we implement the short division algorithm here. This is much simpler
1820 // and faster because we are certain that we can divide a 64-bit quantity
1821 // by a 32-bit quantity at hardware speed and short division is simply a
1822 // series of such operations. This is just like doing short division but we
1823 // are using base 2^32 instead of base 10.
1824 assert(n != 0 && "Divide by zero?");
1825 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001826 unsigned divisor = V[0];
1827 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001828 for (int i = m+n-1; i >= 0; i--) {
1829 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1830 if (partial_dividend == 0) {
1831 Q[i] = 0;
1832 remainder = 0;
1833 } else if (partial_dividend < divisor) {
1834 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001835 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001836 } else if (partial_dividend == divisor) {
1837 Q[i] = 1;
1838 remainder = 0;
1839 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001840 Q[i] = (unsigned)(partial_dividend / divisor);
1841 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001842 }
1843 }
1844 if (R)
1845 R[0] = remainder;
1846 } else {
1847 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1848 // case n > 1.
1849 KnuthDiv(U, V, Q, R, m, n);
1850 }
1851
1852 // If the caller wants the quotient
1853 if (Quotient) {
1854 // Set up the Quotient value's memory.
1855 if (Quotient->BitWidth != LHS.BitWidth) {
1856 if (Quotient->isSingleWord())
1857 Quotient->VAL = 0;
1858 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001859 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001860 Quotient->BitWidth = LHS.BitWidth;
1861 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001862 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001863 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001864 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001865
Eric Christopherd37eda82009-08-21 04:06:45 +00001866 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001867 // order words.
1868 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001869 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001870 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1871 if (Quotient->isSingleWord())
1872 Quotient->VAL = tmp;
1873 else
1874 Quotient->pVal[0] = tmp;
1875 } else {
1876 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1877 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001878 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001879 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1880 }
1881 }
1882
1883 // If the caller wants the remainder
1884 if (Remainder) {
1885 // Set up the Remainder value's memory.
1886 if (Remainder->BitWidth != RHS.BitWidth) {
1887 if (Remainder->isSingleWord())
1888 Remainder->VAL = 0;
1889 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001890 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001891 Remainder->BitWidth = RHS.BitWidth;
1892 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001893 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001894 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001895 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001896
1897 // The remainder is in R. Reconstitute the remainder into Remainder's low
1898 // order words.
1899 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001900 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001901 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1902 if (Remainder->isSingleWord())
1903 Remainder->VAL = tmp;
1904 else
1905 Remainder->pVal[0] = tmp;
1906 } else {
1907 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1908 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001909 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001910 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1911 }
1912 }
1913
1914 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001915 if (U != &SPACE[0]) {
1916 delete [] U;
1917 delete [] V;
1918 delete [] Q;
1919 delete [] R;
1920 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001921}
1922
Reid Spencere81d2da2007-02-16 22:36:51 +00001923APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001924 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001925
1926 // First, deal with the easy case
1927 if (isSingleWord()) {
1928 assert(RHS.VAL != 0 && "Divide by zero?");
1929 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001930 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001931
Reid Spencer71bd08f2007-02-17 02:07:07 +00001932 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001933 unsigned rhsBits = RHS.getActiveBits();
1934 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001935 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001936 unsigned lhsBits = this->getActiveBits();
1937 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001938
1939 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001940 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001941 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001942 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001943 else if (lhsWords < rhsWords || this->ult(RHS)) {
1944 // X / Y ===> 0, iff X < Y
1945 return APInt(BitWidth, 0);
1946 } else if (*this == RHS) {
1947 // X / X ===> 1
1948 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001949 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001950 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001951 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001952 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001953
1954 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1955 APInt Quotient(1,0); // to hold result.
1956 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1957 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001958}
1959
Reid Spencere81d2da2007-02-16 22:36:51 +00001960APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001961 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001962 if (isSingleWord()) {
1963 assert(RHS.VAL != 0 && "Remainder by zero?");
1964 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001965 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001966
Reid Spencere0cdd332007-02-21 08:21:52 +00001967 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001968 unsigned lhsBits = getActiveBits();
1969 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001970
1971 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001972 unsigned rhsBits = RHS.getActiveBits();
1973 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001974 assert(rhsWords && "Performing remainder operation by zero ???");
1975
Reid Spencer71bd08f2007-02-17 02:07:07 +00001976 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001977 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001978 // 0 % Y ===> 0
1979 return APInt(BitWidth, 0);
1980 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1981 // X % Y ===> X, iff X < Y
1982 return *this;
1983 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001984 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001985 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001986 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001987 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001988 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001989 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001990
Reid Spencer19dc32a2007-05-13 23:44:59 +00001991 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001992 APInt Remainder(1,0);
1993 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1994 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001995}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001996
Eric Christopherd37eda82009-08-21 04:06:45 +00001997void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00001998 APInt &Quotient, APInt &Remainder) {
1999 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002000 unsigned lhsBits = LHS.getActiveBits();
2001 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2002 unsigned rhsBits = RHS.getActiveBits();
2003 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002004
2005 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002006 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002007 Quotient = 0; // 0 / Y ===> 0
2008 Remainder = 0; // 0 % Y ===> 0
2009 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002010 }
2011
2012 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002013 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002014 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002015 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002016 }
2017
Reid Spencer19dc32a2007-05-13 23:44:59 +00002018 if (LHS == RHS) {
2019 Quotient = 1; // X / X ===> 1
2020 Remainder = 0; // X % X ===> 0;
2021 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002022 }
2023
Reid Spencer19dc32a2007-05-13 23:44:59 +00002024 if (lhsWords == 1 && rhsWords == 1) {
2025 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002026 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2027 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2028 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2029 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002030 return;
2031 }
2032
2033 // Okay, lets do it the long way
2034 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2035}
2036
Chris Lattner0a0a5852010-10-13 23:54:10 +00002037APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002038 APInt Res = *this+RHS;
2039 Overflow = isNonNegative() == RHS.isNonNegative() &&
2040 Res.isNonNegative() != isNonNegative();
2041 return Res;
2042}
2043
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002044APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2045 APInt Res = *this+RHS;
2046 Overflow = Res.ult(RHS);
2047 return Res;
2048}
2049
Chris Lattner0a0a5852010-10-13 23:54:10 +00002050APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002051 APInt Res = *this - RHS;
2052 Overflow = isNonNegative() != RHS.isNonNegative() &&
2053 Res.isNonNegative() != isNonNegative();
2054 return Res;
2055}
2056
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002057APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002058 APInt Res = *this-RHS;
2059 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002060 return Res;
2061}
2062
Chris Lattner0a0a5852010-10-13 23:54:10 +00002063APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002064 // MININT/-1 --> overflow.
2065 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2066 return sdiv(RHS);
2067}
2068
Chris Lattner0a0a5852010-10-13 23:54:10 +00002069APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002070 APInt Res = *this * RHS;
2071
2072 if (*this != 0 && RHS != 0)
2073 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2074 else
2075 Overflow = false;
2076 return Res;
2077}
2078
Chris Lattner0a0a5852010-10-13 23:54:10 +00002079APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002080 Overflow = ShAmt >= getBitWidth();
2081 if (Overflow)
2082 ShAmt = getBitWidth()-1;
2083
2084 if (isNonNegative()) // Don't allow sign change.
2085 Overflow = ShAmt >= countLeadingZeros();
2086 else
2087 Overflow = ShAmt >= countLeadingOnes();
2088
2089 return *this << ShAmt;
2090}
2091
2092
2093
2094
Benjamin Kramer38e59892010-07-14 22:38:02 +00002095void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002096 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002097 assert(!str.empty() && "Invalid string length");
Reid Spencer5e0a8512007-02-17 03:16:00 +00002098 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2099 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002100
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002101 StringRef::iterator p = str.begin();
2102 size_t slen = str.size();
2103 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002104 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002105 p++;
2106 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002107 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002108 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002109 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002110 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2111 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002112 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2113 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002114
2115 // Allocate memory
2116 if (!isSingleWord())
2117 pVal = getClearedMemory(getNumWords());
2118
2119 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002120 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002121
2122 // Set up an APInt for the digit to add outside the loop so we don't
2123 // constantly construct/destruct it.
2124 APInt apdigit(getBitWidth(), 0);
2125 APInt apradix(getBitWidth(), radix);
2126
2127 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002128 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002129 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002130 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002131
Reid Spencer6551dcd2007-05-16 19:18:22 +00002132 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002133 if (slen > 1) {
2134 if (shift)
2135 *this <<= shift;
2136 else
2137 *this *= apradix;
2138 }
Reid Spencer385f7542007-02-21 03:55:44 +00002139
2140 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002141 if (apdigit.isSingleWord())
2142 apdigit.VAL = digit;
2143 else
2144 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002145 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002146 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002147 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002148 if (isNeg) {
2149 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002150 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002151 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002152}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002153
Chris Lattnerfad86b02008-08-17 07:19:36 +00002154void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2155 bool Signed) const {
2156 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002157 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002158
Chris Lattnerfad86b02008-08-17 07:19:36 +00002159 // First, check for a zero value and just short circuit the logic below.
2160 if (*this == 0) {
2161 Str.push_back('0');
2162 return;
2163 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002164
Chris Lattnerfad86b02008-08-17 07:19:36 +00002165 static const char Digits[] = "0123456789ABCDEF";
Eric Christopherd37eda82009-08-21 04:06:45 +00002166
Reid Spencer9c0696f2007-02-20 08:51:03 +00002167 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002168 char Buffer[65];
2169 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002170
Chris Lattnerfad86b02008-08-17 07:19:36 +00002171 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002172 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002173 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002174 } else {
2175 int64_t I = getSExtValue();
2176 if (I >= 0) {
2177 N = I;
2178 } else {
2179 Str.push_back('-');
2180 N = -(uint64_t)I;
2181 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002182 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002183
Chris Lattnerfad86b02008-08-17 07:19:36 +00002184 while (N) {
2185 *--BufPtr = Digits[N % Radix];
2186 N /= Radix;
2187 }
2188 Str.append(BufPtr, Buffer+65);
2189 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002190 }
2191
Chris Lattnerfad86b02008-08-17 07:19:36 +00002192 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002193
Chris Lattnerfad86b02008-08-17 07:19:36 +00002194 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002195 // They want to print the signed version and it is a negative value
2196 // Flip the bits and add one to turn it into the equivalent positive
2197 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002198 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002199 Tmp++;
2200 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002201 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002202
Chris Lattnerfad86b02008-08-17 07:19:36 +00002203 // We insert the digits backward, then reverse them to get the right order.
2204 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002205
2206 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2207 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002208 // equaly. We just shift until the value is zero.
2209 if (Radix != 10) {
2210 // Just shift tmp right for each digit width until it becomes zero
2211 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2212 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002213
Chris Lattnerfad86b02008-08-17 07:19:36 +00002214 while (Tmp != 0) {
2215 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2216 Str.push_back(Digits[Digit]);
2217 Tmp = Tmp.lshr(ShiftAmt);
2218 }
2219 } else {
2220 APInt divisor(4, 10);
2221 while (Tmp != 0) {
2222 APInt APdigit(1, 0);
2223 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002224 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002225 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002226 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002227 assert(Digit < Radix && "divide failed");
2228 Str.push_back(Digits[Digit]);
2229 Tmp = tmp2;
2230 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002231 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002232
Chris Lattnerfad86b02008-08-17 07:19:36 +00002233 // Reverse the digits before returning.
2234 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002235}
2236
Chris Lattnerfad86b02008-08-17 07:19:36 +00002237/// toString - This returns the APInt as a std::string. Note that this is an
2238/// inefficient method. It is better to pass in a SmallVector/SmallString
2239/// to the methods above.
2240std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2241 SmallString<40> S;
2242 toString(S, Radix, Signed);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002243 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002244}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002245
Chris Lattnerfad86b02008-08-17 07:19:36 +00002246
2247void APInt::dump() const {
2248 SmallString<40> S, U;
2249 this->toStringUnsigned(U);
2250 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002251 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002252 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002253}
2254
Chris Lattner944fac72008-08-23 22:23:09 +00002255void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002256 SmallString<40> S;
2257 this->toString(S, 10, isSigned);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002258 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002259}
2260
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002261// This implements a variety of operations on a representation of
2262// arbitrary precision, two's-complement, bignum integer values.
2263
Chris Lattner91021d32009-08-23 23:11:28 +00002264// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2265// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002266#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002267COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002268
2269/* Some handy functions local to this file. */
2270namespace {
2271
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002272 /* Returns the integer part with the least significant BITS set.
2273 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002274 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002275 lowBitMask(unsigned int bits)
2276 {
Dan Gohman16e02092010-03-24 19:38:02 +00002277 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002278
2279 return ~(integerPart) 0 >> (integerPartWidth - bits);
2280 }
2281
Neil Booth055c0b32007-10-06 00:43:45 +00002282 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002283 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002284 lowHalf(integerPart part)
2285 {
2286 return part & lowBitMask(integerPartWidth / 2);
2287 }
2288
Neil Booth055c0b32007-10-06 00:43:45 +00002289 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002290 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002291 highHalf(integerPart part)
2292 {
2293 return part >> (integerPartWidth / 2);
2294 }
2295
Neil Booth055c0b32007-10-06 00:43:45 +00002296 /* Returns the bit number of the most significant set bit of a part.
2297 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002298 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002299 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002300 {
2301 unsigned int n, msb;
2302
2303 if (value == 0)
2304 return -1U;
2305
2306 n = integerPartWidth / 2;
2307
2308 msb = 0;
2309 do {
2310 if (value >> n) {
2311 value >>= n;
2312 msb += n;
2313 }
2314
2315 n >>= 1;
2316 } while (n);
2317
2318 return msb;
2319 }
2320
Neil Booth055c0b32007-10-06 00:43:45 +00002321 /* Returns the bit number of the least significant set bit of a
2322 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002323 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002324 partLSB(integerPart value)
2325 {
2326 unsigned int n, lsb;
2327
2328 if (value == 0)
2329 return -1U;
2330
2331 lsb = integerPartWidth - 1;
2332 n = integerPartWidth / 2;
2333
2334 do {
2335 if (value << n) {
2336 value <<= n;
2337 lsb -= n;
2338 }
2339
2340 n >>= 1;
2341 } while (n);
2342
2343 return lsb;
2344 }
2345}
2346
2347/* Sets the least significant part of a bignum to the input value, and
2348 zeroes out higher parts. */
2349void
2350APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2351{
2352 unsigned int i;
2353
Dan Gohman16e02092010-03-24 19:38:02 +00002354 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002355
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002356 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002357 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002358 dst[i] = 0;
2359}
2360
2361/* Assign one bignum to another. */
2362void
2363APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2364{
2365 unsigned int i;
2366
Dan Gohman16e02092010-03-24 19:38:02 +00002367 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002368 dst[i] = src[i];
2369}
2370
2371/* Returns true if a bignum is zero, false otherwise. */
2372bool
2373APInt::tcIsZero(const integerPart *src, unsigned int parts)
2374{
2375 unsigned int i;
2376
Dan Gohman16e02092010-03-24 19:38:02 +00002377 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002378 if (src[i])
2379 return false;
2380
2381 return true;
2382}
2383
2384/* Extract the given bit of a bignum; returns 0 or 1. */
2385int
2386APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2387{
Dan Gohman16e02092010-03-24 19:38:02 +00002388 return (parts[bit / integerPartWidth] &
2389 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002390}
2391
John McCalle12b7382010-02-28 02:51:25 +00002392/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002393void
2394APInt::tcSetBit(integerPart *parts, unsigned int bit)
2395{
2396 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2397}
2398
John McCalle12b7382010-02-28 02:51:25 +00002399/* Clears the given bit of a bignum. */
2400void
2401APInt::tcClearBit(integerPart *parts, unsigned int bit)
2402{
2403 parts[bit / integerPartWidth] &=
2404 ~((integerPart) 1 << (bit % integerPartWidth));
2405}
2406
Neil Booth055c0b32007-10-06 00:43:45 +00002407/* Returns the bit number of the least significant set bit of a
2408 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002409unsigned int
2410APInt::tcLSB(const integerPart *parts, unsigned int n)
2411{
2412 unsigned int i, lsb;
2413
Dan Gohman16e02092010-03-24 19:38:02 +00002414 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002415 if (parts[i] != 0) {
2416 lsb = partLSB(parts[i]);
2417
2418 return lsb + i * integerPartWidth;
2419 }
2420 }
2421
2422 return -1U;
2423}
2424
Neil Booth055c0b32007-10-06 00:43:45 +00002425/* Returns the bit number of the most significant set bit of a number.
2426 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002427unsigned int
2428APInt::tcMSB(const integerPart *parts, unsigned int n)
2429{
2430 unsigned int msb;
2431
2432 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002433 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002434
Dan Gohman16e02092010-03-24 19:38:02 +00002435 if (parts[n] != 0) {
2436 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002437
Dan Gohman16e02092010-03-24 19:38:02 +00002438 return msb + n * integerPartWidth;
2439 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002440 } while (n);
2441
2442 return -1U;
2443}
2444
Neil Booth68e53ad2007-10-08 13:47:12 +00002445/* Copy the bit vector of width srcBITS from SRC, starting at bit
2446 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2447 the least significant bit of DST. All high bits above srcBITS in
2448 DST are zero-filled. */
2449void
Evan Chengcf69a742009-05-21 23:47:47 +00002450APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002451 unsigned int srcBits, unsigned int srcLSB)
2452{
2453 unsigned int firstSrcPart, dstParts, shift, n;
2454
2455 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002456 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002457
2458 firstSrcPart = srcLSB / integerPartWidth;
2459 tcAssign (dst, src + firstSrcPart, dstParts);
2460
2461 shift = srcLSB % integerPartWidth;
2462 tcShiftRight (dst, dstParts, shift);
2463
2464 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2465 in DST. If this is less that srcBits, append the rest, else
2466 clear the high bits. */
2467 n = dstParts * integerPartWidth - shift;
2468 if (n < srcBits) {
2469 integerPart mask = lowBitMask (srcBits - n);
2470 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2471 << n % integerPartWidth);
2472 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002473 if (srcBits % integerPartWidth)
2474 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002475 }
2476
2477 /* Clear high parts. */
2478 while (dstParts < dstCount)
2479 dst[dstParts++] = 0;
2480}
2481
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002482/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2483integerPart
2484APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2485 integerPart c, unsigned int parts)
2486{
2487 unsigned int i;
2488
2489 assert(c <= 1);
2490
Dan Gohman16e02092010-03-24 19:38:02 +00002491 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002492 integerPart l;
2493
2494 l = dst[i];
2495 if (c) {
2496 dst[i] += rhs[i] + 1;
2497 c = (dst[i] <= l);
2498 } else {
2499 dst[i] += rhs[i];
2500 c = (dst[i] < l);
2501 }
2502 }
2503
2504 return c;
2505}
2506
2507/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2508integerPart
2509APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2510 integerPart c, unsigned int parts)
2511{
2512 unsigned int i;
2513
2514 assert(c <= 1);
2515
Dan Gohman16e02092010-03-24 19:38:02 +00002516 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002517 integerPart l;
2518
2519 l = dst[i];
2520 if (c) {
2521 dst[i] -= rhs[i] + 1;
2522 c = (dst[i] >= l);
2523 } else {
2524 dst[i] -= rhs[i];
2525 c = (dst[i] > l);
2526 }
2527 }
2528
2529 return c;
2530}
2531
2532/* Negate a bignum in-place. */
2533void
2534APInt::tcNegate(integerPart *dst, unsigned int parts)
2535{
2536 tcComplement(dst, parts);
2537 tcIncrement(dst, parts);
2538}
2539
Neil Booth055c0b32007-10-06 00:43:45 +00002540/* DST += SRC * MULTIPLIER + CARRY if add is true
2541 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002542
2543 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2544 they must start at the same point, i.e. DST == SRC.
2545
2546 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2547 returned. Otherwise DST is filled with the least significant
2548 DSTPARTS parts of the result, and if all of the omitted higher
2549 parts were zero return zero, otherwise overflow occurred and
2550 return one. */
2551int
2552APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2553 integerPart multiplier, integerPart carry,
2554 unsigned int srcParts, unsigned int dstParts,
2555 bool add)
2556{
2557 unsigned int i, n;
2558
2559 /* Otherwise our writes of DST kill our later reads of SRC. */
2560 assert(dst <= src || dst >= src + srcParts);
2561 assert(dstParts <= srcParts + 1);
2562
2563 /* N loops; minimum of dstParts and srcParts. */
2564 n = dstParts < srcParts ? dstParts: srcParts;
2565
Dan Gohman16e02092010-03-24 19:38:02 +00002566 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002567 integerPart low, mid, high, srcPart;
2568
2569 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2570
2571 This cannot overflow, because
2572
2573 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2574
2575 which is less than n^2. */
2576
2577 srcPart = src[i];
2578
2579 if (multiplier == 0 || srcPart == 0) {
2580 low = carry;
2581 high = 0;
2582 } else {
2583 low = lowHalf(srcPart) * lowHalf(multiplier);
2584 high = highHalf(srcPart) * highHalf(multiplier);
2585
2586 mid = lowHalf(srcPart) * highHalf(multiplier);
2587 high += highHalf(mid);
2588 mid <<= integerPartWidth / 2;
2589 if (low + mid < low)
2590 high++;
2591 low += mid;
2592
2593 mid = highHalf(srcPart) * lowHalf(multiplier);
2594 high += highHalf(mid);
2595 mid <<= integerPartWidth / 2;
2596 if (low + mid < low)
2597 high++;
2598 low += mid;
2599
2600 /* Now add carry. */
2601 if (low + carry < low)
2602 high++;
2603 low += carry;
2604 }
2605
2606 if (add) {
2607 /* And now DST[i], and store the new low part there. */
2608 if (low + dst[i] < low)
2609 high++;
2610 dst[i] += low;
2611 } else
2612 dst[i] = low;
2613
2614 carry = high;
2615 }
2616
2617 if (i < dstParts) {
2618 /* Full multiplication, there is no overflow. */
2619 assert(i + 1 == dstParts);
2620 dst[i] = carry;
2621 return 0;
2622 } else {
2623 /* We overflowed if there is carry. */
2624 if (carry)
2625 return 1;
2626
2627 /* We would overflow if any significant unwritten parts would be
2628 non-zero. This is true if any remaining src parts are non-zero
2629 and the multiplier is non-zero. */
2630 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002631 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002632 if (src[i])
2633 return 1;
2634
2635 /* We fitted in the narrow destination. */
2636 return 0;
2637 }
2638}
2639
2640/* DST = LHS * RHS, where DST has the same width as the operands and
2641 is filled with the least significant parts of the result. Returns
2642 one if overflow occurred, otherwise zero. DST must be disjoint
2643 from both operands. */
2644int
2645APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2646 const integerPart *rhs, unsigned int parts)
2647{
2648 unsigned int i;
2649 int overflow;
2650
2651 assert(dst != lhs && dst != rhs);
2652
2653 overflow = 0;
2654 tcSet(dst, 0, parts);
2655
Dan Gohman16e02092010-03-24 19:38:02 +00002656 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002657 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2658 parts - i, true);
2659
2660 return overflow;
2661}
2662
Neil Booth978661d2007-10-06 00:24:48 +00002663/* DST = LHS * RHS, where DST has width the sum of the widths of the
2664 operands. No overflow occurs. DST must be disjoint from both
2665 operands. Returns the number of parts required to hold the
2666 result. */
2667unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002668APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002669 const integerPart *rhs, unsigned int lhsParts,
2670 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002671{
Neil Booth978661d2007-10-06 00:24:48 +00002672 /* Put the narrower number on the LHS for less loops below. */
2673 if (lhsParts > rhsParts) {
2674 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2675 } else {
2676 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002677
Neil Booth978661d2007-10-06 00:24:48 +00002678 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002679
Neil Booth978661d2007-10-06 00:24:48 +00002680 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002681
Dan Gohman16e02092010-03-24 19:38:02 +00002682 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002683 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002684
Neil Booth978661d2007-10-06 00:24:48 +00002685 n = lhsParts + rhsParts;
2686
2687 return n - (dst[n - 1] == 0);
2688 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002689}
2690
2691/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2692 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2693 set REMAINDER to the remainder, return zero. i.e.
2694
2695 OLD_LHS = RHS * LHS + REMAINDER
2696
2697 SCRATCH is a bignum of the same size as the operands and result for
2698 use by the routine; its contents need not be initialized and are
2699 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2700*/
2701int
2702APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2703 integerPart *remainder, integerPart *srhs,
2704 unsigned int parts)
2705{
2706 unsigned int n, shiftCount;
2707 integerPart mask;
2708
2709 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2710
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002711 shiftCount = tcMSB(rhs, parts) + 1;
2712 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002713 return true;
2714
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002715 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002716 n = shiftCount / integerPartWidth;
2717 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2718
2719 tcAssign(srhs, rhs, parts);
2720 tcShiftLeft(srhs, parts, shiftCount);
2721 tcAssign(remainder, lhs, parts);
2722 tcSet(lhs, 0, parts);
2723
2724 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2725 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002726 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002727 int compare;
2728
2729 compare = tcCompare(remainder, srhs, parts);
2730 if (compare >= 0) {
2731 tcSubtract(remainder, srhs, 0, parts);
2732 lhs[n] |= mask;
2733 }
2734
2735 if (shiftCount == 0)
2736 break;
2737 shiftCount--;
2738 tcShiftRight(srhs, parts, 1);
2739 if ((mask >>= 1) == 0)
2740 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2741 }
2742
2743 return false;
2744}
2745
2746/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2747 There are no restrictions on COUNT. */
2748void
2749APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2750{
Neil Booth68e53ad2007-10-08 13:47:12 +00002751 if (count) {
2752 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002753
Neil Booth68e53ad2007-10-08 13:47:12 +00002754 /* Jump is the inter-part jump; shift is is intra-part shift. */
2755 jump = count / integerPartWidth;
2756 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002757
Neil Booth68e53ad2007-10-08 13:47:12 +00002758 while (parts > jump) {
2759 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002760
Neil Booth68e53ad2007-10-08 13:47:12 +00002761 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002762
Neil Booth68e53ad2007-10-08 13:47:12 +00002763 /* dst[i] comes from the two parts src[i - jump] and, if we have
2764 an intra-part shift, src[i - jump - 1]. */
2765 part = dst[parts - jump];
2766 if (shift) {
2767 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002768 if (parts >= jump + 1)
2769 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2770 }
2771
Neil Booth68e53ad2007-10-08 13:47:12 +00002772 dst[parts] = part;
2773 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002774
Neil Booth68e53ad2007-10-08 13:47:12 +00002775 while (parts > 0)
2776 dst[--parts] = 0;
2777 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002778}
2779
2780/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2781 zero. There are no restrictions on COUNT. */
2782void
2783APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2784{
Neil Booth68e53ad2007-10-08 13:47:12 +00002785 if (count) {
2786 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002787
Neil Booth68e53ad2007-10-08 13:47:12 +00002788 /* Jump is the inter-part jump; shift is is intra-part shift. */
2789 jump = count / integerPartWidth;
2790 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002791
Neil Booth68e53ad2007-10-08 13:47:12 +00002792 /* Perform the shift. This leaves the most significant COUNT bits
2793 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002794 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002795 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002796
Neil Booth68e53ad2007-10-08 13:47:12 +00002797 if (i + jump >= parts) {
2798 part = 0;
2799 } else {
2800 part = dst[i + jump];
2801 if (shift) {
2802 part >>= shift;
2803 if (i + jump + 1 < parts)
2804 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2805 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002806 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002807
Neil Booth68e53ad2007-10-08 13:47:12 +00002808 dst[i] = part;
2809 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002810 }
2811}
2812
2813/* Bitwise and of two bignums. */
2814void
2815APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2816{
2817 unsigned int i;
2818
Dan Gohman16e02092010-03-24 19:38:02 +00002819 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002820 dst[i] &= rhs[i];
2821}
2822
2823/* Bitwise inclusive or of two bignums. */
2824void
2825APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2826{
2827 unsigned int i;
2828
Dan Gohman16e02092010-03-24 19:38:02 +00002829 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002830 dst[i] |= rhs[i];
2831}
2832
2833/* Bitwise exclusive or of two bignums. */
2834void
2835APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2836{
2837 unsigned int i;
2838
Dan Gohman16e02092010-03-24 19:38:02 +00002839 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002840 dst[i] ^= rhs[i];
2841}
2842
2843/* Complement a bignum in-place. */
2844void
2845APInt::tcComplement(integerPart *dst, unsigned int parts)
2846{
2847 unsigned int i;
2848
Dan Gohman16e02092010-03-24 19:38:02 +00002849 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002850 dst[i] = ~dst[i];
2851}
2852
2853/* Comparison (unsigned) of two bignums. */
2854int
2855APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2856 unsigned int parts)
2857{
2858 while (parts) {
2859 parts--;
2860 if (lhs[parts] == rhs[parts])
2861 continue;
2862
2863 if (lhs[parts] > rhs[parts])
2864 return 1;
2865 else
2866 return -1;
2867 }
2868
2869 return 0;
2870}
2871
2872/* Increment a bignum in-place, return the carry flag. */
2873integerPart
2874APInt::tcIncrement(integerPart *dst, unsigned int parts)
2875{
2876 unsigned int i;
2877
Dan Gohman16e02092010-03-24 19:38:02 +00002878 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002879 if (++dst[i] != 0)
2880 break;
2881
2882 return i == parts;
2883}
2884
2885/* Set the least significant BITS bits of a bignum, clear the
2886 rest. */
2887void
2888APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2889 unsigned int bits)
2890{
2891 unsigned int i;
2892
2893 i = 0;
2894 while (bits > integerPartWidth) {
2895 dst[i++] = ~(integerPart) 0;
2896 bits -= integerPartWidth;
2897 }
2898
2899 if (bits)
2900 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2901
2902 while (i < parts)
2903 dst[i++] = 0;
2904}