blob: e7ff15cadb80847034efe686ff5e2a81da5f4f6e [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.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000998APInt &APInt::trunc(unsigned width) {
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");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001001 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001002 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001003 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001004 if (wordsBefore != wordsAfter) {
1005 if (wordsAfter == 1) {
1006 uint64_t *tmp = pVal;
1007 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +00001008 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +00001009 } else {
1010 uint64_t *newVal = getClearedMemory(wordsAfter);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001011 for (unsigned i = 0; i < wordsAfter; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001012 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +00001013 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001014 pVal = newVal;
1015 }
1016 }
Reid Spencer94900772007-02-28 17:34:32 +00001017 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001018}
1019
1020// Sign extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001021APInt &APInt::sext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001022 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9eec2412007-02-25 23:44:53 +00001023 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001024 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +00001025 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +00001026 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +00001027 }
1028
1029 // The sign bit is set. First, get some facts
Chris Lattner455e9ab2009-01-21 18:09:24 +00001030 unsigned wordsBefore = getNumWords();
1031 unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001032 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001033 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001034
1035 // Mask the high order word appropriately
1036 if (wordsBefore == wordsAfter) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001037 unsigned newWordBits = width % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001038 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +00001039 uint64_t mask = ~0ULL;
1040 if (newWordBits)
1041 mask >>= APINT_BITS_PER_WORD - newWordBits;
1042 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001043 if (wordsBefore == 1)
1044 VAL |= mask;
1045 else
1046 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001047 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001048 }
1049
Reid Spencerf30b1882007-02-25 23:54:00 +00001050 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001051 uint64_t *newVal = getMemory(wordsAfter);
1052 if (wordsBefore == 1)
1053 newVal[0] = VAL | mask;
1054 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001055 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001056 newVal[i] = pVal[i];
1057 newVal[wordsBefore-1] |= mask;
1058 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001059 for (unsigned i = wordsBefore; i < wordsAfter; i++)
Reid Spencer9eec2412007-02-25 23:44:53 +00001060 newVal[i] = -1ULL;
1061 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001062 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001063 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001064 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001065}
1066
1067// Zero extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001068APInt &APInt::zext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001069 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001070 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001071 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001072 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001073 if (wordsBefore != wordsAfter) {
1074 uint64_t *newVal = getClearedMemory(wordsAfter);
1075 if (wordsBefore == 1)
1076 newVal[0] = VAL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001077 else
Chris Lattner455e9ab2009-01-21 18:09:24 +00001078 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001079 newVal[i] = pVal[i];
1080 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001081 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001082 pVal = newVal;
1083 }
Reid Spencer94900772007-02-28 17:34:32 +00001084 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001085}
1086
Chris Lattner455e9ab2009-01-21 18:09:24 +00001087APInt &APInt::zextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001088 if (BitWidth < width)
1089 return zext(width);
1090 if (BitWidth > width)
1091 return trunc(width);
1092 return *this;
1093}
1094
Chris Lattner455e9ab2009-01-21 18:09:24 +00001095APInt &APInt::sextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001096 if (BitWidth < width)
1097 return sext(width);
1098 if (BitWidth > width)
1099 return trunc(width);
1100 return *this;
1101}
1102
Zhou Shengff4304f2007-02-09 07:48:24 +00001103/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001104/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001105APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001106 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001107}
1108
1109/// Arithmetic right-shift this APInt by shiftAmt.
1110/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001111APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001112 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001113 // Handle a degenerate case
1114 if (shiftAmt == 0)
1115 return *this;
1116
1117 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001118 if (isSingleWord()) {
1119 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001120 return APInt(BitWidth, 0); // undefined
1121 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001122 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001123 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001124 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1125 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001126 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001127
Reid Spencer46f9c942007-03-02 22:39:11 +00001128 // If all the bits were shifted out, the result is, technically, undefined.
1129 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1130 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001131 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001132 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001133 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001134 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001135 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001136 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001137
1138 // Create some space for the result.
1139 uint64_t * val = new uint64_t[getNumWords()];
1140
Reid Spencer46f9c942007-03-02 22:39:11 +00001141 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001142 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1143 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1144 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1145 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001146 if (bitsInWord == 0)
1147 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001148
1149 // If we are shifting whole words, just move whole words
1150 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001151 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001152 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001153 val[i] = pVal[i+offset]; // move whole word
1154
1155 // Adjust the top significant word for sign bit fill, if negative
1156 if (isNegative())
1157 if (bitsInWord < APINT_BITS_PER_WORD)
1158 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1159 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001160 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001161 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001162 // This combines the shifted corresponding word with the low bits from
1163 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001164 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001165 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1166 }
1167
1168 // Shift the break word. In this case there are no bits from the next word
1169 // to include in this word.
1170 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1171
1172 // Deal with sign extenstion in the break word, and possibly the word before
1173 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001174 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001175 if (wordShift > bitsInWord) {
1176 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001177 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001178 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1179 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001180 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001181 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001182 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001183 }
1184
Reid Spencer46f9c942007-03-02 22:39:11 +00001185 // Remaining words are 0 or -1, just assign them.
1186 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001187 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001188 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001189 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001190}
1191
Zhou Shengff4304f2007-02-09 07:48:24 +00001192/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001193/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001194APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001195 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001196}
1197
1198/// Logical right-shift this APInt by shiftAmt.
1199/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001200APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001201 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001202 if (shiftAmt == BitWidth)
1203 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001204 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001205 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001206 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001207
Reid Spencerba81c2b2007-02-26 01:19:48 +00001208 // If all the bits were shifted out, the result is 0. This avoids issues
1209 // with shifting by the size of the integer type, which produces undefined
1210 // results. We define these "undefined results" to always be 0.
1211 if (shiftAmt == BitWidth)
1212 return APInt(BitWidth, 0);
1213
Reid Spencer02ae8b72007-05-17 06:26:29 +00001214 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001215 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001216 // undefined results in the code below. This is also an optimization.
1217 if (shiftAmt == 0)
1218 return *this;
1219
Reid Spencerba81c2b2007-02-26 01:19:48 +00001220 // Create some space for the result.
1221 uint64_t * val = new uint64_t[getNumWords()];
1222
1223 // If we are shifting less than a word, compute the shift with a simple carry
1224 if (shiftAmt < APINT_BITS_PER_WORD) {
1225 uint64_t carry = 0;
1226 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001227 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001228 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1229 }
1230 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001231 }
1232
Reid Spencerba81c2b2007-02-26 01:19:48 +00001233 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001234 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1235 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001236
1237 // If we are shifting whole words, just move whole words
1238 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001239 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001240 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001241 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001242 val[i] = 0;
1243 return APInt(val,BitWidth).clearUnusedBits();
1244 }
1245
Eric Christopherd37eda82009-08-21 04:06:45 +00001246 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001247 unsigned breakWord = getNumWords() - offset -1;
1248 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001249 val[i] = (pVal[i+offset] >> wordShift) |
1250 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001251 // Shift the break word.
1252 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1253
1254 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001255 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001256 val[i] = 0;
1257 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001258}
1259
Zhou Shengff4304f2007-02-09 07:48:24 +00001260/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001261/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001262APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001263 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001264 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001265}
1266
Chris Lattner455e9ab2009-01-21 18:09:24 +00001267APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001268 // If all the bits were shifted out, the result is 0. This avoids issues
1269 // with shifting by the size of the integer type, which produces undefined
1270 // results. We define these "undefined results" to always be 0.
1271 if (shiftAmt == BitWidth)
1272 return APInt(BitWidth, 0);
1273
Reid Spencer92c72832007-05-12 18:01:57 +00001274 // If none of the bits are shifted out, the result is *this. This avoids a
1275 // lshr by the words size in the loop below which can produce incorrect
1276 // results. It also avoids the expensive computation below for a common case.
1277 if (shiftAmt == 0)
1278 return *this;
1279
Reid Spencer87553802007-02-25 00:56:44 +00001280 // Create some space for the result.
1281 uint64_t * val = new uint64_t[getNumWords()];
1282
1283 // If we are shifting less than a word, do it the easy way
1284 if (shiftAmt < APINT_BITS_PER_WORD) {
1285 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001286 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001287 val[i] = pVal[i] << shiftAmt | carry;
1288 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1289 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001290 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001291 }
1292
Reid Spencer87553802007-02-25 00:56:44 +00001293 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001294 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1295 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001296
1297 // If we are shifting whole words, just move whole words
1298 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001299 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001300 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001301 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001302 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001303 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001304 }
Reid Spencer87553802007-02-25 00:56:44 +00001305
1306 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001307 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001308 for (; i > offset; --i)
1309 val[i] = pVal[i-offset] << wordShift |
1310 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001311 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001312 for (i = 0; i < offset; ++i)
1313 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001314 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001315}
1316
Dan Gohmancf609572008-02-29 01:40:47 +00001317APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001318 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001319}
1320
Chris Lattner455e9ab2009-01-21 18:09:24 +00001321APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001322 if (rotateAmt == 0)
1323 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001324 // Don't get too fancy, just use existing shift/or facilities
1325 APInt hi(*this);
1326 APInt lo(*this);
1327 hi.shl(rotateAmt);
1328 lo.lshr(BitWidth - rotateAmt);
1329 return hi | lo;
1330}
1331
Dan Gohmancf609572008-02-29 01:40:47 +00001332APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001333 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001334}
1335
Chris Lattner455e9ab2009-01-21 18:09:24 +00001336APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001337 if (rotateAmt == 0)
1338 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001339 // Don't get too fancy, just use existing shift/or facilities
1340 APInt hi(*this);
1341 APInt lo(*this);
1342 lo.lshr(rotateAmt);
1343 hi.shl(BitWidth - rotateAmt);
1344 return hi | lo;
1345}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001346
1347// Square Root - this method computes and returns the square root of "this".
1348// Three mechanisms are used for computation. For small values (<= 5 bits),
1349// a table lookup is done. This gets some performance for common cases. For
1350// values using less than 52 bits, the value is converted to double and then
1351// the libc sqrt function is called. The result is rounded and then converted
1352// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001353// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001354APInt APInt::sqrt() const {
1355
1356 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001357 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001358
1359 // Use a fast table for some small values. This also gets rid of some
1360 // rounding errors in libc sqrt for small values.
1361 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001362 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001363 /* 0 */ 0,
1364 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001365 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001366 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1367 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1368 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1369 /* 31 */ 6
1370 };
1371 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001372 }
1373
1374 // If the magnitude of the value fits in less than 52 bits (the precision of
1375 // an IEEE double precision floating point value), then we can use the
1376 // libc sqrt function which will probably use a hardware sqrt computation.
1377 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001378 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001379#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001380 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001381 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001382#else
1383 return APInt(BitWidth,
1384 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
Jeff Cohenca5183d2007-03-05 00:00:42 +00001385#endif
1386 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001387
1388 // Okay, all the short cuts are exhausted. We must compute it. The following
1389 // is a classical Babylonian method for computing the square root. This code
1390 // was adapted to APINt from a wikipedia article on such computations.
1391 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001392 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001393 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001394 APInt testy(BitWidth, 16);
1395 APInt x_old(BitWidth, 1);
1396 APInt x_new(BitWidth, 0);
1397 APInt two(BitWidth, 2);
1398
1399 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001400 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001401 if (i >= nbits || this->ule(testy)) {
1402 x_old = x_old.shl(i / 2);
1403 break;
1404 }
1405
Eric Christopherd37eda82009-08-21 04:06:45 +00001406 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001407 for (;;) {
1408 x_new = (this->udiv(x_old) + x_old).udiv(two);
1409 if (x_old.ule(x_new))
1410 break;
1411 x_old = x_new;
1412 }
1413
1414 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001415 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001416 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001417 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001418 // floating point representation after 192 bits. There are no discrepancies
1419 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001420 APInt square(x_old * x_old);
1421 APInt nextSquare((x_old + 1) * (x_old +1));
1422 if (this->ult(square))
1423 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001424 else if (this->ule(nextSquare)) {
1425 APInt midpoint((nextSquare - square).udiv(two));
1426 APInt offset(*this - square);
1427 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001428 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001429 else
1430 return x_old + 1;
1431 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001432 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001433 return x_old + 1;
1434}
1435
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001436/// Computes the multiplicative inverse of this APInt for a given modulo. The
1437/// iterative extended Euclidean algorithm is used to solve for this value,
1438/// however we simplify it to speed up calculating only the inverse, and take
1439/// advantage of div+rem calculations. We also use some tricks to avoid copying
1440/// (potentially large) APInts around.
1441APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1442 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1443
1444 // Using the properties listed at the following web page (accessed 06/21/08):
1445 // http://www.numbertheory.org/php/euclid.html
1446 // (especially the properties numbered 3, 4 and 9) it can be proved that
1447 // BitWidth bits suffice for all the computations in the algorithm implemented
1448 // below. More precisely, this number of bits suffice if the multiplicative
1449 // inverse exists, but may not suffice for the general extended Euclidean
1450 // algorithm.
1451
1452 APInt r[2] = { modulo, *this };
1453 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1454 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001455
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001456 unsigned i;
1457 for (i = 0; r[i^1] != 0; i ^= 1) {
1458 // An overview of the math without the confusing bit-flipping:
1459 // q = r[i-2] / r[i-1]
1460 // r[i] = r[i-2] % r[i-1]
1461 // t[i] = t[i-2] - t[i-1] * q
1462 udivrem(r[i], r[i^1], q, r[i]);
1463 t[i] -= t[i^1] * q;
1464 }
1465
1466 // If this APInt and the modulo are not coprime, there is no multiplicative
1467 // inverse, so return 0. We check this by looking at the next-to-last
1468 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1469 // algorithm.
1470 if (r[i] != 1)
1471 return APInt(BitWidth, 0);
1472
1473 // The next-to-last t is the multiplicative inverse. However, we are
1474 // interested in a positive inverse. Calcuate a positive one from a negative
1475 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001476 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001477 return t[i].isNegative() ? t[i] + modulo : t[i];
1478}
1479
Jay Foad4e5ea552009-04-30 10:15:35 +00001480/// Calculate the magic numbers required to implement a signed integer division
1481/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1482/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1483/// Warren, Jr., chapter 10.
1484APInt::ms APInt::magic() const {
1485 const APInt& d = *this;
1486 unsigned p;
1487 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001488 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001489 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001490
Jay Foad4e5ea552009-04-30 10:15:35 +00001491 ad = d.abs();
1492 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1493 anc = t - 1 - t.urem(ad); // absolute value of nc
1494 p = d.getBitWidth() - 1; // initialize p
1495 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1496 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1497 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1498 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1499 do {
1500 p = p + 1;
1501 q1 = q1<<1; // update q1 = 2p/abs(nc)
1502 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1503 if (r1.uge(anc)) { // must be unsigned comparison
1504 q1 = q1 + 1;
1505 r1 = r1 - anc;
1506 }
1507 q2 = q2<<1; // update q2 = 2p/abs(d)
1508 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1509 if (r2.uge(ad)) { // must be unsigned comparison
1510 q2 = q2 + 1;
1511 r2 = r2 - ad;
1512 }
1513 delta = ad - r2;
1514 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001515
Jay Foad4e5ea552009-04-30 10:15:35 +00001516 mag.m = q2 + 1;
1517 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1518 mag.s = p - d.getBitWidth(); // resulting shift
1519 return mag;
1520}
1521
1522/// Calculate the magic numbers required to implement an unsigned integer
1523/// division by a constant as a sequence of multiplies, adds and shifts.
1524/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1525/// S. Warren, Jr., chapter 10.
1526APInt::mu APInt::magicu() const {
1527 const APInt& d = *this;
1528 unsigned p;
1529 APInt nc, delta, q1, r1, q2, r2;
1530 struct mu magu;
1531 magu.a = 0; // initialize "add" indicator
1532 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1533 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1534 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1535
1536 nc = allOnes - (-d).urem(d);
1537 p = d.getBitWidth() - 1; // initialize p
1538 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1539 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1540 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1541 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1542 do {
1543 p = p + 1;
1544 if (r1.uge(nc - r1)) {
1545 q1 = q1 + q1 + 1; // update q1
1546 r1 = r1 + r1 - nc; // update r1
1547 }
1548 else {
1549 q1 = q1+q1; // update q1
1550 r1 = r1+r1; // update r1
1551 }
1552 if ((r2 + 1).uge(d - r2)) {
1553 if (q2.uge(signedMax)) magu.a = 1;
1554 q2 = q2+q2 + 1; // update q2
1555 r2 = r2+r2 + 1 - d; // update r2
1556 }
1557 else {
1558 if (q2.uge(signedMin)) magu.a = 1;
1559 q2 = q2+q2; // update q2
1560 r2 = r2+r2 + 1; // update r2
1561 }
1562 delta = d - 1 - r2;
1563 } while (p < d.getBitWidth()*2 &&
1564 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1565 magu.m = q2 + 1; // resulting magic number
1566 magu.s = p - d.getBitWidth(); // resulting shift
1567 return magu;
1568}
1569
Reid Spencer9c0696f2007-02-20 08:51:03 +00001570/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1571/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1572/// variables here have the same names as in the algorithm. Comments explain
1573/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001574static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1575 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001576 assert(u && "Must provide dividend");
1577 assert(v && "Must provide divisor");
1578 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001579 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001580 assert(n>1 && "n must be > 1");
1581
1582 // Knuth uses the value b as the base of the number system. In our case b
1583 // is 2^31 so we just set it to -1u.
1584 uint64_t b = uint64_t(1) << 32;
1585
Chris Lattnerfad86b02008-08-17 07:19:36 +00001586#if 0
David Greene465abed2010-01-05 01:28:52 +00001587 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1588 DEBUG(dbgs() << "KnuthDiv: original:");
1589 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1590 DEBUG(dbgs() << " by");
1591 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1592 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001593#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001594 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1595 // u and v by d. Note that we have taken Knuth's advice here to use a power
1596 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1597 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001598 // shift amount from the leading zeros. We are basically normalizing the u
1599 // and v so that its high bits are shifted to the top of v's range without
1600 // overflow. Note that this can require an extra word in u so that u must
1601 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001602 unsigned shift = CountLeadingZeros_32(v[n-1]);
1603 unsigned v_carry = 0;
1604 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001605 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001606 for (unsigned i = 0; i < m+n; ++i) {
1607 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001608 u[i] = (u[i] << shift) | u_carry;
1609 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001610 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001611 for (unsigned i = 0; i < n; ++i) {
1612 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001613 v[i] = (v[i] << shift) | v_carry;
1614 v_carry = v_tmp;
1615 }
1616 }
1617 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001618#if 0
David Greene465abed2010-01-05 01:28:52 +00001619 DEBUG(dbgs() << "KnuthDiv: normal:");
1620 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1621 DEBUG(dbgs() << " by");
1622 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1623 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001624#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001625
1626 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1627 int j = m;
1628 do {
David Greene465abed2010-01-05 01:28:52 +00001629 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001630 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001631 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1632 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1633 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1634 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1635 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001636 // value qp is one too large, and it eliminates all cases where qp is two
1637 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001638 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001639 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001640 uint64_t qp = dividend / v[n-1];
1641 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001642 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1643 qp--;
1644 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001645 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001646 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001647 }
David Greene465abed2010-01-05 01:28:52 +00001648 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001649
Reid Spencer92904632007-02-23 01:57:13 +00001650 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1651 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1652 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001653 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001654 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001655 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001656 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001657 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001658 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001659 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001660 << ", subtrahend == " << subtrahend
1661 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001662
Reid Spencer610fad82007-02-24 10:01:42 +00001663 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001664 unsigned k = j + i;
1665 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1666 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001667 while (borrow && k <= m+n) { // deal with borrow to the left
1668 borrow = u[k] == 0;
1669 u[k]--;
1670 k++;
1671 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001672 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001673 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001674 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001675 }
David Greene465abed2010-01-05 01:28:52 +00001676 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1677 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1678 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001679 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1680 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001681 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001682 // the true value, and a "borrow" to the left should be remembered.
1683 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001684 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001685 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001686 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001687 u[i] = ~u[i] + carry; // b's complement
1688 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001689 }
Reid Spencer92904632007-02-23 01:57:13 +00001690 }
David Greene465abed2010-01-05 01:28:52 +00001691 DEBUG(dbgs() << "KnuthDiv: after complement:");
1692 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1693 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001694
Eric Christopherd37eda82009-08-21 04:06:45 +00001695 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001696 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001697 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001698 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001699 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001700 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001701 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001702 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001703 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1704 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001705 // since it cancels with the borrow that occurred in D4.
1706 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001707 for (unsigned i = 0; i < n; i++) {
1708 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001709 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001710 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001711 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001712 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001713 }
David Greene465abed2010-01-05 01:28:52 +00001714 DEBUG(dbgs() << "KnuthDiv: after correction:");
1715 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1716 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001717
Reid Spencer92904632007-02-23 01:57:13 +00001718 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1719 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001720
David Greene465abed2010-01-05 01:28:52 +00001721 DEBUG(dbgs() << "KnuthDiv: quotient:");
1722 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1723 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001724
Reid Spencer9c0696f2007-02-20 08:51:03 +00001725 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1726 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1727 // compute the remainder (urem uses this).
1728 if (r) {
1729 // The value d is expressed by the "shift" value above since we avoided
1730 // multiplication by d by using a shift left. So, all we have to do is
1731 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001732 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001733 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001734 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001735 for (int i = n-1; i >= 0; i--) {
1736 r[i] = (u[i] >> shift) | carry;
1737 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001738 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001739 }
1740 } else {
1741 for (int i = n-1; i >= 0; i--) {
1742 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001743 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001744 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001745 }
David Greene465abed2010-01-05 01:28:52 +00001746 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001747 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001748#if 0
David Greene465abed2010-01-05 01:28:52 +00001749 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001750#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001751}
1752
Chris Lattner455e9ab2009-01-21 18:09:24 +00001753void APInt::divide(const APInt LHS, unsigned lhsWords,
1754 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001755 APInt *Quotient, APInt *Remainder)
1756{
1757 assert(lhsWords >= rhsWords && "Fractional result");
1758
Eric Christopherd37eda82009-08-21 04:06:45 +00001759 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001760 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001761 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001762 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1763 // can't use 64-bit operands here because we don't have native results of
1764 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001765 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001766 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001767 unsigned n = rhsWords * 2;
1768 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001769
1770 // Allocate space for the temporary values we need either on the stack, if
1771 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001772 unsigned SPACE[128];
1773 unsigned *U = 0;
1774 unsigned *V = 0;
1775 unsigned *Q = 0;
1776 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001777 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1778 U = &SPACE[0];
1779 V = &SPACE[m+n+1];
1780 Q = &SPACE[(m+n+1) + n];
1781 if (Remainder)
1782 R = &SPACE[(m+n+1) + n + (m+n)];
1783 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001784 U = new unsigned[m + n + 1];
1785 V = new unsigned[n];
1786 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001787 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001788 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001789 }
1790
1791 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001792 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001793 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001794 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001795 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001796 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001797 }
1798 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1799
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001800 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001801 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001802 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001803 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001804 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001805 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 }
1807
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001808 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001809 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001810 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001811 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001812
Eric Christopherd37eda82009-08-21 04:06:45 +00001813 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001814 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001815 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001816 // contain any zero words or the Knuth algorithm fails.
1817 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1818 n--;
1819 m++;
1820 }
1821 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1822 m--;
1823
1824 // If we're left with only a single word for the divisor, Knuth doesn't work
1825 // so we implement the short division algorithm here. This is much simpler
1826 // and faster because we are certain that we can divide a 64-bit quantity
1827 // by a 32-bit quantity at hardware speed and short division is simply a
1828 // series of such operations. This is just like doing short division but we
1829 // are using base 2^32 instead of base 10.
1830 assert(n != 0 && "Divide by zero?");
1831 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001832 unsigned divisor = V[0];
1833 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001834 for (int i = m+n-1; i >= 0; i--) {
1835 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1836 if (partial_dividend == 0) {
1837 Q[i] = 0;
1838 remainder = 0;
1839 } else if (partial_dividend < divisor) {
1840 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001841 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001842 } else if (partial_dividend == divisor) {
1843 Q[i] = 1;
1844 remainder = 0;
1845 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001846 Q[i] = (unsigned)(partial_dividend / divisor);
1847 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001848 }
1849 }
1850 if (R)
1851 R[0] = remainder;
1852 } else {
1853 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1854 // case n > 1.
1855 KnuthDiv(U, V, Q, R, m, n);
1856 }
1857
1858 // If the caller wants the quotient
1859 if (Quotient) {
1860 // Set up the Quotient value's memory.
1861 if (Quotient->BitWidth != LHS.BitWidth) {
1862 if (Quotient->isSingleWord())
1863 Quotient->VAL = 0;
1864 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001865 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001866 Quotient->BitWidth = LHS.BitWidth;
1867 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001868 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001869 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001870 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001871
Eric Christopherd37eda82009-08-21 04:06:45 +00001872 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001873 // order words.
1874 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001875 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001876 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1877 if (Quotient->isSingleWord())
1878 Quotient->VAL = tmp;
1879 else
1880 Quotient->pVal[0] = tmp;
1881 } else {
1882 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1883 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001884 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001885 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1886 }
1887 }
1888
1889 // If the caller wants the remainder
1890 if (Remainder) {
1891 // Set up the Remainder value's memory.
1892 if (Remainder->BitWidth != RHS.BitWidth) {
1893 if (Remainder->isSingleWord())
1894 Remainder->VAL = 0;
1895 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001896 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001897 Remainder->BitWidth = RHS.BitWidth;
1898 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001899 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001900 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001901 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001902
1903 // The remainder is in R. Reconstitute the remainder into Remainder's low
1904 // order words.
1905 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001906 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001907 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1908 if (Remainder->isSingleWord())
1909 Remainder->VAL = tmp;
1910 else
1911 Remainder->pVal[0] = tmp;
1912 } else {
1913 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1914 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001915 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001916 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1917 }
1918 }
1919
1920 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001921 if (U != &SPACE[0]) {
1922 delete [] U;
1923 delete [] V;
1924 delete [] Q;
1925 delete [] R;
1926 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001927}
1928
Reid Spencere81d2da2007-02-16 22:36:51 +00001929APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001930 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001931
1932 // First, deal with the easy case
1933 if (isSingleWord()) {
1934 assert(RHS.VAL != 0 && "Divide by zero?");
1935 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001936 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001937
Reid Spencer71bd08f2007-02-17 02:07:07 +00001938 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001939 unsigned rhsBits = RHS.getActiveBits();
1940 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001941 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001942 unsigned lhsBits = this->getActiveBits();
1943 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001944
1945 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001946 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001947 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001948 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001949 else if (lhsWords < rhsWords || this->ult(RHS)) {
1950 // X / Y ===> 0, iff X < Y
1951 return APInt(BitWidth, 0);
1952 } else if (*this == RHS) {
1953 // X / X ===> 1
1954 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001955 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001956 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001957 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001958 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001959
1960 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1961 APInt Quotient(1,0); // to hold result.
1962 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1963 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001964}
1965
Reid Spencere81d2da2007-02-16 22:36:51 +00001966APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001967 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001968 if (isSingleWord()) {
1969 assert(RHS.VAL != 0 && "Remainder by zero?");
1970 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001971 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001972
Reid Spencere0cdd332007-02-21 08:21:52 +00001973 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001974 unsigned lhsBits = getActiveBits();
1975 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001976
1977 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001978 unsigned rhsBits = RHS.getActiveBits();
1979 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001980 assert(rhsWords && "Performing remainder operation by zero ???");
1981
Reid Spencer71bd08f2007-02-17 02:07:07 +00001982 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001983 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001984 // 0 % Y ===> 0
1985 return APInt(BitWidth, 0);
1986 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1987 // X % Y ===> X, iff X < Y
1988 return *this;
1989 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001990 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001991 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001992 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001993 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001994 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001995 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001996
Reid Spencer19dc32a2007-05-13 23:44:59 +00001997 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001998 APInt Remainder(1,0);
1999 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2000 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002001}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002002
Eric Christopherd37eda82009-08-21 04:06:45 +00002003void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002004 APInt &Quotient, APInt &Remainder) {
2005 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002006 unsigned lhsBits = LHS.getActiveBits();
2007 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2008 unsigned rhsBits = RHS.getActiveBits();
2009 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002010
2011 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002012 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002013 Quotient = 0; // 0 / Y ===> 0
2014 Remainder = 0; // 0 % Y ===> 0
2015 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002016 }
2017
2018 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002019 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002020 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002021 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002022 }
2023
Reid Spencer19dc32a2007-05-13 23:44:59 +00002024 if (LHS == RHS) {
2025 Quotient = 1; // X / X ===> 1
2026 Remainder = 0; // X % X ===> 0;
2027 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002028 }
2029
Reid Spencer19dc32a2007-05-13 23:44:59 +00002030 if (lhsWords == 1 && rhsWords == 1) {
2031 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002032 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2033 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2034 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2035 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002036 return;
2037 }
2038
2039 // Okay, lets do it the long way
2040 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2041}
2042
Chris Lattner0a0a5852010-10-13 23:54:10 +00002043APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002044 APInt Res = *this+RHS;
2045 Overflow = isNonNegative() == RHS.isNonNegative() &&
2046 Res.isNonNegative() != isNonNegative();
2047 return Res;
2048}
2049
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002050APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2051 APInt Res = *this+RHS;
2052 Overflow = Res.ult(RHS);
2053 return Res;
2054}
2055
Chris Lattner0a0a5852010-10-13 23:54:10 +00002056APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002057 APInt Res = *this - RHS;
2058 Overflow = isNonNegative() != RHS.isNonNegative() &&
2059 Res.isNonNegative() != isNonNegative();
2060 return Res;
2061}
2062
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002063APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002064 APInt Res = *this-RHS;
2065 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002066 return Res;
2067}
2068
Chris Lattner0a0a5852010-10-13 23:54:10 +00002069APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002070 // MININT/-1 --> overflow.
2071 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2072 return sdiv(RHS);
2073}
2074
Chris Lattner0a0a5852010-10-13 23:54:10 +00002075APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002076 APInt Res = *this * RHS;
2077
2078 if (*this != 0 && RHS != 0)
2079 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2080 else
2081 Overflow = false;
2082 return Res;
2083}
2084
Chris Lattner0a0a5852010-10-13 23:54:10 +00002085APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002086 Overflow = ShAmt >= getBitWidth();
2087 if (Overflow)
2088 ShAmt = getBitWidth()-1;
2089
2090 if (isNonNegative()) // Don't allow sign change.
2091 Overflow = ShAmt >= countLeadingZeros();
2092 else
2093 Overflow = ShAmt >= countLeadingOnes();
2094
2095 return *this << ShAmt;
2096}
2097
2098
2099
2100
Benjamin Kramer38e59892010-07-14 22:38:02 +00002101void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002102 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002103 assert(!str.empty() && "Invalid string length");
Reid Spencer5e0a8512007-02-17 03:16:00 +00002104 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2105 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002106
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002107 StringRef::iterator p = str.begin();
2108 size_t slen = str.size();
2109 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002110 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002111 p++;
2112 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002113 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002114 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002115 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002116 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2117 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002118 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2119 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002120
2121 // Allocate memory
2122 if (!isSingleWord())
2123 pVal = getClearedMemory(getNumWords());
2124
2125 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002126 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002127
2128 // Set up an APInt for the digit to add outside the loop so we don't
2129 // constantly construct/destruct it.
2130 APInt apdigit(getBitWidth(), 0);
2131 APInt apradix(getBitWidth(), radix);
2132
2133 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002134 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002135 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002136 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002137
Reid Spencer6551dcd2007-05-16 19:18:22 +00002138 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002139 if (slen > 1) {
2140 if (shift)
2141 *this <<= shift;
2142 else
2143 *this *= apradix;
2144 }
Reid Spencer385f7542007-02-21 03:55:44 +00002145
2146 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002147 if (apdigit.isSingleWord())
2148 apdigit.VAL = digit;
2149 else
2150 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002151 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002152 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002153 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002154 if (isNeg) {
2155 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002156 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002157 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002158}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002159
Chris Lattnerfad86b02008-08-17 07:19:36 +00002160void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2161 bool Signed) const {
2162 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002163 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002164
Chris Lattnerfad86b02008-08-17 07:19:36 +00002165 // First, check for a zero value and just short circuit the logic below.
2166 if (*this == 0) {
2167 Str.push_back('0');
2168 return;
2169 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002170
Chris Lattnerfad86b02008-08-17 07:19:36 +00002171 static const char Digits[] = "0123456789ABCDEF";
Eric Christopherd37eda82009-08-21 04:06:45 +00002172
Reid Spencer9c0696f2007-02-20 08:51:03 +00002173 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002174 char Buffer[65];
2175 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002176
Chris Lattnerfad86b02008-08-17 07:19:36 +00002177 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002178 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002179 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002180 } else {
2181 int64_t I = getSExtValue();
2182 if (I >= 0) {
2183 N = I;
2184 } else {
2185 Str.push_back('-');
2186 N = -(uint64_t)I;
2187 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002188 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002189
Chris Lattnerfad86b02008-08-17 07:19:36 +00002190 while (N) {
2191 *--BufPtr = Digits[N % Radix];
2192 N /= Radix;
2193 }
2194 Str.append(BufPtr, Buffer+65);
2195 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002196 }
2197
Chris Lattnerfad86b02008-08-17 07:19:36 +00002198 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002199
Chris Lattnerfad86b02008-08-17 07:19:36 +00002200 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002201 // They want to print the signed version and it is a negative value
2202 // Flip the bits and add one to turn it into the equivalent positive
2203 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002204 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002205 Tmp++;
2206 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002207 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002208
Chris Lattnerfad86b02008-08-17 07:19:36 +00002209 // We insert the digits backward, then reverse them to get the right order.
2210 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002211
2212 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2213 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002214 // equaly. We just shift until the value is zero.
2215 if (Radix != 10) {
2216 // Just shift tmp right for each digit width until it becomes zero
2217 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2218 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002219
Chris Lattnerfad86b02008-08-17 07:19:36 +00002220 while (Tmp != 0) {
2221 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2222 Str.push_back(Digits[Digit]);
2223 Tmp = Tmp.lshr(ShiftAmt);
2224 }
2225 } else {
2226 APInt divisor(4, 10);
2227 while (Tmp != 0) {
2228 APInt APdigit(1, 0);
2229 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002230 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002231 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002232 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002233 assert(Digit < Radix && "divide failed");
2234 Str.push_back(Digits[Digit]);
2235 Tmp = tmp2;
2236 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002237 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002238
Chris Lattnerfad86b02008-08-17 07:19:36 +00002239 // Reverse the digits before returning.
2240 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002241}
2242
Chris Lattnerfad86b02008-08-17 07:19:36 +00002243/// toString - This returns the APInt as a std::string. Note that this is an
2244/// inefficient method. It is better to pass in a SmallVector/SmallString
2245/// to the methods above.
2246std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2247 SmallString<40> S;
2248 toString(S, Radix, Signed);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002249 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002250}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002251
Chris Lattnerfad86b02008-08-17 07:19:36 +00002252
2253void APInt::dump() const {
2254 SmallString<40> S, U;
2255 this->toStringUnsigned(U);
2256 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002257 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002258 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002259}
2260
Chris Lattner944fac72008-08-23 22:23:09 +00002261void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002262 SmallString<40> S;
2263 this->toString(S, 10, isSigned);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002264 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002265}
2266
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002267// This implements a variety of operations on a representation of
2268// arbitrary precision, two's-complement, bignum integer values.
2269
Chris Lattner91021d32009-08-23 23:11:28 +00002270// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2271// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002272#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002273COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002274
2275/* Some handy functions local to this file. */
2276namespace {
2277
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002278 /* Returns the integer part with the least significant BITS set.
2279 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002280 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002281 lowBitMask(unsigned int bits)
2282 {
Dan Gohman16e02092010-03-24 19:38:02 +00002283 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002284
2285 return ~(integerPart) 0 >> (integerPartWidth - bits);
2286 }
2287
Neil Booth055c0b32007-10-06 00:43:45 +00002288 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002289 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002290 lowHalf(integerPart part)
2291 {
2292 return part & lowBitMask(integerPartWidth / 2);
2293 }
2294
Neil Booth055c0b32007-10-06 00:43:45 +00002295 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002296 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002297 highHalf(integerPart part)
2298 {
2299 return part >> (integerPartWidth / 2);
2300 }
2301
Neil Booth055c0b32007-10-06 00:43:45 +00002302 /* Returns the bit number of the most significant set bit of a part.
2303 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002304 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002305 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002306 {
2307 unsigned int n, msb;
2308
2309 if (value == 0)
2310 return -1U;
2311
2312 n = integerPartWidth / 2;
2313
2314 msb = 0;
2315 do {
2316 if (value >> n) {
2317 value >>= n;
2318 msb += n;
2319 }
2320
2321 n >>= 1;
2322 } while (n);
2323
2324 return msb;
2325 }
2326
Neil Booth055c0b32007-10-06 00:43:45 +00002327 /* Returns the bit number of the least significant set bit of a
2328 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002329 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002330 partLSB(integerPart value)
2331 {
2332 unsigned int n, lsb;
2333
2334 if (value == 0)
2335 return -1U;
2336
2337 lsb = integerPartWidth - 1;
2338 n = integerPartWidth / 2;
2339
2340 do {
2341 if (value << n) {
2342 value <<= n;
2343 lsb -= n;
2344 }
2345
2346 n >>= 1;
2347 } while (n);
2348
2349 return lsb;
2350 }
2351}
2352
2353/* Sets the least significant part of a bignum to the input value, and
2354 zeroes out higher parts. */
2355void
2356APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2357{
2358 unsigned int i;
2359
Dan Gohman16e02092010-03-24 19:38:02 +00002360 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002361
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002362 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002363 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002364 dst[i] = 0;
2365}
2366
2367/* Assign one bignum to another. */
2368void
2369APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2370{
2371 unsigned int i;
2372
Dan Gohman16e02092010-03-24 19:38:02 +00002373 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002374 dst[i] = src[i];
2375}
2376
2377/* Returns true if a bignum is zero, false otherwise. */
2378bool
2379APInt::tcIsZero(const integerPart *src, unsigned int parts)
2380{
2381 unsigned int i;
2382
Dan Gohman16e02092010-03-24 19:38:02 +00002383 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002384 if (src[i])
2385 return false;
2386
2387 return true;
2388}
2389
2390/* Extract the given bit of a bignum; returns 0 or 1. */
2391int
2392APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2393{
Dan Gohman16e02092010-03-24 19:38:02 +00002394 return (parts[bit / integerPartWidth] &
2395 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002396}
2397
John McCalle12b7382010-02-28 02:51:25 +00002398/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002399void
2400APInt::tcSetBit(integerPart *parts, unsigned int bit)
2401{
2402 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2403}
2404
John McCalle12b7382010-02-28 02:51:25 +00002405/* Clears the given bit of a bignum. */
2406void
2407APInt::tcClearBit(integerPart *parts, unsigned int bit)
2408{
2409 parts[bit / integerPartWidth] &=
2410 ~((integerPart) 1 << (bit % integerPartWidth));
2411}
2412
Neil Booth055c0b32007-10-06 00:43:45 +00002413/* Returns the bit number of the least significant set bit of a
2414 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002415unsigned int
2416APInt::tcLSB(const integerPart *parts, unsigned int n)
2417{
2418 unsigned int i, lsb;
2419
Dan Gohman16e02092010-03-24 19:38:02 +00002420 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002421 if (parts[i] != 0) {
2422 lsb = partLSB(parts[i]);
2423
2424 return lsb + i * integerPartWidth;
2425 }
2426 }
2427
2428 return -1U;
2429}
2430
Neil Booth055c0b32007-10-06 00:43:45 +00002431/* Returns the bit number of the most significant set bit of a number.
2432 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002433unsigned int
2434APInt::tcMSB(const integerPart *parts, unsigned int n)
2435{
2436 unsigned int msb;
2437
2438 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002439 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002440
Dan Gohman16e02092010-03-24 19:38:02 +00002441 if (parts[n] != 0) {
2442 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002443
Dan Gohman16e02092010-03-24 19:38:02 +00002444 return msb + n * integerPartWidth;
2445 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002446 } while (n);
2447
2448 return -1U;
2449}
2450
Neil Booth68e53ad2007-10-08 13:47:12 +00002451/* Copy the bit vector of width srcBITS from SRC, starting at bit
2452 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2453 the least significant bit of DST. All high bits above srcBITS in
2454 DST are zero-filled. */
2455void
Evan Chengcf69a742009-05-21 23:47:47 +00002456APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002457 unsigned int srcBits, unsigned int srcLSB)
2458{
2459 unsigned int firstSrcPart, dstParts, shift, n;
2460
2461 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002462 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002463
2464 firstSrcPart = srcLSB / integerPartWidth;
2465 tcAssign (dst, src + firstSrcPart, dstParts);
2466
2467 shift = srcLSB % integerPartWidth;
2468 tcShiftRight (dst, dstParts, shift);
2469
2470 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2471 in DST. If this is less that srcBits, append the rest, else
2472 clear the high bits. */
2473 n = dstParts * integerPartWidth - shift;
2474 if (n < srcBits) {
2475 integerPart mask = lowBitMask (srcBits - n);
2476 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2477 << n % integerPartWidth);
2478 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002479 if (srcBits % integerPartWidth)
2480 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002481 }
2482
2483 /* Clear high parts. */
2484 while (dstParts < dstCount)
2485 dst[dstParts++] = 0;
2486}
2487
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002488/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2489integerPart
2490APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2491 integerPart c, unsigned int parts)
2492{
2493 unsigned int i;
2494
2495 assert(c <= 1);
2496
Dan Gohman16e02092010-03-24 19:38:02 +00002497 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002498 integerPart l;
2499
2500 l = dst[i];
2501 if (c) {
2502 dst[i] += rhs[i] + 1;
2503 c = (dst[i] <= l);
2504 } else {
2505 dst[i] += rhs[i];
2506 c = (dst[i] < l);
2507 }
2508 }
2509
2510 return c;
2511}
2512
2513/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2514integerPart
2515APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2516 integerPart c, unsigned int parts)
2517{
2518 unsigned int i;
2519
2520 assert(c <= 1);
2521
Dan Gohman16e02092010-03-24 19:38:02 +00002522 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002523 integerPart l;
2524
2525 l = dst[i];
2526 if (c) {
2527 dst[i] -= rhs[i] + 1;
2528 c = (dst[i] >= l);
2529 } else {
2530 dst[i] -= rhs[i];
2531 c = (dst[i] > l);
2532 }
2533 }
2534
2535 return c;
2536}
2537
2538/* Negate a bignum in-place. */
2539void
2540APInt::tcNegate(integerPart *dst, unsigned int parts)
2541{
2542 tcComplement(dst, parts);
2543 tcIncrement(dst, parts);
2544}
2545
Neil Booth055c0b32007-10-06 00:43:45 +00002546/* DST += SRC * MULTIPLIER + CARRY if add is true
2547 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002548
2549 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2550 they must start at the same point, i.e. DST == SRC.
2551
2552 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2553 returned. Otherwise DST is filled with the least significant
2554 DSTPARTS parts of the result, and if all of the omitted higher
2555 parts were zero return zero, otherwise overflow occurred and
2556 return one. */
2557int
2558APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2559 integerPart multiplier, integerPart carry,
2560 unsigned int srcParts, unsigned int dstParts,
2561 bool add)
2562{
2563 unsigned int i, n;
2564
2565 /* Otherwise our writes of DST kill our later reads of SRC. */
2566 assert(dst <= src || dst >= src + srcParts);
2567 assert(dstParts <= srcParts + 1);
2568
2569 /* N loops; minimum of dstParts and srcParts. */
2570 n = dstParts < srcParts ? dstParts: srcParts;
2571
Dan Gohman16e02092010-03-24 19:38:02 +00002572 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002573 integerPart low, mid, high, srcPart;
2574
2575 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2576
2577 This cannot overflow, because
2578
2579 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2580
2581 which is less than n^2. */
2582
2583 srcPart = src[i];
2584
2585 if (multiplier == 0 || srcPart == 0) {
2586 low = carry;
2587 high = 0;
2588 } else {
2589 low = lowHalf(srcPart) * lowHalf(multiplier);
2590 high = highHalf(srcPart) * highHalf(multiplier);
2591
2592 mid = lowHalf(srcPart) * highHalf(multiplier);
2593 high += highHalf(mid);
2594 mid <<= integerPartWidth / 2;
2595 if (low + mid < low)
2596 high++;
2597 low += mid;
2598
2599 mid = highHalf(srcPart) * lowHalf(multiplier);
2600 high += highHalf(mid);
2601 mid <<= integerPartWidth / 2;
2602 if (low + mid < low)
2603 high++;
2604 low += mid;
2605
2606 /* Now add carry. */
2607 if (low + carry < low)
2608 high++;
2609 low += carry;
2610 }
2611
2612 if (add) {
2613 /* And now DST[i], and store the new low part there. */
2614 if (low + dst[i] < low)
2615 high++;
2616 dst[i] += low;
2617 } else
2618 dst[i] = low;
2619
2620 carry = high;
2621 }
2622
2623 if (i < dstParts) {
2624 /* Full multiplication, there is no overflow. */
2625 assert(i + 1 == dstParts);
2626 dst[i] = carry;
2627 return 0;
2628 } else {
2629 /* We overflowed if there is carry. */
2630 if (carry)
2631 return 1;
2632
2633 /* We would overflow if any significant unwritten parts would be
2634 non-zero. This is true if any remaining src parts are non-zero
2635 and the multiplier is non-zero. */
2636 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002637 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002638 if (src[i])
2639 return 1;
2640
2641 /* We fitted in the narrow destination. */
2642 return 0;
2643 }
2644}
2645
2646/* DST = LHS * RHS, where DST has the same width as the operands and
2647 is filled with the least significant parts of the result. Returns
2648 one if overflow occurred, otherwise zero. DST must be disjoint
2649 from both operands. */
2650int
2651APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2652 const integerPart *rhs, unsigned int parts)
2653{
2654 unsigned int i;
2655 int overflow;
2656
2657 assert(dst != lhs && dst != rhs);
2658
2659 overflow = 0;
2660 tcSet(dst, 0, parts);
2661
Dan Gohman16e02092010-03-24 19:38:02 +00002662 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002663 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2664 parts - i, true);
2665
2666 return overflow;
2667}
2668
Neil Booth978661d2007-10-06 00:24:48 +00002669/* DST = LHS * RHS, where DST has width the sum of the widths of the
2670 operands. No overflow occurs. DST must be disjoint from both
2671 operands. Returns the number of parts required to hold the
2672 result. */
2673unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002674APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002675 const integerPart *rhs, unsigned int lhsParts,
2676 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002677{
Neil Booth978661d2007-10-06 00:24:48 +00002678 /* Put the narrower number on the LHS for less loops below. */
2679 if (lhsParts > rhsParts) {
2680 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2681 } else {
2682 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002683
Neil Booth978661d2007-10-06 00:24:48 +00002684 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002685
Neil Booth978661d2007-10-06 00:24:48 +00002686 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002687
Dan Gohman16e02092010-03-24 19:38:02 +00002688 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002689 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002690
Neil Booth978661d2007-10-06 00:24:48 +00002691 n = lhsParts + rhsParts;
2692
2693 return n - (dst[n - 1] == 0);
2694 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002695}
2696
2697/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2698 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2699 set REMAINDER to the remainder, return zero. i.e.
2700
2701 OLD_LHS = RHS * LHS + REMAINDER
2702
2703 SCRATCH is a bignum of the same size as the operands and result for
2704 use by the routine; its contents need not be initialized and are
2705 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2706*/
2707int
2708APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2709 integerPart *remainder, integerPart *srhs,
2710 unsigned int parts)
2711{
2712 unsigned int n, shiftCount;
2713 integerPart mask;
2714
2715 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2716
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002717 shiftCount = tcMSB(rhs, parts) + 1;
2718 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002719 return true;
2720
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002721 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002722 n = shiftCount / integerPartWidth;
2723 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2724
2725 tcAssign(srhs, rhs, parts);
2726 tcShiftLeft(srhs, parts, shiftCount);
2727 tcAssign(remainder, lhs, parts);
2728 tcSet(lhs, 0, parts);
2729
2730 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2731 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002732 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002733 int compare;
2734
2735 compare = tcCompare(remainder, srhs, parts);
2736 if (compare >= 0) {
2737 tcSubtract(remainder, srhs, 0, parts);
2738 lhs[n] |= mask;
2739 }
2740
2741 if (shiftCount == 0)
2742 break;
2743 shiftCount--;
2744 tcShiftRight(srhs, parts, 1);
2745 if ((mask >>= 1) == 0)
2746 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2747 }
2748
2749 return false;
2750}
2751
2752/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2753 There are no restrictions on COUNT. */
2754void
2755APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2756{
Neil Booth68e53ad2007-10-08 13:47:12 +00002757 if (count) {
2758 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002759
Neil Booth68e53ad2007-10-08 13:47:12 +00002760 /* Jump is the inter-part jump; shift is is intra-part shift. */
2761 jump = count / integerPartWidth;
2762 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002763
Neil Booth68e53ad2007-10-08 13:47:12 +00002764 while (parts > jump) {
2765 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002766
Neil Booth68e53ad2007-10-08 13:47:12 +00002767 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002768
Neil Booth68e53ad2007-10-08 13:47:12 +00002769 /* dst[i] comes from the two parts src[i - jump] and, if we have
2770 an intra-part shift, src[i - jump - 1]. */
2771 part = dst[parts - jump];
2772 if (shift) {
2773 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002774 if (parts >= jump + 1)
2775 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2776 }
2777
Neil Booth68e53ad2007-10-08 13:47:12 +00002778 dst[parts] = part;
2779 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002780
Neil Booth68e53ad2007-10-08 13:47:12 +00002781 while (parts > 0)
2782 dst[--parts] = 0;
2783 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002784}
2785
2786/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2787 zero. There are no restrictions on COUNT. */
2788void
2789APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2790{
Neil Booth68e53ad2007-10-08 13:47:12 +00002791 if (count) {
2792 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002793
Neil Booth68e53ad2007-10-08 13:47:12 +00002794 /* Jump is the inter-part jump; shift is is intra-part shift. */
2795 jump = count / integerPartWidth;
2796 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002797
Neil Booth68e53ad2007-10-08 13:47:12 +00002798 /* Perform the shift. This leaves the most significant COUNT bits
2799 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002800 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002801 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002802
Neil Booth68e53ad2007-10-08 13:47:12 +00002803 if (i + jump >= parts) {
2804 part = 0;
2805 } else {
2806 part = dst[i + jump];
2807 if (shift) {
2808 part >>= shift;
2809 if (i + jump + 1 < parts)
2810 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2811 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002812 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002813
Neil Booth68e53ad2007-10-08 13:47:12 +00002814 dst[i] = part;
2815 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002816 }
2817}
2818
2819/* Bitwise and of two bignums. */
2820void
2821APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2822{
2823 unsigned int i;
2824
Dan Gohman16e02092010-03-24 19:38:02 +00002825 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002826 dst[i] &= rhs[i];
2827}
2828
2829/* Bitwise inclusive or of two bignums. */
2830void
2831APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2832{
2833 unsigned int i;
2834
Dan Gohman16e02092010-03-24 19:38:02 +00002835 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002836 dst[i] |= rhs[i];
2837}
2838
2839/* Bitwise exclusive or of two bignums. */
2840void
2841APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2842{
2843 unsigned int i;
2844
Dan Gohman16e02092010-03-24 19:38:02 +00002845 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002846 dst[i] ^= rhs[i];
2847}
2848
2849/* Complement a bignum in-place. */
2850void
2851APInt::tcComplement(integerPart *dst, unsigned int parts)
2852{
2853 unsigned int i;
2854
Dan Gohman16e02092010-03-24 19:38:02 +00002855 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002856 dst[i] = ~dst[i];
2857}
2858
2859/* Comparison (unsigned) of two bignums. */
2860int
2861APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2862 unsigned int parts)
2863{
2864 while (parts) {
2865 parts--;
2866 if (lhs[parts] == rhs[parts])
2867 continue;
2868
2869 if (lhs[parts] > rhs[parts])
2870 return 1;
2871 else
2872 return -1;
2873 }
2874
2875 return 0;
2876}
2877
2878/* Increment a bignum in-place, return the carry flag. */
2879integerPart
2880APInt::tcIncrement(integerPart *dst, unsigned int parts)
2881{
2882 unsigned int i;
2883
Dan Gohman16e02092010-03-24 19:38:02 +00002884 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002885 if (++dst[i] != 0)
2886 break;
2887
2888 return i == parts;
2889}
2890
2891/* Set the least significant BITS bits of a bignum, clear the
2892 rest. */
2893void
2894APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2895 unsigned int bits)
2896{
2897 unsigned int i;
2898
2899 i = 0;
2900 while (bits > integerPartWidth) {
2901 dst[i++] = ~(integerPart) 0;
2902 bits -= integerPartWidth;
2903 }
2904
2905 if (bits)
2906 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2907
2908 while (i < parts)
2909 dst[i++] = 0;
2910}