blob: 9d8f8be127710cb40900d3904b31b3b7c46cc799 [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
Reid Spencere81d2da2007-02-16 22:36:51 +0000762bool APInt::isPowerOf2() const {
763 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
764}
765
Chris Lattner455e9ab2009-01-21 18:09:24 +0000766unsigned APInt::countLeadingZerosSlowCase() const {
John McCall281d0512010-02-03 03:42:44 +0000767 // Treat the most significand word differently because it might have
768 // meaningless bits set beyond the precision.
769 unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
770 integerPart MSWMask;
771 if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
772 else {
773 MSWMask = ~integerPart(0);
774 BitsInMSW = APINT_BITS_PER_WORD;
775 }
776
777 unsigned i = getNumWords();
778 integerPart MSW = pVal[i-1] & MSWMask;
779 if (MSW)
780 return CountLeadingZeros_64(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
781
782 unsigned Count = BitsInMSW;
783 for (--i; i > 0u; --i) {
Chris Lattner98f8ccf2008-08-20 17:02:31 +0000784 if (pVal[i-1] == 0)
785 Count += APINT_BITS_PER_WORD;
786 else {
787 Count += CountLeadingZeros_64(pVal[i-1]);
788 break;
Reid Spencere549c492007-02-21 00:29:48 +0000789 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000790 }
John McCall281d0512010-02-03 03:42:44 +0000791 return Count;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000792}
793
Chris Lattner455e9ab2009-01-21 18:09:24 +0000794static unsigned countLeadingOnes_64(uint64_t V, unsigned skip) {
795 unsigned Count = 0;
Reid Spencer681dcd12007-02-27 21:59:26 +0000796 if (skip)
797 V <<= skip;
798 while (V && (V & (1ULL << 63))) {
799 Count++;
800 V <<= 1;
801 }
802 return Count;
803}
804
Chris Lattner455e9ab2009-01-21 18:09:24 +0000805unsigned APInt::countLeadingOnes() const {
Reid Spencer681dcd12007-02-27 21:59:26 +0000806 if (isSingleWord())
807 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
808
Chris Lattner455e9ab2009-01-21 18:09:24 +0000809 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwin2d0f1c52009-01-27 18:06:03 +0000810 unsigned shift;
811 if (!highWordBits) {
812 highWordBits = APINT_BITS_PER_WORD;
813 shift = 0;
814 } else {
815 shift = APINT_BITS_PER_WORD - highWordBits;
816 }
Reid Spencer681dcd12007-02-27 21:59:26 +0000817 int i = getNumWords() - 1;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000818 unsigned Count = countLeadingOnes_64(pVal[i], shift);
Reid Spencer681dcd12007-02-27 21:59:26 +0000819 if (Count == highWordBits) {
820 for (i--; i >= 0; --i) {
821 if (pVal[i] == -1ULL)
822 Count += APINT_BITS_PER_WORD;
823 else {
824 Count += countLeadingOnes_64(pVal[i], 0);
825 break;
826 }
827 }
828 }
829 return Count;
830}
831
Chris Lattner455e9ab2009-01-21 18:09:24 +0000832unsigned APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000833 if (isSingleWord())
Chris Lattner455e9ab2009-01-21 18:09:24 +0000834 return std::min(unsigned(CountTrailingZeros_64(VAL)), BitWidth);
835 unsigned Count = 0;
836 unsigned i = 0;
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000837 for (; i < getNumWords() && pVal[i] == 0; ++i)
838 Count += APINT_BITS_PER_WORD;
839 if (i < getNumWords())
840 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000841 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000842}
843
Chris Lattner455e9ab2009-01-21 18:09:24 +0000844unsigned APInt::countTrailingOnesSlowCase() const {
845 unsigned Count = 0;
846 unsigned i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000847 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000848 Count += APINT_BITS_PER_WORD;
849 if (i < getNumWords())
850 Count += CountTrailingOnes_64(pVal[i]);
851 return std::min(Count, BitWidth);
852}
853
Chris Lattner455e9ab2009-01-21 18:09:24 +0000854unsigned APInt::countPopulationSlowCase() const {
855 unsigned Count = 0;
856 for (unsigned i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000857 Count += CountPopulation_64(pVal[i]);
858 return Count;
859}
860
Reid Spencere81d2da2007-02-16 22:36:51 +0000861APInt APInt::byteSwap() const {
862 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
863 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000864 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000865 else if (BitWidth == 32)
Chris Lattner455e9ab2009-01-21 18:09:24 +0000866 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000867 else if (BitWidth == 48) {
Chris Lattner455e9ab2009-01-21 18:09:24 +0000868 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000869 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000870 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000871 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000872 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000873 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000874 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000875 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000876 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000877 char *pByte = (char*)Result.pVal;
Chris Lattner455e9ab2009-01-21 18:09:24 +0000878 for (unsigned i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000879 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000880 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
881 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000882 }
883 return Result;
884 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000885}
886
Eric Christopherd37eda82009-08-21 04:06:45 +0000887APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Sheng0b706b12007-02-08 14:35:19 +0000888 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000889 APInt A = API1, B = API2;
890 while (!!B) {
891 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000892 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000893 A = T;
894 }
895 return A;
896}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000897
Chris Lattner455e9ab2009-01-21 18:09:24 +0000898APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000899 union {
900 double D;
901 uint64_t I;
902 } T;
903 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000904
905 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000906 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000907
908 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000909 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000910
911 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000912 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000913 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000914
915 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
916 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
917
918 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000919 if (exp < 52)
Eric Christopherd37eda82009-08-21 04:06:45 +0000920 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer1fa111e2007-02-27 18:23:40 +0000921 APInt(width, mantissa >> (52 - exp));
922
923 // If the client didn't provide enough bits for us to shift the mantissa into
924 // then the result is undefined, just return 0
925 if (width <= exp - 52)
926 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000927
928 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000929 APInt Tmp(width, mantissa);
Chris Lattner455e9ab2009-01-21 18:09:24 +0000930 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000931 return isNeg ? -Tmp : Tmp;
932}
933
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000934/// RoundToDouble - This function converts this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000935/// The layout for double is as following (IEEE Standard 754):
936/// --------------------------------------
937/// | Sign Exponent Fraction Bias |
938/// |-------------------------------------- |
939/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopherd37eda82009-08-21 04:06:45 +0000940/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000941double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000942
943 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen4e97a0f2009-08-12 18:04:11 +0000944 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencera58f0582007-02-18 20:09:41 +0000945 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
946 if (isSigned) {
Dale Johannesen39c177d2009-08-12 17:42:34 +0000947 int64_t sext = (int64_t(getWord(0)) << (64-BitWidth)) >> (64-BitWidth);
Reid Spencera58f0582007-02-18 20:09:41 +0000948 return double(sext);
949 } else
Dale Johannesen39c177d2009-08-12 17:42:34 +0000950 return double(getWord(0));
Reid Spencera58f0582007-02-18 20:09:41 +0000951 }
952
Reid Spencer9c0696f2007-02-20 08:51:03 +0000953 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000954 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000955
956 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000957 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000958
959 // Figure out how many bits we're using.
Chris Lattner455e9ab2009-01-21 18:09:24 +0000960 unsigned n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000961
Reid Spencer9c0696f2007-02-20 08:51:03 +0000962 // The exponent (without bias normalization) is just the number of bits
963 // we are using. Note that the sign bit is gone since we constructed the
964 // absolute value.
965 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000966
Reid Spencer9c0696f2007-02-20 08:51:03 +0000967 // Return infinity for exponent overflow
968 if (exp > 1023) {
969 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000970 return std::numeric_limits<double>::infinity();
Eric Christopherd37eda82009-08-21 04:06:45 +0000971 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000972 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000973 }
974 exp += 1023; // Increment for 1023 bias
975
976 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
977 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000978 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000979 unsigned hiWord = whichWord(n-1);
980 if (hiWord == 0) {
981 mantissa = Tmp.pVal[0];
982 if (n > 52)
983 mantissa >>= n - 52; // shift down, we want the top 52 bits.
984 } else {
985 assert(hiWord > 0 && "huh?");
986 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
987 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
988 mantissa = hibits | lobits;
989 }
990
Zhou Shengd93f00c2007-02-12 20:02:55 +0000991 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000992 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000993 union {
994 double D;
995 uint64_t I;
996 } T;
997 T.I = sign | (exp << 52) | mantissa;
998 return T.D;
999}
1000
Reid Spencere81d2da2007-02-16 22:36:51 +00001001// Truncate to new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001002APInt &APInt::trunc(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001003 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner98f8ccf2008-08-20 17:02:31 +00001004 assert(width && "Can't truncate to 0 bits");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001005 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001006 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001007 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001008 if (wordsBefore != wordsAfter) {
1009 if (wordsAfter == 1) {
1010 uint64_t *tmp = pVal;
1011 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +00001012 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +00001013 } else {
1014 uint64_t *newVal = getClearedMemory(wordsAfter);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001015 for (unsigned i = 0; i < wordsAfter; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001016 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +00001017 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001018 pVal = newVal;
1019 }
1020 }
Reid Spencer94900772007-02-28 17:34:32 +00001021 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001022}
1023
1024// Sign extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001025APInt &APInt::sext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001026 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9eec2412007-02-25 23:44:53 +00001027 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001028 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +00001029 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +00001030 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +00001031 }
1032
1033 // The sign bit is set. First, get some facts
Chris Lattner455e9ab2009-01-21 18:09:24 +00001034 unsigned wordsBefore = getNumWords();
1035 unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001036 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001037 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001038
1039 // Mask the high order word appropriately
1040 if (wordsBefore == wordsAfter) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001041 unsigned newWordBits = width % APINT_BITS_PER_WORD;
Reid Spencer9eec2412007-02-25 23:44:53 +00001042 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +00001043 uint64_t mask = ~0ULL;
1044 if (newWordBits)
1045 mask >>= APINT_BITS_PER_WORD - newWordBits;
1046 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001047 if (wordsBefore == 1)
1048 VAL |= mask;
1049 else
1050 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001051 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001052 }
1053
Reid Spencerf30b1882007-02-25 23:54:00 +00001054 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001055 uint64_t *newVal = getMemory(wordsAfter);
1056 if (wordsBefore == 1)
1057 newVal[0] = VAL | mask;
1058 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001059 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001060 newVal[i] = pVal[i];
1061 newVal[wordsBefore-1] |= mask;
1062 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001063 for (unsigned i = wordsBefore; i < wordsAfter; i++)
Reid Spencer9eec2412007-02-25 23:44:53 +00001064 newVal[i] = -1ULL;
1065 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001066 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001067 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001068 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001069}
1070
1071// Zero extend to a new width.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001072APInt &APInt::zext(unsigned width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001073 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001074 unsigned wordsBefore = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001075 BitWidth = width;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001076 unsigned wordsAfter = getNumWords();
Reid Spencer9eec2412007-02-25 23:44:53 +00001077 if (wordsBefore != wordsAfter) {
1078 uint64_t *newVal = getClearedMemory(wordsAfter);
1079 if (wordsBefore == 1)
1080 newVal[0] = VAL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001081 else
Chris Lattner455e9ab2009-01-21 18:09:24 +00001082 for (unsigned i = 0; i < wordsBefore; ++i)
Reid Spencer9eec2412007-02-25 23:44:53 +00001083 newVal[i] = pVal[i];
1084 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001085 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001086 pVal = newVal;
1087 }
Reid Spencer94900772007-02-28 17:34:32 +00001088 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001089}
1090
Chris Lattner455e9ab2009-01-21 18:09:24 +00001091APInt &APInt::zextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001092 if (BitWidth < width)
1093 return zext(width);
1094 if (BitWidth > width)
1095 return trunc(width);
1096 return *this;
1097}
1098
Chris Lattner455e9ab2009-01-21 18:09:24 +00001099APInt &APInt::sextOrTrunc(unsigned width) {
Reid Spencer68e23002007-03-01 17:15:32 +00001100 if (BitWidth < width)
1101 return sext(width);
1102 if (BitWidth > width)
1103 return trunc(width);
1104 return *this;
1105}
1106
Zhou Shengff4304f2007-02-09 07:48:24 +00001107/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001108/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001109APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001110 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001111}
1112
1113/// Arithmetic right-shift this APInt by shiftAmt.
1114/// @brief Arithmetic right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001115APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001116 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001117 // Handle a degenerate case
1118 if (shiftAmt == 0)
1119 return *this;
1120
1121 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001122 if (isSingleWord()) {
1123 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001124 return APInt(BitWidth, 0); // undefined
1125 else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001126 unsigned SignBit = APINT_BITS_PER_WORD - BitWidth;
Eric Christopherd37eda82009-08-21 04:06:45 +00001127 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001128 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1129 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001130 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001131
Reid Spencer46f9c942007-03-02 22:39:11 +00001132 // If all the bits were shifted out, the result is, technically, undefined.
1133 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1134 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001135 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001136 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001137 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001138 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001139 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001140 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001141
1142 // Create some space for the result.
1143 uint64_t * val = new uint64_t[getNumWords()];
1144
Reid Spencer46f9c942007-03-02 22:39:11 +00001145 // Compute some values needed by the following shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001146 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1147 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1148 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1149 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer46f9c942007-03-02 22:39:11 +00001150 if (bitsInWord == 0)
1151 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001152
1153 // If we are shifting whole words, just move whole words
1154 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001155 // Move the words containing significant bits
Chris Lattner455e9ab2009-01-21 18:09:24 +00001156 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001157 val[i] = pVal[i+offset]; // move whole word
1158
1159 // Adjust the top significant word for sign bit fill, if negative
1160 if (isNegative())
1161 if (bitsInWord < APINT_BITS_PER_WORD)
1162 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1163 } else {
Eric Christopherd37eda82009-08-21 04:06:45 +00001164 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001165 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001166 // This combines the shifted corresponding word with the low bits from
1167 // the next word (shifted into this word's high bits).
Eric Christopherd37eda82009-08-21 04:06:45 +00001168 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer46f9c942007-03-02 22:39:11 +00001169 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1170 }
1171
1172 // Shift the break word. In this case there are no bits from the next word
1173 // to include in this word.
1174 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1175
1176 // Deal with sign extenstion in the break word, and possibly the word before
1177 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001178 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001179 if (wordShift > bitsInWord) {
1180 if (breakWord > 0)
Eric Christopherd37eda82009-08-21 04:06:45 +00001181 val[breakWord-1] |=
Reid Spencer46f9c942007-03-02 22:39:11 +00001182 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1183 val[breakWord] |= ~0ULL;
Eric Christopherd37eda82009-08-21 04:06:45 +00001184 } else
Reid Spencer46f9c942007-03-02 22:39:11 +00001185 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001186 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001187 }
1188
Reid Spencer46f9c942007-03-02 22:39:11 +00001189 // Remaining words are 0 or -1, just assign them.
1190 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001191 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001192 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001193 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001194}
1195
Zhou Shengff4304f2007-02-09 07:48:24 +00001196/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001197/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001198APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001199 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001200}
1201
1202/// Logical right-shift this APInt by shiftAmt.
1203/// @brief Logical right-shift function.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001204APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001205 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001206 if (shiftAmt == BitWidth)
1207 return APInt(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001208 else
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001209 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001210 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001211
Reid Spencerba81c2b2007-02-26 01:19:48 +00001212 // If all the bits were shifted out, the result is 0. This avoids issues
1213 // with shifting by the size of the integer type, which produces undefined
1214 // results. We define these "undefined results" to always be 0.
1215 if (shiftAmt == BitWidth)
1216 return APInt(BitWidth, 0);
1217
Reid Spencer02ae8b72007-05-17 06:26:29 +00001218 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopherd37eda82009-08-21 04:06:45 +00001219 // issues with shifting by the size of the integer type, which produces
Reid Spencer02ae8b72007-05-17 06:26:29 +00001220 // undefined results in the code below. This is also an optimization.
1221 if (shiftAmt == 0)
1222 return *this;
1223
Reid Spencerba81c2b2007-02-26 01:19:48 +00001224 // Create some space for the result.
1225 uint64_t * val = new uint64_t[getNumWords()];
1226
1227 // If we are shifting less than a word, compute the shift with a simple carry
1228 if (shiftAmt < APINT_BITS_PER_WORD) {
1229 uint64_t carry = 0;
1230 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001231 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001232 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1233 }
1234 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001235 }
1236
Reid Spencerba81c2b2007-02-26 01:19:48 +00001237 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001238 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1239 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001240
1241 // If we are shifting whole words, just move whole words
1242 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001243 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001244 val[i] = pVal[i+offset];
Chris Lattner455e9ab2009-01-21 18:09:24 +00001245 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001246 val[i] = 0;
1247 return APInt(val,BitWidth).clearUnusedBits();
1248 }
1249
Eric Christopherd37eda82009-08-21 04:06:45 +00001250 // Shift the low order words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001251 unsigned breakWord = getNumWords() - offset -1;
1252 for (unsigned i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001253 val[i] = (pVal[i+offset] >> wordShift) |
1254 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001255 // Shift the break word.
1256 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1257
1258 // Remaining words are 0
Chris Lattner455e9ab2009-01-21 18:09:24 +00001259 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencerba81c2b2007-02-26 01:19:48 +00001260 val[i] = 0;
1261 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001262}
1263
Zhou Shengff4304f2007-02-09 07:48:24 +00001264/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001265/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001266APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky4bd47872009-01-19 17:42:33 +00001267 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001268 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001269}
1270
Chris Lattner455e9ab2009-01-21 18:09:24 +00001271APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencer87553802007-02-25 00:56:44 +00001272 // If all the bits were shifted out, the result is 0. This avoids issues
1273 // with shifting by the size of the integer type, which produces undefined
1274 // results. We define these "undefined results" to always be 0.
1275 if (shiftAmt == BitWidth)
1276 return APInt(BitWidth, 0);
1277
Reid Spencer92c72832007-05-12 18:01:57 +00001278 // If none of the bits are shifted out, the result is *this. This avoids a
1279 // lshr by the words size in the loop below which can produce incorrect
1280 // results. It also avoids the expensive computation below for a common case.
1281 if (shiftAmt == 0)
1282 return *this;
1283
Reid Spencer87553802007-02-25 00:56:44 +00001284 // Create some space for the result.
1285 uint64_t * val = new uint64_t[getNumWords()];
1286
1287 // If we are shifting less than a word, do it the easy way
1288 if (shiftAmt < APINT_BITS_PER_WORD) {
1289 uint64_t carry = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001290 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencer87553802007-02-25 00:56:44 +00001291 val[i] = pVal[i] << shiftAmt | carry;
1292 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1293 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001294 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001295 }
1296
Reid Spencer87553802007-02-25 00:56:44 +00001297 // Compute some values needed by the remaining shift algorithms
Chris Lattner455e9ab2009-01-21 18:09:24 +00001298 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1299 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer87553802007-02-25 00:56:44 +00001300
1301 // If we are shifting whole words, just move whole words
1302 if (wordShift == 0) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001303 for (unsigned i = 0; i < offset; i++)
Reid Spencer87553802007-02-25 00:56:44 +00001304 val[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001305 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencer87553802007-02-25 00:56:44 +00001306 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001307 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001308 }
Reid Spencer87553802007-02-25 00:56:44 +00001309
1310 // Copy whole words from this to Result.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001311 unsigned i = getNumWords() - 1;
Reid Spencer87553802007-02-25 00:56:44 +00001312 for (; i > offset; --i)
1313 val[i] = pVal[i-offset] << wordShift |
1314 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001315 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001316 for (i = 0; i < offset; ++i)
1317 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001318 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001319}
1320
Dan Gohmancf609572008-02-29 01:40:47 +00001321APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001322 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001323}
1324
Chris Lattner455e9ab2009-01-21 18:09:24 +00001325APInt APInt::rotl(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001326 if (rotateAmt == 0)
1327 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001328 // Don't get too fancy, just use existing shift/or facilities
1329 APInt hi(*this);
1330 APInt lo(*this);
1331 hi.shl(rotateAmt);
1332 lo.lshr(BitWidth - rotateAmt);
1333 return hi | lo;
1334}
1335
Dan Gohmancf609572008-02-29 01:40:47 +00001336APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001337 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001338}
1339
Chris Lattner455e9ab2009-01-21 18:09:24 +00001340APInt APInt::rotr(unsigned rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001341 if (rotateAmt == 0)
1342 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001343 // Don't get too fancy, just use existing shift/or facilities
1344 APInt hi(*this);
1345 APInt lo(*this);
1346 lo.lshr(rotateAmt);
1347 hi.shl(BitWidth - rotateAmt);
1348 return hi | lo;
1349}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001350
1351// Square Root - this method computes and returns the square root of "this".
1352// Three mechanisms are used for computation. For small values (<= 5 bits),
1353// a table lookup is done. This gets some performance for common cases. For
1354// values using less than 52 bits, the value is converted to double and then
1355// the libc sqrt function is called. The result is rounded and then converted
1356// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopherd37eda82009-08-21 04:06:45 +00001357// the Babylonian method for computing square roots is used.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001358APInt APInt::sqrt() const {
1359
1360 // Determine the magnitude of the value.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001361 unsigned magnitude = getActiveBits();
Reid Spenceraf8fb192007-03-01 05:39:56 +00001362
1363 // Use a fast table for some small values. This also gets rid of some
1364 // rounding errors in libc sqrt for small values.
1365 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001366 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001367 /* 0 */ 0,
1368 /* 1- 2 */ 1, 1,
Eric Christopherd37eda82009-08-21 04:06:45 +00001369 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001370 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1371 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1372 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1373 /* 31 */ 6
1374 };
1375 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001376 }
1377
1378 // If the magnitude of the value fits in less than 52 bits (the precision of
1379 // an IEEE double precision floating point value), then we can use the
1380 // libc sqrt function which will probably use a hardware sqrt computation.
1381 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001382 if (magnitude < 52) {
Chris Lattner4c297c92010-05-15 17:11:55 +00001383#if HAVE_ROUND
Eric Christopherd37eda82009-08-21 04:06:45 +00001384 return APInt(BitWidth,
Reid Spenceraf8fb192007-03-01 05:39:56 +00001385 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Chris Lattner4c297c92010-05-15 17:11:55 +00001386#else
1387 return APInt(BitWidth,
1388 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
Jeff Cohenca5183d2007-03-05 00:00:42 +00001389#endif
1390 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001391
1392 // Okay, all the short cuts are exhausted. We must compute it. The following
1393 // is a classical Babylonian method for computing the square root. This code
1394 // was adapted to APINt from a wikipedia article on such computations.
1395 // See http://www.wikipedia.org/ and go to the page named
Eric Christopherd37eda82009-08-21 04:06:45 +00001396 // Calculate_an_integer_square_root.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001397 unsigned nbits = BitWidth, i = 4;
Reid Spenceraf8fb192007-03-01 05:39:56 +00001398 APInt testy(BitWidth, 16);
1399 APInt x_old(BitWidth, 1);
1400 APInt x_new(BitWidth, 0);
1401 APInt two(BitWidth, 2);
1402
1403 // Select a good starting value using binary logarithms.
Eric Christopherd37eda82009-08-21 04:06:45 +00001404 for (;; i += 2, testy = testy.shl(2))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001405 if (i >= nbits || this->ule(testy)) {
1406 x_old = x_old.shl(i / 2);
1407 break;
1408 }
1409
Eric Christopherd37eda82009-08-21 04:06:45 +00001410 // Use the Babylonian method to arrive at the integer square root:
Reid Spenceraf8fb192007-03-01 05:39:56 +00001411 for (;;) {
1412 x_new = (this->udiv(x_old) + x_old).udiv(two);
1413 if (x_old.ule(x_new))
1414 break;
1415 x_old = x_new;
1416 }
1417
1418 // Make sure we return the closest approximation
Eric Christopherd37eda82009-08-21 04:06:45 +00001419 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencerf09aef72007-03-02 04:21:55 +00001420 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopherd37eda82009-08-21 04:06:45 +00001421 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencerf09aef72007-03-02 04:21:55 +00001422 // floating point representation after 192 bits. There are no discrepancies
1423 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001424 APInt square(x_old * x_old);
1425 APInt nextSquare((x_old + 1) * (x_old +1));
1426 if (this->ult(square))
1427 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001428 else if (this->ule(nextSquare)) {
1429 APInt midpoint((nextSquare - square).udiv(two));
1430 APInt offset(*this - square);
1431 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001432 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001433 else
1434 return x_old + 1;
1435 } else
Torok Edwinc23197a2009-07-14 16:55:14 +00001436 llvm_unreachable("Error in APInt::sqrt computation");
Reid Spenceraf8fb192007-03-01 05:39:56 +00001437 return x_old + 1;
1438}
1439
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001440/// Computes the multiplicative inverse of this APInt for a given modulo. The
1441/// iterative extended Euclidean algorithm is used to solve for this value,
1442/// however we simplify it to speed up calculating only the inverse, and take
1443/// advantage of div+rem calculations. We also use some tricks to avoid copying
1444/// (potentially large) APInts around.
1445APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1446 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1447
1448 // Using the properties listed at the following web page (accessed 06/21/08):
1449 // http://www.numbertheory.org/php/euclid.html
1450 // (especially the properties numbered 3, 4 and 9) it can be proved that
1451 // BitWidth bits suffice for all the computations in the algorithm implemented
1452 // below. More precisely, this number of bits suffice if the multiplicative
1453 // inverse exists, but may not suffice for the general extended Euclidean
1454 // algorithm.
1455
1456 APInt r[2] = { modulo, *this };
1457 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1458 APInt q(BitWidth, 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00001459
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001460 unsigned i;
1461 for (i = 0; r[i^1] != 0; i ^= 1) {
1462 // An overview of the math without the confusing bit-flipping:
1463 // q = r[i-2] / r[i-1]
1464 // r[i] = r[i-2] % r[i-1]
1465 // t[i] = t[i-2] - t[i-1] * q
1466 udivrem(r[i], r[i^1], q, r[i]);
1467 t[i] -= t[i^1] * q;
1468 }
1469
1470 // If this APInt and the modulo are not coprime, there is no multiplicative
1471 // inverse, so return 0. We check this by looking at the next-to-last
1472 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1473 // algorithm.
1474 if (r[i] != 1)
1475 return APInt(BitWidth, 0);
1476
1477 // The next-to-last t is the multiplicative inverse. However, we are
1478 // interested in a positive inverse. Calcuate a positive one from a negative
1479 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001480 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001481 return t[i].isNegative() ? t[i] + modulo : t[i];
1482}
1483
Jay Foad4e5ea552009-04-30 10:15:35 +00001484/// Calculate the magic numbers required to implement a signed integer division
1485/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1486/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1487/// Warren, Jr., chapter 10.
1488APInt::ms APInt::magic() const {
1489 const APInt& d = *this;
1490 unsigned p;
1491 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foad4e5ea552009-04-30 10:15:35 +00001492 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foad4e5ea552009-04-30 10:15:35 +00001493 struct ms mag;
Eric Christopherd37eda82009-08-21 04:06:45 +00001494
Jay Foad4e5ea552009-04-30 10:15:35 +00001495 ad = d.abs();
1496 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1497 anc = t - 1 - t.urem(ad); // absolute value of nc
1498 p = d.getBitWidth() - 1; // initialize p
1499 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1500 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1501 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1502 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1503 do {
1504 p = p + 1;
1505 q1 = q1<<1; // update q1 = 2p/abs(nc)
1506 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1507 if (r1.uge(anc)) { // must be unsigned comparison
1508 q1 = q1 + 1;
1509 r1 = r1 - anc;
1510 }
1511 q2 = q2<<1; // update q2 = 2p/abs(d)
1512 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1513 if (r2.uge(ad)) { // must be unsigned comparison
1514 q2 = q2 + 1;
1515 r2 = r2 - ad;
1516 }
1517 delta = ad - r2;
1518 } while (q1.ule(delta) || (q1 == delta && r1 == 0));
Eric Christopherd37eda82009-08-21 04:06:45 +00001519
Jay Foad4e5ea552009-04-30 10:15:35 +00001520 mag.m = q2 + 1;
1521 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1522 mag.s = p - d.getBitWidth(); // resulting shift
1523 return mag;
1524}
1525
1526/// Calculate the magic numbers required to implement an unsigned integer
1527/// division by a constant as a sequence of multiplies, adds and shifts.
1528/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1529/// S. Warren, Jr., chapter 10.
1530APInt::mu APInt::magicu() const {
1531 const APInt& d = *this;
1532 unsigned p;
1533 APInt nc, delta, q1, r1, q2, r2;
1534 struct mu magu;
1535 magu.a = 0; // initialize "add" indicator
1536 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth());
1537 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1538 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1539
1540 nc = allOnes - (-d).urem(d);
1541 p = d.getBitWidth() - 1; // initialize p
1542 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1543 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1544 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1545 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1546 do {
1547 p = p + 1;
1548 if (r1.uge(nc - r1)) {
1549 q1 = q1 + q1 + 1; // update q1
1550 r1 = r1 + r1 - nc; // update r1
1551 }
1552 else {
1553 q1 = q1+q1; // update q1
1554 r1 = r1+r1; // update r1
1555 }
1556 if ((r2 + 1).uge(d - r2)) {
1557 if (q2.uge(signedMax)) magu.a = 1;
1558 q2 = q2+q2 + 1; // update q2
1559 r2 = r2+r2 + 1 - d; // update r2
1560 }
1561 else {
1562 if (q2.uge(signedMin)) magu.a = 1;
1563 q2 = q2+q2; // update q2
1564 r2 = r2+r2 + 1; // update r2
1565 }
1566 delta = d - 1 - r2;
1567 } while (p < d.getBitWidth()*2 &&
1568 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1569 magu.m = q2 + 1; // resulting magic number
1570 magu.s = p - d.getBitWidth(); // resulting shift
1571 return magu;
1572}
1573
Reid Spencer9c0696f2007-02-20 08:51:03 +00001574/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1575/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1576/// variables here have the same names as in the algorithm. Comments explain
1577/// the algorithm and any deviation from it.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001578static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1579 unsigned m, unsigned n) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001580 assert(u && "Must provide dividend");
1581 assert(v && "Must provide divisor");
1582 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001583 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001584 assert(n>1 && "n must be > 1");
1585
1586 // Knuth uses the value b as the base of the number system. In our case b
1587 // is 2^31 so we just set it to -1u.
1588 uint64_t b = uint64_t(1) << 32;
1589
Chris Lattnerfad86b02008-08-17 07:19:36 +00001590#if 0
David Greene465abed2010-01-05 01:28:52 +00001591 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1592 DEBUG(dbgs() << "KnuthDiv: original:");
1593 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1594 DEBUG(dbgs() << " by");
1595 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1596 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001597#endif
Eric Christopherd37eda82009-08-21 04:06:45 +00001598 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1599 // u and v by d. Note that we have taken Knuth's advice here to use a power
1600 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1601 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencer9c0696f2007-02-20 08:51:03 +00001602 // shift amount from the leading zeros. We are basically normalizing the u
1603 // and v so that its high bits are shifted to the top of v's range without
1604 // overflow. Note that this can require an extra word in u so that u must
1605 // be of length m+n+1.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001606 unsigned shift = CountLeadingZeros_32(v[n-1]);
1607 unsigned v_carry = 0;
1608 unsigned u_carry = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001609 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001610 for (unsigned i = 0; i < m+n; ++i) {
1611 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001612 u[i] = (u[i] << shift) | u_carry;
1613 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001614 }
Chris Lattner455e9ab2009-01-21 18:09:24 +00001615 for (unsigned i = 0; i < n; ++i) {
1616 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001617 v[i] = (v[i] << shift) | v_carry;
1618 v_carry = v_tmp;
1619 }
1620 }
1621 u[m+n] = u_carry;
Chris Lattnerfad86b02008-08-17 07:19:36 +00001622#if 0
David Greene465abed2010-01-05 01:28:52 +00001623 DEBUG(dbgs() << "KnuthDiv: normal:");
1624 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1625 DEBUG(dbgs() << " by");
1626 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1627 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001628#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001629
1630 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1631 int j = m;
1632 do {
David Greene465abed2010-01-05 01:28:52 +00001633 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001634 // D3. [Calculate q'.].
Reid Spencer9c0696f2007-02-20 08:51:03 +00001635 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1636 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1637 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1638 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1639 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopherd37eda82009-08-21 04:06:45 +00001640 // value qp is one too large, and it eliminates all cases where qp is two
1641 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001642 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greene465abed2010-01-05 01:28:52 +00001643 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001644 uint64_t qp = dividend / v[n-1];
1645 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001646 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1647 qp--;
1648 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001649 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001650 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001651 }
David Greene465abed2010-01-05 01:28:52 +00001652 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001653
Reid Spencer92904632007-02-23 01:57:13 +00001654 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1655 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1656 // consists of a simple multiplication by a one-place number, combined with
Eric Christopherd37eda82009-08-21 04:06:45 +00001657 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001658 bool isNeg = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001659 for (unsigned i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001660 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001661 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001662 bool borrow = subtrahend > u_tmp;
David Greene465abed2010-01-05 01:28:52 +00001663 DEBUG(dbgs() << "KnuthDiv: u_tmp == " << u_tmp
Daniel Dunbara53902b2009-07-13 05:27:30 +00001664 << ", subtrahend == " << subtrahend
1665 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001666
Reid Spencer610fad82007-02-24 10:01:42 +00001667 uint64_t result = u_tmp - subtrahend;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001668 unsigned k = j + i;
1669 u[k++] = (unsigned)(result & (b-1)); // subtract low word
1670 u[k++] = (unsigned)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001671 while (borrow && k <= m+n) { // deal with borrow to the left
1672 borrow = u[k] == 0;
1673 u[k]--;
1674 k++;
1675 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001676 isNeg |= borrow;
David Greene465abed2010-01-05 01:28:52 +00001677 DEBUG(dbgs() << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
Eric Christopherd37eda82009-08-21 04:06:45 +00001678 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001679 }
David Greene465abed2010-01-05 01:28:52 +00001680 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1681 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1682 DEBUG(dbgs() << '\n');
Eric Christopherd37eda82009-08-21 04:06:45 +00001683 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1684 // this step is actually negative, (u[j+n]...u[j]) should be left as the
Reid Spencer610fad82007-02-24 10:01:42 +00001685 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001686 // the true value, and a "borrow" to the left should be remembered.
1687 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001688 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001689 bool carry = true; // true because b's complement is "complement + 1"
Chris Lattner455e9ab2009-01-21 18:09:24 +00001690 for (unsigned i = 0; i <= m+n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001691 u[i] = ~u[i] + carry; // b's complement
1692 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001693 }
Reid Spencer92904632007-02-23 01:57:13 +00001694 }
David Greene465abed2010-01-05 01:28:52 +00001695 DEBUG(dbgs() << "KnuthDiv: after complement:");
1696 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1697 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001698
Eric Christopherd37eda82009-08-21 04:06:45 +00001699 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencer9c0696f2007-02-20 08:51:03 +00001700 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001701 q[j] = (unsigned)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001702 if (isNeg) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001703 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencer9c0696f2007-02-20 08:51:03 +00001704 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopherd37eda82009-08-21 04:06:45 +00001705 // this possibility. Decrease q[j] by 1
Reid Spencer92904632007-02-23 01:57:13 +00001706 q[j]--;
Eric Christopherd37eda82009-08-21 04:06:45 +00001707 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1708 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencer92904632007-02-23 01:57:13 +00001709 // since it cancels with the borrow that occurred in D4.
1710 bool carry = false;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001711 for (unsigned i = 0; i < n; i++) {
1712 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001713 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001714 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001715 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001716 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001717 }
David Greene465abed2010-01-05 01:28:52 +00001718 DEBUG(dbgs() << "KnuthDiv: after correction:");
1719 DEBUG(for (int i = m+n; i >=0; i--) dbgs() <<" " << u[i]);
1720 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001721
Reid Spencer92904632007-02-23 01:57:13 +00001722 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1723 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001724
David Greene465abed2010-01-05 01:28:52 +00001725 DEBUG(dbgs() << "KnuthDiv: quotient:");
1726 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1727 DEBUG(dbgs() << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001728
Reid Spencer9c0696f2007-02-20 08:51:03 +00001729 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1730 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1731 // compute the remainder (urem uses this).
1732 if (r) {
1733 // The value d is expressed by the "shift" value above since we avoided
1734 // multiplication by d by using a shift left. So, all we have to do is
1735 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001736 if (shift) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001737 unsigned carry = 0;
David Greene465abed2010-01-05 01:28:52 +00001738 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer1050ec52007-02-24 20:38:01 +00001739 for (int i = n-1; i >= 0; i--) {
1740 r[i] = (u[i] >> shift) | carry;
1741 carry = u[i] << (32 - shift);
David Greene465abed2010-01-05 01:28:52 +00001742 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001743 }
1744 } else {
1745 for (int i = n-1; i >= 0; i--) {
1746 r[i] = u[i];
David Greene465abed2010-01-05 01:28:52 +00001747 DEBUG(dbgs() << " " << r[i]);
Reid Spencer1050ec52007-02-24 20:38:01 +00001748 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001749 }
David Greene465abed2010-01-05 01:28:52 +00001750 DEBUG(dbgs() << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001751 }
Chris Lattnerfad86b02008-08-17 07:19:36 +00001752#if 0
David Greene465abed2010-01-05 01:28:52 +00001753 DEBUG(dbgs() << '\n');
Chris Lattnerfad86b02008-08-17 07:19:36 +00001754#endif
Reid Spencer9c0696f2007-02-20 08:51:03 +00001755}
1756
Chris Lattner455e9ab2009-01-21 18:09:24 +00001757void APInt::divide(const APInt LHS, unsigned lhsWords,
1758 const APInt &RHS, unsigned rhsWords,
Reid Spencer9c0696f2007-02-20 08:51:03 +00001759 APInt *Quotient, APInt *Remainder)
1760{
1761 assert(lhsWords >= rhsWords && "Fractional result");
1762
Eric Christopherd37eda82009-08-21 04:06:45 +00001763 // First, compose the values into an array of 32-bit words instead of
Reid Spencer9c0696f2007-02-20 08:51:03 +00001764 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohmanf451cb82010-02-10 16:03:48 +00001765 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopherd37eda82009-08-21 04:06:45 +00001766 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1767 // can't use 64-bit operands here because we don't have native results of
1768 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencer9c0696f2007-02-20 08:51:03 +00001769 // work on large-endian machines.
Dan Gohmande551f92009-04-01 18:45:54 +00001770 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001771 unsigned n = rhsWords * 2;
1772 unsigned m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001773
1774 // Allocate space for the temporary values we need either on the stack, if
1775 // it will fit, or on the heap if it won't.
Chris Lattner455e9ab2009-01-21 18:09:24 +00001776 unsigned SPACE[128];
1777 unsigned *U = 0;
1778 unsigned *V = 0;
1779 unsigned *Q = 0;
1780 unsigned *R = 0;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001781 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1782 U = &SPACE[0];
1783 V = &SPACE[m+n+1];
1784 Q = &SPACE[(m+n+1) + n];
1785 if (Remainder)
1786 R = &SPACE[(m+n+1) + n + (m+n)];
1787 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001788 U = new unsigned[m + n + 1];
1789 V = new unsigned[n];
1790 Q = new unsigned[m+n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001791 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001792 R = new unsigned[n];
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001793 }
1794
1795 // Initialize the dividend
Chris Lattner455e9ab2009-01-21 18:09:24 +00001796 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001797 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001798 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001799 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001800 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001801 }
1802 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1803
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001804 // Initialize the divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00001805 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001806 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001807 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner455e9ab2009-01-21 18:09:24 +00001808 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmande551f92009-04-01 18:45:54 +00001809 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001810 }
1811
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001812 // initialize the quotient and remainder
Chris Lattner455e9ab2009-01-21 18:09:24 +00001813 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001814 if (Remainder)
Chris Lattner455e9ab2009-01-21 18:09:24 +00001815 memset(R, 0, n * sizeof(unsigned));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001816
Eric Christopherd37eda82009-08-21 04:06:45 +00001817 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencer9c0696f2007-02-20 08:51:03 +00001818 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopherd37eda82009-08-21 04:06:45 +00001819 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencer9c0696f2007-02-20 08:51:03 +00001820 // contain any zero words or the Knuth algorithm fails.
1821 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1822 n--;
1823 m++;
1824 }
1825 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1826 m--;
1827
1828 // If we're left with only a single word for the divisor, Knuth doesn't work
1829 // so we implement the short division algorithm here. This is much simpler
1830 // and faster because we are certain that we can divide a 64-bit quantity
1831 // by a 32-bit quantity at hardware speed and short division is simply a
1832 // series of such operations. This is just like doing short division but we
1833 // are using base 2^32 instead of base 10.
1834 assert(n != 0 && "Divide by zero?");
1835 if (n == 1) {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001836 unsigned divisor = V[0];
1837 unsigned remainder = 0;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001838 for (int i = m+n-1; i >= 0; i--) {
1839 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1840 if (partial_dividend == 0) {
1841 Q[i] = 0;
1842 remainder = 0;
1843 } else if (partial_dividend < divisor) {
1844 Q[i] = 0;
Chris Lattner455e9ab2009-01-21 18:09:24 +00001845 remainder = (unsigned)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001846 } else if (partial_dividend == divisor) {
1847 Q[i] = 1;
1848 remainder = 0;
1849 } else {
Chris Lattner455e9ab2009-01-21 18:09:24 +00001850 Q[i] = (unsigned)(partial_dividend / divisor);
1851 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001852 }
1853 }
1854 if (R)
1855 R[0] = remainder;
1856 } else {
1857 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1858 // case n > 1.
1859 KnuthDiv(U, V, Q, R, m, n);
1860 }
1861
1862 // If the caller wants the quotient
1863 if (Quotient) {
1864 // Set up the Quotient value's memory.
1865 if (Quotient->BitWidth != LHS.BitWidth) {
1866 if (Quotient->isSingleWord())
1867 Quotient->VAL = 0;
1868 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001869 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001870 Quotient->BitWidth = LHS.BitWidth;
1871 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001872 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001873 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001874 Quotient->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001875
Eric Christopherd37eda82009-08-21 04:06:45 +00001876 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencer9c0696f2007-02-20 08:51:03 +00001877 // order words.
1878 if (lhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001879 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001880 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1881 if (Quotient->isSingleWord())
1882 Quotient->VAL = tmp;
1883 else
1884 Quotient->pVal[0] = tmp;
1885 } else {
1886 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1887 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001888 Quotient->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001889 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1890 }
1891 }
1892
1893 // If the caller wants the remainder
1894 if (Remainder) {
1895 // Set up the Remainder value's memory.
1896 if (Remainder->BitWidth != RHS.BitWidth) {
1897 if (Remainder->isSingleWord())
1898 Remainder->VAL = 0;
1899 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001900 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001901 Remainder->BitWidth = RHS.BitWidth;
1902 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001903 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001904 } else
Jay Foad7a874dd2010-12-01 08:53:58 +00001905 Remainder->clearAllBits();
Reid Spencer9c0696f2007-02-20 08:51:03 +00001906
1907 // The remainder is in R. Reconstitute the remainder into Remainder's low
1908 // order words.
1909 if (rhsWords == 1) {
Eric Christopherd37eda82009-08-21 04:06:45 +00001910 uint64_t tmp =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001911 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1912 if (Remainder->isSingleWord())
1913 Remainder->VAL = tmp;
1914 else
1915 Remainder->pVal[0] = tmp;
1916 } else {
1917 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1918 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopherd37eda82009-08-21 04:06:45 +00001919 Remainder->pVal[i] =
Reid Spencer9c0696f2007-02-20 08:51:03 +00001920 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1921 }
1922 }
1923
1924 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001925 if (U != &SPACE[0]) {
1926 delete [] U;
1927 delete [] V;
1928 delete [] Q;
1929 delete [] R;
1930 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001931}
1932
Reid Spencere81d2da2007-02-16 22:36:51 +00001933APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001934 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001935
1936 // First, deal with the easy case
1937 if (isSingleWord()) {
1938 assert(RHS.VAL != 0 && "Divide by zero?");
1939 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001940 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001941
Reid Spencer71bd08f2007-02-17 02:07:07 +00001942 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner455e9ab2009-01-21 18:09:24 +00001943 unsigned rhsBits = RHS.getActiveBits();
1944 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001945 assert(rhsWords && "Divided by zero???");
Chris Lattner455e9ab2009-01-21 18:09:24 +00001946 unsigned lhsBits = this->getActiveBits();
1947 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001948
1949 // Deal with some degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00001950 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001951 // 0 / X ===> 0
Eric Christopherd37eda82009-08-21 04:06:45 +00001952 return APInt(BitWidth, 0);
Reid Spencere0cdd332007-02-21 08:21:52 +00001953 else if (lhsWords < rhsWords || this->ult(RHS)) {
1954 // X / Y ===> 0, iff X < Y
1955 return APInt(BitWidth, 0);
1956 } else if (*this == RHS) {
1957 // X / X ===> 1
1958 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001959 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001960 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001961 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001962 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001963
1964 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1965 APInt Quotient(1,0); // to hold result.
1966 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1967 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001968}
1969
Reid Spencere81d2da2007-02-16 22:36:51 +00001970APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001971 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001972 if (isSingleWord()) {
1973 assert(RHS.VAL != 0 && "Remainder by zero?");
1974 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001975 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001976
Reid Spencere0cdd332007-02-21 08:21:52 +00001977 // Get some facts about the LHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001978 unsigned lhsBits = getActiveBits();
1979 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001980
1981 // Get some facts about the RHS
Chris Lattner455e9ab2009-01-21 18:09:24 +00001982 unsigned rhsBits = RHS.getActiveBits();
1983 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001984 assert(rhsWords && "Performing remainder operation by zero ???");
1985
Reid Spencer71bd08f2007-02-17 02:07:07 +00001986 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001987 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001988 // 0 % Y ===> 0
1989 return APInt(BitWidth, 0);
1990 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1991 // X % Y ===> X, iff X < Y
1992 return *this;
1993 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001994 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001995 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001996 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001997 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001998 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001999 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002000
Reid Spencer19dc32a2007-05-13 23:44:59 +00002001 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00002002 APInt Remainder(1,0);
2003 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
2004 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00002005}
Reid Spencer5e0a8512007-02-17 03:16:00 +00002006
Eric Christopherd37eda82009-08-21 04:06:45 +00002007void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer19dc32a2007-05-13 23:44:59 +00002008 APInt &Quotient, APInt &Remainder) {
2009 // Get some size facts about the dividend and divisor
Chris Lattner455e9ab2009-01-21 18:09:24 +00002010 unsigned lhsBits = LHS.getActiveBits();
2011 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2012 unsigned rhsBits = RHS.getActiveBits();
2013 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002014
2015 // Check the degenerate cases
Eric Christopherd37eda82009-08-21 04:06:45 +00002016 if (lhsWords == 0) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002017 Quotient = 0; // 0 / Y ===> 0
2018 Remainder = 0; // 0 % Y ===> 0
2019 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002020 }
2021
2022 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Reid Spencer19dc32a2007-05-13 23:44:59 +00002023 Remainder = LHS; // X % Y ===> X, iff X < Y
John McCalld73bf592009-12-24 08:52:06 +00002024 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer19dc32a2007-05-13 23:44:59 +00002025 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002026 }
2027
Reid Spencer19dc32a2007-05-13 23:44:59 +00002028 if (LHS == RHS) {
2029 Quotient = 1; // X / X ===> 1
2030 Remainder = 0; // X % X ===> 0;
2031 return;
Eric Christopherd37eda82009-08-21 04:06:45 +00002032 }
2033
Reid Spencer19dc32a2007-05-13 23:44:59 +00002034 if (lhsWords == 1 && rhsWords == 1) {
2035 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00002036 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2037 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2038 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2039 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00002040 return;
2041 }
2042
2043 // Okay, lets do it the long way
2044 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2045}
2046
Chris Lattner0a0a5852010-10-13 23:54:10 +00002047APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002048 APInt Res = *this+RHS;
2049 Overflow = isNonNegative() == RHS.isNonNegative() &&
2050 Res.isNonNegative() != isNonNegative();
2051 return Res;
2052}
2053
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002054APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2055 APInt Res = *this+RHS;
2056 Overflow = Res.ult(RHS);
2057 return Res;
2058}
2059
Chris Lattner0a0a5852010-10-13 23:54:10 +00002060APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002061 APInt Res = *this - RHS;
2062 Overflow = isNonNegative() != RHS.isNonNegative() &&
2063 Res.isNonNegative() != isNonNegative();
2064 return Res;
2065}
2066
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002067APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnera5bbde82010-10-14 00:30:00 +00002068 APInt Res = *this-RHS;
2069 Overflow = Res.ugt(*this);
Chris Lattnereafc5cb2010-10-14 00:05:07 +00002070 return Res;
2071}
2072
Chris Lattner0a0a5852010-10-13 23:54:10 +00002073APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002074 // MININT/-1 --> overflow.
2075 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2076 return sdiv(RHS);
2077}
2078
Chris Lattner0a0a5852010-10-13 23:54:10 +00002079APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002080 APInt Res = *this * RHS;
2081
2082 if (*this != 0 && RHS != 0)
2083 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2084 else
2085 Overflow = false;
2086 return Res;
2087}
2088
Chris Lattner0a0a5852010-10-13 23:54:10 +00002089APInt APInt::sshl_ov(unsigned ShAmt, bool &Overflow) const {
Chris Lattnerf2ddc642010-10-13 23:46:33 +00002090 Overflow = ShAmt >= getBitWidth();
2091 if (Overflow)
2092 ShAmt = getBitWidth()-1;
2093
2094 if (isNonNegative()) // Don't allow sign change.
2095 Overflow = ShAmt >= countLeadingZeros();
2096 else
2097 Overflow = ShAmt >= countLeadingOnes();
2098
2099 return *this << ShAmt;
2100}
2101
2102
2103
2104
Benjamin Kramer38e59892010-07-14 22:38:02 +00002105void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00002106 // Check our assumptions here
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002107 assert(!str.empty() && "Invalid string length");
Reid Spencer5e0a8512007-02-17 03:16:00 +00002108 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2109 "Radix should be 2, 8, 10, or 16!");
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002110
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002111 StringRef::iterator p = str.begin();
2112 size_t slen = str.size();
2113 bool isNeg = *p == '-';
Erick Tryzelaarbb975312009-08-21 03:15:14 +00002114 if (*p == '-' || *p == '+') {
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002115 p++;
2116 slen--;
Eric Christophere250f2a2009-08-21 04:10:31 +00002117 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002118 }
Chris Lattnera5ae15e2007-05-03 18:15:36 +00002119 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattner38300e92009-04-25 18:34:04 +00002120 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2121 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohman16e02092010-03-24 19:38:02 +00002122 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2123 "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00002124
2125 // Allocate memory
2126 if (!isSingleWord())
2127 pVal = getClearedMemory(getNumWords());
2128
2129 // Figure out if we can shift instead of multiply
Chris Lattner455e9ab2009-01-21 18:09:24 +00002130 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002131
2132 // Set up an APInt for the digit to add outside the loop so we don't
2133 // constantly construct/destruct it.
2134 APInt apdigit(getBitWidth(), 0);
2135 APInt apradix(getBitWidth(), radix);
2136
2137 // Enter digit traversal loop
Daniel Dunbar689ad6e2009-08-13 02:33:34 +00002138 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaarae8f78d2009-08-21 03:15:28 +00002139 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar56c39eb2009-08-21 06:48:37 +00002140 assert(digit < radix && "Invalid character in digit string");
Reid Spencer385f7542007-02-21 03:55:44 +00002141
Reid Spencer6551dcd2007-05-16 19:18:22 +00002142 // Shift or multiply the value by the radix
Chris Lattner38300e92009-04-25 18:34:04 +00002143 if (slen > 1) {
2144 if (shift)
2145 *this <<= shift;
2146 else
2147 *this *= apradix;
2148 }
Reid Spencer385f7542007-02-21 03:55:44 +00002149
2150 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00002151 if (apdigit.isSingleWord())
2152 apdigit.VAL = digit;
2153 else
2154 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00002155 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00002156 }
Reid Spencer9eec2412007-02-25 23:44:53 +00002157 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00002158 if (isNeg) {
2159 (*this)--;
Jay Foad7a874dd2010-12-01 08:53:58 +00002160 this->flipAllBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00002161 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002162}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002163
Chris Lattnerfad86b02008-08-17 07:19:36 +00002164void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
2165 bool Signed) const {
2166 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2) &&
Reid Spencer9c0696f2007-02-20 08:51:03 +00002167 "Radix should be 2, 8, 10, or 16!");
Eric Christopherd37eda82009-08-21 04:06:45 +00002168
Chris Lattnerfad86b02008-08-17 07:19:36 +00002169 // First, check for a zero value and just short circuit the logic below.
2170 if (*this == 0) {
2171 Str.push_back('0');
2172 return;
2173 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002174
Chris Lattnerfad86b02008-08-17 07:19:36 +00002175 static const char Digits[] = "0123456789ABCDEF";
Eric Christopherd37eda82009-08-21 04:06:45 +00002176
Reid Spencer9c0696f2007-02-20 08:51:03 +00002177 if (isSingleWord()) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002178 char Buffer[65];
2179 char *BufPtr = Buffer+65;
Eric Christopherd37eda82009-08-21 04:06:45 +00002180
Chris Lattnerfad86b02008-08-17 07:19:36 +00002181 uint64_t N;
Chris Lattner50839122010-08-18 00:33:47 +00002182 if (!Signed) {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002183 N = getZExtValue();
Chris Lattner50839122010-08-18 00:33:47 +00002184 } else {
2185 int64_t I = getSExtValue();
2186 if (I >= 0) {
2187 N = I;
2188 } else {
2189 Str.push_back('-');
2190 N = -(uint64_t)I;
2191 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002192 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002193
Chris Lattnerfad86b02008-08-17 07:19:36 +00002194 while (N) {
2195 *--BufPtr = Digits[N % Radix];
2196 N /= Radix;
2197 }
2198 Str.append(BufPtr, Buffer+65);
2199 return;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002200 }
2201
Chris Lattnerfad86b02008-08-17 07:19:36 +00002202 APInt Tmp(*this);
Eric Christopherd37eda82009-08-21 04:06:45 +00002203
Chris Lattnerfad86b02008-08-17 07:19:36 +00002204 if (Signed && isNegative()) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002205 // They want to print the signed version and it is a negative value
2206 // Flip the bits and add one to turn it into the equivalent positive
2207 // value and put a '-' in the result.
Jay Foad7a874dd2010-12-01 08:53:58 +00002208 Tmp.flipAllBits();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002209 Tmp++;
2210 Str.push_back('-');
Reid Spencer9c0696f2007-02-20 08:51:03 +00002211 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002212
Chris Lattnerfad86b02008-08-17 07:19:36 +00002213 // We insert the digits backward, then reverse them to get the right order.
2214 unsigned StartDig = Str.size();
Eric Christopherd37eda82009-08-21 04:06:45 +00002215
2216 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2217 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattnerfad86b02008-08-17 07:19:36 +00002218 // equaly. We just shift until the value is zero.
2219 if (Radix != 10) {
2220 // Just shift tmp right for each digit width until it becomes zero
2221 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2222 unsigned MaskAmt = Radix - 1;
Eric Christopherd37eda82009-08-21 04:06:45 +00002223
Chris Lattnerfad86b02008-08-17 07:19:36 +00002224 while (Tmp != 0) {
2225 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2226 Str.push_back(Digits[Digit]);
2227 Tmp = Tmp.lshr(ShiftAmt);
2228 }
2229 } else {
2230 APInt divisor(4, 10);
2231 while (Tmp != 0) {
2232 APInt APdigit(1, 0);
2233 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopherd37eda82009-08-21 04:06:45 +00002234 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattnerfad86b02008-08-17 07:19:36 +00002235 &APdigit);
Chris Lattner455e9ab2009-01-21 18:09:24 +00002236 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002237 assert(Digit < Radix && "divide failed");
2238 Str.push_back(Digits[Digit]);
2239 Tmp = tmp2;
2240 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00002241 }
Eric Christopherd37eda82009-08-21 04:06:45 +00002242
Chris Lattnerfad86b02008-08-17 07:19:36 +00002243 // Reverse the digits before returning.
2244 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencer9c0696f2007-02-20 08:51:03 +00002245}
2246
Chris Lattnerfad86b02008-08-17 07:19:36 +00002247/// toString - This returns the APInt as a std::string. Note that this is an
2248/// inefficient method. It is better to pass in a SmallVector/SmallString
2249/// to the methods above.
2250std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2251 SmallString<40> S;
2252 toString(S, Radix, Signed);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002253 return S.str();
Reid Spencer385f7542007-02-21 03:55:44 +00002254}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002255
Chris Lattnerfad86b02008-08-17 07:19:36 +00002256
2257void APInt::dump() const {
2258 SmallString<40> S, U;
2259 this->toStringUnsigned(U);
2260 this->toStringSigned(S);
David Greene465abed2010-01-05 01:28:52 +00002261 dbgs() << "APInt(" << BitWidth << "b, "
Daniel Dunbardddfd342009-08-19 20:07:03 +00002262 << U.str() << "u " << S.str() << "s)";
Chris Lattnerfad86b02008-08-17 07:19:36 +00002263}
2264
Chris Lattner944fac72008-08-23 22:23:09 +00002265void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattnerfad86b02008-08-17 07:19:36 +00002266 SmallString<40> S;
2267 this->toString(S, 10, isSigned);
Daniel Dunbardddfd342009-08-19 20:07:03 +00002268 OS << S.str();
Chris Lattnerfad86b02008-08-17 07:19:36 +00002269}
2270
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002271// This implements a variety of operations on a representation of
2272// arbitrary precision, two's-complement, bignum integer values.
2273
Chris Lattner91021d32009-08-23 23:11:28 +00002274// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2275// and unrestricting assumption.
Chris Lattner9f17eb02008-08-17 04:58:58 +00002276#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002277COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002278
2279/* Some handy functions local to this file. */
2280namespace {
2281
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002282 /* Returns the integer part with the least significant BITS set.
2283 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002284 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002285 lowBitMask(unsigned int bits)
2286 {
Dan Gohman16e02092010-03-24 19:38:02 +00002287 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002288
2289 return ~(integerPart) 0 >> (integerPartWidth - bits);
2290 }
2291
Neil Booth055c0b32007-10-06 00:43:45 +00002292 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002293 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002294 lowHalf(integerPart part)
2295 {
2296 return part & lowBitMask(integerPartWidth / 2);
2297 }
2298
Neil Booth055c0b32007-10-06 00:43:45 +00002299 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002300 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002301 highHalf(integerPart part)
2302 {
2303 return part >> (integerPartWidth / 2);
2304 }
2305
Neil Booth055c0b32007-10-06 00:43:45 +00002306 /* Returns the bit number of the most significant set bit of a part.
2307 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002308 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002309 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002310 {
2311 unsigned int n, msb;
2312
2313 if (value == 0)
2314 return -1U;
2315
2316 n = integerPartWidth / 2;
2317
2318 msb = 0;
2319 do {
2320 if (value >> n) {
2321 value >>= n;
2322 msb += n;
2323 }
2324
2325 n >>= 1;
2326 } while (n);
2327
2328 return msb;
2329 }
2330
Neil Booth055c0b32007-10-06 00:43:45 +00002331 /* Returns the bit number of the least significant set bit of a
2332 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002333 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002334 partLSB(integerPart value)
2335 {
2336 unsigned int n, lsb;
2337
2338 if (value == 0)
2339 return -1U;
2340
2341 lsb = integerPartWidth - 1;
2342 n = integerPartWidth / 2;
2343
2344 do {
2345 if (value << n) {
2346 value <<= n;
2347 lsb -= n;
2348 }
2349
2350 n >>= 1;
2351 } while (n);
2352
2353 return lsb;
2354 }
2355}
2356
2357/* Sets the least significant part of a bignum to the input value, and
2358 zeroes out higher parts. */
2359void
2360APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2361{
2362 unsigned int i;
2363
Dan Gohman16e02092010-03-24 19:38:02 +00002364 assert(parts > 0);
Neil Booth68e53ad2007-10-08 13:47:12 +00002365
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002366 dst[0] = part;
Dan Gohman16e02092010-03-24 19:38:02 +00002367 for (i = 1; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002368 dst[i] = 0;
2369}
2370
2371/* Assign one bignum to another. */
2372void
2373APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2374{
2375 unsigned int i;
2376
Dan Gohman16e02092010-03-24 19:38:02 +00002377 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002378 dst[i] = src[i];
2379}
2380
2381/* Returns true if a bignum is zero, false otherwise. */
2382bool
2383APInt::tcIsZero(const integerPart *src, unsigned int parts)
2384{
2385 unsigned int i;
2386
Dan Gohman16e02092010-03-24 19:38:02 +00002387 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002388 if (src[i])
2389 return false;
2390
2391 return true;
2392}
2393
2394/* Extract the given bit of a bignum; returns 0 or 1. */
2395int
2396APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2397{
Dan Gohman16e02092010-03-24 19:38:02 +00002398 return (parts[bit / integerPartWidth] &
2399 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002400}
2401
John McCalle12b7382010-02-28 02:51:25 +00002402/* Set the given bit of a bignum. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002403void
2404APInt::tcSetBit(integerPart *parts, unsigned int bit)
2405{
2406 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2407}
2408
John McCalle12b7382010-02-28 02:51:25 +00002409/* Clears the given bit of a bignum. */
2410void
2411APInt::tcClearBit(integerPart *parts, unsigned int bit)
2412{
2413 parts[bit / integerPartWidth] &=
2414 ~((integerPart) 1 << (bit % integerPartWidth));
2415}
2416
Neil Booth055c0b32007-10-06 00:43:45 +00002417/* Returns the bit number of the least significant set bit of a
2418 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002419unsigned int
2420APInt::tcLSB(const integerPart *parts, unsigned int n)
2421{
2422 unsigned int i, lsb;
2423
Dan Gohman16e02092010-03-24 19:38:02 +00002424 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002425 if (parts[i] != 0) {
2426 lsb = partLSB(parts[i]);
2427
2428 return lsb + i * integerPartWidth;
2429 }
2430 }
2431
2432 return -1U;
2433}
2434
Neil Booth055c0b32007-10-06 00:43:45 +00002435/* Returns the bit number of the most significant set bit of a number.
2436 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002437unsigned int
2438APInt::tcMSB(const integerPart *parts, unsigned int n)
2439{
2440 unsigned int msb;
2441
2442 do {
Dan Gohman16e02092010-03-24 19:38:02 +00002443 --n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002444
Dan Gohman16e02092010-03-24 19:38:02 +00002445 if (parts[n] != 0) {
2446 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002447
Dan Gohman16e02092010-03-24 19:38:02 +00002448 return msb + n * integerPartWidth;
2449 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002450 } while (n);
2451
2452 return -1U;
2453}
2454
Neil Booth68e53ad2007-10-08 13:47:12 +00002455/* Copy the bit vector of width srcBITS from SRC, starting at bit
2456 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2457 the least significant bit of DST. All high bits above srcBITS in
2458 DST are zero-filled. */
2459void
Evan Chengcf69a742009-05-21 23:47:47 +00002460APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Booth68e53ad2007-10-08 13:47:12 +00002461 unsigned int srcBits, unsigned int srcLSB)
2462{
2463 unsigned int firstSrcPart, dstParts, shift, n;
2464
2465 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohman16e02092010-03-24 19:38:02 +00002466 assert(dstParts <= dstCount);
Neil Booth68e53ad2007-10-08 13:47:12 +00002467
2468 firstSrcPart = srcLSB / integerPartWidth;
2469 tcAssign (dst, src + firstSrcPart, dstParts);
2470
2471 shift = srcLSB % integerPartWidth;
2472 tcShiftRight (dst, dstParts, shift);
2473
2474 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2475 in DST. If this is less that srcBits, append the rest, else
2476 clear the high bits. */
2477 n = dstParts * integerPartWidth - shift;
2478 if (n < srcBits) {
2479 integerPart mask = lowBitMask (srcBits - n);
2480 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2481 << n % integerPartWidth);
2482 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002483 if (srcBits % integerPartWidth)
2484 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002485 }
2486
2487 /* Clear high parts. */
2488 while (dstParts < dstCount)
2489 dst[dstParts++] = 0;
2490}
2491
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002492/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2493integerPart
2494APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2495 integerPart c, unsigned int parts)
2496{
2497 unsigned int i;
2498
2499 assert(c <= 1);
2500
Dan Gohman16e02092010-03-24 19:38:02 +00002501 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002502 integerPart l;
2503
2504 l = dst[i];
2505 if (c) {
2506 dst[i] += rhs[i] + 1;
2507 c = (dst[i] <= l);
2508 } else {
2509 dst[i] += rhs[i];
2510 c = (dst[i] < l);
2511 }
2512 }
2513
2514 return c;
2515}
2516
2517/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2518integerPart
2519APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2520 integerPart c, unsigned int parts)
2521{
2522 unsigned int i;
2523
2524 assert(c <= 1);
2525
Dan Gohman16e02092010-03-24 19:38:02 +00002526 for (i = 0; i < parts; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002527 integerPart l;
2528
2529 l = dst[i];
2530 if (c) {
2531 dst[i] -= rhs[i] + 1;
2532 c = (dst[i] >= l);
2533 } else {
2534 dst[i] -= rhs[i];
2535 c = (dst[i] > l);
2536 }
2537 }
2538
2539 return c;
2540}
2541
2542/* Negate a bignum in-place. */
2543void
2544APInt::tcNegate(integerPart *dst, unsigned int parts)
2545{
2546 tcComplement(dst, parts);
2547 tcIncrement(dst, parts);
2548}
2549
Neil Booth055c0b32007-10-06 00:43:45 +00002550/* DST += SRC * MULTIPLIER + CARRY if add is true
2551 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002552
2553 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2554 they must start at the same point, i.e. DST == SRC.
2555
2556 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2557 returned. Otherwise DST is filled with the least significant
2558 DSTPARTS parts of the result, and if all of the omitted higher
2559 parts were zero return zero, otherwise overflow occurred and
2560 return one. */
2561int
2562APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2563 integerPart multiplier, integerPart carry,
2564 unsigned int srcParts, unsigned int dstParts,
2565 bool add)
2566{
2567 unsigned int i, n;
2568
2569 /* Otherwise our writes of DST kill our later reads of SRC. */
2570 assert(dst <= src || dst >= src + srcParts);
2571 assert(dstParts <= srcParts + 1);
2572
2573 /* N loops; minimum of dstParts and srcParts. */
2574 n = dstParts < srcParts ? dstParts: srcParts;
2575
Dan Gohman16e02092010-03-24 19:38:02 +00002576 for (i = 0; i < n; i++) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002577 integerPart low, mid, high, srcPart;
2578
2579 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2580
2581 This cannot overflow, because
2582
2583 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2584
2585 which is less than n^2. */
2586
2587 srcPart = src[i];
2588
2589 if (multiplier == 0 || srcPart == 0) {
2590 low = carry;
2591 high = 0;
2592 } else {
2593 low = lowHalf(srcPart) * lowHalf(multiplier);
2594 high = highHalf(srcPart) * highHalf(multiplier);
2595
2596 mid = lowHalf(srcPart) * highHalf(multiplier);
2597 high += highHalf(mid);
2598 mid <<= integerPartWidth / 2;
2599 if (low + mid < low)
2600 high++;
2601 low += mid;
2602
2603 mid = highHalf(srcPart) * lowHalf(multiplier);
2604 high += highHalf(mid);
2605 mid <<= integerPartWidth / 2;
2606 if (low + mid < low)
2607 high++;
2608 low += mid;
2609
2610 /* Now add carry. */
2611 if (low + carry < low)
2612 high++;
2613 low += carry;
2614 }
2615
2616 if (add) {
2617 /* And now DST[i], and store the new low part there. */
2618 if (low + dst[i] < low)
2619 high++;
2620 dst[i] += low;
2621 } else
2622 dst[i] = low;
2623
2624 carry = high;
2625 }
2626
2627 if (i < dstParts) {
2628 /* Full multiplication, there is no overflow. */
2629 assert(i + 1 == dstParts);
2630 dst[i] = carry;
2631 return 0;
2632 } else {
2633 /* We overflowed if there is carry. */
2634 if (carry)
2635 return 1;
2636
2637 /* We would overflow if any significant unwritten parts would be
2638 non-zero. This is true if any remaining src parts are non-zero
2639 and the multiplier is non-zero. */
2640 if (multiplier)
Dan Gohman16e02092010-03-24 19:38:02 +00002641 for (; i < srcParts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002642 if (src[i])
2643 return 1;
2644
2645 /* We fitted in the narrow destination. */
2646 return 0;
2647 }
2648}
2649
2650/* DST = LHS * RHS, where DST has the same width as the operands and
2651 is filled with the least significant parts of the result. Returns
2652 one if overflow occurred, otherwise zero. DST must be disjoint
2653 from both operands. */
2654int
2655APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2656 const integerPart *rhs, unsigned int parts)
2657{
2658 unsigned int i;
2659 int overflow;
2660
2661 assert(dst != lhs && dst != rhs);
2662
2663 overflow = 0;
2664 tcSet(dst, 0, parts);
2665
Dan Gohman16e02092010-03-24 19:38:02 +00002666 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002667 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2668 parts - i, true);
2669
2670 return overflow;
2671}
2672
Neil Booth978661d2007-10-06 00:24:48 +00002673/* DST = LHS * RHS, where DST has width the sum of the widths of the
2674 operands. No overflow occurs. DST must be disjoint from both
2675 operands. Returns the number of parts required to hold the
2676 result. */
2677unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002678APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002679 const integerPart *rhs, unsigned int lhsParts,
2680 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002681{
Neil Booth978661d2007-10-06 00:24:48 +00002682 /* Put the narrower number on the LHS for less loops below. */
2683 if (lhsParts > rhsParts) {
2684 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2685 } else {
2686 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002687
Neil Booth978661d2007-10-06 00:24:48 +00002688 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002689
Neil Booth978661d2007-10-06 00:24:48 +00002690 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002691
Dan Gohman16e02092010-03-24 19:38:02 +00002692 for (n = 0; n < lhsParts; n++)
Neil Booth978661d2007-10-06 00:24:48 +00002693 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002694
Neil Booth978661d2007-10-06 00:24:48 +00002695 n = lhsParts + rhsParts;
2696
2697 return n - (dst[n - 1] == 0);
2698 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002699}
2700
2701/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2702 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2703 set REMAINDER to the remainder, return zero. i.e.
2704
2705 OLD_LHS = RHS * LHS + REMAINDER
2706
2707 SCRATCH is a bignum of the same size as the operands and result for
2708 use by the routine; its contents need not be initialized and are
2709 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2710*/
2711int
2712APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2713 integerPart *remainder, integerPart *srhs,
2714 unsigned int parts)
2715{
2716 unsigned int n, shiftCount;
2717 integerPart mask;
2718
2719 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2720
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002721 shiftCount = tcMSB(rhs, parts) + 1;
2722 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002723 return true;
2724
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002725 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002726 n = shiftCount / integerPartWidth;
2727 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2728
2729 tcAssign(srhs, rhs, parts);
2730 tcShiftLeft(srhs, parts, shiftCount);
2731 tcAssign(remainder, lhs, parts);
2732 tcSet(lhs, 0, parts);
2733
2734 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2735 the total. */
Dan Gohman16e02092010-03-24 19:38:02 +00002736 for (;;) {
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002737 int compare;
2738
2739 compare = tcCompare(remainder, srhs, parts);
2740 if (compare >= 0) {
2741 tcSubtract(remainder, srhs, 0, parts);
2742 lhs[n] |= mask;
2743 }
2744
2745 if (shiftCount == 0)
2746 break;
2747 shiftCount--;
2748 tcShiftRight(srhs, parts, 1);
2749 if ((mask >>= 1) == 0)
2750 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2751 }
2752
2753 return false;
2754}
2755
2756/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2757 There are no restrictions on COUNT. */
2758void
2759APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2760{
Neil Booth68e53ad2007-10-08 13:47:12 +00002761 if (count) {
2762 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002763
Neil Booth68e53ad2007-10-08 13:47:12 +00002764 /* Jump is the inter-part jump; shift is is intra-part shift. */
2765 jump = count / integerPartWidth;
2766 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002767
Neil Booth68e53ad2007-10-08 13:47:12 +00002768 while (parts > jump) {
2769 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002770
Neil Booth68e53ad2007-10-08 13:47:12 +00002771 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002772
Neil Booth68e53ad2007-10-08 13:47:12 +00002773 /* dst[i] comes from the two parts src[i - jump] and, if we have
2774 an intra-part shift, src[i - jump - 1]. */
2775 part = dst[parts - jump];
2776 if (shift) {
2777 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002778 if (parts >= jump + 1)
2779 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2780 }
2781
Neil Booth68e53ad2007-10-08 13:47:12 +00002782 dst[parts] = part;
2783 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002784
Neil Booth68e53ad2007-10-08 13:47:12 +00002785 while (parts > 0)
2786 dst[--parts] = 0;
2787 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002788}
2789
2790/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2791 zero. There are no restrictions on COUNT. */
2792void
2793APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2794{
Neil Booth68e53ad2007-10-08 13:47:12 +00002795 if (count) {
2796 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002797
Neil Booth68e53ad2007-10-08 13:47:12 +00002798 /* Jump is the inter-part jump; shift is is intra-part shift. */
2799 jump = count / integerPartWidth;
2800 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002801
Neil Booth68e53ad2007-10-08 13:47:12 +00002802 /* Perform the shift. This leaves the most significant COUNT bits
2803 of the result at zero. */
Dan Gohman16e02092010-03-24 19:38:02 +00002804 for (i = 0; i < parts; i++) {
Neil Booth68e53ad2007-10-08 13:47:12 +00002805 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002806
Neil Booth68e53ad2007-10-08 13:47:12 +00002807 if (i + jump >= parts) {
2808 part = 0;
2809 } else {
2810 part = dst[i + jump];
2811 if (shift) {
2812 part >>= shift;
2813 if (i + jump + 1 < parts)
2814 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2815 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002816 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002817
Neil Booth68e53ad2007-10-08 13:47:12 +00002818 dst[i] = part;
2819 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002820 }
2821}
2822
2823/* Bitwise and of two bignums. */
2824void
2825APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2826{
2827 unsigned int i;
2828
Dan Gohman16e02092010-03-24 19:38:02 +00002829 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002830 dst[i] &= rhs[i];
2831}
2832
2833/* Bitwise inclusive or of two bignums. */
2834void
2835APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2836{
2837 unsigned int i;
2838
Dan Gohman16e02092010-03-24 19:38:02 +00002839 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002840 dst[i] |= rhs[i];
2841}
2842
2843/* Bitwise exclusive or of two bignums. */
2844void
2845APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2846{
2847 unsigned int i;
2848
Dan Gohman16e02092010-03-24 19:38:02 +00002849 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002850 dst[i] ^= rhs[i];
2851}
2852
2853/* Complement a bignum in-place. */
2854void
2855APInt::tcComplement(integerPart *dst, unsigned int parts)
2856{
2857 unsigned int i;
2858
Dan Gohman16e02092010-03-24 19:38:02 +00002859 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002860 dst[i] = ~dst[i];
2861}
2862
2863/* Comparison (unsigned) of two bignums. */
2864int
2865APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2866 unsigned int parts)
2867{
2868 while (parts) {
2869 parts--;
2870 if (lhs[parts] == rhs[parts])
2871 continue;
2872
2873 if (lhs[parts] > rhs[parts])
2874 return 1;
2875 else
2876 return -1;
2877 }
2878
2879 return 0;
2880}
2881
2882/* Increment a bignum in-place, return the carry flag. */
2883integerPart
2884APInt::tcIncrement(integerPart *dst, unsigned int parts)
2885{
2886 unsigned int i;
2887
Dan Gohman16e02092010-03-24 19:38:02 +00002888 for (i = 0; i < parts; i++)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002889 if (++dst[i] != 0)
2890 break;
2891
2892 return i == parts;
2893}
2894
2895/* Set the least significant BITS bits of a bignum, clear the
2896 rest. */
2897void
2898APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2899 unsigned int bits)
2900{
2901 unsigned int i;
2902
2903 i = 0;
2904 while (bits > integerPartWidth) {
2905 dst[i++] = ~(integerPart) 0;
2906 bits -= integerPartWidth;
2907 }
2908
2909 if (bits)
2910 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2911
2912 while (i < parts)
2913 dst[i++] = 0;
2914}