blob: 671fc4e7c3b2ec7851195b9d522634f7489532eb [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"
Reid Spencer9d6c9192007-02-24 03:58:46 +000017#include "llvm/Support/Debug.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000018#include "llvm/Support/MathExtras.h"
Jeff Cohenca5183d2007-03-05 00:00:42 +000019#include <math.h>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000020#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000021#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000022#include <cstdlib>
Reid Spencer385f7542007-02-21 03:55:44 +000023#include <iomanip>
Reid Spencer385f7542007-02-21 03:55:44 +000024
Zhou Shengfd43dcf2007-02-06 03:00:16 +000025using namespace llvm;
26
Reid Spencer9af18872007-12-11 06:53:58 +000027
28/// 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 Spencer9c0696f2007-02-20 08:51:03 +000097APInt::APInt(uint32_t numbits, const std::string& Val, uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +000098 : BitWidth(numbits), 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");
Zhou Shenga3832fd2007-02-07 06:14:53 +0000101 assert(!Val.empty() && "String empty?");
Reid Spencere81d2da2007-02-16 22:36:51 +0000102 fromString(numbits, Val.c_str(), Val.size(), radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +0000103}
104
Reid Spencer54362ca2007-02-20 23:40:25 +0000105APInt::APInt(const APInt& that)
Reid Spencer385f7542007-02-21 03:55:44 +0000106 : BitWidth(that.BitWidth), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +0000107 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
108 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Reid Spenceraf0e9562007-02-18 18:38:44 +0000109 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000110 VAL = that.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000111 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000112 pVal = getMemory(getNumWords());
Reid Spencer54362ca2007-02-20 23:40:25 +0000113 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000114 }
115}
116
117APInt::~APInt() {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000118 if (!isSingleWord() && pVal)
Reid Spencer9ac44112007-02-26 23:38:21 +0000119 delete [] pVal;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000120}
121
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000122APInt& APInt::operator=(const APInt& RHS) {
Reid Spencer9ac44112007-02-26 23:38:21 +0000123 // Don't do anything for X = X
124 if (this == &RHS)
125 return *this;
126
127 // If the bitwidths are the same, we can avoid mucking with memory
128 if (BitWidth == RHS.getBitWidth()) {
129 if (isSingleWord())
130 VAL = RHS.VAL;
131 else
132 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
133 return *this;
134 }
135
136 if (isSingleWord())
137 if (RHS.isSingleWord())
138 VAL = RHS.VAL;
139 else {
140 VAL = 0;
141 pVal = getMemory(RHS.getNumWords());
142 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
143 }
144 else if (getNumWords() == RHS.getNumWords())
145 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
146 else if (RHS.isSingleWord()) {
147 delete [] pVal;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000148 VAL = RHS.VAL;
Reid Spencer9ac44112007-02-26 23:38:21 +0000149 } else {
150 delete [] pVal;
151 pVal = getMemory(RHS.getNumWords());
152 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
153 }
154 BitWidth = RHS.BitWidth;
155 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000156}
157
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000158APInt& APInt::operator=(uint64_t RHS) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000159 if (isSingleWord())
160 VAL = RHS;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000161 else {
162 pVal[0] = RHS;
Reid Spencera58f0582007-02-18 20:09:41 +0000163 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000164 }
Reid Spencer9ac44112007-02-26 23:38:21 +0000165 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000166}
167
Reid Spenceraf0e9562007-02-18 18:38:44 +0000168/// add_1 - This function adds a single "digit" integer, y, to the multiple
169/// "digit" integer array, x[]. x[] is modified to reflect the addition and
170/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000171/// @returns the carry of the addition.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000172static bool add_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000173 for (uint32_t i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000174 dest[i] = y + x[i];
175 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000176 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000177 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000178 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000179 break;
180 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000181 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000182 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000183}
184
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000185/// @brief Prefix increment operator. Increments the APInt by one.
186APInt& APInt::operator++() {
Reid Spencere81d2da2007-02-16 22:36:51 +0000187 if (isSingleWord())
188 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000189 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000190 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000191 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000192}
193
Reid Spenceraf0e9562007-02-18 18:38:44 +0000194/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
195/// the multi-digit integer array, x[], propagating the borrowed 1 value until
196/// no further borrowing is neeeded or it runs out of "digits" in x. The result
197/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
198/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000199/// @returns the borrow out of the subtraction
200static bool sub_1(uint64_t x[], uint32_t len, uint64_t y) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000201 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000202 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000203 x[i] -= y;
204 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000205 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000206 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000207 y = 0; // No need to borrow
208 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000209 }
210 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000211 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000212}
213
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000214/// @brief Prefix decrement operator. Decrements the APInt by one.
215APInt& APInt::operator--() {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000216 if (isSingleWord())
217 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000218 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000219 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000220 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000221}
222
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000223/// add - This function adds the integer array x to the integer array Y and
224/// places the result in dest.
225/// @returns the carry out from the addition
226/// @brief General addition of 64-bit integer arrays
Reid Spencer9d6c9192007-02-24 03:58:46 +0000227static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
228 uint32_t len) {
229 bool carry = false;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000230 for (uint32_t i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000231 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000232 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000233 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000234 }
235 return carry;
236}
237
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000238/// Adds the RHS APint to this APInt.
239/// @returns this, after addition of RHS.
240/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000241APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000242 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer54362ca2007-02-20 23:40:25 +0000243 if (isSingleWord())
244 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000245 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000246 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000247 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000248 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000249}
250
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000251/// Subtracts the integer array y from the integer array x
252/// @returns returns the borrow out.
253/// @brief Generalized subtraction of 64-bit integer arrays.
Reid Spencer9d6c9192007-02-24 03:58:46 +0000254static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
255 uint32_t len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000256 bool borrow = false;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000257 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000258 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
259 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
260 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000261 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000262 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000263}
264
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000265/// Subtracts the RHS APInt from this APInt
266/// @returns this, after subtraction
267/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000268APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000269 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000270 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000271 VAL -= RHS.VAL;
272 else
273 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000274 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000275}
276
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000277/// Multiplies an integer array, x by a a uint64_t integer and places the result
278/// into dest.
279/// @returns the carry out of the multiplication.
280/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Reid Spencer610fad82007-02-24 10:01:42 +0000281static uint64_t mul_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
282 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000283 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000284 uint64_t carry = 0;
285
286 // For each digit of x.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000287 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000288 // Split x into high and low words
289 uint64_t lx = x[i] & 0xffffffffULL;
290 uint64_t hx = x[i] >> 32;
291 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000292 // hasCarry == 0, no carry
293 // hasCarry == 1, has carry
294 // hasCarry == 2, no carry and the calculation result == 0.
295 uint8_t hasCarry = 0;
296 dest[i] = carry + lx * ly;
297 // Determine if the add above introduces carry.
298 hasCarry = (dest[i] < carry) ? 1 : 0;
299 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
300 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
301 // (2^32 - 1) + 2^32 = 2^64.
302 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
303
304 carry += (lx * hy) & 0xffffffffULL;
305 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
306 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
307 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
308 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000309 return carry;
310}
311
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000312/// Multiplies integer array x by integer array y and stores the result into
313/// the integer array dest. Note that dest's size must be >= xlen + ylen.
314/// @brief Generalized multiplicate of integer arrays.
Reid Spencer610fad82007-02-24 10:01:42 +0000315static void mul(uint64_t dest[], uint64_t x[], uint32_t xlen, uint64_t y[],
316 uint32_t ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000317 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000318 for (uint32_t i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000319 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000320 uint64_t carry = 0, lx = 0, hx = 0;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000321 for (uint32_t j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000322 lx = x[j] & 0xffffffffULL;
323 hx = x[j] >> 32;
324 // hasCarry - A flag to indicate if has carry.
325 // hasCarry == 0, no carry
326 // hasCarry == 1, has carry
327 // hasCarry == 2, no carry and the calculation result == 0.
328 uint8_t hasCarry = 0;
329 uint64_t resul = carry + lx * ly;
330 hasCarry = (resul < carry) ? 1 : 0;
331 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
332 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
333
334 carry += (lx * hy) & 0xffffffffULL;
335 resul = (carry << 32) | (resul & 0xffffffffULL);
336 dest[i+j] += resul;
337 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
338 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
339 ((lx * hy) >> 32) + hx * hy;
340 }
341 dest[i+xlen] = carry;
342 }
343}
344
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000345APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000346 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000347 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000348 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000349 clearUnusedBits();
350 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000351 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000352
353 // Get some bit facts about LHS and check for zero
354 uint32_t lhsBits = getActiveBits();
355 uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
356 if (!lhsWords)
357 // 0 * X ===> 0
358 return *this;
359
360 // Get some bit facts about RHS and check for zero
361 uint32_t rhsBits = RHS.getActiveBits();
362 uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
363 if (!rhsWords) {
364 // X * 0 ===> 0
365 clear();
366 return *this;
367 }
368
369 // Allocate space for the result
370 uint32_t destWords = rhsWords + lhsWords;
371 uint64_t *dest = getMemory(destWords);
372
373 // Perform the long multiply
374 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
375
376 // Copy result back into *this
377 clear();
378 uint32_t wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
379 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
380
381 // delete dest array and return
382 delete[] dest;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000383 return *this;
384}
385
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000386APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000387 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000388 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000389 VAL &= RHS.VAL;
390 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000391 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000392 uint32_t numWords = getNumWords();
393 for (uint32_t i = 0; i < numWords; ++i)
394 pVal[i] &= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000395 return *this;
396}
397
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000398APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000399 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000400 if (isSingleWord()) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000401 VAL |= RHS.VAL;
402 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000403 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000404 uint32_t numWords = getNumWords();
405 for (uint32_t i = 0; i < numWords; ++i)
406 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000407 return *this;
408}
409
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000410APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000411 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000412 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000413 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000414 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000415 return *this;
416 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000417 uint32_t numWords = getNumWords();
418 for (uint32_t i = 0; i < numWords; ++i)
419 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000420 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000421}
422
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000423APInt APInt::operator&(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000424 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spenceraf0e9562007-02-18 18:38:44 +0000425 if (isSingleWord())
426 return APInt(getBitWidth(), VAL & RHS.VAL);
427
Reid Spenceraf0e9562007-02-18 18:38:44 +0000428 uint32_t numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000429 uint64_t* val = getMemory(numWords);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000430 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000431 val[i] = pVal[i] & RHS.pVal[i];
432 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000433}
434
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000435APInt APInt::operator|(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000436 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spenceraf0e9562007-02-18 18:38:44 +0000437 if (isSingleWord())
438 return APInt(getBitWidth(), VAL | RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000439
Reid Spenceraf0e9562007-02-18 18:38:44 +0000440 uint32_t numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000441 uint64_t *val = getMemory(numWords);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000442 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000443 val[i] = pVal[i] | RHS.pVal[i];
444 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000445}
446
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000447APInt APInt::operator^(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000448 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000449 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000450 return APInt(BitWidth, VAL ^ RHS.VAL);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000451
Reid Spenceraf0e9562007-02-18 18:38:44 +0000452 uint32_t numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000453 uint64_t *val = getMemory(numWords);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000454 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000455 val[i] = pVal[i] ^ RHS.pVal[i];
456
457 // 0^0==1 so clear the high bits in case they got set.
458 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000459}
460
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000461bool APInt::operator !() const {
462 if (isSingleWord())
463 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000464
465 for (uint32_t i = 0; i < getNumWords(); ++i)
466 if (pVal[i])
467 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000468 return true;
469}
470
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000471APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000472 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000473 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000474 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000475 APInt Result(*this);
476 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000477 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000478}
479
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000480APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000481 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000482 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000483 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000484 APInt Result(BitWidth, 0);
485 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000486 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000487}
488
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000489APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000490 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000491 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000492 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000493 APInt Result(BitWidth, 0);
494 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000495 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000496}
497
Reid Spenceraf0e9562007-02-18 18:38:44 +0000498bool APInt::operator[](uint32_t bitPosition) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000499 return (maskBit(bitPosition) &
500 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000501}
502
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000503bool APInt::operator==(const APInt& RHS) const {
Reid Spencer9ac44112007-02-26 23:38:21 +0000504 assert(BitWidth == RHS.BitWidth && "Comparison requires equal bit widths");
Reid Spencer54362ca2007-02-20 23:40:25 +0000505 if (isSingleWord())
506 return VAL == RHS.VAL;
507
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000508 // Get some facts about the number of bits used in the two operands.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000509 uint32_t n1 = getActiveBits();
510 uint32_t n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000511
512 // If the number of bits isn't the same, they aren't equal
Reid Spencer54362ca2007-02-20 23:40:25 +0000513 if (n1 != n2)
514 return false;
515
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000516 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000517 if (n1 <= APINT_BITS_PER_WORD)
518 return pVal[0] == RHS.pVal[0];
519
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000520 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000521 for (int i = whichWord(n1 - 1); i >= 0; --i)
522 if (pVal[i] != RHS.pVal[i])
523 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000524 return true;
525}
526
Zhou Shenga3832fd2007-02-07 06:14:53 +0000527bool APInt::operator==(uint64_t Val) const {
528 if (isSingleWord())
529 return VAL == Val;
Reid Spencer54362ca2007-02-20 23:40:25 +0000530
531 uint32_t n = getActiveBits();
532 if (n <= APINT_BITS_PER_WORD)
533 return pVal[0] == Val;
534 else
535 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000536}
537
Reid Spencere81d2da2007-02-16 22:36:51 +0000538bool APInt::ult(const APInt& RHS) const {
539 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
540 if (isSingleWord())
541 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000542
543 // Get active bit length of both operands
544 uint32_t n1 = getActiveBits();
545 uint32_t n2 = RHS.getActiveBits();
546
547 // If magnitude of LHS is less than RHS, return true.
548 if (n1 < n2)
549 return true;
550
551 // If magnitude of RHS is greather than LHS, return false.
552 if (n2 < n1)
553 return false;
554
555 // If they bot fit in a word, just compare the low order word
556 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
557 return pVal[0] < RHS.pVal[0];
558
559 // Otherwise, compare all words
Reid Spencer1fa111e2007-02-27 18:23:40 +0000560 uint32_t topWord = whichWord(std::max(n1,n2)-1);
561 for (int i = topWord; i >= 0; --i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000562 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000563 return false;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000564 if (pVal[i] < RHS.pVal[i])
565 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000566 }
567 return false;
568}
569
Reid Spencere81d2da2007-02-16 22:36:51 +0000570bool APInt::slt(const APInt& RHS) const {
571 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000572 if (isSingleWord()) {
573 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
574 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
575 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000576 }
Reid Spencera58f0582007-02-18 20:09:41 +0000577
578 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000579 APInt rhs(RHS);
580 bool lhsNeg = isNegative();
581 bool rhsNeg = rhs.isNegative();
582 if (lhsNeg) {
583 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000584 lhs.flip();
585 lhs++;
586 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000587 if (rhsNeg) {
588 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000589 rhs.flip();
590 rhs++;
591 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000592
593 // Now we have unsigned values to compare so do the comparison if necessary
594 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000595 if (lhsNeg)
596 if (rhsNeg)
597 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000598 else
599 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000600 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000601 return false;
602 else
603 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000604}
605
Reid Spenceraf0e9562007-02-18 18:38:44 +0000606APInt& APInt::set(uint32_t bitPosition) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000607 if (isSingleWord())
608 VAL |= maskBit(bitPosition);
609 else
610 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000611 return *this;
612}
613
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000614APInt& APInt::set() {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000615 if (isSingleWord()) {
616 VAL = -1ULL;
617 return clearUnusedBits();
Zhou Shengb04973e2007-02-15 06:36:31 +0000618 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000619
620 // Set all the bits in all the words.
Zhou Sheng6dbe2332007-03-21 04:34:37 +0000621 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000622 pVal[i] = -1ULL;
623 // Clear the unused ones
624 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000625}
626
627/// Set the given bit to 0 whose position is given as "bitPosition".
628/// @brief Set a given bit to 0.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000629APInt& APInt::clear(uint32_t bitPosition) {
630 if (isSingleWord())
631 VAL &= ~maskBit(bitPosition);
632 else
633 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000634 return *this;
635}
636
637/// @brief Set every bit to 0.
638APInt& APInt::clear() {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000639 if (isSingleWord())
640 VAL = 0;
Zhou Shenga3832fd2007-02-07 06:14:53 +0000641 else
Reid Spencera58f0582007-02-18 20:09:41 +0000642 memset(pVal, 0, getNumWords() * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000643 return *this;
644}
645
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000646/// @brief Bitwise NOT operator. Performs a bitwise logical NOT operation on
647/// this APInt.
648APInt APInt::operator~() const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000649 APInt Result(*this);
650 Result.flip();
651 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000652}
653
654/// @brief Toggle every bit to its opposite value.
655APInt& APInt::flip() {
Reid Spencer9eec2412007-02-25 23:44:53 +0000656 if (isSingleWord()) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000657 VAL ^= -1ULL;
Reid Spencer9eec2412007-02-25 23:44:53 +0000658 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000659 }
Reid Spencer9eec2412007-02-25 23:44:53 +0000660 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000661 pVal[i] ^= -1ULL;
Reid Spencer9eec2412007-02-25 23:44:53 +0000662 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000663}
664
665/// Toggle a given bit to its opposite value whose position is given
666/// as "bitPosition".
667/// @brief Toggles a given bit to its opposite value.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000668APInt& APInt::flip(uint32_t bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000669 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000670 if ((*this)[bitPosition]) clear(bitPosition);
671 else set(bitPosition);
672 return *this;
673}
674
Reid Spencer57ae4f52007-04-13 19:19:07 +0000675uint32_t APInt::getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) {
676 assert(str != 0 && "Invalid value string");
677 assert(slen > 0 && "Invalid string length");
678
679 // Each computation below needs to know if its negative
680 uint32_t isNegative = str[0] == '-';
681 if (isNegative) {
682 slen--;
683 str++;
684 }
685 // For radixes of power-of-two values, the bits required is accurately and
686 // easily computed
687 if (radix == 2)
688 return slen + isNegative;
689 if (radix == 8)
690 return slen * 3 + isNegative;
691 if (radix == 16)
692 return slen * 4 + isNegative;
693
694 // Otherwise it must be radix == 10, the hard case
695 assert(radix == 10 && "Invalid radix");
696
697 // This is grossly inefficient but accurate. We could probably do something
698 // with a computation of roughly slen*64/20 and then adjust by the value of
699 // the first few digits. But, I'm not sure how accurate that could be.
700
701 // Compute a sufficient number of bits that is always large enough but might
702 // be too large. This avoids the assertion in the constructor.
703 uint32_t sufficient = slen*64/18;
704
705 // Convert to the actual binary value.
706 APInt tmp(sufficient, str, slen, radix);
707
708 // Compute how many bits are required.
Reid Spencer0468ab32007-04-14 00:00:10 +0000709 return isNegative + tmp.logBase2() + 1;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000710}
711
Reid Spencer794f4722007-02-26 21:02:27 +0000712uint64_t APInt::getHashValue() const {
Reid Spencer9ac44112007-02-26 23:38:21 +0000713 // Put the bit width into the low order bits.
714 uint64_t hash = BitWidth;
Reid Spencer794f4722007-02-26 21:02:27 +0000715
716 // Add the sum of the words to the hash.
717 if (isSingleWord())
Reid Spencer9ac44112007-02-26 23:38:21 +0000718 hash += VAL << 6; // clear separation of up to 64 bits
Reid Spencer794f4722007-02-26 21:02:27 +0000719 else
720 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer9ac44112007-02-26 23:38:21 +0000721 hash += pVal[i] << 6; // clear sepration of up to 64 bits
Reid Spencer794f4722007-02-26 21:02:27 +0000722 return hash;
723}
724
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000725/// HiBits - This function returns the high "numBits" bits of this APInt.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000726APInt APInt::getHiBits(uint32_t numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000727 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000728}
729
730/// LoBits - This function returns the low "numBits" bits of this APInt.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000731APInt APInt::getLoBits(uint32_t numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000732 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
733 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000734}
735
Reid Spencere81d2da2007-02-16 22:36:51 +0000736bool APInt::isPowerOf2() const {
737 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
738}
739
Reid Spenceraf0e9562007-02-18 18:38:44 +0000740uint32_t APInt::countLeadingZeros() const {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000741 uint32_t Count = 0;
Reid Spencere549c492007-02-21 00:29:48 +0000742 if (isSingleWord())
743 Count = CountLeadingZeros_64(VAL);
744 else {
745 for (uint32_t i = getNumWords(); i > 0u; --i) {
746 if (pVal[i-1] == 0)
747 Count += APINT_BITS_PER_WORD;
748 else {
749 Count += CountLeadingZeros_64(pVal[i-1]);
750 break;
751 }
752 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000753 }
Reid Spencerab2b2c82007-02-22 00:22:00 +0000754 uint32_t remainder = BitWidth % APINT_BITS_PER_WORD;
755 if (remainder)
756 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner9e513ac2007-11-23 22:42:31 +0000757 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000758}
759
Reid Spencer681dcd12007-02-27 21:59:26 +0000760static uint32_t countLeadingOnes_64(uint64_t V, uint32_t skip) {
761 uint32_t Count = 0;
762 if (skip)
763 V <<= skip;
764 while (V && (V & (1ULL << 63))) {
765 Count++;
766 V <<= 1;
767 }
768 return Count;
769}
770
771uint32_t APInt::countLeadingOnes() const {
772 if (isSingleWord())
773 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
774
775 uint32_t highWordBits = BitWidth % APINT_BITS_PER_WORD;
776 uint32_t shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits);
777 int i = getNumWords() - 1;
778 uint32_t Count = countLeadingOnes_64(pVal[i], shift);
779 if (Count == highWordBits) {
780 for (i--; i >= 0; --i) {
781 if (pVal[i] == -1ULL)
782 Count += APINT_BITS_PER_WORD;
783 else {
784 Count += countLeadingOnes_64(pVal[i], 0);
785 break;
786 }
787 }
788 }
789 return Count;
790}
791
Reid Spenceraf0e9562007-02-18 18:38:44 +0000792uint32_t APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000793 if (isSingleWord())
Anton Korobeynikov97d37262007-12-24 11:16:47 +0000794 return std::min(uint32_t(CountTrailingZeros_64(VAL)), BitWidth);
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000795 uint32_t Count = 0;
796 uint32_t i = 0;
797 for (; i < getNumWords() && pVal[i] == 0; ++i)
798 Count += APINT_BITS_PER_WORD;
799 if (i < getNumWords())
800 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000801 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000802}
803
Reid Spenceraf0e9562007-02-18 18:38:44 +0000804uint32_t APInt::countPopulation() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000805 if (isSingleWord())
806 return CountPopulation_64(VAL);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000807 uint32_t Count = 0;
808 for (uint32_t i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000809 Count += CountPopulation_64(pVal[i]);
810 return Count;
811}
812
Reid Spencere81d2da2007-02-16 22:36:51 +0000813APInt APInt::byteSwap() const {
814 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
815 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000816 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000817 else if (BitWidth == 32)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000818 return APInt(BitWidth, ByteSwap_32(uint32_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000819 else if (BitWidth == 48) {
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000820 uint32_t Tmp1 = uint32_t(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000821 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000822 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000823 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000824 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000825 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000826 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000827 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000828 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000829 char *pByte = (char*)Result.pVal;
Reid Spencera58f0582007-02-18 20:09:41 +0000830 for (uint32_t i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000831 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000832 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
833 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000834 }
835 return Result;
836 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000837}
838
Zhou Sheng0b706b12007-02-08 14:35:19 +0000839APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
840 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000841 APInt A = API1, B = API2;
842 while (!!B) {
843 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000844 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000845 A = T;
846 }
847 return A;
848}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000849
Reid Spencer1fa111e2007-02-27 18:23:40 +0000850APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, uint32_t width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000851 union {
852 double D;
853 uint64_t I;
854 } T;
855 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000856
857 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000858 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000859
860 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000861 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000862
863 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000864 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000865 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000866
867 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
868 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
869
870 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000871 if (exp < 52)
Reid Spencer1fa111e2007-02-27 18:23:40 +0000872 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
873 APInt(width, mantissa >> (52 - exp));
874
875 // If the client didn't provide enough bits for us to shift the mantissa into
876 // then the result is undefined, just return 0
877 if (width <= exp - 52)
878 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000879
880 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000881 APInt Tmp(width, mantissa);
Reid Spencere81d2da2007-02-16 22:36:51 +0000882 Tmp = Tmp.shl(exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000883 return isNeg ? -Tmp : Tmp;
884}
885
Reid Spencerdb3faa62007-02-13 22:41:58 +0000886/// RoundToDouble - This function convert this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000887/// The layout for double is as following (IEEE Standard 754):
888/// --------------------------------------
889/// | Sign Exponent Fraction Bias |
890/// |-------------------------------------- |
891/// | 1[63] 11[62-52] 52[51-00] 1023 |
892/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000893double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000894
895 // Handle the simple case where the value is contained in one uint64_t.
Reid Spencera58f0582007-02-18 20:09:41 +0000896 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
897 if (isSigned) {
898 int64_t sext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
899 return double(sext);
900 } else
901 return double(VAL);
902 }
903
Reid Spencer9c0696f2007-02-20 08:51:03 +0000904 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000905 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000906
907 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000908 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000909
910 // Figure out how many bits we're using.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000911 uint32_t n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000912
Reid Spencer9c0696f2007-02-20 08:51:03 +0000913 // The exponent (without bias normalization) is just the number of bits
914 // we are using. Note that the sign bit is gone since we constructed the
915 // absolute value.
916 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000917
Reid Spencer9c0696f2007-02-20 08:51:03 +0000918 // Return infinity for exponent overflow
919 if (exp > 1023) {
920 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000921 return std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000922 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000923 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000924 }
925 exp += 1023; // Increment for 1023 bias
926
927 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
928 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000929 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000930 unsigned hiWord = whichWord(n-1);
931 if (hiWord == 0) {
932 mantissa = Tmp.pVal[0];
933 if (n > 52)
934 mantissa >>= n - 52; // shift down, we want the top 52 bits.
935 } else {
936 assert(hiWord > 0 && "huh?");
937 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
938 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
939 mantissa = hibits | lobits;
940 }
941
Zhou Shengd93f00c2007-02-12 20:02:55 +0000942 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000943 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000944 union {
945 double D;
946 uint64_t I;
947 } T;
948 T.I = sign | (exp << 52) | mantissa;
949 return T.D;
950}
951
Reid Spencere81d2da2007-02-16 22:36:51 +0000952// Truncate to new width.
Reid Spencer94900772007-02-28 17:34:32 +0000953APInt &APInt::trunc(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000954 assert(width < BitWidth && "Invalid APInt Truncate request");
Reid Spencer9af18872007-12-11 06:53:58 +0000955 assert(width >= MIN_INT_BITS && "Can't truncate to 0 bits");
Reid Spencer9eec2412007-02-25 23:44:53 +0000956 uint32_t wordsBefore = getNumWords();
957 BitWidth = width;
958 uint32_t wordsAfter = getNumWords();
959 if (wordsBefore != wordsAfter) {
960 if (wordsAfter == 1) {
961 uint64_t *tmp = pVal;
962 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +0000963 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +0000964 } else {
965 uint64_t *newVal = getClearedMemory(wordsAfter);
966 for (uint32_t i = 0; i < wordsAfter; ++i)
967 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +0000968 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +0000969 pVal = newVal;
970 }
971 }
Reid Spencer94900772007-02-28 17:34:32 +0000972 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +0000973}
974
975// Sign extend to a new width.
Reid Spencer94900772007-02-28 17:34:32 +0000976APInt &APInt::sext(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000977 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9af18872007-12-11 06:53:58 +0000978 assert(width <= MAX_INT_BITS && "Too many bits");
Reid Spencer9eec2412007-02-25 23:44:53 +0000979 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000980 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +0000981 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +0000982 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +0000983 }
984
985 // The sign bit is set. First, get some facts
986 uint32_t wordsBefore = getNumWords();
987 uint32_t wordBits = BitWidth % APINT_BITS_PER_WORD;
988 BitWidth = width;
989 uint32_t wordsAfter = getNumWords();
990
991 // Mask the high order word appropriately
992 if (wordsBefore == wordsAfter) {
993 uint32_t newWordBits = width % APINT_BITS_PER_WORD;
994 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +0000995 uint64_t mask = ~0ULL;
996 if (newWordBits)
997 mask >>= APINT_BITS_PER_WORD - newWordBits;
998 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +0000999 if (wordsBefore == 1)
1000 VAL |= mask;
1001 else
1002 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001003 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001004 }
1005
Reid Spencerf30b1882007-02-25 23:54:00 +00001006 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001007 uint64_t *newVal = getMemory(wordsAfter);
1008 if (wordsBefore == 1)
1009 newVal[0] = VAL | mask;
1010 else {
1011 for (uint32_t i = 0; i < wordsBefore; ++i)
1012 newVal[i] = pVal[i];
1013 newVal[wordsBefore-1] |= mask;
1014 }
1015 for (uint32_t i = wordsBefore; i < wordsAfter; i++)
1016 newVal[i] = -1ULL;
1017 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001018 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001019 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001020 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001021}
1022
1023// Zero extend to a new width.
Reid Spencer94900772007-02-28 17:34:32 +00001024APInt &APInt::zext(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001025 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Reid Spencer9af18872007-12-11 06:53:58 +00001026 assert(width <= MAX_INT_BITS && "Too many bits");
Reid Spencer9eec2412007-02-25 23:44:53 +00001027 uint32_t wordsBefore = getNumWords();
1028 BitWidth = width;
1029 uint32_t wordsAfter = getNumWords();
1030 if (wordsBefore != wordsAfter) {
1031 uint64_t *newVal = getClearedMemory(wordsAfter);
1032 if (wordsBefore == 1)
1033 newVal[0] = VAL;
1034 else
1035 for (uint32_t i = 0; i < wordsBefore; ++i)
1036 newVal[i] = pVal[i];
1037 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001038 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001039 pVal = newVal;
1040 }
Reid Spencer94900772007-02-28 17:34:32 +00001041 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001042}
1043
Reid Spencer68e23002007-03-01 17:15:32 +00001044APInt &APInt::zextOrTrunc(uint32_t width) {
1045 if (BitWidth < width)
1046 return zext(width);
1047 if (BitWidth > width)
1048 return trunc(width);
1049 return *this;
1050}
1051
1052APInt &APInt::sextOrTrunc(uint32_t width) {
1053 if (BitWidth < width)
1054 return sext(width);
1055 if (BitWidth > width)
1056 return trunc(width);
1057 return *this;
1058}
1059
Zhou Shengff4304f2007-02-09 07:48:24 +00001060/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001061/// @brief Arithmetic right-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001062APInt APInt::ashr(uint32_t shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001063 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001064 // Handle a degenerate case
1065 if (shiftAmt == 0)
1066 return *this;
1067
1068 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001069 if (isSingleWord()) {
1070 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001071 return APInt(BitWidth, 0); // undefined
1072 else {
1073 uint32_t SignBit = APINT_BITS_PER_WORD - BitWidth;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001074 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001075 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1076 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001077 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001078
Reid Spencer46f9c942007-03-02 22:39:11 +00001079 // If all the bits were shifted out, the result is, technically, undefined.
1080 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1081 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001082 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001083 if (isNegative())
1084 return APInt(BitWidth, -1ULL);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001085 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001086 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001087 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001088
1089 // Create some space for the result.
1090 uint64_t * val = new uint64_t[getNumWords()];
1091
Reid Spencer46f9c942007-03-02 22:39:11 +00001092 // Compute some values needed by the following shift algorithms
1093 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1094 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1095 uint32_t breakWord = getNumWords() - 1 - offset; // last word affected
1096 uint32_t bitsInWord = whichBit(BitWidth); // how many bits in last word?
1097 if (bitsInWord == 0)
1098 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001099
1100 // If we are shifting whole words, just move whole words
1101 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001102 // Move the words containing significant bits
1103 for (uint32_t i = 0; i <= breakWord; ++i)
1104 val[i] = pVal[i+offset]; // move whole word
1105
1106 // Adjust the top significant word for sign bit fill, if negative
1107 if (isNegative())
1108 if (bitsInWord < APINT_BITS_PER_WORD)
1109 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1110 } else {
1111 // Shift the low order words
1112 for (uint32_t i = 0; i < breakWord; ++i) {
1113 // This combines the shifted corresponding word with the low bits from
1114 // the next word (shifted into this word's high bits).
1115 val[i] = (pVal[i+offset] >> wordShift) |
1116 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1117 }
1118
1119 // Shift the break word. In this case there are no bits from the next word
1120 // to include in this word.
1121 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1122
1123 // Deal with sign extenstion in the break word, and possibly the word before
1124 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001125 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001126 if (wordShift > bitsInWord) {
1127 if (breakWord > 0)
1128 val[breakWord-1] |=
1129 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1130 val[breakWord] |= ~0ULL;
1131 } else
1132 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001133 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001134 }
1135
Reid Spencer46f9c942007-03-02 22:39:11 +00001136 // Remaining words are 0 or -1, just assign them.
1137 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001138 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001139 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001140 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001141}
1142
Zhou Shengff4304f2007-02-09 07:48:24 +00001143/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001144/// @brief Logical right-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001145APInt APInt::lshr(uint32_t shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001146 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001147 if (shiftAmt == BitWidth)
1148 return APInt(BitWidth, 0);
1149 else
1150 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001151 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001152
Reid Spencerba81c2b2007-02-26 01:19:48 +00001153 // If all the bits were shifted out, the result is 0. This avoids issues
1154 // with shifting by the size of the integer type, which produces undefined
1155 // results. We define these "undefined results" to always be 0.
1156 if (shiftAmt == BitWidth)
1157 return APInt(BitWidth, 0);
1158
Reid Spencer02ae8b72007-05-17 06:26:29 +00001159 // If none of the bits are shifted out, the result is *this. This avoids
1160 // issues with shifting byt he size of the integer type, which produces
1161 // undefined results in the code below. This is also an optimization.
1162 if (shiftAmt == 0)
1163 return *this;
1164
Reid Spencerba81c2b2007-02-26 01:19:48 +00001165 // Create some space for the result.
1166 uint64_t * val = new uint64_t[getNumWords()];
1167
1168 // If we are shifting less than a word, compute the shift with a simple carry
1169 if (shiftAmt < APINT_BITS_PER_WORD) {
1170 uint64_t carry = 0;
1171 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001172 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001173 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1174 }
1175 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001176 }
1177
Reid Spencerba81c2b2007-02-26 01:19:48 +00001178 // Compute some values needed by the remaining shift algorithms
1179 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1180 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1181
1182 // If we are shifting whole words, just move whole words
1183 if (wordShift == 0) {
1184 for (uint32_t i = 0; i < getNumWords() - offset; ++i)
1185 val[i] = pVal[i+offset];
1186 for (uint32_t i = getNumWords()-offset; i < getNumWords(); i++)
1187 val[i] = 0;
1188 return APInt(val,BitWidth).clearUnusedBits();
1189 }
1190
1191 // Shift the low order words
1192 uint32_t breakWord = getNumWords() - offset -1;
1193 for (uint32_t i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001194 val[i] = (pVal[i+offset] >> wordShift) |
1195 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001196 // Shift the break word.
1197 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1198
1199 // Remaining words are 0
1200 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
1201 val[i] = 0;
1202 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001203}
1204
Zhou Shengff4304f2007-02-09 07:48:24 +00001205/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001206/// @brief Left-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001207APInt APInt::shl(uint32_t shiftAmt) const {
Reid Spencer5bce8542007-02-24 20:19:37 +00001208 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer87553802007-02-25 00:56:44 +00001209 if (isSingleWord()) {
Reid Spencer5bce8542007-02-24 20:19:37 +00001210 if (shiftAmt == BitWidth)
Reid Spencer87553802007-02-25 00:56:44 +00001211 return APInt(BitWidth, 0); // avoid undefined shift results
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001212 return APInt(BitWidth, VAL << shiftAmt);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001213 }
Reid Spencer5bce8542007-02-24 20:19:37 +00001214
Reid Spencer87553802007-02-25 00:56:44 +00001215 // If all the bits were shifted out, the result is 0. This avoids issues
1216 // with shifting by the size of the integer type, which produces undefined
1217 // results. We define these "undefined results" to always be 0.
1218 if (shiftAmt == BitWidth)
1219 return APInt(BitWidth, 0);
1220
Reid Spencer92c72832007-05-12 18:01:57 +00001221 // If none of the bits are shifted out, the result is *this. This avoids a
1222 // lshr by the words size in the loop below which can produce incorrect
1223 // results. It also avoids the expensive computation below for a common case.
1224 if (shiftAmt == 0)
1225 return *this;
1226
Reid Spencer87553802007-02-25 00:56:44 +00001227 // Create some space for the result.
1228 uint64_t * val = new uint64_t[getNumWords()];
1229
1230 // If we are shifting less than a word, do it the easy way
1231 if (shiftAmt < APINT_BITS_PER_WORD) {
1232 uint64_t carry = 0;
Reid Spencer87553802007-02-25 00:56:44 +00001233 for (uint32_t i = 0; i < getNumWords(); i++) {
1234 val[i] = pVal[i] << shiftAmt | carry;
1235 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1236 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001237 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001238 }
1239
Reid Spencer87553802007-02-25 00:56:44 +00001240 // Compute some values needed by the remaining shift algorithms
1241 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1242 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1243
1244 // If we are shifting whole words, just move whole words
1245 if (wordShift == 0) {
1246 for (uint32_t i = 0; i < offset; i++)
1247 val[i] = 0;
1248 for (uint32_t i = offset; i < getNumWords(); i++)
1249 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001250 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001251 }
Reid Spencer87553802007-02-25 00:56:44 +00001252
1253 // Copy whole words from this to Result.
1254 uint32_t i = getNumWords() - 1;
1255 for (; i > offset; --i)
1256 val[i] = pVal[i-offset] << wordShift |
1257 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001258 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001259 for (i = 0; i < offset; ++i)
1260 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001261 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001262}
1263
Reid Spencer19dc32a2007-05-13 23:44:59 +00001264APInt APInt::rotl(uint32_t rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001265 if (rotateAmt == 0)
1266 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001267 // Don't get too fancy, just use existing shift/or facilities
1268 APInt hi(*this);
1269 APInt lo(*this);
1270 hi.shl(rotateAmt);
1271 lo.lshr(BitWidth - rotateAmt);
1272 return hi | lo;
1273}
1274
1275APInt APInt::rotr(uint32_t rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001276 if (rotateAmt == 0)
1277 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001278 // Don't get too fancy, just use existing shift/or facilities
1279 APInt hi(*this);
1280 APInt lo(*this);
1281 lo.lshr(rotateAmt);
1282 hi.shl(BitWidth - rotateAmt);
1283 return hi | lo;
1284}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001285
1286// Square Root - this method computes and returns the square root of "this".
1287// Three mechanisms are used for computation. For small values (<= 5 bits),
1288// a table lookup is done. This gets some performance for common cases. For
1289// values using less than 52 bits, the value is converted to double and then
1290// the libc sqrt function is called. The result is rounded and then converted
1291// back to a uint64_t which is then used to construct the result. Finally,
1292// the Babylonian method for computing square roots is used.
1293APInt APInt::sqrt() const {
1294
1295 // Determine the magnitude of the value.
1296 uint32_t magnitude = getActiveBits();
1297
1298 // Use a fast table for some small values. This also gets rid of some
1299 // rounding errors in libc sqrt for small values.
1300 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001301 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001302 /* 0 */ 0,
1303 /* 1- 2 */ 1, 1,
1304 /* 3- 6 */ 2, 2, 2, 2,
1305 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1306 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1307 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1308 /* 31 */ 6
1309 };
1310 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001311 }
1312
1313 // If the magnitude of the value fits in less than 52 bits (the precision of
1314 // an IEEE double precision floating point value), then we can use the
1315 // libc sqrt function which will probably use a hardware sqrt computation.
1316 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001317 if (magnitude < 52) {
1318#ifdef _MSC_VER
1319 // Amazingly, VC++ doesn't have round().
1320 return APInt(BitWidth,
1321 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1322#else
Reid Spenceraf8fb192007-03-01 05:39:56 +00001323 return APInt(BitWidth,
1324 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001325#endif
1326 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001327
1328 // Okay, all the short cuts are exhausted. We must compute it. The following
1329 // is a classical Babylonian method for computing the square root. This code
1330 // was adapted to APINt from a wikipedia article on such computations.
1331 // See http://www.wikipedia.org/ and go to the page named
1332 // Calculate_an_integer_square_root.
1333 uint32_t nbits = BitWidth, i = 4;
1334 APInt testy(BitWidth, 16);
1335 APInt x_old(BitWidth, 1);
1336 APInt x_new(BitWidth, 0);
1337 APInt two(BitWidth, 2);
1338
1339 // Select a good starting value using binary logarithms.
1340 for (;; i += 2, testy = testy.shl(2))
1341 if (i >= nbits || this->ule(testy)) {
1342 x_old = x_old.shl(i / 2);
1343 break;
1344 }
1345
1346 // Use the Babylonian method to arrive at the integer square root:
1347 for (;;) {
1348 x_new = (this->udiv(x_old) + x_old).udiv(two);
1349 if (x_old.ule(x_new))
1350 break;
1351 x_old = x_new;
1352 }
1353
1354 // Make sure we return the closest approximation
Reid Spencerf09aef72007-03-02 04:21:55 +00001355 // NOTE: The rounding calculation below is correct. It will produce an
1356 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
1357 // determined to be a rounding issue with pari/gp as it begins to use a
1358 // floating point representation after 192 bits. There are no discrepancies
1359 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001360 APInt square(x_old * x_old);
1361 APInt nextSquare((x_old + 1) * (x_old +1));
1362 if (this->ult(square))
1363 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001364 else if (this->ule(nextSquare)) {
1365 APInt midpoint((nextSquare - square).udiv(two));
1366 APInt offset(*this - square);
1367 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001368 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001369 else
1370 return x_old + 1;
1371 } else
Reid Spenceraf8fb192007-03-01 05:39:56 +00001372 assert(0 && "Error in APInt::sqrt computation");
1373 return x_old + 1;
1374}
1375
Reid Spencer9c0696f2007-02-20 08:51:03 +00001376/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1377/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1378/// variables here have the same names as in the algorithm. Comments explain
1379/// the algorithm and any deviation from it.
1380static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r,
1381 uint32_t m, uint32_t n) {
1382 assert(u && "Must provide dividend");
1383 assert(v && "Must provide divisor");
1384 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001385 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001386 assert(n>1 && "n must be > 1");
1387
1388 // Knuth uses the value b as the base of the number system. In our case b
1389 // is 2^31 so we just set it to -1u.
1390 uint64_t b = uint64_t(1) << 32;
1391
Reid Spencer9d6c9192007-02-24 03:58:46 +00001392 DEBUG(cerr << "KnuthDiv: m=" << m << " n=" << n << '\n');
1393 DEBUG(cerr << "KnuthDiv: original:");
1394 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1395 DEBUG(cerr << " by");
1396 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1397 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001398 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1399 // u and v by d. Note that we have taken Knuth's advice here to use a power
1400 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1401 // 2 allows us to shift instead of multiply and it is easy to determine the
1402 // shift amount from the leading zeros. We are basically normalizing the u
1403 // and v so that its high bits are shifted to the top of v's range without
1404 // overflow. Note that this can require an extra word in u so that u must
1405 // be of length m+n+1.
1406 uint32_t shift = CountLeadingZeros_32(v[n-1]);
1407 uint32_t v_carry = 0;
1408 uint32_t u_carry = 0;
1409 if (shift) {
1410 for (uint32_t i = 0; i < m+n; ++i) {
1411 uint32_t u_tmp = u[i] >> (32 - shift);
1412 u[i] = (u[i] << shift) | u_carry;
1413 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001414 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001415 for (uint32_t i = 0; i < n; ++i) {
1416 uint32_t v_tmp = v[i] >> (32 - shift);
1417 v[i] = (v[i] << shift) | v_carry;
1418 v_carry = v_tmp;
1419 }
1420 }
1421 u[m+n] = u_carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001422 DEBUG(cerr << "KnuthDiv: normal:");
1423 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1424 DEBUG(cerr << " by");
1425 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1426 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001427
1428 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1429 int j = m;
1430 do {
Reid Spencer9d6c9192007-02-24 03:58:46 +00001431 DEBUG(cerr << "KnuthDiv: quotient digit #" << j << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001432 // D3. [Calculate q'.].
1433 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1434 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1435 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1436 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1437 // on v[n-2] determines at high speed most of the cases in which the trial
1438 // value qp is one too large, and it eliminates all cases where qp is two
1439 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001440 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001441 DEBUG(cerr << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001442 uint64_t qp = dividend / v[n-1];
1443 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001444 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1445 qp--;
1446 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001447 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001448 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001449 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001450 DEBUG(cerr << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001451
Reid Spencer92904632007-02-23 01:57:13 +00001452 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1453 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1454 // consists of a simple multiplication by a one-place number, combined with
Reid Spencer610fad82007-02-24 10:01:42 +00001455 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001456 bool isNeg = false;
Reid Spencer92904632007-02-23 01:57:13 +00001457 for (uint32_t i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001458 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001459 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001460 bool borrow = subtrahend > u_tmp;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001461 DEBUG(cerr << "KnuthDiv: u_tmp == " << u_tmp
Reid Spencer610fad82007-02-24 10:01:42 +00001462 << ", subtrahend == " << subtrahend
1463 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001464
Reid Spencer610fad82007-02-24 10:01:42 +00001465 uint64_t result = u_tmp - subtrahend;
1466 uint32_t k = j + i;
1467 u[k++] = result & (b-1); // subtract low word
1468 u[k++] = result >> 32; // subtract high word
1469 while (borrow && k <= m+n) { // deal with borrow to the left
1470 borrow = u[k] == 0;
1471 u[k]--;
1472 k++;
1473 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001474 isNeg |= borrow;
Reid Spencer610fad82007-02-24 10:01:42 +00001475 DEBUG(cerr << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
1476 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001477 }
1478 DEBUG(cerr << "KnuthDiv: after subtraction:");
1479 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1480 DEBUG(cerr << '\n');
Reid Spencer610fad82007-02-24 10:01:42 +00001481 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1482 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1483 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001484 // the true value, and a "borrow" to the left should be remembered.
1485 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001486 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001487 bool carry = true; // true because b's complement is "complement + 1"
1488 for (uint32_t i = 0; i <= m+n; ++i) {
1489 u[i] = ~u[i] + carry; // b's complement
1490 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001491 }
Reid Spencer92904632007-02-23 01:57:13 +00001492 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001493 DEBUG(cerr << "KnuthDiv: after complement:");
1494 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1495 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001496
1497 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
1498 // negative, go to step D6; otherwise go on to step D7.
1499 q[j] = qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001500 if (isNeg) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001501 // D6. [Add back]. The probability that this step is necessary is very
1502 // small, on the order of only 2/b. Make sure that test data accounts for
Reid Spencer92904632007-02-23 01:57:13 +00001503 // this possibility. Decrease q[j] by 1
1504 q[j]--;
1505 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1506 // A carry will occur to the left of u[j+n], and it should be ignored
1507 // since it cancels with the borrow that occurred in D4.
1508 bool carry = false;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001509 for (uint32_t i = 0; i < n; i++) {
Reid Spencer9d6c9192007-02-24 03:58:46 +00001510 uint32_t limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001511 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001512 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001513 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001514 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001515 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001516 DEBUG(cerr << "KnuthDiv: after correction:");
1517 DEBUG(for (int i = m+n; i >=0; i--) cerr <<" " << u[i]);
1518 DEBUG(cerr << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001519
Reid Spencer92904632007-02-23 01:57:13 +00001520 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1521 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001522
Reid Spencer9d6c9192007-02-24 03:58:46 +00001523 DEBUG(cerr << "KnuthDiv: quotient:");
1524 DEBUG(for (int i = m; i >=0; i--) cerr <<" " << q[i]);
1525 DEBUG(cerr << '\n');
1526
Reid Spencer9c0696f2007-02-20 08:51:03 +00001527 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1528 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1529 // compute the remainder (urem uses this).
1530 if (r) {
1531 // The value d is expressed by the "shift" value above since we avoided
1532 // multiplication by d by using a shift left. So, all we have to do is
1533 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001534 if (shift) {
1535 uint32_t carry = 0;
1536 DEBUG(cerr << "KnuthDiv: remainder:");
1537 for (int i = n-1; i >= 0; i--) {
1538 r[i] = (u[i] >> shift) | carry;
1539 carry = u[i] << (32 - shift);
1540 DEBUG(cerr << " " << r[i]);
1541 }
1542 } else {
1543 for (int i = n-1; i >= 0; i--) {
1544 r[i] = u[i];
1545 DEBUG(cerr << " " << r[i]);
1546 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001547 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001548 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001549 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001550 DEBUG(cerr << std::setbase(10) << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001551}
1552
Reid Spencer9c0696f2007-02-20 08:51:03 +00001553void APInt::divide(const APInt LHS, uint32_t lhsWords,
1554 const APInt &RHS, uint32_t rhsWords,
1555 APInt *Quotient, APInt *Remainder)
1556{
1557 assert(lhsWords >= rhsWords && "Fractional result");
1558
1559 // First, compose the values into an array of 32-bit words instead of
1560 // 64-bit words. This is a necessity of both the "short division" algorithm
1561 // and the the Knuth "classical algorithm" which requires there to be native
1562 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1563 // can't use 64-bit operands here because we don't have native results of
1564 // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't
1565 // work on large-endian machines.
1566 uint64_t mask = ~0ull >> (sizeof(uint32_t)*8);
1567 uint32_t n = rhsWords * 2;
1568 uint32_t m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001569
1570 // Allocate space for the temporary values we need either on the stack, if
1571 // it will fit, or on the heap if it won't.
1572 uint32_t SPACE[128];
1573 uint32_t *U = 0;
1574 uint32_t *V = 0;
1575 uint32_t *Q = 0;
1576 uint32_t *R = 0;
1577 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1578 U = &SPACE[0];
1579 V = &SPACE[m+n+1];
1580 Q = &SPACE[(m+n+1) + n];
1581 if (Remainder)
1582 R = &SPACE[(m+n+1) + n + (m+n)];
1583 } else {
1584 U = new uint32_t[m + n + 1];
1585 V = new uint32_t[n];
1586 Q = new uint32_t[m+n];
1587 if (Remainder)
1588 R = new uint32_t[n];
1589 }
1590
1591 // Initialize the dividend
Reid Spencer9c0696f2007-02-20 08:51:03 +00001592 memset(U, 0, (m+n+1)*sizeof(uint32_t));
1593 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001594 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001595 U[i * 2] = tmp & mask;
1596 U[i * 2 + 1] = tmp >> (sizeof(uint32_t)*8);
1597 }
1598 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1599
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001600 // Initialize the divisor
Reid Spencer9c0696f2007-02-20 08:51:03 +00001601 memset(V, 0, (n)*sizeof(uint32_t));
1602 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001603 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001604 V[i * 2] = tmp & mask;
1605 V[i * 2 + 1] = tmp >> (sizeof(uint32_t)*8);
1606 }
1607
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001608 // initialize the quotient and remainder
Reid Spencer9c0696f2007-02-20 08:51:03 +00001609 memset(Q, 0, (m+n) * sizeof(uint32_t));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001610 if (Remainder)
Reid Spencer9c0696f2007-02-20 08:51:03 +00001611 memset(R, 0, n * sizeof(uint32_t));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001612
1613 // Now, adjust m and n for the Knuth division. n is the number of words in
1614 // the divisor. m is the number of words by which the dividend exceeds the
1615 // divisor (i.e. m+n is the length of the dividend). These sizes must not
1616 // contain any zero words or the Knuth algorithm fails.
1617 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1618 n--;
1619 m++;
1620 }
1621 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1622 m--;
1623
1624 // If we're left with only a single word for the divisor, Knuth doesn't work
1625 // so we implement the short division algorithm here. This is much simpler
1626 // and faster because we are certain that we can divide a 64-bit quantity
1627 // by a 32-bit quantity at hardware speed and short division is simply a
1628 // series of such operations. This is just like doing short division but we
1629 // are using base 2^32 instead of base 10.
1630 assert(n != 0 && "Divide by zero?");
1631 if (n == 1) {
1632 uint32_t divisor = V[0];
1633 uint32_t remainder = 0;
1634 for (int i = m+n-1; i >= 0; i--) {
1635 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1636 if (partial_dividend == 0) {
1637 Q[i] = 0;
1638 remainder = 0;
1639 } else if (partial_dividend < divisor) {
1640 Q[i] = 0;
1641 remainder = partial_dividend;
1642 } else if (partial_dividend == divisor) {
1643 Q[i] = 1;
1644 remainder = 0;
1645 } else {
1646 Q[i] = partial_dividend / divisor;
1647 remainder = partial_dividend - (Q[i] * divisor);
1648 }
1649 }
1650 if (R)
1651 R[0] = remainder;
1652 } else {
1653 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1654 // case n > 1.
1655 KnuthDiv(U, V, Q, R, m, n);
1656 }
1657
1658 // If the caller wants the quotient
1659 if (Quotient) {
1660 // Set up the Quotient value's memory.
1661 if (Quotient->BitWidth != LHS.BitWidth) {
1662 if (Quotient->isSingleWord())
1663 Quotient->VAL = 0;
1664 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001665 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001666 Quotient->BitWidth = LHS.BitWidth;
1667 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001668 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001669 } else
1670 Quotient->clear();
1671
1672 // The quotient is in Q. Reconstitute the quotient into Quotient's low
1673 // order words.
1674 if (lhsWords == 1) {
1675 uint64_t tmp =
1676 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1677 if (Quotient->isSingleWord())
1678 Quotient->VAL = tmp;
1679 else
1680 Quotient->pVal[0] = tmp;
1681 } else {
1682 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1683 for (unsigned i = 0; i < lhsWords; ++i)
1684 Quotient->pVal[i] =
1685 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1686 }
1687 }
1688
1689 // If the caller wants the remainder
1690 if (Remainder) {
1691 // Set up the Remainder value's memory.
1692 if (Remainder->BitWidth != RHS.BitWidth) {
1693 if (Remainder->isSingleWord())
1694 Remainder->VAL = 0;
1695 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001696 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001697 Remainder->BitWidth = RHS.BitWidth;
1698 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001699 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001700 } else
1701 Remainder->clear();
1702
1703 // The remainder is in R. Reconstitute the remainder into Remainder's low
1704 // order words.
1705 if (rhsWords == 1) {
1706 uint64_t tmp =
1707 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1708 if (Remainder->isSingleWord())
1709 Remainder->VAL = tmp;
1710 else
1711 Remainder->pVal[0] = tmp;
1712 } else {
1713 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1714 for (unsigned i = 0; i < rhsWords; ++i)
1715 Remainder->pVal[i] =
1716 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1717 }
1718 }
1719
1720 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001721 if (U != &SPACE[0]) {
1722 delete [] U;
1723 delete [] V;
1724 delete [] Q;
1725 delete [] R;
1726 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001727}
1728
Reid Spencere81d2da2007-02-16 22:36:51 +00001729APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001730 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001731
1732 // First, deal with the easy case
1733 if (isSingleWord()) {
1734 assert(RHS.VAL != 0 && "Divide by zero?");
1735 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001736 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001737
Reid Spencer71bd08f2007-02-17 02:07:07 +00001738 // Get some facts about the LHS and RHS number of bits and words
Reid Spenceraf0e9562007-02-18 18:38:44 +00001739 uint32_t rhsBits = RHS.getActiveBits();
1740 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001741 assert(rhsWords && "Divided by zero???");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001742 uint32_t lhsBits = this->getActiveBits();
Reid Spenceraf0e9562007-02-18 18:38:44 +00001743 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001744
1745 // Deal with some degenerate cases
1746 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001747 // 0 / X ===> 0
1748 return APInt(BitWidth, 0);
1749 else if (lhsWords < rhsWords || this->ult(RHS)) {
1750 // X / Y ===> 0, iff X < Y
1751 return APInt(BitWidth, 0);
1752 } else if (*this == RHS) {
1753 // X / X ===> 1
1754 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001755 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001756 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001757 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001758 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001759
1760 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1761 APInt Quotient(1,0); // to hold result.
1762 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1763 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001764}
1765
Reid Spencere81d2da2007-02-16 22:36:51 +00001766APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001767 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001768 if (isSingleWord()) {
1769 assert(RHS.VAL != 0 && "Remainder by zero?");
1770 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001771 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001772
Reid Spencere0cdd332007-02-21 08:21:52 +00001773 // Get some facts about the LHS
1774 uint32_t lhsBits = getActiveBits();
1775 uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001776
1777 // Get some facts about the RHS
Reid Spenceraf0e9562007-02-18 18:38:44 +00001778 uint32_t rhsBits = RHS.getActiveBits();
1779 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001780 assert(rhsWords && "Performing remainder operation by zero ???");
1781
Reid Spencer71bd08f2007-02-17 02:07:07 +00001782 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001783 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001784 // 0 % Y ===> 0
1785 return APInt(BitWidth, 0);
1786 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1787 // X % Y ===> X, iff X < Y
1788 return *this;
1789 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001790 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001791 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001792 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001793 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001794 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001795 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001796
Reid Spencer19dc32a2007-05-13 23:44:59 +00001797 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001798 APInt Remainder(1,0);
1799 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1800 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001801}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001802
Reid Spencer19dc32a2007-05-13 23:44:59 +00001803void APInt::udivrem(const APInt &LHS, const APInt &RHS,
1804 APInt &Quotient, APInt &Remainder) {
1805 // Get some size facts about the dividend and divisor
1806 uint32_t lhsBits = LHS.getActiveBits();
1807 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1808 uint32_t rhsBits = RHS.getActiveBits();
1809 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
1810
1811 // Check the degenerate cases
1812 if (lhsWords == 0) {
1813 Quotient = 0; // 0 / Y ===> 0
1814 Remainder = 0; // 0 % Y ===> 0
1815 return;
1816 }
1817
1818 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1819 Quotient = 0; // X / Y ===> 0, iff X < Y
1820 Remainder = LHS; // X % Y ===> X, iff X < Y
1821 return;
1822 }
1823
1824 if (LHS == RHS) {
1825 Quotient = 1; // X / X ===> 1
1826 Remainder = 0; // X % X ===> 0;
1827 return;
1828 }
1829
1830 if (lhsWords == 1 && rhsWords == 1) {
1831 // There is only one word to consider so use the native versions.
1832 if (LHS.isSingleWord()) {
1833 Quotient = APInt(LHS.getBitWidth(), LHS.VAL / RHS.VAL);
1834 Remainder = APInt(LHS.getBitWidth(), LHS.VAL % RHS.VAL);
1835 } else {
1836 Quotient = APInt(LHS.getBitWidth(), LHS.pVal[0] / RHS.pVal[0]);
1837 Remainder = APInt(LHS.getBitWidth(), LHS.pVal[0] % RHS.pVal[0]);
1838 }
1839 return;
1840 }
1841
1842 // Okay, lets do it the long way
1843 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1844}
1845
Reid Spencer385f7542007-02-21 03:55:44 +00001846void APInt::fromString(uint32_t numbits, const char *str, uint32_t slen,
Reid Spencer5e0a8512007-02-17 03:16:00 +00001847 uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00001848 // Check our assumptions here
Reid Spencer5e0a8512007-02-17 03:16:00 +00001849 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
1850 "Radix should be 2, 8, 10, or 16!");
Reid Spencer385f7542007-02-21 03:55:44 +00001851 assert(str && "String is null?");
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001852 bool isNeg = str[0] == '-';
1853 if (isNeg)
Reid Spencer9eec2412007-02-25 23:44:53 +00001854 str++, slen--;
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001855 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
1856 assert((slen*3 <= numbits || radix != 8) && "Insufficient bit width");
1857 assert((slen*4 <= numbits || radix != 16) && "Insufficient bit width");
1858 assert(((slen*64)/22 <= numbits || radix != 10) && "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00001859
1860 // Allocate memory
1861 if (!isSingleWord())
1862 pVal = getClearedMemory(getNumWords());
1863
1864 // Figure out if we can shift instead of multiply
1865 uint32_t shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
1866
1867 // Set up an APInt for the digit to add outside the loop so we don't
1868 // constantly construct/destruct it.
1869 APInt apdigit(getBitWidth(), 0);
1870 APInt apradix(getBitWidth(), radix);
1871
1872 // Enter digit traversal loop
1873 for (unsigned i = 0; i < slen; i++) {
1874 // Get a digit
1875 uint32_t digit = 0;
1876 char cdigit = str[i];
Reid Spencer6551dcd2007-05-16 19:18:22 +00001877 if (radix == 16) {
1878 if (!isxdigit(cdigit))
1879 assert(0 && "Invalid hex digit in string");
1880 if (isdigit(cdigit))
1881 digit = cdigit - '0';
1882 else if (cdigit >= 'a')
Reid Spencer385f7542007-02-21 03:55:44 +00001883 digit = cdigit - 'a' + 10;
1884 else if (cdigit >= 'A')
1885 digit = cdigit - 'A' + 10;
1886 else
Reid Spencer6551dcd2007-05-16 19:18:22 +00001887 assert(0 && "huh? we shouldn't get here");
1888 } else if (isdigit(cdigit)) {
1889 digit = cdigit - '0';
1890 } else {
Reid Spencer385f7542007-02-21 03:55:44 +00001891 assert(0 && "Invalid character in digit string");
Reid Spencer6551dcd2007-05-16 19:18:22 +00001892 }
Reid Spencer385f7542007-02-21 03:55:44 +00001893
Reid Spencer6551dcd2007-05-16 19:18:22 +00001894 // Shift or multiply the value by the radix
Reid Spencer385f7542007-02-21 03:55:44 +00001895 if (shift)
Reid Spencer6551dcd2007-05-16 19:18:22 +00001896 *this <<= shift;
Reid Spencer385f7542007-02-21 03:55:44 +00001897 else
1898 *this *= apradix;
1899
1900 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00001901 if (apdigit.isSingleWord())
1902 apdigit.VAL = digit;
1903 else
1904 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00001905 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001906 }
Reid Spencer9eec2412007-02-25 23:44:53 +00001907 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001908 if (isNeg) {
1909 (*this)--;
Reid Spencer9eec2412007-02-25 23:44:53 +00001910 this->flip();
Reid Spencer9eec2412007-02-25 23:44:53 +00001911 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001912}
Reid Spencer9c0696f2007-02-20 08:51:03 +00001913
Reid Spencer9c0696f2007-02-20 08:51:03 +00001914std::string APInt::toString(uint8_t radix, bool wantSigned) const {
1915 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
1916 "Radix should be 2, 8, 10, or 16!");
1917 static const char *digits[] = {
1918 "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
1919 };
1920 std::string result;
1921 uint32_t bits_used = getActiveBits();
1922 if (isSingleWord()) {
1923 char buf[65];
1924 const char *format = (radix == 10 ? (wantSigned ? "%lld" : "%llu") :
1925 (radix == 16 ? "%llX" : (radix == 8 ? "%llo" : 0)));
1926 if (format) {
1927 if (wantSigned) {
1928 int64_t sextVal = (int64_t(VAL) << (APINT_BITS_PER_WORD-BitWidth)) >>
1929 (APINT_BITS_PER_WORD-BitWidth);
1930 sprintf(buf, format, sextVal);
1931 } else
1932 sprintf(buf, format, VAL);
1933 } else {
1934 memset(buf, 0, 65);
1935 uint64_t v = VAL;
1936 while (bits_used) {
1937 uint32_t bit = v & 1;
1938 bits_used--;
1939 buf[bits_used] = digits[bit][0];
1940 v >>=1;
1941 }
1942 }
1943 result = buf;
1944 return result;
1945 }
1946
1947 if (radix != 10) {
Reid Spencerfb0709a2007-05-17 19:23:02 +00001948 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
1949 // because the number of bits per digit (1,3 and 4 respectively) divides
1950 // equaly. We just shift until there value is zero.
1951
1952 // First, check for a zero value and just short circuit the logic below.
1953 if (*this == 0)
1954 result = "0";
1955 else {
1956 APInt tmp(*this);
1957 size_t insert_at = 0;
1958 if (wantSigned && this->isNegative()) {
1959 // They want to print the signed version and it is a negative value
1960 // Flip the bits and add one to turn it into the equivalent positive
1961 // value and put a '-' in the result.
1962 tmp.flip();
1963 tmp++;
1964 result = "-";
1965 insert_at = 1;
1966 }
1967 // Just shift tmp right for each digit width until it becomes zero
1968 uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1));
1969 uint64_t mask = radix - 1;
1970 APInt zero(tmp.getBitWidth(), 0);
1971 while (tmp.ne(zero)) {
Reid Spencer20a4c232007-05-19 00:29:55 +00001972 unsigned digit = (tmp.isSingleWord() ? tmp.VAL : tmp.pVal[0]) & mask;
Reid Spencerfb0709a2007-05-17 19:23:02 +00001973 result.insert(insert_at, digits[digit]);
Reid Spencer20a4c232007-05-19 00:29:55 +00001974 tmp = tmp.lshr(shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001975 }
1976 }
1977 return result;
1978 }
1979
1980 APInt tmp(*this);
1981 APInt divisor(4, radix);
1982 APInt zero(tmp.getBitWidth(), 0);
1983 size_t insert_at = 0;
1984 if (wantSigned && tmp[BitWidth-1]) {
1985 // They want to print the signed version and it is a negative value
1986 // Flip the bits and add one to turn it into the equivalent positive
1987 // value and put a '-' in the result.
1988 tmp.flip();
1989 tmp++;
1990 result = "-";
1991 insert_at = 1;
1992 }
Reid Spencere549c492007-02-21 00:29:48 +00001993 if (tmp == APInt(tmp.getBitWidth(), 0))
Reid Spencer9c0696f2007-02-20 08:51:03 +00001994 result = "0";
1995 else while (tmp.ne(zero)) {
1996 APInt APdigit(1,0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001997 APInt tmp2(tmp.getBitWidth(), 0);
Reid Spencer385f7542007-02-21 03:55:44 +00001998 divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
1999 &APdigit);
Reid Spencer794f4722007-02-26 21:02:27 +00002000 uint32_t digit = APdigit.getZExtValue();
Reid Spencer385f7542007-02-21 03:55:44 +00002001 assert(digit < radix && "divide failed");
2002 result.insert(insert_at,digits[digit]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002003 tmp = tmp2;
2004 }
2005
2006 return result;
2007}
2008
Reid Spencer385f7542007-02-21 03:55:44 +00002009void APInt::dump() const
2010{
Reid Spencer610fad82007-02-24 10:01:42 +00002011 cerr << "APInt(" << BitWidth << ")=" << std::setbase(16);
Reid Spencer385f7542007-02-21 03:55:44 +00002012 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +00002013 cerr << VAL;
Reid Spencer385f7542007-02-21 03:55:44 +00002014 else for (unsigned i = getNumWords(); i > 0; i--) {
Reid Spencer610fad82007-02-24 10:01:42 +00002015 cerr << pVal[i-1] << " ";
Reid Spencer385f7542007-02-21 03:55:44 +00002016 }
Chris Lattner9132a2b2007-08-23 05:15:32 +00002017 cerr << " U(" << this->toStringUnsigned(10) << ") S("
Dale Johannesen9e3d3ab2007-09-14 22:26:36 +00002018 << this->toStringSigned(10) << ")" << std::setbase(10);
Reid Spencer385f7542007-02-21 03:55:44 +00002019}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002020
2021// This implements a variety of operations on a representation of
2022// arbitrary precision, two's-complement, bignum integer values.
2023
2024/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2025 and unrestricting assumption. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002026COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002027
2028/* Some handy functions local to this file. */
2029namespace {
2030
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002031 /* Returns the integer part with the least significant BITS set.
2032 BITS cannot be zero. */
2033 inline integerPart
2034 lowBitMask(unsigned int bits)
2035 {
2036 assert (bits != 0 && bits <= integerPartWidth);
2037
2038 return ~(integerPart) 0 >> (integerPartWidth - bits);
2039 }
2040
Neil Booth055c0b32007-10-06 00:43:45 +00002041 /* Returns the value of the lower half of PART. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002042 inline integerPart
2043 lowHalf(integerPart part)
2044 {
2045 return part & lowBitMask(integerPartWidth / 2);
2046 }
2047
Neil Booth055c0b32007-10-06 00:43:45 +00002048 /* Returns the value of the upper half of PART. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002049 inline integerPart
2050 highHalf(integerPart part)
2051 {
2052 return part >> (integerPartWidth / 2);
2053 }
2054
Neil Booth055c0b32007-10-06 00:43:45 +00002055 /* Returns the bit number of the most significant set bit of a part.
2056 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002057 unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002058 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002059 {
2060 unsigned int n, msb;
2061
2062 if (value == 0)
2063 return -1U;
2064
2065 n = integerPartWidth / 2;
2066
2067 msb = 0;
2068 do {
2069 if (value >> n) {
2070 value >>= n;
2071 msb += n;
2072 }
2073
2074 n >>= 1;
2075 } while (n);
2076
2077 return msb;
2078 }
2079
Neil Booth055c0b32007-10-06 00:43:45 +00002080 /* Returns the bit number of the least significant set bit of a
2081 part. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002082 unsigned int
2083 partLSB(integerPart value)
2084 {
2085 unsigned int n, lsb;
2086
2087 if (value == 0)
2088 return -1U;
2089
2090 lsb = integerPartWidth - 1;
2091 n = integerPartWidth / 2;
2092
2093 do {
2094 if (value << n) {
2095 value <<= n;
2096 lsb -= n;
2097 }
2098
2099 n >>= 1;
2100 } while (n);
2101
2102 return lsb;
2103 }
2104}
2105
2106/* Sets the least significant part of a bignum to the input value, and
2107 zeroes out higher parts. */
2108void
2109APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2110{
2111 unsigned int i;
2112
Neil Booth68e53ad2007-10-08 13:47:12 +00002113 assert (parts > 0);
2114
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002115 dst[0] = part;
2116 for(i = 1; i < parts; i++)
2117 dst[i] = 0;
2118}
2119
2120/* Assign one bignum to another. */
2121void
2122APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2123{
2124 unsigned int i;
2125
2126 for(i = 0; i < parts; i++)
2127 dst[i] = src[i];
2128}
2129
2130/* Returns true if a bignum is zero, false otherwise. */
2131bool
2132APInt::tcIsZero(const integerPart *src, unsigned int parts)
2133{
2134 unsigned int i;
2135
2136 for(i = 0; i < parts; i++)
2137 if (src[i])
2138 return false;
2139
2140 return true;
2141}
2142
2143/* Extract the given bit of a bignum; returns 0 or 1. */
2144int
2145APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2146{
2147 return(parts[bit / integerPartWidth]
2148 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2149}
2150
2151/* Set the given bit of a bignum. */
2152void
2153APInt::tcSetBit(integerPart *parts, unsigned int bit)
2154{
2155 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2156}
2157
Neil Booth055c0b32007-10-06 00:43:45 +00002158/* Returns the bit number of the least significant set bit of a
2159 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002160unsigned int
2161APInt::tcLSB(const integerPart *parts, unsigned int n)
2162{
2163 unsigned int i, lsb;
2164
2165 for(i = 0; i < n; i++) {
2166 if (parts[i] != 0) {
2167 lsb = partLSB(parts[i]);
2168
2169 return lsb + i * integerPartWidth;
2170 }
2171 }
2172
2173 return -1U;
2174}
2175
Neil Booth055c0b32007-10-06 00:43:45 +00002176/* Returns the bit number of the most significant set bit of a number.
2177 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002178unsigned int
2179APInt::tcMSB(const integerPart *parts, unsigned int n)
2180{
2181 unsigned int msb;
2182
2183 do {
2184 --n;
2185
2186 if (parts[n] != 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002187 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002188
2189 return msb + n * integerPartWidth;
2190 }
2191 } while (n);
2192
2193 return -1U;
2194}
2195
Neil Booth68e53ad2007-10-08 13:47:12 +00002196/* Copy the bit vector of width srcBITS from SRC, starting at bit
2197 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2198 the least significant bit of DST. All high bits above srcBITS in
2199 DST are zero-filled. */
2200void
2201APInt::tcExtract(integerPart *dst, unsigned int dstCount, const integerPart *src,
2202 unsigned int srcBits, unsigned int srcLSB)
2203{
2204 unsigned int firstSrcPart, dstParts, shift, n;
2205
2206 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2207 assert (dstParts <= dstCount);
2208
2209 firstSrcPart = srcLSB / integerPartWidth;
2210 tcAssign (dst, src + firstSrcPart, dstParts);
2211
2212 shift = srcLSB % integerPartWidth;
2213 tcShiftRight (dst, dstParts, shift);
2214
2215 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2216 in DST. If this is less that srcBits, append the rest, else
2217 clear the high bits. */
2218 n = dstParts * integerPartWidth - shift;
2219 if (n < srcBits) {
2220 integerPart mask = lowBitMask (srcBits - n);
2221 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2222 << n % integerPartWidth);
2223 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002224 if (srcBits % integerPartWidth)
2225 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002226 }
2227
2228 /* Clear high parts. */
2229 while (dstParts < dstCount)
2230 dst[dstParts++] = 0;
2231}
2232
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002233/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2234integerPart
2235APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2236 integerPart c, unsigned int parts)
2237{
2238 unsigned int i;
2239
2240 assert(c <= 1);
2241
2242 for(i = 0; i < parts; i++) {
2243 integerPart l;
2244
2245 l = dst[i];
2246 if (c) {
2247 dst[i] += rhs[i] + 1;
2248 c = (dst[i] <= l);
2249 } else {
2250 dst[i] += rhs[i];
2251 c = (dst[i] < l);
2252 }
2253 }
2254
2255 return c;
2256}
2257
2258/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2259integerPart
2260APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2261 integerPart c, unsigned int parts)
2262{
2263 unsigned int i;
2264
2265 assert(c <= 1);
2266
2267 for(i = 0; i < parts; i++) {
2268 integerPart l;
2269
2270 l = dst[i];
2271 if (c) {
2272 dst[i] -= rhs[i] + 1;
2273 c = (dst[i] >= l);
2274 } else {
2275 dst[i] -= rhs[i];
2276 c = (dst[i] > l);
2277 }
2278 }
2279
2280 return c;
2281}
2282
2283/* Negate a bignum in-place. */
2284void
2285APInt::tcNegate(integerPart *dst, unsigned int parts)
2286{
2287 tcComplement(dst, parts);
2288 tcIncrement(dst, parts);
2289}
2290
Neil Booth055c0b32007-10-06 00:43:45 +00002291/* DST += SRC * MULTIPLIER + CARRY if add is true
2292 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002293
2294 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2295 they must start at the same point, i.e. DST == SRC.
2296
2297 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2298 returned. Otherwise DST is filled with the least significant
2299 DSTPARTS parts of the result, and if all of the omitted higher
2300 parts were zero return zero, otherwise overflow occurred and
2301 return one. */
2302int
2303APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2304 integerPart multiplier, integerPart carry,
2305 unsigned int srcParts, unsigned int dstParts,
2306 bool add)
2307{
2308 unsigned int i, n;
2309
2310 /* Otherwise our writes of DST kill our later reads of SRC. */
2311 assert(dst <= src || dst >= src + srcParts);
2312 assert(dstParts <= srcParts + 1);
2313
2314 /* N loops; minimum of dstParts and srcParts. */
2315 n = dstParts < srcParts ? dstParts: srcParts;
2316
2317 for(i = 0; i < n; i++) {
2318 integerPart low, mid, high, srcPart;
2319
2320 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2321
2322 This cannot overflow, because
2323
2324 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2325
2326 which is less than n^2. */
2327
2328 srcPart = src[i];
2329
2330 if (multiplier == 0 || srcPart == 0) {
2331 low = carry;
2332 high = 0;
2333 } else {
2334 low = lowHalf(srcPart) * lowHalf(multiplier);
2335 high = highHalf(srcPart) * highHalf(multiplier);
2336
2337 mid = lowHalf(srcPart) * highHalf(multiplier);
2338 high += highHalf(mid);
2339 mid <<= integerPartWidth / 2;
2340 if (low + mid < low)
2341 high++;
2342 low += mid;
2343
2344 mid = highHalf(srcPart) * lowHalf(multiplier);
2345 high += highHalf(mid);
2346 mid <<= integerPartWidth / 2;
2347 if (low + mid < low)
2348 high++;
2349 low += mid;
2350
2351 /* Now add carry. */
2352 if (low + carry < low)
2353 high++;
2354 low += carry;
2355 }
2356
2357 if (add) {
2358 /* And now DST[i], and store the new low part there. */
2359 if (low + dst[i] < low)
2360 high++;
2361 dst[i] += low;
2362 } else
2363 dst[i] = low;
2364
2365 carry = high;
2366 }
2367
2368 if (i < dstParts) {
2369 /* Full multiplication, there is no overflow. */
2370 assert(i + 1 == dstParts);
2371 dst[i] = carry;
2372 return 0;
2373 } else {
2374 /* We overflowed if there is carry. */
2375 if (carry)
2376 return 1;
2377
2378 /* We would overflow if any significant unwritten parts would be
2379 non-zero. This is true if any remaining src parts are non-zero
2380 and the multiplier is non-zero. */
2381 if (multiplier)
2382 for(; i < srcParts; i++)
2383 if (src[i])
2384 return 1;
2385
2386 /* We fitted in the narrow destination. */
2387 return 0;
2388 }
2389}
2390
2391/* DST = LHS * RHS, where DST has the same width as the operands and
2392 is filled with the least significant parts of the result. Returns
2393 one if overflow occurred, otherwise zero. DST must be disjoint
2394 from both operands. */
2395int
2396APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2397 const integerPart *rhs, unsigned int parts)
2398{
2399 unsigned int i;
2400 int overflow;
2401
2402 assert(dst != lhs && dst != rhs);
2403
2404 overflow = 0;
2405 tcSet(dst, 0, parts);
2406
2407 for(i = 0; i < parts; i++)
2408 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2409 parts - i, true);
2410
2411 return overflow;
2412}
2413
Neil Booth978661d2007-10-06 00:24:48 +00002414/* DST = LHS * RHS, where DST has width the sum of the widths of the
2415 operands. No overflow occurs. DST must be disjoint from both
2416 operands. Returns the number of parts required to hold the
2417 result. */
2418unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002419APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002420 const integerPart *rhs, unsigned int lhsParts,
2421 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002422{
Neil Booth978661d2007-10-06 00:24:48 +00002423 /* Put the narrower number on the LHS for less loops below. */
2424 if (lhsParts > rhsParts) {
2425 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2426 } else {
2427 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002428
Neil Booth978661d2007-10-06 00:24:48 +00002429 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002430
Neil Booth978661d2007-10-06 00:24:48 +00002431 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002432
Neil Booth978661d2007-10-06 00:24:48 +00002433 for(n = 0; n < lhsParts; n++)
2434 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002435
Neil Booth978661d2007-10-06 00:24:48 +00002436 n = lhsParts + rhsParts;
2437
2438 return n - (dst[n - 1] == 0);
2439 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002440}
2441
2442/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2443 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2444 set REMAINDER to the remainder, return zero. i.e.
2445
2446 OLD_LHS = RHS * LHS + REMAINDER
2447
2448 SCRATCH is a bignum of the same size as the operands and result for
2449 use by the routine; its contents need not be initialized and are
2450 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2451*/
2452int
2453APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2454 integerPart *remainder, integerPart *srhs,
2455 unsigned int parts)
2456{
2457 unsigned int n, shiftCount;
2458 integerPart mask;
2459
2460 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2461
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002462 shiftCount = tcMSB(rhs, parts) + 1;
2463 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002464 return true;
2465
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002466 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002467 n = shiftCount / integerPartWidth;
2468 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2469
2470 tcAssign(srhs, rhs, parts);
2471 tcShiftLeft(srhs, parts, shiftCount);
2472 tcAssign(remainder, lhs, parts);
2473 tcSet(lhs, 0, parts);
2474
2475 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2476 the total. */
2477 for(;;) {
2478 int compare;
2479
2480 compare = tcCompare(remainder, srhs, parts);
2481 if (compare >= 0) {
2482 tcSubtract(remainder, srhs, 0, parts);
2483 lhs[n] |= mask;
2484 }
2485
2486 if (shiftCount == 0)
2487 break;
2488 shiftCount--;
2489 tcShiftRight(srhs, parts, 1);
2490 if ((mask >>= 1) == 0)
2491 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2492 }
2493
2494 return false;
2495}
2496
2497/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2498 There are no restrictions on COUNT. */
2499void
2500APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2501{
Neil Booth68e53ad2007-10-08 13:47:12 +00002502 if (count) {
2503 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002504
Neil Booth68e53ad2007-10-08 13:47:12 +00002505 /* Jump is the inter-part jump; shift is is intra-part shift. */
2506 jump = count / integerPartWidth;
2507 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002508
Neil Booth68e53ad2007-10-08 13:47:12 +00002509 while (parts > jump) {
2510 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002511
Neil Booth68e53ad2007-10-08 13:47:12 +00002512 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002513
Neil Booth68e53ad2007-10-08 13:47:12 +00002514 /* dst[i] comes from the two parts src[i - jump] and, if we have
2515 an intra-part shift, src[i - jump - 1]. */
2516 part = dst[parts - jump];
2517 if (shift) {
2518 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002519 if (parts >= jump + 1)
2520 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2521 }
2522
Neil Booth68e53ad2007-10-08 13:47:12 +00002523 dst[parts] = part;
2524 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002525
Neil Booth68e53ad2007-10-08 13:47:12 +00002526 while (parts > 0)
2527 dst[--parts] = 0;
2528 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002529}
2530
2531/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2532 zero. There are no restrictions on COUNT. */
2533void
2534APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2535{
Neil Booth68e53ad2007-10-08 13:47:12 +00002536 if (count) {
2537 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002538
Neil Booth68e53ad2007-10-08 13:47:12 +00002539 /* Jump is the inter-part jump; shift is is intra-part shift. */
2540 jump = count / integerPartWidth;
2541 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002542
Neil Booth68e53ad2007-10-08 13:47:12 +00002543 /* Perform the shift. This leaves the most significant COUNT bits
2544 of the result at zero. */
2545 for(i = 0; i < parts; i++) {
2546 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002547
Neil Booth68e53ad2007-10-08 13:47:12 +00002548 if (i + jump >= parts) {
2549 part = 0;
2550 } else {
2551 part = dst[i + jump];
2552 if (shift) {
2553 part >>= shift;
2554 if (i + jump + 1 < parts)
2555 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2556 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002557 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002558
Neil Booth68e53ad2007-10-08 13:47:12 +00002559 dst[i] = part;
2560 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002561 }
2562}
2563
2564/* Bitwise and of two bignums. */
2565void
2566APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2567{
2568 unsigned int i;
2569
2570 for(i = 0; i < parts; i++)
2571 dst[i] &= rhs[i];
2572}
2573
2574/* Bitwise inclusive or of two bignums. */
2575void
2576APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2577{
2578 unsigned int i;
2579
2580 for(i = 0; i < parts; i++)
2581 dst[i] |= rhs[i];
2582}
2583
2584/* Bitwise exclusive or of two bignums. */
2585void
2586APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2587{
2588 unsigned int i;
2589
2590 for(i = 0; i < parts; i++)
2591 dst[i] ^= rhs[i];
2592}
2593
2594/* Complement a bignum in-place. */
2595void
2596APInt::tcComplement(integerPart *dst, unsigned int parts)
2597{
2598 unsigned int i;
2599
2600 for(i = 0; i < parts; i++)
2601 dst[i] = ~dst[i];
2602}
2603
2604/* Comparison (unsigned) of two bignums. */
2605int
2606APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2607 unsigned int parts)
2608{
2609 while (parts) {
2610 parts--;
2611 if (lhs[parts] == rhs[parts])
2612 continue;
2613
2614 if (lhs[parts] > rhs[parts])
2615 return 1;
2616 else
2617 return -1;
2618 }
2619
2620 return 0;
2621}
2622
2623/* Increment a bignum in-place, return the carry flag. */
2624integerPart
2625APInt::tcIncrement(integerPart *dst, unsigned int parts)
2626{
2627 unsigned int i;
2628
2629 for(i = 0; i < parts; i++)
2630 if (++dst[i] != 0)
2631 break;
2632
2633 return i == parts;
2634}
2635
2636/* Set the least significant BITS bits of a bignum, clear the
2637 rest. */
2638void
2639APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2640 unsigned int bits)
2641{
2642 unsigned int i;
2643
2644 i = 0;
2645 while (bits > integerPartWidth) {
2646 dst[i++] = ~(integerPart) 0;
2647 bits -= integerPartWidth;
2648 }
2649
2650 if (bits)
2651 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2652
2653 while (i < parts)
2654 dst[i++] = 0;
2655}