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