blob: d579ae0965b338eb84b934717fabe1b616f0e2e7 [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"
Ted Kremeneke420deb2008-01-19 04:23:33 +000017#include "llvm/ADT/FoldingSet.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000018#include "llvm/Support/Debug.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000019#include "llvm/Support/MathExtras.h"
Jeff Cohenca5183d2007-03-05 00:00:42 +000020#include <math.h>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000021#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000022#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000023#include <cstdlib>
Reid Spencer385f7542007-02-21 03:55:44 +000024#include <iomanip>
Reid Spencer385f7542007-02-21 03:55:44 +000025
Zhou Shengfd43dcf2007-02-06 03:00:16 +000026using namespace llvm;
27
Reid Spencer9af18872007-12-11 06:53:58 +000028/// This enumeration just provides for internal constants used in this
29/// translation unit.
30enum {
31 MIN_INT_BITS = 1, ///< Minimum number of bits that can be specified
32 ///< Note that this must remain synchronized with IntegerType::MIN_INT_BITS
33 MAX_INT_BITS = (1<<23)-1 ///< Maximum number of bits that can be specified
34 ///< Note that this must remain synchronized with IntegerType::MAX_INT_BITS
35};
36
Reid Spencer5d0d05c2007-02-25 19:32:03 +000037/// A utility function for allocating memory, checking for allocation failures,
38/// and ensuring the contents are zeroed.
Reid Spenceraf0e9562007-02-18 18:38:44 +000039inline static uint64_t* getClearedMemory(uint32_t numWords) {
40 uint64_t * result = new uint64_t[numWords];
41 assert(result && "APInt memory allocation fails!");
42 memset(result, 0, numWords * sizeof(uint64_t));
43 return result;
Zhou Sheng353815d2007-02-06 06:04:53 +000044}
45
Reid Spencer5d0d05c2007-02-25 19:32:03 +000046/// A utility function for allocating memory and checking for allocation
47/// failure. The content is not zeroed.
Reid Spenceraf0e9562007-02-18 18:38:44 +000048inline static uint64_t* getMemory(uint32_t numWords) {
49 uint64_t * result = new uint64_t[numWords];
50 assert(result && "APInt memory allocation fails!");
51 return result;
52}
53
Reid Spenceradf2a202007-03-19 21:19:02 +000054APInt::APInt(uint32_t numBits, uint64_t val, bool isSigned)
Reid Spencer3a341372007-03-19 20:37:47 +000055 : BitWidth(numBits), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +000056 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
57 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Reid Spencer5d0d05c2007-02-25 19:32:03 +000058 if (isSingleWord())
59 VAL = val;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000060 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +000061 pVal = getClearedMemory(getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +000062 pVal[0] = val;
Reid Spencer3a341372007-03-19 20:37:47 +000063 if (isSigned && int64_t(val) < 0)
64 for (unsigned i = 1; i < getNumWords(); ++i)
65 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000066 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +000067 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +000068}
69
Dale Johannesen910993e2007-09-21 22:09:37 +000070APInt::APInt(uint32_t numBits, uint32_t numWords, const uint64_t bigVal[])
Reid Spencer385f7542007-02-21 03:55:44 +000071 : BitWidth(numBits), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +000072 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
73 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000074 assert(bigVal && "Null pointer detected!");
75 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000076 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000077 else {
Reid Spencer610fad82007-02-24 10:01:42 +000078 // Get memory, cleared to 0
79 pVal = getClearedMemory(getNumWords());
80 // Calculate the number of words to copy
81 uint32_t words = std::min<uint32_t>(numWords, getNumWords());
82 // Copy the words from bigVal to pVal
83 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +000084 }
Reid Spencer610fad82007-02-24 10:01:42 +000085 // Make sure unused high bits are cleared
86 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +000087}
88
Reid Spenceraf0e9562007-02-18 18:38:44 +000089APInt::APInt(uint32_t numbits, const char StrStart[], uint32_t slen,
Reid Spencer9c0696f2007-02-20 08:51:03 +000090 uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +000091 : BitWidth(numbits), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +000092 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
93 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Reid Spencere81d2da2007-02-16 22:36:51 +000094 fromString(numbits, StrStart, slen, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +000095}
96
Reid Spencer54362ca2007-02-20 23:40:25 +000097APInt::APInt(const APInt& that)
Reid Spencer385f7542007-02-21 03:55:44 +000098 : BitWidth(that.BitWidth), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +000099 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
100 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Reid Spenceraf0e9562007-02-18 18:38:44 +0000101 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000102 VAL = that.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000103 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000104 pVal = getMemory(getNumWords());
Reid Spencer54362ca2007-02-20 23:40:25 +0000105 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000106 }
107}
108
109APInt::~APInt() {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000110 if (!isSingleWord() && pVal)
Reid Spencer9ac44112007-02-26 23:38:21 +0000111 delete [] pVal;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000112}
113
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000114APInt& APInt::operator=(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000115 // Don't do anything for X = X
116 if (this == &RHS)
117 return *this;
118
119 // If the bitwidths are the same, we can avoid mucking with memory
120 if (BitWidth == RHS.getBitWidth()) {
121 if (isSingleWord())
122 VAL = RHS.VAL;
123 else
124 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
125 return *this;
126 }
127
128 if (isSingleWord())
129 if (RHS.isSingleWord())
130 VAL = RHS.VAL;
131 else {
132 VAL = 0;
133 pVal = getMemory(RHS.getNumWords());
134 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
135 }
136 else if (getNumWords() == RHS.getNumWords())
137 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
138 else if (RHS.isSingleWord()) {
139 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000140 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000141 } else {
142 delete [] pVal;
143 pVal = getMemory(RHS.getNumWords());
144 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
145 }
146 BitWidth = RHS.BitWidth;
147 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000148}
149
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000150APInt& APInt::operator=(uint64_t RHS) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000151 if (isSingleWord())
152 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000153 else {
154 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000155 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000156 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000157 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000158}
159
Ted Kremeneke420deb2008-01-19 04:23:33 +0000160/// Profile - This method 'profiles' an APInt for use with FoldingSet.
161void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremeneka795aca2008-02-19 20:50:41 +0000162 ID.AddInteger(BitWidth);
163
Ted Kremeneke420deb2008-01-19 04:23:33 +0000164 if (isSingleWord()) {
165 ID.AddInteger(VAL);
166 return;
167 }
168
169 uint32_t NumWords = getNumWords();
170 for (unsigned i = 0; i < NumWords; ++i)
171 ID.AddInteger(pVal[i]);
172}
173
Reid Spenceraf0e9562007-02-18 18:38:44 +0000174/// add_1 - This function adds a single "digit" integer, y, to the multiple
175/// "digit" integer array, x[]. x[] is modified to reflect the addition and
176/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000177/// @returns the carry of the addition.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000178static bool add_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000179 for (uint32_t i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000180 dest[i] = y + x[i];
181 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000182 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000183 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000184 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000185 break;
186 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000187 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000188 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000189}
190
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000191/// @brief Prefix increment operator. Increments the APInt by one.
192APInt& APInt::operator++() {
Reid Spencere81d2da2007-02-16 22:36:51 +0000193 if (isSingleWord())
194 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000195 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000196 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000197 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000198}
199
Reid Spenceraf0e9562007-02-18 18:38:44 +0000200/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
201/// the multi-digit integer array, x[], propagating the borrowed 1 value until
202/// no further borrowing is neeeded or it runs out of "digits" in x. The result
203/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
204/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000205/// @returns the borrow out of the subtraction
206static bool sub_1(uint64_t x[], uint32_t len, uint64_t y) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000207 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000208 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000209 x[i] -= y;
210 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000211 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000212 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000213 y = 0; // No need to borrow
214 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000215 }
216 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000217 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000218}
219
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000220/// @brief Prefix decrement operator. Decrements the APInt by one.
221APInt& APInt::operator--() {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000222 if (isSingleWord())
223 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000224 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000225 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000226 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000227}
228
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000229/// add - This function adds the integer array x to the integer array Y and
230/// places the result in dest.
231/// @returns the carry out from the addition
232/// @brief General addition of 64-bit integer arrays
Reid Spencer9d6c9192007-02-24 03:58:46 +0000233static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
234 uint32_t len) {
235 bool carry = false;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000236 for (uint32_t i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000237 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000238 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000239 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000240 }
241 return carry;
242}
243
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000244/// Adds the RHS APint to this APInt.
245/// @returns this, after addition of RHS.
246/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000247APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000248 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer54362ca2007-02-20 23:40:25 +0000249 if (isSingleWord())
250 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000251 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000252 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000253 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000254 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000255}
256
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000257/// Subtracts the integer array y from the integer array x
258/// @returns returns the borrow out.
259/// @brief Generalized subtraction of 64-bit integer arrays.
Reid Spencer9d6c9192007-02-24 03:58:46 +0000260static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
261 uint32_t len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000262 bool borrow = false;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000263 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000264 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
265 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
266 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000267 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000268 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000269}
270
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000271/// Subtracts the RHS APInt from this APInt
272/// @returns this, after subtraction
273/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000274APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000275 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000276 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000277 VAL -= RHS.VAL;
278 else
279 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000280 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000281}
282
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000283/// Multiplies an integer array, x by a a uint64_t integer and places the result
284/// into dest.
285/// @returns the carry out of the multiplication.
286/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Reid Spencer610fad82007-02-24 10:01:42 +0000287static uint64_t mul_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
288 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000289 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000290 uint64_t carry = 0;
291
292 // For each digit of x.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000293 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000294 // Split x into high and low words
295 uint64_t lx = x[i] & 0xffffffffULL;
296 uint64_t hx = x[i] >> 32;
297 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000298 // hasCarry == 0, no carry
299 // hasCarry == 1, has carry
300 // hasCarry == 2, no carry and the calculation result == 0.
301 uint8_t hasCarry = 0;
302 dest[i] = carry + lx * ly;
303 // Determine if the add above introduces carry.
304 hasCarry = (dest[i] < carry) ? 1 : 0;
305 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
306 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
307 // (2^32 - 1) + 2^32 = 2^64.
308 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
309
310 carry += (lx * hy) & 0xffffffffULL;
311 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
312 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
313 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
314 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000315 return carry;
316}
317
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000318/// Multiplies integer array x by integer array y and stores the result into
319/// the integer array dest. Note that dest's size must be >= xlen + ylen.
320/// @brief Generalized multiplicate of integer arrays.
Reid Spencer610fad82007-02-24 10:01:42 +0000321static void mul(uint64_t dest[], uint64_t x[], uint32_t xlen, uint64_t y[],
322 uint32_t ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000323 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000324 for (uint32_t i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000325 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000326 uint64_t carry = 0, lx = 0, hx = 0;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000327 for (uint32_t j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000328 lx = x[j] & 0xffffffffULL;
329 hx = x[j] >> 32;
330 // hasCarry - A flag to indicate if has carry.
331 // hasCarry == 0, no carry
332 // hasCarry == 1, has carry
333 // hasCarry == 2, no carry and the calculation result == 0.
334 uint8_t hasCarry = 0;
335 uint64_t resul = carry + lx * ly;
336 hasCarry = (resul < carry) ? 1 : 0;
337 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
338 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
339
340 carry += (lx * hy) & 0xffffffffULL;
341 resul = (carry << 32) | (resul & 0xffffffffULL);
342 dest[i+j] += resul;
343 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
344 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
345 ((lx * hy) >> 32) + hx * hy;
346 }
347 dest[i+xlen] = carry;
348 }
349}
350
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000351APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000352 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000353 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000354 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000355 clearUnusedBits();
356 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000357 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000358
359 // Get some bit facts about LHS and check for zero
360 uint32_t lhsBits = getActiveBits();
361 uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
362 if (!lhsWords)
363 // 0 * X ===> 0
364 return *this;
365
366 // Get some bit facts about RHS and check for zero
367 uint32_t rhsBits = RHS.getActiveBits();
368 uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
369 if (!rhsWords) {
370 // X * 0 ===> 0
371 clear();
372 return *this;
373 }
374
375 // Allocate space for the result
376 uint32_t destWords = rhsWords + lhsWords;
377 uint64_t *dest = getMemory(destWords);
378
379 // Perform the long multiply
380 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
381
382 // Copy result back into *this
383 clear();
384 uint32_t wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
385 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
386
387 // delete dest array and return
388 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000389 return *this;
390}
391
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000392APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000393 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000394 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000395 VAL &= RHS.VAL;
396 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000397 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000398 uint32_t numWords = getNumWords();
399 for (uint32_t i = 0; i < numWords; ++i)
400 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000401 return *this;
402}
403
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000404APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000405 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000406 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000407 VAL |= RHS.VAL;
408 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000409 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000410 uint32_t numWords = getNumWords();
411 for (uint32_t i = 0; i < numWords; ++i)
412 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000413 return *this;
414}
415
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000416APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000417 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000418 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000419 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000420 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000421 return *this;
422 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000423 uint32_t numWords = getNumWords();
424 for (uint32_t i = 0; i < numWords; ++i)
425 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000426 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000427}
428
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000429APInt APInt::operator&(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000430 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spenceraf0e9562007-02-18 18:38:44 +0000431 if (isSingleWord())
432 return APInt(getBitWidth(), VAL & RHS.VAL);
433
Reid Spenceraf0e9562007-02-18 18:38:44 +0000434 uint32_t numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000435 uint64_t* val = getMemory(numWords);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000436 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000437 val[i] = pVal[i] & RHS.pVal[i];
438 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000439}
440
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000441APInt APInt::operator|(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000442 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spenceraf0e9562007-02-18 18:38:44 +0000443 if (isSingleWord())
444 return APInt(getBitWidth(), VAL | RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000445
Reid Spenceraf0e9562007-02-18 18:38:44 +0000446 uint32_t numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000447 uint64_t *val = getMemory(numWords);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000448 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000449 val[i] = pVal[i] | RHS.pVal[i];
450 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000451}
452
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000453APInt APInt::operator^(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000454 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000455 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000456 return APInt(BitWidth, VAL ^ RHS.VAL);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000457
Reid Spenceraf0e9562007-02-18 18:38:44 +0000458 uint32_t numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000459 uint64_t *val = getMemory(numWords);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000460 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000461 val[i] = pVal[i] ^ RHS.pVal[i];
462
463 // 0^0==1 so clear the high bits in case they got set.
464 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000465}
466
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000467bool APInt::operator !() const {
468 if (isSingleWord())
469 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000470
471 for (uint32_t i = 0; i < getNumWords(); ++i)
472 if (pVal[i])
473 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000474 return true;
475}
476
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000477APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000478 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000479 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000480 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000481 APInt Result(*this);
482 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000483 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000484}
485
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000486APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000487 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000488 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000489 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000490 APInt Result(BitWidth, 0);
491 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000492 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000493}
494
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000495APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000496 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000497 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000498 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000499 APInt Result(BitWidth, 0);
500 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000501 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000502}
503
Reid Spenceraf0e9562007-02-18 18:38:44 +0000504bool APInt::operator[](uint32_t bitPosition) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000505 return (maskBit(bitPosition) &
506 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000507}
508
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000509bool APInt::operator==(const APInt& RHS) const {
Reid Spencer9ac44112007-02-26 23:38:21 +0000510 assert(BitWidth == RHS.BitWidth && "Comparison requires equal bit widths");
Reid Spencer54362ca2007-02-20 23:40:25 +0000511 if (isSingleWord())
512 return VAL == RHS.VAL;
513
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000514 // Get some facts about the number of bits used in the two operands.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000515 uint32_t n1 = getActiveBits();
516 uint32_t n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000517
518 // If the number of bits isn't the same, they aren't equal
Reid Spencer54362ca2007-02-20 23:40:25 +0000519 if (n1 != n2)
520 return false;
521
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000522 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000523 if (n1 <= APINT_BITS_PER_WORD)
524 return pVal[0] == RHS.pVal[0];
525
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000526 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000527 for (int i = whichWord(n1 - 1); i >= 0; --i)
528 if (pVal[i] != RHS.pVal[i])
529 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000530 return true;
531}
532
Zhou Shenga3832fd2007-02-07 06:14:53 +0000533bool APInt::operator==(uint64_t Val) const {
534 if (isSingleWord())
535 return VAL == Val;
Reid Spencer54362ca2007-02-20 23:40:25 +0000536
537 uint32_t n = getActiveBits();
538 if (n <= APINT_BITS_PER_WORD)
539 return pVal[0] == Val;
540 else
541 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000542}
543
Reid Spencere81d2da2007-02-16 22:36:51 +0000544bool APInt::ult(const APInt& RHS) const {
545 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
546 if (isSingleWord())
547 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000548
549 // Get active bit length of both operands
550 uint32_t n1 = getActiveBits();
551 uint32_t n2 = RHS.getActiveBits();
552
553 // If magnitude of LHS is less than RHS, return true.
554 if (n1 < n2)
555 return true;
556
557 // If magnitude of RHS is greather than LHS, return false.
558 if (n2 < n1)
559 return false;
560
561 // If they bot fit in a word, just compare the low order word
562 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
563 return pVal[0] < RHS.pVal[0];
564
565 // Otherwise, compare all words
Reid Spencer1fa111e2007-02-27 18:23:40 +0000566 uint32_t topWord = whichWord(std::max(n1,n2)-1);
567 for (int i = topWord; i >= 0; --i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000568 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000569 return false;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000570 if (pVal[i] < RHS.pVal[i])
571 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000572 }
573 return false;
574}
575
Reid Spencere81d2da2007-02-16 22:36:51 +0000576bool APInt::slt(const APInt& RHS) const {
577 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000578 if (isSingleWord()) {
579 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
580 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
581 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000582 }
Reid Spencera58f0582007-02-18 20:09:41 +0000583
584 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000585 APInt rhs(RHS);
586 bool lhsNeg = isNegative();
587 bool rhsNeg = rhs.isNegative();
588 if (lhsNeg) {
589 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000590 lhs.flip();
591 lhs++;
592 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000593 if (rhsNeg) {
594 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000595 rhs.flip();
596 rhs++;
597 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000598
599 // Now we have unsigned values to compare so do the comparison if necessary
600 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000601 if (lhsNeg)
602 if (rhsNeg)
603 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000604 else
605 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000606 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000607 return false;
608 else
609 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000610}
611
Reid Spenceraf0e9562007-02-18 18:38:44 +0000612APInt& APInt::set(uint32_t bitPosition) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000613 if (isSingleWord())
614 VAL |= maskBit(bitPosition);
615 else
616 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000617 return *this;
618}
619
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000620APInt& APInt::set() {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000621 if (isSingleWord()) {
622 VAL = -1ULL;
623 return clearUnusedBits();
Zhou Shengb04973e2007-02-15 06:36:31 +0000624 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000625
626 // Set all the bits in all the words.
Zhou Sheng6dbe2332007-03-21 04:34:37 +0000627 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000628 pVal[i] = -1ULL;
629 // Clear the unused ones
630 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000631}
632
633/// Set the given bit to 0 whose position is given as "bitPosition".
634/// @brief Set a given bit to 0.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000635APInt& APInt::clear(uint32_t bitPosition) {
636 if (isSingleWord())
637 VAL &= ~maskBit(bitPosition);
638 else
639 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000640 return *this;
641}
642
643/// @brief Set every bit to 0.
644APInt& APInt::clear() {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000645 if (isSingleWord())
646 VAL = 0;
Zhou Shenga3832fd2007-02-07 06:14:53 +0000647 else
Reid Spencera58f0582007-02-18 20:09:41 +0000648 memset(pVal, 0, getNumWords() * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000649 return *this;
650}
651
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000652/// @brief Bitwise NOT operator. Performs a bitwise logical NOT operation on
653/// this APInt.
654APInt APInt::operator~() const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000655 APInt Result(*this);
656 Result.flip();
657 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000658}
659
660/// @brief Toggle every bit to its opposite value.
661APInt& APInt::flip() {
Reid Spencer9eec2412007-02-25 23:44:53 +0000662 if (isSingleWord()) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000663 VAL ^= -1ULL;
Reid Spencer9eec2412007-02-25 23:44:53 +0000664 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000665 }
Reid Spencer9eec2412007-02-25 23:44:53 +0000666 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000667 pVal[i] ^= -1ULL;
Reid Spencer9eec2412007-02-25 23:44:53 +0000668 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000669}
670
671/// Toggle a given bit to its opposite value whose position is given
672/// as "bitPosition".
673/// @brief Toggles a given bit to its opposite value.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000674APInt& APInt::flip(uint32_t bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000675 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000676 if ((*this)[bitPosition]) clear(bitPosition);
677 else set(bitPosition);
678 return *this;
679}
680
Reid Spencer57ae4f52007-04-13 19:19:07 +0000681uint32_t APInt::getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) {
682 assert(str != 0 && "Invalid value string");
683 assert(slen > 0 && "Invalid string length");
684
685 // Each computation below needs to know if its negative
686 uint32_t isNegative = str[0] == '-';
687 if (isNegative) {
688 slen--;
689 str++;
690 }
691 // For radixes of power-of-two values, the bits required is accurately and
692 // easily computed
693 if (radix == 2)
694 return slen + isNegative;
695 if (radix == 8)
696 return slen * 3 + isNegative;
697 if (radix == 16)
698 return slen * 4 + isNegative;
699
700 // Otherwise it must be radix == 10, the hard case
701 assert(radix == 10 && "Invalid radix");
702
703 // This is grossly inefficient but accurate. We could probably do something
704 // with a computation of roughly slen*64/20 and then adjust by the value of
705 // the first few digits. But, I'm not sure how accurate that could be.
706
707 // Compute a sufficient number of bits that is always large enough but might
708 // be too large. This avoids the assertion in the constructor.
709 uint32_t sufficient = slen*64/18;
710
711 // Convert to the actual binary value.
712 APInt tmp(sufficient, str, slen, radix);
713
714 // Compute how many bits are required.
Reid Spencer0468ab32007-04-14 00:00:10 +0000715 return isNegative + tmp.logBase2() + 1;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000716}
717
Reid Spencer794f4722007-02-26 21:02:27 +0000718uint64_t APInt::getHashValue() const {
Reid Spencer9ac44112007-02-26 23:38:21 +0000719 // Put the bit width into the low order bits.
720 uint64_t hash = BitWidth;
Reid Spencer794f4722007-02-26 21:02:27 +0000721
722 // Add the sum of the words to the hash.
723 if (isSingleWord())
Reid Spencer9ac44112007-02-26 23:38:21 +0000724 hash += VAL << 6; // clear separation of up to 64 bits
Reid Spencer794f4722007-02-26 21:02:27 +0000725 else
726 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer9ac44112007-02-26 23:38:21 +0000727 hash += pVal[i] << 6; // clear sepration of up to 64 bits
Reid Spencer794f4722007-02-26 21:02:27 +0000728 return hash;
729}
730
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000731/// HiBits - This function returns the high "numBits" bits of this APInt.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000732APInt APInt::getHiBits(uint32_t numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000733 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000734}
735
736/// LoBits - This function returns the low "numBits" bits of this APInt.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000737APInt APInt::getLoBits(uint32_t numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000738 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
739 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000740}
741
Reid Spencere81d2da2007-02-16 22:36:51 +0000742bool APInt::isPowerOf2() const {
743 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
744}
745
Reid Spenceraf0e9562007-02-18 18:38:44 +0000746uint32_t APInt::countLeadingZeros() const {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000747 uint32_t Count = 0;
Reid Spencere549c492007-02-21 00:29:48 +0000748 if (isSingleWord())
749 Count = CountLeadingZeros_64(VAL);
750 else {
751 for (uint32_t i = getNumWords(); i > 0u; --i) {
752 if (pVal[i-1] == 0)
753 Count += APINT_BITS_PER_WORD;
754 else {
755 Count += CountLeadingZeros_64(pVal[i-1]);
756 break;
757 }
758 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000759 }
Reid Spencerab2b2c82007-02-22 00:22:00 +0000760 uint32_t remainder = BitWidth % APINT_BITS_PER_WORD;
761 if (remainder)
762 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner9e513ac2007-11-23 22:42:31 +0000763 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000764}
765
Reid Spencer681dcd12007-02-27 21:59:26 +0000766static uint32_t countLeadingOnes_64(uint64_t V, uint32_t skip) {
767 uint32_t Count = 0;
768 if (skip)
769 V <<= skip;
770 while (V && (V & (1ULL << 63))) {
771 Count++;
772 V <<= 1;
773 }
774 return Count;
775}
776
777uint32_t APInt::countLeadingOnes() const {
778 if (isSingleWord())
779 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
780
781 uint32_t highWordBits = BitWidth % APINT_BITS_PER_WORD;
782 uint32_t shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits);
783 int i = getNumWords() - 1;
784 uint32_t Count = countLeadingOnes_64(pVal[i], shift);
785 if (Count == highWordBits) {
786 for (i--; i >= 0; --i) {
787 if (pVal[i] == -1ULL)
788 Count += APINT_BITS_PER_WORD;
789 else {
790 Count += countLeadingOnes_64(pVal[i], 0);
791 break;
792 }
793 }
794 }
795 return Count;
796}
797
Reid Spenceraf0e9562007-02-18 18:38:44 +0000798uint32_t APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000799 if (isSingleWord())
Anton Korobeynikov97d37262007-12-24 11:16:47 +0000800 return std::min(uint32_t(CountTrailingZeros_64(VAL)), BitWidth);
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000801 uint32_t Count = 0;
802 uint32_t i = 0;
803 for (; i < getNumWords() && pVal[i] == 0; ++i)
804 Count += APINT_BITS_PER_WORD;
805 if (i < getNumWords())
806 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000807 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000808}
809
Dan Gohman42dd77f2008-02-13 21:11:05 +0000810uint32_t APInt::countTrailingOnes() const {
811 if (isSingleWord())
812 return std::min(uint32_t(CountTrailingOnes_64(VAL)), BitWidth);
813 uint32_t Count = 0;
814 uint32_t i = 0;
Dan Gohman5a0e7b42008-02-14 22:38:45 +0000815 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman42dd77f2008-02-13 21:11:05 +0000816 Count += APINT_BITS_PER_WORD;
817 if (i < getNumWords())
818 Count += CountTrailingOnes_64(pVal[i]);
819 return std::min(Count, BitWidth);
820}
821
Reid Spenceraf0e9562007-02-18 18:38:44 +0000822uint32_t APInt::countPopulation() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000823 if (isSingleWord())
824 return CountPopulation_64(VAL);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000825 uint32_t Count = 0;
826 for (uint32_t i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000827 Count += CountPopulation_64(pVal[i]);
828 return Count;
829}
830
Reid Spencere81d2da2007-02-16 22:36:51 +0000831APInt APInt::byteSwap() const {
832 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
833 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000834 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000835 else if (BitWidth == 32)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000836 return APInt(BitWidth, ByteSwap_32(uint32_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000837 else if (BitWidth == 48) {
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000838 uint32_t Tmp1 = uint32_t(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000839 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000840 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000841 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000842 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000843 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000844 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000845 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000846 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000847 char *pByte = (char*)Result.pVal;
Reid Spencera58f0582007-02-18 20:09:41 +0000848 for (uint32_t i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000849 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000850 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
851 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000852 }
853 return Result;
854 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000855}
856
Zhou Sheng0b706b12007-02-08 14:35:19 +0000857APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
858 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000859 APInt A = API1, B = API2;
860 while (!!B) {
861 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000862 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000863 A = T;
864 }
865 return A;
866}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000867
Reid Spencer1fa111e2007-02-27 18:23:40 +0000868APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, uint32_t width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000869 union {
870 double D;
871 uint64_t I;
872 } T;
873 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000874
875 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000876 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000877
878 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000879 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000880
881 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000882 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000883 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000884
885 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
886 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
887
888 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000889 if (exp < 52)
Reid Spencer1fa111e2007-02-27 18:23:40 +0000890 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
891 APInt(width, mantissa >> (52 - exp));
892
893 // If the client didn't provide enough bits for us to shift the mantissa into
894 // then the result is undefined, just return 0
895 if (width <= exp - 52)
896 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000897
898 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000899 APInt Tmp(width, mantissa);
Evan Cheng48e8c802008-05-02 21:15:08 +0000900 Tmp = Tmp.shl((uint32_t)exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000901 return isNeg ? -Tmp : Tmp;
902}
903
Reid Spencerdb3faa62007-02-13 22:41:58 +0000904/// RoundToDouble - This function convert this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000905/// The layout for double is as following (IEEE Standard 754):
906/// --------------------------------------
907/// | Sign Exponent Fraction Bias |
908/// |-------------------------------------- |
909/// | 1[63] 11[62-52] 52[51-00] 1023 |
910/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000911double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000912
913 // Handle the simple case where the value is contained in one uint64_t.
Reid Spencera58f0582007-02-18 20:09:41 +0000914 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
915 if (isSigned) {
916 int64_t sext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
917 return double(sext);
918 } else
919 return double(VAL);
920 }
921
Reid Spencer9c0696f2007-02-20 08:51:03 +0000922 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000923 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000924
925 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000926 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000927
928 // Figure out how many bits we're using.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000929 uint32_t n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000930
Reid Spencer9c0696f2007-02-20 08:51:03 +0000931 // The exponent (without bias normalization) is just the number of bits
932 // we are using. Note that the sign bit is gone since we constructed the
933 // absolute value.
934 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000935
Reid Spencer9c0696f2007-02-20 08:51:03 +0000936 // Return infinity for exponent overflow
937 if (exp > 1023) {
938 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000939 return std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000940 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000941 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000942 }
943 exp += 1023; // Increment for 1023 bias
944
945 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
946 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000947 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000948 unsigned hiWord = whichWord(n-1);
949 if (hiWord == 0) {
950 mantissa = Tmp.pVal[0];
951 if (n > 52)
952 mantissa >>= n - 52; // shift down, we want the top 52 bits.
953 } else {
954 assert(hiWord > 0 && "huh?");
955 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
956 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
957 mantissa = hibits | lobits;
958 }
959
Zhou Shengd93f00c2007-02-12 20:02:55 +0000960 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000961 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000962 union {
963 double D;
964 uint64_t I;
965 } T;
966 T.I = sign | (exp << 52) | mantissa;
967 return T.D;
968}
969
Reid Spencere81d2da2007-02-16 22:36:51 +0000970// Truncate to new width.
Reid Spencer94900772007-02-28 17:34:32 +0000971APInt &APInt::trunc(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000972 assert(width < BitWidth && "Invalid APInt Truncate request");
Reid Spencer9af18872007-12-11 06:53:58 +0000973 assert(width >= MIN_INT_BITS && "Can't truncate to 0 bits");
Reid Spencer9eec2412007-02-25 23:44:53 +0000974 uint32_t wordsBefore = getNumWords();
975 BitWidth = width;
976 uint32_t wordsAfter = getNumWords();
977 if (wordsBefore != wordsAfter) {
978 if (wordsAfter == 1) {
979 uint64_t *tmp = pVal;
980 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +0000981 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +0000982 } else {
983 uint64_t *newVal = getClearedMemory(wordsAfter);
984 for (uint32_t i = 0; i < wordsAfter; ++i)
985 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +0000986 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +0000987 pVal = newVal;
988 }
989 }
Reid Spencer94900772007-02-28 17:34:32 +0000990 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +0000991}
992
993// Sign extend to a new width.
Reid Spencer94900772007-02-28 17:34:32 +0000994APInt &APInt::sext(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000995 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9af18872007-12-11 06:53:58 +0000996 assert(width <= MAX_INT_BITS && "Too many bits");
Reid Spencer9eec2412007-02-25 23:44:53 +0000997 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000998 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +0000999 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +00001000 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +00001001 }
1002
1003 // The sign bit is set. First, get some facts
1004 uint32_t wordsBefore = getNumWords();
1005 uint32_t wordBits = BitWidth % APINT_BITS_PER_WORD;
1006 BitWidth = width;
1007 uint32_t wordsAfter = getNumWords();
1008
1009 // Mask the high order word appropriately
1010 if (wordsBefore == wordsAfter) {
1011 uint32_t newWordBits = width % APINT_BITS_PER_WORD;
1012 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +00001013 uint64_t mask = ~0ULL;
1014 if (newWordBits)
1015 mask >>= APINT_BITS_PER_WORD - newWordBits;
1016 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001017 if (wordsBefore == 1)
1018 VAL |= mask;
1019 else
1020 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001021 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001022 }
1023
Reid Spencerf30b1882007-02-25 23:54:00 +00001024 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001025 uint64_t *newVal = getMemory(wordsAfter);
1026 if (wordsBefore == 1)
1027 newVal[0] = VAL | mask;
1028 else {
1029 for (uint32_t i = 0; i < wordsBefore; ++i)
1030 newVal[i] = pVal[i];
1031 newVal[wordsBefore-1] |= mask;
1032 }
1033 for (uint32_t i = wordsBefore; i < wordsAfter; i++)
1034 newVal[i] = -1ULL;
1035 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001036 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001037 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001038 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001039}
1040
1041// Zero extend to a new width.
Reid Spencer94900772007-02-28 17:34:32 +00001042APInt &APInt::zext(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001043 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Reid Spencer9af18872007-12-11 06:53:58 +00001044 assert(width <= MAX_INT_BITS && "Too many bits");
Reid Spencer9eec2412007-02-25 23:44:53 +00001045 uint32_t wordsBefore = getNumWords();
1046 BitWidth = width;
1047 uint32_t wordsAfter = getNumWords();
1048 if (wordsBefore != wordsAfter) {
1049 uint64_t *newVal = getClearedMemory(wordsAfter);
1050 if (wordsBefore == 1)
1051 newVal[0] = VAL;
1052 else
1053 for (uint32_t i = 0; i < wordsBefore; ++i)
1054 newVal[i] = pVal[i];
1055 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001056 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001057 pVal = newVal;
1058 }
Reid Spencer94900772007-02-28 17:34:32 +00001059 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001060}
1061
Reid Spencer68e23002007-03-01 17:15:32 +00001062APInt &APInt::zextOrTrunc(uint32_t width) {
1063 if (BitWidth < width)
1064 return zext(width);
1065 if (BitWidth > width)
1066 return trunc(width);
1067 return *this;
1068}
1069
1070APInt &APInt::sextOrTrunc(uint32_t width) {
1071 if (BitWidth < width)
1072 return sext(width);
1073 if (BitWidth > width)
1074 return trunc(width);
1075 return *this;
1076}
1077
Zhou Shengff4304f2007-02-09 07:48:24 +00001078/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001079/// @brief Arithmetic right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001080APInt APInt::ashr(const APInt &shiftAmt) const {
Evan Cheng48e8c802008-05-02 21:15:08 +00001081 return ashr((uint32_t)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001082}
1083
1084/// Arithmetic right-shift this APInt by shiftAmt.
1085/// @brief Arithmetic right-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001086APInt APInt::ashr(uint32_t shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001087 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001088 // Handle a degenerate case
1089 if (shiftAmt == 0)
1090 return *this;
1091
1092 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001093 if (isSingleWord()) {
1094 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001095 return APInt(BitWidth, 0); // undefined
1096 else {
1097 uint32_t SignBit = APINT_BITS_PER_WORD - BitWidth;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001098 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001099 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1100 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001101 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001102
Reid Spencer46f9c942007-03-02 22:39:11 +00001103 // If all the bits were shifted out, the result is, technically, undefined.
1104 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1105 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001106 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001107 if (isNegative())
Zhou Shengbfde7d62008-06-05 13:27:38 +00001108 return APInt(BitWidth, -1ULL, true);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001109 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001110 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001111 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001112
1113 // Create some space for the result.
1114 uint64_t * val = new uint64_t[getNumWords()];
1115
Reid Spencer46f9c942007-03-02 22:39:11 +00001116 // Compute some values needed by the following shift algorithms
1117 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1118 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1119 uint32_t breakWord = getNumWords() - 1 - offset; // last word affected
1120 uint32_t bitsInWord = whichBit(BitWidth); // how many bits in last word?
1121 if (bitsInWord == 0)
1122 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001123
1124 // If we are shifting whole words, just move whole words
1125 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001126 // Move the words containing significant bits
1127 for (uint32_t i = 0; i <= breakWord; ++i)
1128 val[i] = pVal[i+offset]; // move whole word
1129
1130 // Adjust the top significant word for sign bit fill, if negative
1131 if (isNegative())
1132 if (bitsInWord < APINT_BITS_PER_WORD)
1133 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1134 } else {
1135 // Shift the low order words
1136 for (uint32_t i = 0; i < breakWord; ++i) {
1137 // This combines the shifted corresponding word with the low bits from
1138 // the next word (shifted into this word's high bits).
1139 val[i] = (pVal[i+offset] >> wordShift) |
1140 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1141 }
1142
1143 // Shift the break word. In this case there are no bits from the next word
1144 // to include in this word.
1145 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1146
1147 // Deal with sign extenstion in the break word, and possibly the word before
1148 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001149 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001150 if (wordShift > bitsInWord) {
1151 if (breakWord > 0)
1152 val[breakWord-1] |=
1153 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1154 val[breakWord] |= ~0ULL;
1155 } else
1156 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001157 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001158 }
1159
Reid Spencer46f9c942007-03-02 22:39:11 +00001160 // Remaining words are 0 or -1, just assign them.
1161 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001162 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001163 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001164 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001165}
1166
Zhou Shengff4304f2007-02-09 07:48:24 +00001167/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001168/// @brief Logical right-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001169APInt APInt::lshr(const APInt &shiftAmt) const {
Evan Cheng48e8c802008-05-02 21:15:08 +00001170 return lshr((uint32_t)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001171}
1172
1173/// Logical right-shift this APInt by shiftAmt.
1174/// @brief Logical right-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001175APInt APInt::lshr(uint32_t shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001176 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001177 if (shiftAmt == BitWidth)
1178 return APInt(BitWidth, 0);
1179 else
1180 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001181 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001182
Reid Spencerba81c2b2007-02-26 01:19:48 +00001183 // If all the bits were shifted out, the result is 0. This avoids issues
1184 // with shifting by the size of the integer type, which produces undefined
1185 // results. We define these "undefined results" to always be 0.
1186 if (shiftAmt == BitWidth)
1187 return APInt(BitWidth, 0);
1188
Reid Spencer02ae8b72007-05-17 06:26:29 +00001189 // If none of the bits are shifted out, the result is *this. This avoids
1190 // issues with shifting byt he size of the integer type, which produces
1191 // undefined results in the code below. This is also an optimization.
1192 if (shiftAmt == 0)
1193 return *this;
1194
Reid Spencerba81c2b2007-02-26 01:19:48 +00001195 // Create some space for the result.
1196 uint64_t * val = new uint64_t[getNumWords()];
1197
1198 // If we are shifting less than a word, compute the shift with a simple carry
1199 if (shiftAmt < APINT_BITS_PER_WORD) {
1200 uint64_t carry = 0;
1201 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001202 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001203 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1204 }
1205 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001206 }
1207
Reid Spencerba81c2b2007-02-26 01:19:48 +00001208 // Compute some values needed by the remaining shift algorithms
1209 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1210 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1211
1212 // If we are shifting whole words, just move whole words
1213 if (wordShift == 0) {
1214 for (uint32_t i = 0; i < getNumWords() - offset; ++i)
1215 val[i] = pVal[i+offset];
1216 for (uint32_t i = getNumWords()-offset; i < getNumWords(); i++)
1217 val[i] = 0;
1218 return APInt(val,BitWidth).clearUnusedBits();
1219 }
1220
1221 // Shift the low order words
1222 uint32_t breakWord = getNumWords() - offset -1;
1223 for (uint32_t i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001224 val[i] = (pVal[i+offset] >> wordShift) |
1225 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001226 // Shift the break word.
1227 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1228
1229 // Remaining words are 0
1230 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
1231 val[i] = 0;
1232 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001233}
1234
Zhou Shengff4304f2007-02-09 07:48:24 +00001235/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001236/// @brief Left-shift function.
Dan Gohmancf609572008-02-29 01:40:47 +00001237APInt APInt::shl(const APInt &shiftAmt) const {
1238 // It's undefined behavior in C to shift by BitWidth or greater, but
Evan Cheng48e8c802008-05-02 21:15:08 +00001239 return shl((uint32_t)shiftAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001240}
1241
1242/// Left-shift this APInt by shiftAmt.
1243/// @brief Left-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001244APInt APInt::shl(uint32_t shiftAmt) const {
Reid Spencer5bce8542007-02-24 20:19:37 +00001245 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer87553802007-02-25 00:56:44 +00001246 if (isSingleWord()) {
Reid Spencer5bce8542007-02-24 20:19:37 +00001247 if (shiftAmt == BitWidth)
Reid Spencer87553802007-02-25 00:56:44 +00001248 return APInt(BitWidth, 0); // avoid undefined shift results
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001249 return APInt(BitWidth, VAL << shiftAmt);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001250 }
Reid Spencer5bce8542007-02-24 20:19:37 +00001251
Reid Spencer87553802007-02-25 00:56:44 +00001252 // If all the bits were shifted out, the result is 0. This avoids issues
1253 // with shifting by the size of the integer type, which produces undefined
1254 // results. We define these "undefined results" to always be 0.
1255 if (shiftAmt == BitWidth)
1256 return APInt(BitWidth, 0);
1257
Reid Spencer92c72832007-05-12 18:01:57 +00001258 // If none of the bits are shifted out, the result is *this. This avoids a
1259 // lshr by the words size in the loop below which can produce incorrect
1260 // results. It also avoids the expensive computation below for a common case.
1261 if (shiftAmt == 0)
1262 return *this;
1263
Reid Spencer87553802007-02-25 00:56:44 +00001264 // Create some space for the result.
1265 uint64_t * val = new uint64_t[getNumWords()];
1266
1267 // If we are shifting less than a word, do it the easy way
1268 if (shiftAmt < APINT_BITS_PER_WORD) {
1269 uint64_t carry = 0;
Reid Spencer87553802007-02-25 00:56:44 +00001270 for (uint32_t i = 0; i < getNumWords(); i++) {
1271 val[i] = pVal[i] << shiftAmt | carry;
1272 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1273 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001274 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001275 }
1276
Reid Spencer87553802007-02-25 00:56:44 +00001277 // Compute some values needed by the remaining shift algorithms
1278 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1279 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1280
1281 // If we are shifting whole words, just move whole words
1282 if (wordShift == 0) {
1283 for (uint32_t i = 0; i < offset; i++)
1284 val[i] = 0;
1285 for (uint32_t i = offset; i < getNumWords(); i++)
1286 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001287 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001288 }
Reid Spencer87553802007-02-25 00:56:44 +00001289
1290 // Copy whole words from this to Result.
1291 uint32_t i = getNumWords() - 1;
1292 for (; i > offset; --i)
1293 val[i] = pVal[i-offset] << wordShift |
1294 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001295 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001296 for (i = 0; i < offset; ++i)
1297 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001298 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001299}
1300
Dan Gohmancf609572008-02-29 01:40:47 +00001301APInt APInt::rotl(const APInt &rotateAmt) const {
Evan Cheng48e8c802008-05-02 21:15:08 +00001302 return rotl((uint32_t)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001303}
1304
Reid Spencer19dc32a2007-05-13 23:44:59 +00001305APInt APInt::rotl(uint32_t rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001306 if (rotateAmt == 0)
1307 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001308 // Don't get too fancy, just use existing shift/or facilities
1309 APInt hi(*this);
1310 APInt lo(*this);
1311 hi.shl(rotateAmt);
1312 lo.lshr(BitWidth - rotateAmt);
1313 return hi | lo;
1314}
1315
Dan Gohmancf609572008-02-29 01:40:47 +00001316APInt APInt::rotr(const APInt &rotateAmt) const {
Evan Cheng48e8c802008-05-02 21:15:08 +00001317 return rotr((uint32_t)rotateAmt.getLimitedValue(BitWidth));
Dan Gohmancf609572008-02-29 01:40:47 +00001318}
1319
Reid Spencer19dc32a2007-05-13 23:44:59 +00001320APInt APInt::rotr(uint32_t rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001321 if (rotateAmt == 0)
1322 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001323 // Don't get too fancy, just use existing shift/or facilities
1324 APInt hi(*this);
1325 APInt lo(*this);
1326 lo.lshr(rotateAmt);
1327 hi.shl(BitWidth - rotateAmt);
1328 return hi | lo;
1329}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001330
1331// Square Root - this method computes and returns the square root of "this".
1332// Three mechanisms are used for computation. For small values (<= 5 bits),
1333// a table lookup is done. This gets some performance for common cases. For
1334// values using less than 52 bits, the value is converted to double and then
1335// the libc sqrt function is called. The result is rounded and then converted
1336// back to a uint64_t which is then used to construct the result. Finally,
1337// the Babylonian method for computing square roots is used.
1338APInt APInt::sqrt() const {
1339
1340 // Determine the magnitude of the value.
1341 uint32_t magnitude = getActiveBits();
1342
1343 // Use a fast table for some small values. This also gets rid of some
1344 // rounding errors in libc sqrt for small values.
1345 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001346 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001347 /* 0 */ 0,
1348 /* 1- 2 */ 1, 1,
1349 /* 3- 6 */ 2, 2, 2, 2,
1350 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1351 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1352 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1353 /* 31 */ 6
1354 };
1355 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001356 }
1357
1358 // If the magnitude of the value fits in less than 52 bits (the precision of
1359 // an IEEE double precision floating point value), then we can use the
1360 // libc sqrt function which will probably use a hardware sqrt computation.
1361 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001362 if (magnitude < 52) {
1363#ifdef _MSC_VER
1364 // Amazingly, VC++ doesn't have round().
1365 return APInt(BitWidth,
1366 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1367#else
Reid Spenceraf8fb192007-03-01 05:39:56 +00001368 return APInt(BitWidth,
1369 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001370#endif
1371 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001372
1373 // Okay, all the short cuts are exhausted. We must compute it. The following
1374 // is a classical Babylonian method for computing the square root. This code
1375 // was adapted to APINt from a wikipedia article on such computations.
1376 // See http://www.wikipedia.org/ and go to the page named
1377 // Calculate_an_integer_square_root.
1378 uint32_t nbits = BitWidth, i = 4;
1379 APInt testy(BitWidth, 16);
1380 APInt x_old(BitWidth, 1);
1381 APInt x_new(BitWidth, 0);
1382 APInt two(BitWidth, 2);
1383
1384 // Select a good starting value using binary logarithms.
1385 for (;; i += 2, testy = testy.shl(2))
1386 if (i >= nbits || this->ule(testy)) {
1387 x_old = x_old.shl(i / 2);
1388 break;
1389 }
1390
1391 // Use the Babylonian method to arrive at the integer square root:
1392 for (;;) {
1393 x_new = (this->udiv(x_old) + x_old).udiv(two);
1394 if (x_old.ule(x_new))
1395 break;
1396 x_old = x_new;
1397 }
1398
1399 // Make sure we return the closest approximation
Reid Spencerf09aef72007-03-02 04:21:55 +00001400 // NOTE: The rounding calculation below is correct. It will produce an
1401 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
1402 // determined to be a rounding issue with pari/gp as it begins to use a
1403 // floating point representation after 192 bits. There are no discrepancies
1404 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001405 APInt square(x_old * x_old);
1406 APInt nextSquare((x_old + 1) * (x_old +1));
1407 if (this->ult(square))
1408 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001409 else if (this->ule(nextSquare)) {
1410 APInt midpoint((nextSquare - square).udiv(two));
1411 APInt offset(*this - square);
1412 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001413 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001414 else
1415 return x_old + 1;
1416 } else
Reid Spenceraf8fb192007-03-01 05:39:56 +00001417 assert(0 && "Error in APInt::sqrt computation");
1418 return x_old + 1;
1419}
1420
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001421/// Computes the multiplicative inverse of this APInt for a given modulo. The
1422/// iterative extended Euclidean algorithm is used to solve for this value,
1423/// however we simplify it to speed up calculating only the inverse, and take
1424/// advantage of div+rem calculations. We also use some tricks to avoid copying
1425/// (potentially large) APInts around.
1426APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1427 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1428
1429 // Using the properties listed at the following web page (accessed 06/21/08):
1430 // http://www.numbertheory.org/php/euclid.html
1431 // (especially the properties numbered 3, 4 and 9) it can be proved that
1432 // BitWidth bits suffice for all the computations in the algorithm implemented
1433 // below. More precisely, this number of bits suffice if the multiplicative
1434 // inverse exists, but may not suffice for the general extended Euclidean
1435 // algorithm.
1436
1437 APInt r[2] = { modulo, *this };
1438 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1439 APInt q(BitWidth, 0);
1440
1441 unsigned i;
1442 for (i = 0; r[i^1] != 0; i ^= 1) {
1443 // An overview of the math without the confusing bit-flipping:
1444 // q = r[i-2] / r[i-1]
1445 // r[i] = r[i-2] % r[i-1]
1446 // t[i] = t[i-2] - t[i-1] * q
1447 udivrem(r[i], r[i^1], q, r[i]);
1448 t[i] -= t[i^1] * q;
1449 }
1450
1451 // If this APInt and the modulo are not coprime, there is no multiplicative
1452 // inverse, so return 0. We check this by looking at the next-to-last
1453 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1454 // algorithm.
1455 if (r[i] != 1)
1456 return APInt(BitWidth, 0);
1457
1458 // The next-to-last t is the multiplicative inverse. However, we are
1459 // interested in a positive inverse. Calcuate a positive one from a negative
1460 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczde0f2382008-07-20 15:55:14 +00001461 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001462 return t[i].isNegative() ? t[i] + modulo : t[i];
1463}
1464
Reid Spencer9c0696f2007-02-20 08:51:03 +00001465/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1466/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1467/// variables here have the same names as in the algorithm. Comments explain
1468/// the algorithm and any deviation from it.
1469static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r,
1470 uint32_t m, uint32_t n) {
1471 assert(u && "Must provide dividend");
1472 assert(v && "Must provide divisor");
1473 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001474 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001475 assert(n>1 && "n must be > 1");
1476
1477 // Knuth uses the value b as the base of the number system. In our case b
1478 // is 2^31 so we just set it to -1u.
1479 uint64_t b = uint64_t(1) << 32;
1480
Reid Spencer9d6c9192007-02-24 03:58:46 +00001481 DEBUG(cerr << "KnuthDiv: m=" << m << " n=" << n << '\n');
1482 DEBUG(cerr << "KnuthDiv: original:");
1483 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1484 DEBUG(cerr << " by");
1485 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1486 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001487 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1488 // u and v by d. Note that we have taken Knuth's advice here to use a power
1489 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1490 // 2 allows us to shift instead of multiply and it is easy to determine the
1491 // shift amount from the leading zeros. We are basically normalizing the u
1492 // and v so that its high bits are shifted to the top of v's range without
1493 // overflow. Note that this can require an extra word in u so that u must
1494 // be of length m+n+1.
1495 uint32_t shift = CountLeadingZeros_32(v[n-1]);
1496 uint32_t v_carry = 0;
1497 uint32_t u_carry = 0;
1498 if (shift) {
1499 for (uint32_t i = 0; i < m+n; ++i) {
1500 uint32_t u_tmp = u[i] >> (32 - shift);
1501 u[i] = (u[i] << shift) | u_carry;
1502 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001503 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001504 for (uint32_t i = 0; i < n; ++i) {
1505 uint32_t v_tmp = v[i] >> (32 - shift);
1506 v[i] = (v[i] << shift) | v_carry;
1507 v_carry = v_tmp;
1508 }
1509 }
1510 u[m+n] = u_carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001511 DEBUG(cerr << "KnuthDiv: normal:");
1512 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1513 DEBUG(cerr << " by");
1514 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1515 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001516
1517 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1518 int j = m;
1519 do {
Reid Spencer9d6c9192007-02-24 03:58:46 +00001520 DEBUG(cerr << "KnuthDiv: quotient digit #" << j << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001521 // D3. [Calculate q'.].
1522 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1523 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1524 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1525 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1526 // on v[n-2] determines at high speed most of the cases in which the trial
1527 // value qp is one too large, and it eliminates all cases where qp is two
1528 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001529 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001530 DEBUG(cerr << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001531 uint64_t qp = dividend / v[n-1];
1532 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001533 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1534 qp--;
1535 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001536 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001537 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001538 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001539 DEBUG(cerr << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001540
Reid Spencer92904632007-02-23 01:57:13 +00001541 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1542 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1543 // consists of a simple multiplication by a one-place number, combined with
Reid Spencer610fad82007-02-24 10:01:42 +00001544 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001545 bool isNeg = false;
Reid Spencer92904632007-02-23 01:57:13 +00001546 for (uint32_t i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001547 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001548 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001549 bool borrow = subtrahend > u_tmp;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001550 DEBUG(cerr << "KnuthDiv: u_tmp == " << u_tmp
Reid Spencer610fad82007-02-24 10:01:42 +00001551 << ", subtrahend == " << subtrahend
1552 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001553
Reid Spencer610fad82007-02-24 10:01:42 +00001554 uint64_t result = u_tmp - subtrahend;
1555 uint32_t k = j + i;
Evan Cheng48e8c802008-05-02 21:15:08 +00001556 u[k++] = (uint32_t)(result & (b-1)); // subtract low word
1557 u[k++] = (uint32_t)(result >> 32); // subtract high word
Reid Spencer610fad82007-02-24 10:01:42 +00001558 while (borrow && k <= m+n) { // deal with borrow to the left
1559 borrow = u[k] == 0;
1560 u[k]--;
1561 k++;
1562 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001563 isNeg |= borrow;
Reid Spencer610fad82007-02-24 10:01:42 +00001564 DEBUG(cerr << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
1565 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001566 }
1567 DEBUG(cerr << "KnuthDiv: after subtraction:");
1568 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1569 DEBUG(cerr << '\n');
Reid Spencer610fad82007-02-24 10:01:42 +00001570 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1571 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1572 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001573 // the true value, and a "borrow" to the left should be remembered.
1574 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001575 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001576 bool carry = true; // true because b's complement is "complement + 1"
1577 for (uint32_t i = 0; i <= m+n; ++i) {
1578 u[i] = ~u[i] + carry; // b's complement
1579 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001580 }
Reid Spencer92904632007-02-23 01:57:13 +00001581 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001582 DEBUG(cerr << "KnuthDiv: after complement:");
1583 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1584 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001585
1586 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
1587 // negative, go to step D6; otherwise go on to step D7.
Evan Cheng48e8c802008-05-02 21:15:08 +00001588 q[j] = (uint32_t)qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001589 if (isNeg) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001590 // D6. [Add back]. The probability that this step is necessary is very
1591 // small, on the order of only 2/b. Make sure that test data accounts for
Reid Spencer92904632007-02-23 01:57:13 +00001592 // this possibility. Decrease q[j] by 1
1593 q[j]--;
1594 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1595 // A carry will occur to the left of u[j+n], and it should be ignored
1596 // since it cancels with the borrow that occurred in D4.
1597 bool carry = false;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001598 for (uint32_t i = 0; i < n; i++) {
Reid Spencer9d6c9192007-02-24 03:58:46 +00001599 uint32_t limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001600 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001601 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001602 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001603 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001604 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001605 DEBUG(cerr << "KnuthDiv: after correction:");
1606 DEBUG(for (int i = m+n; i >=0; i--) cerr <<" " << u[i]);
1607 DEBUG(cerr << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001608
Reid Spencer92904632007-02-23 01:57:13 +00001609 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1610 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001611
Reid Spencer9d6c9192007-02-24 03:58:46 +00001612 DEBUG(cerr << "KnuthDiv: quotient:");
1613 DEBUG(for (int i = m; i >=0; i--) cerr <<" " << q[i]);
1614 DEBUG(cerr << '\n');
1615
Reid Spencer9c0696f2007-02-20 08:51:03 +00001616 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1617 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1618 // compute the remainder (urem uses this).
1619 if (r) {
1620 // The value d is expressed by the "shift" value above since we avoided
1621 // multiplication by d by using a shift left. So, all we have to do is
1622 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001623 if (shift) {
1624 uint32_t carry = 0;
1625 DEBUG(cerr << "KnuthDiv: remainder:");
1626 for (int i = n-1; i >= 0; i--) {
1627 r[i] = (u[i] >> shift) | carry;
1628 carry = u[i] << (32 - shift);
1629 DEBUG(cerr << " " << r[i]);
1630 }
1631 } else {
1632 for (int i = n-1; i >= 0; i--) {
1633 r[i] = u[i];
1634 DEBUG(cerr << " " << r[i]);
1635 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001636 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001637 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001638 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001639 DEBUG(cerr << std::setbase(10) << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001640}
1641
Reid Spencer9c0696f2007-02-20 08:51:03 +00001642void APInt::divide(const APInt LHS, uint32_t lhsWords,
1643 const APInt &RHS, uint32_t rhsWords,
1644 APInt *Quotient, APInt *Remainder)
1645{
1646 assert(lhsWords >= rhsWords && "Fractional result");
1647
1648 // First, compose the values into an array of 32-bit words instead of
1649 // 64-bit words. This is a necessity of both the "short division" algorithm
1650 // and the the Knuth "classical algorithm" which requires there to be native
1651 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1652 // can't use 64-bit operands here because we don't have native results of
1653 // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't
1654 // work on large-endian machines.
1655 uint64_t mask = ~0ull >> (sizeof(uint32_t)*8);
1656 uint32_t n = rhsWords * 2;
1657 uint32_t m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001658
1659 // Allocate space for the temporary values we need either on the stack, if
1660 // it will fit, or on the heap if it won't.
1661 uint32_t SPACE[128];
1662 uint32_t *U = 0;
1663 uint32_t *V = 0;
1664 uint32_t *Q = 0;
1665 uint32_t *R = 0;
1666 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1667 U = &SPACE[0];
1668 V = &SPACE[m+n+1];
1669 Q = &SPACE[(m+n+1) + n];
1670 if (Remainder)
1671 R = &SPACE[(m+n+1) + n + (m+n)];
1672 } else {
1673 U = new uint32_t[m + n + 1];
1674 V = new uint32_t[n];
1675 Q = new uint32_t[m+n];
1676 if (Remainder)
1677 R = new uint32_t[n];
1678 }
1679
1680 // Initialize the dividend
Reid Spencer9c0696f2007-02-20 08:51:03 +00001681 memset(U, 0, (m+n+1)*sizeof(uint32_t));
1682 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001683 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Evan Cheng48e8c802008-05-02 21:15:08 +00001684 U[i * 2] = (uint32_t)(tmp & mask);
1685 U[i * 2 + 1] = (uint32_t)(tmp >> (sizeof(uint32_t)*8));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001686 }
1687 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1688
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001689 // Initialize the divisor
Reid Spencer9c0696f2007-02-20 08:51:03 +00001690 memset(V, 0, (n)*sizeof(uint32_t));
1691 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001692 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Evan Cheng48e8c802008-05-02 21:15:08 +00001693 V[i * 2] = (uint32_t)(tmp & mask);
1694 V[i * 2 + 1] = (uint32_t)(tmp >> (sizeof(uint32_t)*8));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001695 }
1696
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001697 // initialize the quotient and remainder
Reid Spencer9c0696f2007-02-20 08:51:03 +00001698 memset(Q, 0, (m+n) * sizeof(uint32_t));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001699 if (Remainder)
Reid Spencer9c0696f2007-02-20 08:51:03 +00001700 memset(R, 0, n * sizeof(uint32_t));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001701
1702 // Now, adjust m and n for the Knuth division. n is the number of words in
1703 // the divisor. m is the number of words by which the dividend exceeds the
1704 // divisor (i.e. m+n is the length of the dividend). These sizes must not
1705 // contain any zero words or the Knuth algorithm fails.
1706 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1707 n--;
1708 m++;
1709 }
1710 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1711 m--;
1712
1713 // If we're left with only a single word for the divisor, Knuth doesn't work
1714 // so we implement the short division algorithm here. This is much simpler
1715 // and faster because we are certain that we can divide a 64-bit quantity
1716 // by a 32-bit quantity at hardware speed and short division is simply a
1717 // series of such operations. This is just like doing short division but we
1718 // are using base 2^32 instead of base 10.
1719 assert(n != 0 && "Divide by zero?");
1720 if (n == 1) {
1721 uint32_t divisor = V[0];
1722 uint32_t remainder = 0;
1723 for (int i = m+n-1; i >= 0; i--) {
1724 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1725 if (partial_dividend == 0) {
1726 Q[i] = 0;
1727 remainder = 0;
1728 } else if (partial_dividend < divisor) {
1729 Q[i] = 0;
Evan Cheng48e8c802008-05-02 21:15:08 +00001730 remainder = (uint32_t)partial_dividend;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001731 } else if (partial_dividend == divisor) {
1732 Q[i] = 1;
1733 remainder = 0;
1734 } else {
Evan Cheng48e8c802008-05-02 21:15:08 +00001735 Q[i] = (uint32_t)(partial_dividend / divisor);
1736 remainder = (uint32_t)(partial_dividend - (Q[i] * divisor));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001737 }
1738 }
1739 if (R)
1740 R[0] = remainder;
1741 } else {
1742 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1743 // case n > 1.
1744 KnuthDiv(U, V, Q, R, m, n);
1745 }
1746
1747 // If the caller wants the quotient
1748 if (Quotient) {
1749 // Set up the Quotient value's memory.
1750 if (Quotient->BitWidth != LHS.BitWidth) {
1751 if (Quotient->isSingleWord())
1752 Quotient->VAL = 0;
1753 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001754 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001755 Quotient->BitWidth = LHS.BitWidth;
1756 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001757 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001758 } else
1759 Quotient->clear();
1760
1761 // The quotient is in Q. Reconstitute the quotient into Quotient's low
1762 // order words.
1763 if (lhsWords == 1) {
1764 uint64_t tmp =
1765 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1766 if (Quotient->isSingleWord())
1767 Quotient->VAL = tmp;
1768 else
1769 Quotient->pVal[0] = tmp;
1770 } else {
1771 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1772 for (unsigned i = 0; i < lhsWords; ++i)
1773 Quotient->pVal[i] =
1774 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1775 }
1776 }
1777
1778 // If the caller wants the remainder
1779 if (Remainder) {
1780 // Set up the Remainder value's memory.
1781 if (Remainder->BitWidth != RHS.BitWidth) {
1782 if (Remainder->isSingleWord())
1783 Remainder->VAL = 0;
1784 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001785 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001786 Remainder->BitWidth = RHS.BitWidth;
1787 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001788 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001789 } else
1790 Remainder->clear();
1791
1792 // The remainder is in R. Reconstitute the remainder into Remainder's low
1793 // order words.
1794 if (rhsWords == 1) {
1795 uint64_t tmp =
1796 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1797 if (Remainder->isSingleWord())
1798 Remainder->VAL = tmp;
1799 else
1800 Remainder->pVal[0] = tmp;
1801 } else {
1802 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1803 for (unsigned i = 0; i < rhsWords; ++i)
1804 Remainder->pVal[i] =
1805 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1806 }
1807 }
1808
1809 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001810 if (U != &SPACE[0]) {
1811 delete [] U;
1812 delete [] V;
1813 delete [] Q;
1814 delete [] R;
1815 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001816}
1817
Reid Spencere81d2da2007-02-16 22:36:51 +00001818APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001819 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001820
1821 // First, deal with the easy case
1822 if (isSingleWord()) {
1823 assert(RHS.VAL != 0 && "Divide by zero?");
1824 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001825 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001826
Reid Spencer71bd08f2007-02-17 02:07:07 +00001827 // Get some facts about the LHS and RHS number of bits and words
Reid Spenceraf0e9562007-02-18 18:38:44 +00001828 uint32_t rhsBits = RHS.getActiveBits();
1829 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001830 assert(rhsWords && "Divided by zero???");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001831 uint32_t lhsBits = this->getActiveBits();
Reid Spenceraf0e9562007-02-18 18:38:44 +00001832 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001833
1834 // Deal with some degenerate cases
1835 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001836 // 0 / X ===> 0
1837 return APInt(BitWidth, 0);
1838 else if (lhsWords < rhsWords || this->ult(RHS)) {
1839 // X / Y ===> 0, iff X < Y
1840 return APInt(BitWidth, 0);
1841 } else if (*this == RHS) {
1842 // X / X ===> 1
1843 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001844 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001845 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001846 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001847 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001848
1849 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1850 APInt Quotient(1,0); // to hold result.
1851 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1852 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001853}
1854
Reid Spencere81d2da2007-02-16 22:36:51 +00001855APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001856 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001857 if (isSingleWord()) {
1858 assert(RHS.VAL != 0 && "Remainder by zero?");
1859 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001860 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001861
Reid Spencere0cdd332007-02-21 08:21:52 +00001862 // Get some facts about the LHS
1863 uint32_t lhsBits = getActiveBits();
1864 uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001865
1866 // Get some facts about the RHS
Reid Spenceraf0e9562007-02-18 18:38:44 +00001867 uint32_t rhsBits = RHS.getActiveBits();
1868 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001869 assert(rhsWords && "Performing remainder operation by zero ???");
1870
Reid Spencer71bd08f2007-02-17 02:07:07 +00001871 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001872 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001873 // 0 % Y ===> 0
1874 return APInt(BitWidth, 0);
1875 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1876 // X % Y ===> X, iff X < Y
1877 return *this;
1878 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001879 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001880 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001881 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001882 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001883 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001884 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001885
Reid Spencer19dc32a2007-05-13 23:44:59 +00001886 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001887 APInt Remainder(1,0);
1888 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1889 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001890}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001891
Reid Spencer19dc32a2007-05-13 23:44:59 +00001892void APInt::udivrem(const APInt &LHS, const APInt &RHS,
1893 APInt &Quotient, APInt &Remainder) {
1894 // Get some size facts about the dividend and divisor
1895 uint32_t lhsBits = LHS.getActiveBits();
1896 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1897 uint32_t rhsBits = RHS.getActiveBits();
1898 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
1899
1900 // Check the degenerate cases
1901 if (lhsWords == 0) {
1902 Quotient = 0; // 0 / Y ===> 0
1903 Remainder = 0; // 0 % Y ===> 0
1904 return;
1905 }
1906
1907 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1908 Quotient = 0; // X / Y ===> 0, iff X < Y
1909 Remainder = LHS; // X % Y ===> X, iff X < Y
1910 return;
1911 }
1912
1913 if (LHS == RHS) {
1914 Quotient = 1; // X / X ===> 1
1915 Remainder = 0; // X % X ===> 0;
1916 return;
1917 }
1918
1919 if (lhsWords == 1 && rhsWords == 1) {
1920 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz300c6c52008-06-23 19:39:50 +00001921 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1922 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
1923 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
1924 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer19dc32a2007-05-13 23:44:59 +00001925 return;
1926 }
1927
1928 // Okay, lets do it the long way
1929 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1930}
1931
Reid Spencer385f7542007-02-21 03:55:44 +00001932void APInt::fromString(uint32_t numbits, const char *str, uint32_t slen,
Reid Spencer5e0a8512007-02-17 03:16:00 +00001933 uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00001934 // Check our assumptions here
Reid Spencer5e0a8512007-02-17 03:16:00 +00001935 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
1936 "Radix should be 2, 8, 10, or 16!");
Reid Spencer385f7542007-02-21 03:55:44 +00001937 assert(str && "String is null?");
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001938 bool isNeg = str[0] == '-';
1939 if (isNeg)
Reid Spencer9eec2412007-02-25 23:44:53 +00001940 str++, slen--;
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001941 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
1942 assert((slen*3 <= numbits || radix != 8) && "Insufficient bit width");
1943 assert((slen*4 <= numbits || radix != 16) && "Insufficient bit width");
1944 assert(((slen*64)/22 <= numbits || radix != 10) && "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00001945
1946 // Allocate memory
1947 if (!isSingleWord())
1948 pVal = getClearedMemory(getNumWords());
1949
1950 // Figure out if we can shift instead of multiply
1951 uint32_t shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
1952
1953 // Set up an APInt for the digit to add outside the loop so we don't
1954 // constantly construct/destruct it.
1955 APInt apdigit(getBitWidth(), 0);
1956 APInt apradix(getBitWidth(), radix);
1957
1958 // Enter digit traversal loop
1959 for (unsigned i = 0; i < slen; i++) {
1960 // Get a digit
1961 uint32_t digit = 0;
1962 char cdigit = str[i];
Reid Spencer6551dcd2007-05-16 19:18:22 +00001963 if (radix == 16) {
1964 if (!isxdigit(cdigit))
1965 assert(0 && "Invalid hex digit in string");
1966 if (isdigit(cdigit))
1967 digit = cdigit - '0';
1968 else if (cdigit >= 'a')
Reid Spencer385f7542007-02-21 03:55:44 +00001969 digit = cdigit - 'a' + 10;
1970 else if (cdigit >= 'A')
1971 digit = cdigit - 'A' + 10;
1972 else
Reid Spencer6551dcd2007-05-16 19:18:22 +00001973 assert(0 && "huh? we shouldn't get here");
1974 } else if (isdigit(cdigit)) {
1975 digit = cdigit - '0';
Bill Wendlingf7a91e62008-03-16 20:05:52 +00001976 assert((radix == 10 ||
1977 (radix == 8 && digit != 8 && digit != 9) ||
1978 (radix == 2 && (digit == 0 || digit == 1))) &&
1979 "Invalid digit in string for given radix");
Reid Spencer6551dcd2007-05-16 19:18:22 +00001980 } else {
Reid Spencer385f7542007-02-21 03:55:44 +00001981 assert(0 && "Invalid character in digit string");
Reid Spencer6551dcd2007-05-16 19:18:22 +00001982 }
Reid Spencer385f7542007-02-21 03:55:44 +00001983
Reid Spencer6551dcd2007-05-16 19:18:22 +00001984 // Shift or multiply the value by the radix
Reid Spencer385f7542007-02-21 03:55:44 +00001985 if (shift)
Reid Spencer6551dcd2007-05-16 19:18:22 +00001986 *this <<= shift;
Reid Spencer385f7542007-02-21 03:55:44 +00001987 else
1988 *this *= apradix;
1989
1990 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00001991 if (apdigit.isSingleWord())
1992 apdigit.VAL = digit;
1993 else
1994 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00001995 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001996 }
Reid Spencer9eec2412007-02-25 23:44:53 +00001997 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001998 if (isNeg) {
1999 (*this)--;
Reid Spencer9eec2412007-02-25 23:44:53 +00002000 this->flip();
Reid Spencer9eec2412007-02-25 23:44:53 +00002001 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00002002}
Reid Spencer9c0696f2007-02-20 08:51:03 +00002003
Reid Spencer9c0696f2007-02-20 08:51:03 +00002004std::string APInt::toString(uint8_t radix, bool wantSigned) const {
2005 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
2006 "Radix should be 2, 8, 10, or 16!");
Dan Gohmancfbb2f02008-03-25 21:45:14 +00002007 static const char *const digits[] = {
Reid Spencer9c0696f2007-02-20 08:51:03 +00002008 "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
2009 };
2010 std::string result;
2011 uint32_t bits_used = getActiveBits();
2012 if (isSingleWord()) {
2013 char buf[65];
2014 const char *format = (radix == 10 ? (wantSigned ? "%lld" : "%llu") :
2015 (radix == 16 ? "%llX" : (radix == 8 ? "%llo" : 0)));
2016 if (format) {
2017 if (wantSigned) {
2018 int64_t sextVal = (int64_t(VAL) << (APINT_BITS_PER_WORD-BitWidth)) >>
2019 (APINT_BITS_PER_WORD-BitWidth);
2020 sprintf(buf, format, sextVal);
2021 } else
2022 sprintf(buf, format, VAL);
2023 } else {
2024 memset(buf, 0, 65);
2025 uint64_t v = VAL;
2026 while (bits_used) {
Evan Cheng48e8c802008-05-02 21:15:08 +00002027 uint32_t bit = (uint32_t)v & 1;
Reid Spencer9c0696f2007-02-20 08:51:03 +00002028 bits_used--;
2029 buf[bits_used] = digits[bit][0];
2030 v >>=1;
2031 }
2032 }
2033 result = buf;
2034 return result;
2035 }
2036
2037 if (radix != 10) {
Reid Spencerfb0709a2007-05-17 19:23:02 +00002038 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2039 // because the number of bits per digit (1,3 and 4 respectively) divides
2040 // equaly. We just shift until there value is zero.
2041
2042 // First, check for a zero value and just short circuit the logic below.
2043 if (*this == 0)
2044 result = "0";
2045 else {
2046 APInt tmp(*this);
2047 size_t insert_at = 0;
2048 if (wantSigned && this->isNegative()) {
2049 // They want to print the signed version and it is a negative value
2050 // Flip the bits and add one to turn it into the equivalent positive
2051 // value and put a '-' in the result.
2052 tmp.flip();
2053 tmp++;
2054 result = "-";
2055 insert_at = 1;
2056 }
2057 // Just shift tmp right for each digit width until it becomes zero
2058 uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1));
2059 uint64_t mask = radix - 1;
2060 APInt zero(tmp.getBitWidth(), 0);
2061 while (tmp.ne(zero)) {
Evan Cheng48e8c802008-05-02 21:15:08 +00002062 unsigned digit =
2063 (unsigned)((tmp.isSingleWord() ? tmp.VAL : tmp.pVal[0]) & mask);
Reid Spencerfb0709a2007-05-17 19:23:02 +00002064 result.insert(insert_at, digits[digit]);
Reid Spencer20a4c232007-05-19 00:29:55 +00002065 tmp = tmp.lshr(shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002066 }
2067 }
2068 return result;
2069 }
2070
2071 APInt tmp(*this);
2072 APInt divisor(4, radix);
2073 APInt zero(tmp.getBitWidth(), 0);
2074 size_t insert_at = 0;
2075 if (wantSigned && tmp[BitWidth-1]) {
2076 // They want to print the signed version and it is a negative value
2077 // Flip the bits and add one to turn it into the equivalent positive
2078 // value and put a '-' in the result.
2079 tmp.flip();
2080 tmp++;
2081 result = "-";
2082 insert_at = 1;
2083 }
Dan Gohman95df6b32008-06-21 22:03:12 +00002084 if (tmp == zero)
Reid Spencer9c0696f2007-02-20 08:51:03 +00002085 result = "0";
2086 else while (tmp.ne(zero)) {
2087 APInt APdigit(1,0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002088 APInt tmp2(tmp.getBitWidth(), 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002089 divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
2090 &APdigit);
Evan Cheng48e8c802008-05-02 21:15:08 +00002091 uint32_t digit = (uint32_t)APdigit.getZExtValue();
Reid Spencer385f7542007-02-21 03:55:44 +00002092 assert(digit < radix && "divide failed");
2093 result.insert(insert_at,digits[digit]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002094 tmp = tmp2;
2095 }
2096
2097 return result;
2098}
2099
Reid Spencer385f7542007-02-21 03:55:44 +00002100void APInt::dump() const
2101{
Reid Spencer610fad82007-02-24 10:01:42 +00002102 cerr << "APInt(" << BitWidth << ")=" << std::setbase(16);
Reid Spencer385f7542007-02-21 03:55:44 +00002103 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +00002104 cerr << VAL;
Reid Spencer385f7542007-02-21 03:55:44 +00002105 else for (unsigned i = getNumWords(); i > 0; i--) {
Reid Spencer610fad82007-02-24 10:01:42 +00002106 cerr << pVal[i-1] << " ";
Reid Spencer385f7542007-02-21 03:55:44 +00002107 }
Chris Lattner9132a2b2007-08-23 05:15:32 +00002108 cerr << " U(" << this->toStringUnsigned(10) << ") S("
Dale Johannesen9e3d3ab2007-09-14 22:26:36 +00002109 << this->toStringSigned(10) << ")" << std::setbase(10);
Reid Spencer385f7542007-02-21 03:55:44 +00002110}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002111
2112// This implements a variety of operations on a representation of
2113// arbitrary precision, two's-complement, bignum integer values.
2114
2115/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2116 and unrestricting assumption. */
Chris Lattner9f17eb02008-08-17 04:58:58 +00002117#define COMPILE_TIME_ASSERT(cond) extern int CTAssert[(cond) ? 1 : -1]
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002118COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002119
2120/* Some handy functions local to this file. */
2121namespace {
2122
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002123 /* Returns the integer part with the least significant BITS set.
2124 BITS cannot be zero. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002125 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002126 lowBitMask(unsigned int bits)
2127 {
2128 assert (bits != 0 && bits <= integerPartWidth);
2129
2130 return ~(integerPart) 0 >> (integerPartWidth - bits);
2131 }
2132
Neil Booth055c0b32007-10-06 00:43:45 +00002133 /* Returns the value of the lower half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002134 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002135 lowHalf(integerPart part)
2136 {
2137 return part & lowBitMask(integerPartWidth / 2);
2138 }
2139
Neil Booth055c0b32007-10-06 00:43:45 +00002140 /* Returns the value of the upper half of PART. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002141 static inline integerPart
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002142 highHalf(integerPart part)
2143 {
2144 return part >> (integerPartWidth / 2);
2145 }
2146
Neil Booth055c0b32007-10-06 00:43:45 +00002147 /* Returns the bit number of the most significant set bit of a part.
2148 If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002149 static unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002150 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002151 {
2152 unsigned int n, msb;
2153
2154 if (value == 0)
2155 return -1U;
2156
2157 n = integerPartWidth / 2;
2158
2159 msb = 0;
2160 do {
2161 if (value >> n) {
2162 value >>= n;
2163 msb += n;
2164 }
2165
2166 n >>= 1;
2167 } while (n);
2168
2169 return msb;
2170 }
2171
Neil Booth055c0b32007-10-06 00:43:45 +00002172 /* Returns the bit number of the least significant set bit of a
2173 part. If the input number has no bits set -1U is returned. */
Dan Gohman3bd659b2008-04-10 21:11:47 +00002174 static unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002175 partLSB(integerPart value)
2176 {
2177 unsigned int n, lsb;
2178
2179 if (value == 0)
2180 return -1U;
2181
2182 lsb = integerPartWidth - 1;
2183 n = integerPartWidth / 2;
2184
2185 do {
2186 if (value << n) {
2187 value <<= n;
2188 lsb -= n;
2189 }
2190
2191 n >>= 1;
2192 } while (n);
2193
2194 return lsb;
2195 }
2196}
2197
2198/* Sets the least significant part of a bignum to the input value, and
2199 zeroes out higher parts. */
2200void
2201APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2202{
2203 unsigned int i;
2204
Neil Booth68e53ad2007-10-08 13:47:12 +00002205 assert (parts > 0);
2206
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002207 dst[0] = part;
2208 for(i = 1; i < parts; i++)
2209 dst[i] = 0;
2210}
2211
2212/* Assign one bignum to another. */
2213void
2214APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2215{
2216 unsigned int i;
2217
2218 for(i = 0; i < parts; i++)
2219 dst[i] = src[i];
2220}
2221
2222/* Returns true if a bignum is zero, false otherwise. */
2223bool
2224APInt::tcIsZero(const integerPart *src, unsigned int parts)
2225{
2226 unsigned int i;
2227
2228 for(i = 0; i < parts; i++)
2229 if (src[i])
2230 return false;
2231
2232 return true;
2233}
2234
2235/* Extract the given bit of a bignum; returns 0 or 1. */
2236int
2237APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2238{
2239 return(parts[bit / integerPartWidth]
2240 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2241}
2242
2243/* Set the given bit of a bignum. */
2244void
2245APInt::tcSetBit(integerPart *parts, unsigned int bit)
2246{
2247 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2248}
2249
Neil Booth055c0b32007-10-06 00:43:45 +00002250/* Returns the bit number of the least significant set bit of a
2251 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002252unsigned int
2253APInt::tcLSB(const integerPart *parts, unsigned int n)
2254{
2255 unsigned int i, lsb;
2256
2257 for(i = 0; i < n; i++) {
2258 if (parts[i] != 0) {
2259 lsb = partLSB(parts[i]);
2260
2261 return lsb + i * integerPartWidth;
2262 }
2263 }
2264
2265 return -1U;
2266}
2267
Neil Booth055c0b32007-10-06 00:43:45 +00002268/* Returns the bit number of the most significant set bit of a number.
2269 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002270unsigned int
2271APInt::tcMSB(const integerPart *parts, unsigned int n)
2272{
2273 unsigned int msb;
2274
2275 do {
2276 --n;
2277
2278 if (parts[n] != 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002279 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002280
2281 return msb + n * integerPartWidth;
2282 }
2283 } while (n);
2284
2285 return -1U;
2286}
2287
Neil Booth68e53ad2007-10-08 13:47:12 +00002288/* Copy the bit vector of width srcBITS from SRC, starting at bit
2289 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2290 the least significant bit of DST. All high bits above srcBITS in
2291 DST are zero-filled. */
2292void
2293APInt::tcExtract(integerPart *dst, unsigned int dstCount, const integerPart *src,
2294 unsigned int srcBits, unsigned int srcLSB)
2295{
2296 unsigned int firstSrcPart, dstParts, shift, n;
2297
2298 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2299 assert (dstParts <= dstCount);
2300
2301 firstSrcPart = srcLSB / integerPartWidth;
2302 tcAssign (dst, src + firstSrcPart, dstParts);
2303
2304 shift = srcLSB % integerPartWidth;
2305 tcShiftRight (dst, dstParts, shift);
2306
2307 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2308 in DST. If this is less that srcBits, append the rest, else
2309 clear the high bits. */
2310 n = dstParts * integerPartWidth - shift;
2311 if (n < srcBits) {
2312 integerPart mask = lowBitMask (srcBits - n);
2313 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2314 << n % integerPartWidth);
2315 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002316 if (srcBits % integerPartWidth)
2317 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002318 }
2319
2320 /* Clear high parts. */
2321 while (dstParts < dstCount)
2322 dst[dstParts++] = 0;
2323}
2324
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002325/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2326integerPart
2327APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2328 integerPart c, unsigned int parts)
2329{
2330 unsigned int i;
2331
2332 assert(c <= 1);
2333
2334 for(i = 0; i < parts; i++) {
2335 integerPart l;
2336
2337 l = dst[i];
2338 if (c) {
2339 dst[i] += rhs[i] + 1;
2340 c = (dst[i] <= l);
2341 } else {
2342 dst[i] += rhs[i];
2343 c = (dst[i] < l);
2344 }
2345 }
2346
2347 return c;
2348}
2349
2350/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2351integerPart
2352APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2353 integerPart c, unsigned int parts)
2354{
2355 unsigned int i;
2356
2357 assert(c <= 1);
2358
2359 for(i = 0; i < parts; i++) {
2360 integerPart l;
2361
2362 l = dst[i];
2363 if (c) {
2364 dst[i] -= rhs[i] + 1;
2365 c = (dst[i] >= l);
2366 } else {
2367 dst[i] -= rhs[i];
2368 c = (dst[i] > l);
2369 }
2370 }
2371
2372 return c;
2373}
2374
2375/* Negate a bignum in-place. */
2376void
2377APInt::tcNegate(integerPart *dst, unsigned int parts)
2378{
2379 tcComplement(dst, parts);
2380 tcIncrement(dst, parts);
2381}
2382
Neil Booth055c0b32007-10-06 00:43:45 +00002383/* DST += SRC * MULTIPLIER + CARRY if add is true
2384 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002385
2386 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2387 they must start at the same point, i.e. DST == SRC.
2388
2389 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2390 returned. Otherwise DST is filled with the least significant
2391 DSTPARTS parts of the result, and if all of the omitted higher
2392 parts were zero return zero, otherwise overflow occurred and
2393 return one. */
2394int
2395APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2396 integerPart multiplier, integerPart carry,
2397 unsigned int srcParts, unsigned int dstParts,
2398 bool add)
2399{
2400 unsigned int i, n;
2401
2402 /* Otherwise our writes of DST kill our later reads of SRC. */
2403 assert(dst <= src || dst >= src + srcParts);
2404 assert(dstParts <= srcParts + 1);
2405
2406 /* N loops; minimum of dstParts and srcParts. */
2407 n = dstParts < srcParts ? dstParts: srcParts;
2408
2409 for(i = 0; i < n; i++) {
2410 integerPart low, mid, high, srcPart;
2411
2412 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2413
2414 This cannot overflow, because
2415
2416 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2417
2418 which is less than n^2. */
2419
2420 srcPart = src[i];
2421
2422 if (multiplier == 0 || srcPart == 0) {
2423 low = carry;
2424 high = 0;
2425 } else {
2426 low = lowHalf(srcPart) * lowHalf(multiplier);
2427 high = highHalf(srcPart) * highHalf(multiplier);
2428
2429 mid = lowHalf(srcPart) * highHalf(multiplier);
2430 high += highHalf(mid);
2431 mid <<= integerPartWidth / 2;
2432 if (low + mid < low)
2433 high++;
2434 low += mid;
2435
2436 mid = highHalf(srcPart) * lowHalf(multiplier);
2437 high += highHalf(mid);
2438 mid <<= integerPartWidth / 2;
2439 if (low + mid < low)
2440 high++;
2441 low += mid;
2442
2443 /* Now add carry. */
2444 if (low + carry < low)
2445 high++;
2446 low += carry;
2447 }
2448
2449 if (add) {
2450 /* And now DST[i], and store the new low part there. */
2451 if (low + dst[i] < low)
2452 high++;
2453 dst[i] += low;
2454 } else
2455 dst[i] = low;
2456
2457 carry = high;
2458 }
2459
2460 if (i < dstParts) {
2461 /* Full multiplication, there is no overflow. */
2462 assert(i + 1 == dstParts);
2463 dst[i] = carry;
2464 return 0;
2465 } else {
2466 /* We overflowed if there is carry. */
2467 if (carry)
2468 return 1;
2469
2470 /* We would overflow if any significant unwritten parts would be
2471 non-zero. This is true if any remaining src parts are non-zero
2472 and the multiplier is non-zero. */
2473 if (multiplier)
2474 for(; i < srcParts; i++)
2475 if (src[i])
2476 return 1;
2477
2478 /* We fitted in the narrow destination. */
2479 return 0;
2480 }
2481}
2482
2483/* DST = LHS * RHS, where DST has the same width as the operands and
2484 is filled with the least significant parts of the result. Returns
2485 one if overflow occurred, otherwise zero. DST must be disjoint
2486 from both operands. */
2487int
2488APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2489 const integerPart *rhs, unsigned int parts)
2490{
2491 unsigned int i;
2492 int overflow;
2493
2494 assert(dst != lhs && dst != rhs);
2495
2496 overflow = 0;
2497 tcSet(dst, 0, parts);
2498
2499 for(i = 0; i < parts; i++)
2500 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2501 parts - i, true);
2502
2503 return overflow;
2504}
2505
Neil Booth978661d2007-10-06 00:24:48 +00002506/* DST = LHS * RHS, where DST has width the sum of the widths of the
2507 operands. No overflow occurs. DST must be disjoint from both
2508 operands. Returns the number of parts required to hold the
2509 result. */
2510unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002511APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002512 const integerPart *rhs, unsigned int lhsParts,
2513 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002514{
Neil Booth978661d2007-10-06 00:24:48 +00002515 /* Put the narrower number on the LHS for less loops below. */
2516 if (lhsParts > rhsParts) {
2517 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2518 } else {
2519 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002520
Neil Booth978661d2007-10-06 00:24:48 +00002521 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002522
Neil Booth978661d2007-10-06 00:24:48 +00002523 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002524
Neil Booth978661d2007-10-06 00:24:48 +00002525 for(n = 0; n < lhsParts; n++)
2526 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002527
Neil Booth978661d2007-10-06 00:24:48 +00002528 n = lhsParts + rhsParts;
2529
2530 return n - (dst[n - 1] == 0);
2531 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002532}
2533
2534/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2535 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2536 set REMAINDER to the remainder, return zero. i.e.
2537
2538 OLD_LHS = RHS * LHS + REMAINDER
2539
2540 SCRATCH is a bignum of the same size as the operands and result for
2541 use by the routine; its contents need not be initialized and are
2542 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2543*/
2544int
2545APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2546 integerPart *remainder, integerPart *srhs,
2547 unsigned int parts)
2548{
2549 unsigned int n, shiftCount;
2550 integerPart mask;
2551
2552 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2553
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002554 shiftCount = tcMSB(rhs, parts) + 1;
2555 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002556 return true;
2557
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002558 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002559 n = shiftCount / integerPartWidth;
2560 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2561
2562 tcAssign(srhs, rhs, parts);
2563 tcShiftLeft(srhs, parts, shiftCount);
2564 tcAssign(remainder, lhs, parts);
2565 tcSet(lhs, 0, parts);
2566
2567 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2568 the total. */
2569 for(;;) {
2570 int compare;
2571
2572 compare = tcCompare(remainder, srhs, parts);
2573 if (compare >= 0) {
2574 tcSubtract(remainder, srhs, 0, parts);
2575 lhs[n] |= mask;
2576 }
2577
2578 if (shiftCount == 0)
2579 break;
2580 shiftCount--;
2581 tcShiftRight(srhs, parts, 1);
2582 if ((mask >>= 1) == 0)
2583 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2584 }
2585
2586 return false;
2587}
2588
2589/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2590 There are no restrictions on COUNT. */
2591void
2592APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2593{
Neil Booth68e53ad2007-10-08 13:47:12 +00002594 if (count) {
2595 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002596
Neil Booth68e53ad2007-10-08 13:47:12 +00002597 /* Jump is the inter-part jump; shift is is intra-part shift. */
2598 jump = count / integerPartWidth;
2599 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002600
Neil Booth68e53ad2007-10-08 13:47:12 +00002601 while (parts > jump) {
2602 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002603
Neil Booth68e53ad2007-10-08 13:47:12 +00002604 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002605
Neil Booth68e53ad2007-10-08 13:47:12 +00002606 /* dst[i] comes from the two parts src[i - jump] and, if we have
2607 an intra-part shift, src[i - jump - 1]. */
2608 part = dst[parts - jump];
2609 if (shift) {
2610 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002611 if (parts >= jump + 1)
2612 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2613 }
2614
Neil Booth68e53ad2007-10-08 13:47:12 +00002615 dst[parts] = part;
2616 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002617
Neil Booth68e53ad2007-10-08 13:47:12 +00002618 while (parts > 0)
2619 dst[--parts] = 0;
2620 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002621}
2622
2623/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2624 zero. There are no restrictions on COUNT. */
2625void
2626APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2627{
Neil Booth68e53ad2007-10-08 13:47:12 +00002628 if (count) {
2629 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002630
Neil Booth68e53ad2007-10-08 13:47:12 +00002631 /* Jump is the inter-part jump; shift is is intra-part shift. */
2632 jump = count / integerPartWidth;
2633 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002634
Neil Booth68e53ad2007-10-08 13:47:12 +00002635 /* Perform the shift. This leaves the most significant COUNT bits
2636 of the result at zero. */
2637 for(i = 0; i < parts; i++) {
2638 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002639
Neil Booth68e53ad2007-10-08 13:47:12 +00002640 if (i + jump >= parts) {
2641 part = 0;
2642 } else {
2643 part = dst[i + jump];
2644 if (shift) {
2645 part >>= shift;
2646 if (i + jump + 1 < parts)
2647 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2648 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002649 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002650
Neil Booth68e53ad2007-10-08 13:47:12 +00002651 dst[i] = part;
2652 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002653 }
2654}
2655
2656/* Bitwise and of two bignums. */
2657void
2658APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2659{
2660 unsigned int i;
2661
2662 for(i = 0; i < parts; i++)
2663 dst[i] &= rhs[i];
2664}
2665
2666/* Bitwise inclusive or of two bignums. */
2667void
2668APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2669{
2670 unsigned int i;
2671
2672 for(i = 0; i < parts; i++)
2673 dst[i] |= rhs[i];
2674}
2675
2676/* Bitwise exclusive or of two bignums. */
2677void
2678APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2679{
2680 unsigned int i;
2681
2682 for(i = 0; i < parts; i++)
2683 dst[i] ^= rhs[i];
2684}
2685
2686/* Complement a bignum in-place. */
2687void
2688APInt::tcComplement(integerPart *dst, unsigned int parts)
2689{
2690 unsigned int i;
2691
2692 for(i = 0; i < parts; i++)
2693 dst[i] = ~dst[i];
2694}
2695
2696/* Comparison (unsigned) of two bignums. */
2697int
2698APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2699 unsigned int parts)
2700{
2701 while (parts) {
2702 parts--;
2703 if (lhs[parts] == rhs[parts])
2704 continue;
2705
2706 if (lhs[parts] > rhs[parts])
2707 return 1;
2708 else
2709 return -1;
2710 }
2711
2712 return 0;
2713}
2714
2715/* Increment a bignum in-place, return the carry flag. */
2716integerPart
2717APInt::tcIncrement(integerPart *dst, unsigned int parts)
2718{
2719 unsigned int i;
2720
2721 for(i = 0; i < parts; i++)
2722 if (++dst[i] != 0)
2723 break;
2724
2725 return i == parts;
2726}
2727
2728/* Set the least significant BITS bits of a bignum, clear the
2729 rest. */
2730void
2731APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2732 unsigned int bits)
2733{
2734 unsigned int i;
2735
2736 i = 0;
2737 while (bits > integerPartWidth) {
2738 dst[i++] = ~(integerPart) 0;
2739 bits -= integerPartWidth;
2740 }
2741
2742 if (bits)
2743 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2744
2745 while (i < parts)
2746 dst[i++] = 0;
2747}