blob: c8482e9c7195262459536a2bbf1afadd346df7a3 [file] [log] [blame]
Zhou Shengfd43dcf2007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Zhou Shengfd43dcf2007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencer5d0d05c2007-02-25 19:32:03 +000010// This file implements a class to represent arbitrary precision integer
11// constant values and provide a variety of arithmetic operations on them.
Zhou Shengfd43dcf2007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer9d6c9192007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
Ted Kremeneke420deb2008-01-19 04:23:33 +000017#include "llvm/ADT/FoldingSet.h"
Reid Spencer9d6c9192007-02-24 03:58:46 +000018#include "llvm/Support/Debug.h"
Zhou Shengfd43dcf2007-02-06 03:00:16 +000019#include "llvm/Support/MathExtras.h"
Jeff Cohenca5183d2007-03-05 00:00:42 +000020#include <math.h>
Jeff Cohen09dfd8e2007-03-20 20:42:36 +000021#include <limits>
Zhou Shenga3832fd2007-02-07 06:14:53 +000022#include <cstring>
Zhou Shengfd43dcf2007-02-06 03:00:16 +000023#include <cstdlib>
Reid Spencer385f7542007-02-21 03:55:44 +000024#include <iomanip>
Reid Spencer385f7542007-02-21 03:55:44 +000025
Zhou Shengfd43dcf2007-02-06 03:00:16 +000026using namespace llvm;
27
Reid Spencer9af18872007-12-11 06:53:58 +000028/// This enumeration just provides for internal constants used in this
29/// translation unit.
30enum {
31 MIN_INT_BITS = 1, ///< Minimum number of bits that can be specified
32 ///< Note that this must remain synchronized with IntegerType::MIN_INT_BITS
33 MAX_INT_BITS = (1<<23)-1 ///< Maximum number of bits that can be specified
34 ///< Note that this must remain synchronized with IntegerType::MAX_INT_BITS
35};
36
Reid Spencer5d0d05c2007-02-25 19:32:03 +000037/// A utility function for allocating memory, checking for allocation failures,
38/// and ensuring the contents are zeroed.
Reid Spenceraf0e9562007-02-18 18:38:44 +000039inline static uint64_t* getClearedMemory(uint32_t numWords) {
40 uint64_t * result = new uint64_t[numWords];
41 assert(result && "APInt memory allocation fails!");
42 memset(result, 0, numWords * sizeof(uint64_t));
43 return result;
Zhou Sheng353815d2007-02-06 06:04:53 +000044}
45
Reid Spencer5d0d05c2007-02-25 19:32:03 +000046/// A utility function for allocating memory and checking for allocation
47/// failure. The content is not zeroed.
Reid Spenceraf0e9562007-02-18 18:38:44 +000048inline static uint64_t* getMemory(uint32_t numWords) {
49 uint64_t * result = new uint64_t[numWords];
50 assert(result && "APInt memory allocation fails!");
51 return result;
52}
53
Reid Spenceradf2a202007-03-19 21:19:02 +000054APInt::APInt(uint32_t numBits, uint64_t val, bool isSigned)
Reid Spencer3a341372007-03-19 20:37:47 +000055 : BitWidth(numBits), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +000056 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
57 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Reid Spencer5d0d05c2007-02-25 19:32:03 +000058 if (isSingleWord())
59 VAL = val;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000060 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +000061 pVal = getClearedMemory(getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +000062 pVal[0] = val;
Reid Spencer3a341372007-03-19 20:37:47 +000063 if (isSigned && int64_t(val) < 0)
64 for (unsigned i = 1; i < getNumWords(); ++i)
65 pVal[i] = -1ULL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +000066 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +000067 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +000068}
69
Dale Johannesen910993e2007-09-21 22:09:37 +000070APInt::APInt(uint32_t numBits, uint32_t numWords, const uint64_t bigVal[])
Reid Spencer385f7542007-02-21 03:55:44 +000071 : BitWidth(numBits), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +000072 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
73 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Zhou Shengfd43dcf2007-02-06 03:00:16 +000074 assert(bigVal && "Null pointer detected!");
75 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +000076 VAL = bigVal[0];
Zhou Shengfd43dcf2007-02-06 03:00:16 +000077 else {
Reid Spencer610fad82007-02-24 10:01:42 +000078 // Get memory, cleared to 0
79 pVal = getClearedMemory(getNumWords());
80 // Calculate the number of words to copy
81 uint32_t words = std::min<uint32_t>(numWords, getNumWords());
82 // Copy the words from bigVal to pVal
83 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +000084 }
Reid Spencer610fad82007-02-24 10:01:42 +000085 // Make sure unused high bits are cleared
86 clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +000087}
88
Reid Spenceraf0e9562007-02-18 18:38:44 +000089APInt::APInt(uint32_t numbits, const char StrStart[], uint32_t slen,
Reid Spencer9c0696f2007-02-20 08:51:03 +000090 uint8_t radix)
Reid Spencer385f7542007-02-21 03:55:44 +000091 : BitWidth(numbits), VAL(0) {
Reid Spencer9af18872007-12-11 06:53:58 +000092 assert(BitWidth >= MIN_INT_BITS && "bitwidth too small");
93 assert(BitWidth <= MAX_INT_BITS && "bitwidth too large");
Reid Spencere81d2da2007-02-16 22:36:51 +000094 fromString(numbits, StrStart, slen, radix);
Zhou Shenga3832fd2007-02-07 06:14:53 +000095}
96
Reid 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
Ted Kremeneke420deb2008-01-19 04:23:33 +0000168/// Profile - This method 'profiles' an APInt for use with FoldingSet.
169void APInt::Profile(FoldingSetNodeID& ID) const {
170 if (isSingleWord()) {
171 ID.AddInteger(VAL);
172 return;
173 }
174
175 uint32_t NumWords = getNumWords();
176 for (unsigned i = 0; i < NumWords; ++i)
177 ID.AddInteger(pVal[i]);
178}
179
Reid Spenceraf0e9562007-02-18 18:38:44 +0000180/// add_1 - This function adds a single "digit" integer, y, to the multiple
181/// "digit" integer array, x[]. x[] is modified to reflect the addition and
182/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000183/// @returns the carry of the addition.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000184static bool add_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000185 for (uint32_t i = 0; i < len; ++i) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000186 dest[i] = y + x[i];
187 if (dest[i] < y)
Reid Spencer610fad82007-02-24 10:01:42 +0000188 y = 1; // Carry one to next digit.
Reid Spencerf2c521c2007-02-18 06:39:42 +0000189 else {
Reid Spencer610fad82007-02-24 10:01:42 +0000190 y = 0; // No need to carry so exit early
Reid Spencerf2c521c2007-02-18 06:39:42 +0000191 break;
192 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000193 }
Reid Spencerf2c521c2007-02-18 06:39:42 +0000194 return y;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000195}
196
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000197/// @brief Prefix increment operator. Increments the APInt by one.
198APInt& APInt::operator++() {
Reid Spencere81d2da2007-02-16 22:36:51 +0000199 if (isSingleWord())
200 ++VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000201 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000202 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000203 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000204}
205
Reid Spenceraf0e9562007-02-18 18:38:44 +0000206/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
207/// the multi-digit integer array, x[], propagating the borrowed 1 value until
208/// no further borrowing is neeeded or it runs out of "digits" in x. The result
209/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
210/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000211/// @returns the borrow out of the subtraction
212static bool sub_1(uint64_t x[], uint32_t len, uint64_t y) {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000213 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000214 uint64_t X = x[i];
Reid Spencerf2c521c2007-02-18 06:39:42 +0000215 x[i] -= y;
216 if (y > X)
Reid Spenceraf0e9562007-02-18 18:38:44 +0000217 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer5e0a8512007-02-17 03:16:00 +0000218 else {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000219 y = 0; // No need to borrow
220 break; // Remaining digits are unchanged so exit early
Reid Spencer5e0a8512007-02-17 03:16:00 +0000221 }
222 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000223 return bool(y);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000224}
225
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000226/// @brief Prefix decrement operator. Decrements the APInt by one.
227APInt& APInt::operator--() {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000228 if (isSingleWord())
229 --VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000230 else
Zhou Shenga3832fd2007-02-07 06:14:53 +0000231 sub_1(pVal, getNumWords(), 1);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000232 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000233}
234
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000235/// add - This function adds the integer array x to the integer array Y and
236/// places the result in dest.
237/// @returns the carry out from the addition
238/// @brief General addition of 64-bit integer arrays
Reid Spencer9d6c9192007-02-24 03:58:46 +0000239static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
240 uint32_t len) {
241 bool carry = false;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000242 for (uint32_t i = 0; i< len; ++i) {
Reid Spencer92904632007-02-23 01:57:13 +0000243 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer54362ca2007-02-20 23:40:25 +0000244 dest[i] = x[i] + y[i] + carry;
Reid Spencer60c0a6a2007-02-21 05:44:56 +0000245 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer5e0a8512007-02-17 03:16:00 +0000246 }
247 return carry;
248}
249
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000250/// Adds the RHS APint to this APInt.
251/// @returns this, after addition of RHS.
252/// @brief Addition assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000253APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000254 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer54362ca2007-02-20 23:40:25 +0000255 if (isSingleWord())
256 VAL += RHS.VAL;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000257 else {
Reid Spencer54362ca2007-02-20 23:40:25 +0000258 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000259 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000260 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000261}
262
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000263/// Subtracts the integer array y from the integer array x
264/// @returns returns the borrow out.
265/// @brief Generalized subtraction of 64-bit integer arrays.
Reid Spencer9d6c9192007-02-24 03:58:46 +0000266static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
267 uint32_t len) {
Reid Spencer385f7542007-02-21 03:55:44 +0000268 bool borrow = false;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000269 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer385f7542007-02-21 03:55:44 +0000270 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
271 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
272 dest[i] = x_tmp - y[i];
Reid Spencer5e0a8512007-02-17 03:16:00 +0000273 }
Reid Spencer54362ca2007-02-20 23:40:25 +0000274 return borrow;
Reid Spencer5e0a8512007-02-17 03:16:00 +0000275}
276
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000277/// Subtracts the RHS APInt from this APInt
278/// @returns this, after subtraction
279/// @brief Subtraction assignment operator.
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000280APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000281 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000282 if (isSingleWord())
Reid Spencer54362ca2007-02-20 23:40:25 +0000283 VAL -= RHS.VAL;
284 else
285 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000286 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000287}
288
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000289/// Multiplies an integer array, x by a a uint64_t integer and places the result
290/// into dest.
291/// @returns the carry out of the multiplication.
292/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Reid Spencer610fad82007-02-24 10:01:42 +0000293static uint64_t mul_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
294 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer5e0a8512007-02-17 03:16:00 +0000295 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000296 uint64_t carry = 0;
297
298 // For each digit of x.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000299 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000300 // Split x into high and low words
301 uint64_t lx = x[i] & 0xffffffffULL;
302 uint64_t hx = x[i] >> 32;
303 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer5e0a8512007-02-17 03:16:00 +0000304 // hasCarry == 0, no carry
305 // hasCarry == 1, has carry
306 // hasCarry == 2, no carry and the calculation result == 0.
307 uint8_t hasCarry = 0;
308 dest[i] = carry + lx * ly;
309 // Determine if the add above introduces carry.
310 hasCarry = (dest[i] < carry) ? 1 : 0;
311 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
312 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
313 // (2^32 - 1) + 2^32 = 2^64.
314 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
315
316 carry += (lx * hy) & 0xffffffffULL;
317 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
318 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
319 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
320 }
Reid Spencer5e0a8512007-02-17 03:16:00 +0000321 return carry;
322}
323
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000324/// Multiplies integer array x by integer array y and stores the result into
325/// the integer array dest. Note that dest's size must be >= xlen + ylen.
326/// @brief Generalized multiplicate of integer arrays.
Reid Spencer610fad82007-02-24 10:01:42 +0000327static void mul(uint64_t dest[], uint64_t x[], uint32_t xlen, uint64_t y[],
328 uint32_t ylen) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000329 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000330 for (uint32_t i = 1; i < ylen; ++i) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000331 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencere0cdd332007-02-21 08:21:52 +0000332 uint64_t carry = 0, lx = 0, hx = 0;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000333 for (uint32_t j = 0; j < xlen; ++j) {
Reid Spencer5e0a8512007-02-17 03:16:00 +0000334 lx = x[j] & 0xffffffffULL;
335 hx = x[j] >> 32;
336 // hasCarry - A flag to indicate if has carry.
337 // hasCarry == 0, no carry
338 // hasCarry == 1, has carry
339 // hasCarry == 2, no carry and the calculation result == 0.
340 uint8_t hasCarry = 0;
341 uint64_t resul = carry + lx * ly;
342 hasCarry = (resul < carry) ? 1 : 0;
343 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
344 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
345
346 carry += (lx * hy) & 0xffffffffULL;
347 resul = (carry << 32) | (resul & 0xffffffffULL);
348 dest[i+j] += resul;
349 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
350 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
351 ((lx * hy) >> 32) + hx * hy;
352 }
353 dest[i+xlen] = carry;
354 }
355}
356
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000357APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000358 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencere0cdd332007-02-21 08:21:52 +0000359 if (isSingleWord()) {
Reid Spencer61eb1802007-02-20 20:42:10 +0000360 VAL *= RHS.VAL;
Reid Spencere0cdd332007-02-21 08:21:52 +0000361 clearUnusedBits();
362 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000363 }
Reid Spencere0cdd332007-02-21 08:21:52 +0000364
365 // Get some bit facts about LHS and check for zero
366 uint32_t lhsBits = getActiveBits();
367 uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
368 if (!lhsWords)
369 // 0 * X ===> 0
370 return *this;
371
372 // Get some bit facts about RHS and check for zero
373 uint32_t rhsBits = RHS.getActiveBits();
374 uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
375 if (!rhsWords) {
376 // X * 0 ===> 0
377 clear();
378 return *this;
379 }
380
381 // Allocate space for the result
382 uint32_t destWords = rhsWords + lhsWords;
383 uint64_t *dest = getMemory(destWords);
384
385 // Perform the long multiply
386 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
387
388 // Copy result back into *this
389 clear();
390 uint32_t wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
391 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
392
393 // delete dest array and return
394 delete[] dest;
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 Spenceraf0e9562007-02-18 18:38:44 +0000413 VAL |= RHS.VAL;
414 return *this;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000415 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000416 uint32_t numWords = getNumWords();
417 for (uint32_t i = 0; i < numWords; ++i)
418 pVal[i] |= RHS.pVal[i];
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000419 return *this;
420}
421
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000422APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000423 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000424 if (isSingleWord()) {
Reid Spencerf2c521c2007-02-18 06:39:42 +0000425 VAL ^= RHS.VAL;
Reid Spencer54362ca2007-02-20 23:40:25 +0000426 this->clearUnusedBits();
Reid Spencerf2c521c2007-02-18 06:39:42 +0000427 return *this;
428 }
Reid Spenceraf0e9562007-02-18 18:38:44 +0000429 uint32_t numWords = getNumWords();
430 for (uint32_t i = 0; i < numWords; ++i)
431 pVal[i] ^= RHS.pVal[i];
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000432 return clearUnusedBits();
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);
439
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 Spenceraf0e9562007-02-18 18:38:44 +0000449 if (isSingleWord())
450 return APInt(getBitWidth(), VAL | RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +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 return APInt(val, getBitWidth());
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000457}
458
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000459APInt APInt::operator^(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000460 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000461 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000462 return APInt(BitWidth, VAL ^ RHS.VAL);
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000463
Reid Spenceraf0e9562007-02-18 18:38:44 +0000464 uint32_t numWords = getNumWords();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000465 uint64_t *val = getMemory(numWords);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000466 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000467 val[i] = pVal[i] ^ RHS.pVal[i];
468
469 // 0^0==1 so clear the high bits in case they got set.
470 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000471}
472
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000473bool APInt::operator !() const {
474 if (isSingleWord())
475 return !VAL;
Reid Spenceraf0e9562007-02-18 18:38:44 +0000476
477 for (uint32_t i = 0; i < getNumWords(); ++i)
478 if (pVal[i])
479 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000480 return true;
481}
482
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000483APInt APInt::operator*(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000484 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000485 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000486 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer61eb1802007-02-20 20:42:10 +0000487 APInt Result(*this);
488 Result *= RHS;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000489 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000490}
491
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000492APInt APInt::operator+(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000493 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000494 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000495 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000496 APInt Result(BitWidth, 0);
497 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000498 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000499}
500
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000501APInt APInt::operator-(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000502 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000503 if (isSingleWord())
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000504 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer54362ca2007-02-20 23:40:25 +0000505 APInt Result(BitWidth, 0);
506 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000507 return Result.clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000508}
509
Reid Spenceraf0e9562007-02-18 18:38:44 +0000510bool APInt::operator[](uint32_t bitPosition) const {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000511 return (maskBit(bitPosition) &
512 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000513}
514
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000515bool APInt::operator==(const APInt& RHS) const {
Reid Spencer9ac44112007-02-26 23:38:21 +0000516 assert(BitWidth == RHS.BitWidth && "Comparison requires equal bit widths");
Reid Spencer54362ca2007-02-20 23:40:25 +0000517 if (isSingleWord())
518 return VAL == RHS.VAL;
519
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000520 // Get some facts about the number of bits used in the two operands.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000521 uint32_t n1 = getActiveBits();
522 uint32_t n2 = RHS.getActiveBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000523
524 // If the number of bits isn't the same, they aren't equal
Reid Spencer54362ca2007-02-20 23:40:25 +0000525 if (n1 != n2)
526 return false;
527
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000528 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer54362ca2007-02-20 23:40:25 +0000529 if (n1 <= APINT_BITS_PER_WORD)
530 return pVal[0] == RHS.pVal[0];
531
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000532 // Otherwise, compare everything
Reid Spencer54362ca2007-02-20 23:40:25 +0000533 for (int i = whichWord(n1 - 1); i >= 0; --i)
534 if (pVal[i] != RHS.pVal[i])
535 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000536 return true;
537}
538
Zhou Shenga3832fd2007-02-07 06:14:53 +0000539bool APInt::operator==(uint64_t Val) const {
540 if (isSingleWord())
541 return VAL == Val;
Reid Spencer54362ca2007-02-20 23:40:25 +0000542
543 uint32_t n = getActiveBits();
544 if (n <= APINT_BITS_PER_WORD)
545 return pVal[0] == Val;
546 else
547 return false;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000548}
549
Reid Spencere81d2da2007-02-16 22:36:51 +0000550bool APInt::ult(const APInt& RHS) const {
551 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
552 if (isSingleWord())
553 return VAL < RHS.VAL;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000554
555 // Get active bit length of both operands
556 uint32_t n1 = getActiveBits();
557 uint32_t n2 = RHS.getActiveBits();
558
559 // If magnitude of LHS is less than RHS, return true.
560 if (n1 < n2)
561 return true;
562
563 // If magnitude of RHS is greather than LHS, return false.
564 if (n2 < n1)
565 return false;
566
567 // If they bot fit in a word, just compare the low order word
568 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
569 return pVal[0] < RHS.pVal[0];
570
571 // Otherwise, compare all words
Reid Spencer1fa111e2007-02-27 18:23:40 +0000572 uint32_t topWord = whichWord(std::max(n1,n2)-1);
573 for (int i = topWord; i >= 0; --i) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000574 if (pVal[i] > RHS.pVal[i])
Reid Spencere81d2da2007-02-16 22:36:51 +0000575 return false;
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000576 if (pVal[i] < RHS.pVal[i])
577 return true;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000578 }
579 return false;
580}
581
Reid Spencere81d2da2007-02-16 22:36:51 +0000582bool APInt::slt(const APInt& RHS) const {
583 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencera58f0582007-02-18 20:09:41 +0000584 if (isSingleWord()) {
585 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
586 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
587 return lhsSext < rhsSext;
Reid Spencere81d2da2007-02-16 22:36:51 +0000588 }
Reid Spencera58f0582007-02-18 20:09:41 +0000589
590 APInt lhs(*this);
Reid Spencer1fa111e2007-02-27 18:23:40 +0000591 APInt rhs(RHS);
592 bool lhsNeg = isNegative();
593 bool rhsNeg = rhs.isNegative();
594 if (lhsNeg) {
595 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000596 lhs.flip();
597 lhs++;
598 }
Reid Spencer1fa111e2007-02-27 18:23:40 +0000599 if (rhsNeg) {
600 // Sign bit is set so perform two's complement to make it positive
Reid Spencera58f0582007-02-18 20:09:41 +0000601 rhs.flip();
602 rhs++;
603 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000604
605 // Now we have unsigned values to compare so do the comparison if necessary
606 // based on the negativeness of the values.
Reid Spencer1fa111e2007-02-27 18:23:40 +0000607 if (lhsNeg)
608 if (rhsNeg)
609 return lhs.ugt(rhs);
Reid Spencera58f0582007-02-18 20:09:41 +0000610 else
611 return true;
Reid Spencer1fa111e2007-02-27 18:23:40 +0000612 else if (rhsNeg)
Reid Spencera58f0582007-02-18 20:09:41 +0000613 return false;
614 else
615 return lhs.ult(rhs);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000616}
617
Reid Spenceraf0e9562007-02-18 18:38:44 +0000618APInt& APInt::set(uint32_t bitPosition) {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000619 if (isSingleWord())
620 VAL |= maskBit(bitPosition);
621 else
622 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000623 return *this;
624}
625
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000626APInt& APInt::set() {
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000627 if (isSingleWord()) {
628 VAL = -1ULL;
629 return clearUnusedBits();
Zhou Shengb04973e2007-02-15 06:36:31 +0000630 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000631
632 // Set all the bits in all the words.
Zhou Sheng6dbe2332007-03-21 04:34:37 +0000633 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer5d0d05c2007-02-25 19:32:03 +0000634 pVal[i] = -1ULL;
635 // Clear the unused ones
636 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000637}
638
639/// Set the given bit to 0 whose position is given as "bitPosition".
640/// @brief Set a given bit to 0.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000641APInt& APInt::clear(uint32_t bitPosition) {
642 if (isSingleWord())
643 VAL &= ~maskBit(bitPosition);
644 else
645 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000646 return *this;
647}
648
649/// @brief Set every bit to 0.
650APInt& APInt::clear() {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000651 if (isSingleWord())
652 VAL = 0;
Zhou Shenga3832fd2007-02-07 06:14:53 +0000653 else
Reid Spencera58f0582007-02-18 20:09:41 +0000654 memset(pVal, 0, getNumWords() * APINT_WORD_SIZE);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000655 return *this;
656}
657
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000658/// @brief Bitwise NOT operator. Performs a bitwise logical NOT operation on
659/// this APInt.
660APInt APInt::operator~() const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000661 APInt Result(*this);
662 Result.flip();
663 return Result;
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000664}
665
666/// @brief Toggle every bit to its opposite value.
667APInt& APInt::flip() {
Reid Spencer9eec2412007-02-25 23:44:53 +0000668 if (isSingleWord()) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000669 VAL ^= -1ULL;
Reid Spencer9eec2412007-02-25 23:44:53 +0000670 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000671 }
Reid Spencer9eec2412007-02-25 23:44:53 +0000672 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000673 pVal[i] ^= -1ULL;
Reid Spencer9eec2412007-02-25 23:44:53 +0000674 return clearUnusedBits();
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000675}
676
677/// Toggle a given bit to its opposite value whose position is given
678/// as "bitPosition".
679/// @brief Toggles a given bit to its opposite value.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000680APInt& APInt::flip(uint32_t bitPosition) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000681 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000682 if ((*this)[bitPosition]) clear(bitPosition);
683 else set(bitPosition);
684 return *this;
685}
686
Reid Spencer57ae4f52007-04-13 19:19:07 +0000687uint32_t APInt::getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) {
688 assert(str != 0 && "Invalid value string");
689 assert(slen > 0 && "Invalid string length");
690
691 // Each computation below needs to know if its negative
692 uint32_t isNegative = str[0] == '-';
693 if (isNegative) {
694 slen--;
695 str++;
696 }
697 // For radixes of power-of-two values, the bits required is accurately and
698 // easily computed
699 if (radix == 2)
700 return slen + isNegative;
701 if (radix == 8)
702 return slen * 3 + isNegative;
703 if (radix == 16)
704 return slen * 4 + isNegative;
705
706 // Otherwise it must be radix == 10, the hard case
707 assert(radix == 10 && "Invalid radix");
708
709 // This is grossly inefficient but accurate. We could probably do something
710 // with a computation of roughly slen*64/20 and then adjust by the value of
711 // the first few digits. But, I'm not sure how accurate that could be.
712
713 // Compute a sufficient number of bits that is always large enough but might
714 // be too large. This avoids the assertion in the constructor.
715 uint32_t sufficient = slen*64/18;
716
717 // Convert to the actual binary value.
718 APInt tmp(sufficient, str, slen, radix);
719
720 // Compute how many bits are required.
Reid Spencer0468ab32007-04-14 00:00:10 +0000721 return isNegative + tmp.logBase2() + 1;
Reid Spencer57ae4f52007-04-13 19:19:07 +0000722}
723
Reid Spencer794f4722007-02-26 21:02:27 +0000724uint64_t APInt::getHashValue() const {
Reid Spencer9ac44112007-02-26 23:38:21 +0000725 // Put the bit width into the low order bits.
726 uint64_t hash = BitWidth;
Reid Spencer794f4722007-02-26 21:02:27 +0000727
728 // Add the sum of the words to the hash.
729 if (isSingleWord())
Reid Spencer9ac44112007-02-26 23:38:21 +0000730 hash += VAL << 6; // clear separation of up to 64 bits
Reid Spencer794f4722007-02-26 21:02:27 +0000731 else
732 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer9ac44112007-02-26 23:38:21 +0000733 hash += pVal[i] << 6; // clear sepration of up to 64 bits
Reid Spencer794f4722007-02-26 21:02:27 +0000734 return hash;
735}
736
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000737/// HiBits - This function returns the high "numBits" bits of this APInt.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000738APInt APInt::getHiBits(uint32_t numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000739 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000740}
741
742/// LoBits - This function returns the low "numBits" bits of this APInt.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000743APInt APInt::getLoBits(uint32_t numBits) const {
Reid Spencere81d2da2007-02-16 22:36:51 +0000744 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
745 BitWidth - numBits);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000746}
747
Reid Spencere81d2da2007-02-16 22:36:51 +0000748bool APInt::isPowerOf2() const {
749 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
750}
751
Reid Spenceraf0e9562007-02-18 18:38:44 +0000752uint32_t APInt::countLeadingZeros() const {
Reid Spenceraf0e9562007-02-18 18:38:44 +0000753 uint32_t Count = 0;
Reid Spencere549c492007-02-21 00:29:48 +0000754 if (isSingleWord())
755 Count = CountLeadingZeros_64(VAL);
756 else {
757 for (uint32_t i = getNumWords(); i > 0u; --i) {
758 if (pVal[i-1] == 0)
759 Count += APINT_BITS_PER_WORD;
760 else {
761 Count += CountLeadingZeros_64(pVal[i-1]);
762 break;
763 }
764 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000765 }
Reid Spencerab2b2c82007-02-22 00:22:00 +0000766 uint32_t remainder = BitWidth % APINT_BITS_PER_WORD;
767 if (remainder)
768 Count -= APINT_BITS_PER_WORD - remainder;
Chris Lattner9e513ac2007-11-23 22:42:31 +0000769 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000770}
771
Reid Spencer681dcd12007-02-27 21:59:26 +0000772static uint32_t countLeadingOnes_64(uint64_t V, uint32_t skip) {
773 uint32_t Count = 0;
774 if (skip)
775 V <<= skip;
776 while (V && (V & (1ULL << 63))) {
777 Count++;
778 V <<= 1;
779 }
780 return Count;
781}
782
783uint32_t APInt::countLeadingOnes() const {
784 if (isSingleWord())
785 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
786
787 uint32_t highWordBits = BitWidth % APINT_BITS_PER_WORD;
788 uint32_t shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits);
789 int i = getNumWords() - 1;
790 uint32_t Count = countLeadingOnes_64(pVal[i], shift);
791 if (Count == highWordBits) {
792 for (i--; i >= 0; --i) {
793 if (pVal[i] == -1ULL)
794 Count += APINT_BITS_PER_WORD;
795 else {
796 Count += countLeadingOnes_64(pVal[i], 0);
797 break;
798 }
799 }
800 }
801 return Count;
802}
803
Reid Spenceraf0e9562007-02-18 18:38:44 +0000804uint32_t APInt::countTrailingZeros() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000805 if (isSingleWord())
Anton Korobeynikov97d37262007-12-24 11:16:47 +0000806 return std::min(uint32_t(CountTrailingZeros_64(VAL)), BitWidth);
Reid Spencer47fbe9e2007-02-26 07:44:38 +0000807 uint32_t Count = 0;
808 uint32_t i = 0;
809 for (; i < getNumWords() && pVal[i] == 0; ++i)
810 Count += APINT_BITS_PER_WORD;
811 if (i < getNumWords())
812 Count += CountTrailingZeros_64(pVal[i]);
Chris Lattner5e557122007-11-23 22:36:25 +0000813 return std::min(Count, BitWidth);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000814}
815
Dan Gohman42dd77f2008-02-13 21:11:05 +0000816uint32_t APInt::countTrailingOnes() const {
817 if (isSingleWord())
818 return std::min(uint32_t(CountTrailingOnes_64(VAL)), BitWidth);
819 uint32_t Count = 0;
820 uint32_t i = 0;
821 for (; i < getNumWords() && pVal[i] == -1; ++i)
822 Count += APINT_BITS_PER_WORD;
823 if (i < getNumWords())
824 Count += CountTrailingOnes_64(pVal[i]);
825 return std::min(Count, BitWidth);
826}
827
Reid Spenceraf0e9562007-02-18 18:38:44 +0000828uint32_t APInt::countPopulation() const {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000829 if (isSingleWord())
830 return CountPopulation_64(VAL);
Reid Spenceraf0e9562007-02-18 18:38:44 +0000831 uint32_t Count = 0;
832 for (uint32_t i = 0; i < getNumWords(); ++i)
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000833 Count += CountPopulation_64(pVal[i]);
834 return Count;
835}
836
Reid Spencere81d2da2007-02-16 22:36:51 +0000837APInt APInt::byteSwap() const {
838 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
839 if (BitWidth == 16)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000840 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000841 else if (BitWidth == 32)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000842 return APInt(BitWidth, ByteSwap_32(uint32_t(VAL)));
Reid Spencere81d2da2007-02-16 22:36:51 +0000843 else if (BitWidth == 48) {
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000844 uint32_t Tmp1 = uint32_t(VAL >> 16);
Zhou Shengb04973e2007-02-15 06:36:31 +0000845 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000846 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengb04973e2007-02-15 06:36:31 +0000847 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000848 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencere81d2da2007-02-16 22:36:51 +0000849 } else if (BitWidth == 64)
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000850 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengb04973e2007-02-15 06:36:31 +0000851 else {
Reid Spencercd6f2bf2007-02-17 00:18:01 +0000852 APInt Result(BitWidth, 0);
Zhou Shengb04973e2007-02-15 06:36:31 +0000853 char *pByte = (char*)Result.pVal;
Reid Spencera58f0582007-02-18 20:09:41 +0000854 for (uint32_t i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengb04973e2007-02-15 06:36:31 +0000855 char Tmp = pByte[i];
Reid Spencera58f0582007-02-18 20:09:41 +0000856 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
857 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengb04973e2007-02-15 06:36:31 +0000858 }
859 return Result;
860 }
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000861}
862
Zhou Sheng0b706b12007-02-08 14:35:19 +0000863APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
864 const APInt& API2) {
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000865 APInt A = API1, B = API2;
866 while (!!B) {
867 APInt T = B;
Reid Spencere81d2da2007-02-16 22:36:51 +0000868 B = APIntOps::urem(A, B);
Zhou Shengfd43dcf2007-02-06 03:00:16 +0000869 A = T;
870 }
871 return A;
872}
Chris Lattner6ad4c142007-02-06 05:38:37 +0000873
Reid Spencer1fa111e2007-02-27 18:23:40 +0000874APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, uint32_t width) {
Zhou Shengd93f00c2007-02-12 20:02:55 +0000875 union {
876 double D;
877 uint64_t I;
878 } T;
879 T.D = Double;
Reid Spencer30f44f32007-02-27 01:28:10 +0000880
881 // Get the sign bit from the highest order bit
Zhou Shengd93f00c2007-02-12 20:02:55 +0000882 bool isNeg = T.I >> 63;
Reid Spencer30f44f32007-02-27 01:28:10 +0000883
884 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd93f00c2007-02-12 20:02:55 +0000885 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer30f44f32007-02-27 01:28:10 +0000886
887 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000888 if (exp < 0)
Reid Spencerff605762007-02-28 01:30:08 +0000889 return APInt(width, 0u);
Reid Spencer30f44f32007-02-27 01:28:10 +0000890
891 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
892 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
893
894 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd93f00c2007-02-12 20:02:55 +0000895 if (exp < 52)
Reid Spencer1fa111e2007-02-27 18:23:40 +0000896 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
897 APInt(width, mantissa >> (52 - exp));
898
899 // If the client didn't provide enough bits for us to shift the mantissa into
900 // then the result is undefined, just return 0
901 if (width <= exp - 52)
902 return APInt(width, 0);
Reid Spencer30f44f32007-02-27 01:28:10 +0000903
904 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer1fa111e2007-02-27 18:23:40 +0000905 APInt Tmp(width, mantissa);
Reid Spencere81d2da2007-02-16 22:36:51 +0000906 Tmp = Tmp.shl(exp - 52);
Zhou Shengd93f00c2007-02-12 20:02:55 +0000907 return isNeg ? -Tmp : Tmp;
908}
909
Reid Spencerdb3faa62007-02-13 22:41:58 +0000910/// RoundToDouble - This function convert this APInt to a double.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000911/// The layout for double is as following (IEEE Standard 754):
912/// --------------------------------------
913/// | Sign Exponent Fraction Bias |
914/// |-------------------------------------- |
915/// | 1[63] 11[62-52] 52[51-00] 1023 |
916/// --------------------------------------
Reid Spencere81d2da2007-02-16 22:36:51 +0000917double APInt::roundToDouble(bool isSigned) const {
Reid Spencer9c0696f2007-02-20 08:51:03 +0000918
919 // Handle the simple case where the value is contained in one uint64_t.
Reid Spencera58f0582007-02-18 20:09:41 +0000920 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
921 if (isSigned) {
922 int64_t sext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
923 return double(sext);
924 } else
925 return double(VAL);
926 }
927
Reid Spencer9c0696f2007-02-20 08:51:03 +0000928 // Determine if the value is negative.
Reid Spencere81d2da2007-02-16 22:36:51 +0000929 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000930
931 // Construct the absolute value if we're negative.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000932 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencer9c0696f2007-02-20 08:51:03 +0000933
934 // Figure out how many bits we're using.
Reid Spenceraf0e9562007-02-18 18:38:44 +0000935 uint32_t n = Tmp.getActiveBits();
Zhou Shengd93f00c2007-02-12 20:02:55 +0000936
Reid Spencer9c0696f2007-02-20 08:51:03 +0000937 // The exponent (without bias normalization) is just the number of bits
938 // we are using. Note that the sign bit is gone since we constructed the
939 // absolute value.
940 uint64_t exp = n;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000941
Reid Spencer9c0696f2007-02-20 08:51:03 +0000942 // Return infinity for exponent overflow
943 if (exp > 1023) {
944 if (!isSigned || !isNeg)
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000945 return std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000946 else
Jeff Cohen09dfd8e2007-03-20 20:42:36 +0000947 return -std::numeric_limits<double>::infinity();
Reid Spencer9c0696f2007-02-20 08:51:03 +0000948 }
949 exp += 1023; // Increment for 1023 bias
950
951 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
952 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd93f00c2007-02-12 20:02:55 +0000953 uint64_t mantissa;
Reid Spencer9c0696f2007-02-20 08:51:03 +0000954 unsigned hiWord = whichWord(n-1);
955 if (hiWord == 0) {
956 mantissa = Tmp.pVal[0];
957 if (n > 52)
958 mantissa >>= n - 52; // shift down, we want the top 52 bits.
959 } else {
960 assert(hiWord > 0 && "huh?");
961 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
962 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
963 mantissa = hibits | lobits;
964 }
965
Zhou Shengd93f00c2007-02-12 20:02:55 +0000966 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencer443b5702007-02-18 00:44:22 +0000967 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd93f00c2007-02-12 20:02:55 +0000968 union {
969 double D;
970 uint64_t I;
971 } T;
972 T.I = sign | (exp << 52) | mantissa;
973 return T.D;
974}
975
Reid Spencere81d2da2007-02-16 22:36:51 +0000976// Truncate to new width.
Reid Spencer94900772007-02-28 17:34:32 +0000977APInt &APInt::trunc(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +0000978 assert(width < BitWidth && "Invalid APInt Truncate request");
Reid Spencer9af18872007-12-11 06:53:58 +0000979 assert(width >= MIN_INT_BITS && "Can't truncate to 0 bits");
Reid Spencer9eec2412007-02-25 23:44:53 +0000980 uint32_t wordsBefore = getNumWords();
981 BitWidth = width;
982 uint32_t wordsAfter = getNumWords();
983 if (wordsBefore != wordsAfter) {
984 if (wordsAfter == 1) {
985 uint64_t *tmp = pVal;
986 VAL = pVal[0];
Reid Spencer9ac44112007-02-26 23:38:21 +0000987 delete [] tmp;
Reid Spencer9eec2412007-02-25 23:44:53 +0000988 } else {
989 uint64_t *newVal = getClearedMemory(wordsAfter);
990 for (uint32_t i = 0; i < wordsAfter; ++i)
991 newVal[i] = pVal[i];
Reid Spencer9ac44112007-02-26 23:38:21 +0000992 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +0000993 pVal = newVal;
994 }
995 }
Reid Spencer94900772007-02-28 17:34:32 +0000996 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +0000997}
998
999// Sign extend to a new width.
Reid Spencer94900772007-02-28 17:34:32 +00001000APInt &APInt::sext(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001001 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencer9af18872007-12-11 06:53:58 +00001002 assert(width <= MAX_INT_BITS && "Too many bits");
Reid Spencer9eec2412007-02-25 23:44:53 +00001003 // If the sign bit isn't set, this is the same as zext.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001004 if (!isNegative()) {
Reid Spencer9eec2412007-02-25 23:44:53 +00001005 zext(width);
Reid Spencer94900772007-02-28 17:34:32 +00001006 return *this;
Reid Spencer9eec2412007-02-25 23:44:53 +00001007 }
1008
1009 // The sign bit is set. First, get some facts
1010 uint32_t wordsBefore = getNumWords();
1011 uint32_t wordBits = BitWidth % APINT_BITS_PER_WORD;
1012 BitWidth = width;
1013 uint32_t wordsAfter = getNumWords();
1014
1015 // Mask the high order word appropriately
1016 if (wordsBefore == wordsAfter) {
1017 uint32_t newWordBits = width % APINT_BITS_PER_WORD;
1018 // The extension is contained to the wordsBefore-1th word.
Reid Spencer36184ed2007-03-02 01:19:42 +00001019 uint64_t mask = ~0ULL;
1020 if (newWordBits)
1021 mask >>= APINT_BITS_PER_WORD - newWordBits;
1022 mask <<= wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001023 if (wordsBefore == 1)
1024 VAL |= mask;
1025 else
1026 pVal[wordsBefore-1] |= mask;
Reid Spencer295e40a2007-03-01 23:30:25 +00001027 return clearUnusedBits();
Reid Spencer9eec2412007-02-25 23:44:53 +00001028 }
1029
Reid Spencerf30b1882007-02-25 23:54:00 +00001030 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencer9eec2412007-02-25 23:44:53 +00001031 uint64_t *newVal = getMemory(wordsAfter);
1032 if (wordsBefore == 1)
1033 newVal[0] = VAL | mask;
1034 else {
1035 for (uint32_t i = 0; i < wordsBefore; ++i)
1036 newVal[i] = pVal[i];
1037 newVal[wordsBefore-1] |= mask;
1038 }
1039 for (uint32_t i = wordsBefore; i < wordsAfter; i++)
1040 newVal[i] = -1ULL;
1041 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001042 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001043 pVal = newVal;
Reid Spencer94900772007-02-28 17:34:32 +00001044 return clearUnusedBits();
Reid Spencere81d2da2007-02-16 22:36:51 +00001045}
1046
1047// Zero extend to a new width.
Reid Spencer94900772007-02-28 17:34:32 +00001048APInt &APInt::zext(uint32_t width) {
Reid Spencere81d2da2007-02-16 22:36:51 +00001049 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Reid Spencer9af18872007-12-11 06:53:58 +00001050 assert(width <= MAX_INT_BITS && "Too many bits");
Reid Spencer9eec2412007-02-25 23:44:53 +00001051 uint32_t wordsBefore = getNumWords();
1052 BitWidth = width;
1053 uint32_t wordsAfter = getNumWords();
1054 if (wordsBefore != wordsAfter) {
1055 uint64_t *newVal = getClearedMemory(wordsAfter);
1056 if (wordsBefore == 1)
1057 newVal[0] = VAL;
1058 else
1059 for (uint32_t i = 0; i < wordsBefore; ++i)
1060 newVal[i] = pVal[i];
1061 if (wordsBefore != 1)
Reid Spencer9ac44112007-02-26 23:38:21 +00001062 delete [] pVal;
Reid Spencer9eec2412007-02-25 23:44:53 +00001063 pVal = newVal;
1064 }
Reid Spencer94900772007-02-28 17:34:32 +00001065 return *this;
Reid Spencere81d2da2007-02-16 22:36:51 +00001066}
1067
Reid Spencer68e23002007-03-01 17:15:32 +00001068APInt &APInt::zextOrTrunc(uint32_t width) {
1069 if (BitWidth < width)
1070 return zext(width);
1071 if (BitWidth > width)
1072 return trunc(width);
1073 return *this;
1074}
1075
1076APInt &APInt::sextOrTrunc(uint32_t width) {
1077 if (BitWidth < width)
1078 return sext(width);
1079 if (BitWidth > width)
1080 return trunc(width);
1081 return *this;
1082}
1083
Zhou Shengff4304f2007-02-09 07:48:24 +00001084/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001085/// @brief Arithmetic right-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001086APInt APInt::ashr(uint32_t shiftAmt) const {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001087 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer46f9c942007-03-02 22:39:11 +00001088 // Handle a degenerate case
1089 if (shiftAmt == 0)
1090 return *this;
1091
1092 // Handle single word shifts with built-in ashr
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001093 if (isSingleWord()) {
1094 if (shiftAmt == BitWidth)
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001095 return APInt(BitWidth, 0); // undefined
1096 else {
1097 uint32_t SignBit = APINT_BITS_PER_WORD - BitWidth;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001098 return APInt(BitWidth,
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001099 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1100 }
Zhou Sheng0b706b12007-02-08 14:35:19 +00001101 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001102
Reid Spencer46f9c942007-03-02 22:39:11 +00001103 // If all the bits were shifted out, the result is, technically, undefined.
1104 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1105 // issues in the algorithm below.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001106 if (shiftAmt == BitWidth) {
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001107 if (isNegative())
1108 return APInt(BitWidth, -1ULL);
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001109 else
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001110 return APInt(BitWidth, 0);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001111 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001112
1113 // Create some space for the result.
1114 uint64_t * val = new uint64_t[getNumWords()];
1115
Reid Spencer46f9c942007-03-02 22:39:11 +00001116 // Compute some values needed by the following shift algorithms
1117 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1118 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1119 uint32_t breakWord = getNumWords() - 1 - offset; // last word affected
1120 uint32_t bitsInWord = whichBit(BitWidth); // how many bits in last word?
1121 if (bitsInWord == 0)
1122 bitsInWord = APINT_BITS_PER_WORD;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001123
1124 // If we are shifting whole words, just move whole words
1125 if (wordShift == 0) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001126 // Move the words containing significant bits
1127 for (uint32_t i = 0; i <= breakWord; ++i)
1128 val[i] = pVal[i+offset]; // move whole word
1129
1130 // Adjust the top significant word for sign bit fill, if negative
1131 if (isNegative())
1132 if (bitsInWord < APINT_BITS_PER_WORD)
1133 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1134 } else {
1135 // Shift the low order words
1136 for (uint32_t i = 0; i < breakWord; ++i) {
1137 // This combines the shifted corresponding word with the low bits from
1138 // the next word (shifted into this word's high bits).
1139 val[i] = (pVal[i+offset] >> wordShift) |
1140 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1141 }
1142
1143 // Shift the break word. In this case there are no bits from the next word
1144 // to include in this word.
1145 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1146
1147 // Deal with sign extenstion in the break word, and possibly the word before
1148 // it.
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001149 if (isNegative()) {
Reid Spencer46f9c942007-03-02 22:39:11 +00001150 if (wordShift > bitsInWord) {
1151 if (breakWord > 0)
1152 val[breakWord-1] |=
1153 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1154 val[breakWord] |= ~0ULL;
1155 } else
1156 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001157 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001158 }
1159
Reid Spencer46f9c942007-03-02 22:39:11 +00001160 // Remaining words are 0 or -1, just assign them.
1161 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001162 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer46f9c942007-03-02 22:39:11 +00001163 val[i] = fillValue;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001164 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001165}
1166
Zhou Shengff4304f2007-02-09 07:48:24 +00001167/// Logical right-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001168/// @brief Logical right-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001169APInt APInt::lshr(uint32_t shiftAmt) const {
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001170 if (isSingleWord()) {
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001171 if (shiftAmt == BitWidth)
1172 return APInt(BitWidth, 0);
1173 else
1174 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001175 }
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001176
Reid Spencerba81c2b2007-02-26 01:19:48 +00001177 // If all the bits were shifted out, the result is 0. This avoids issues
1178 // with shifting by the size of the integer type, which produces undefined
1179 // results. We define these "undefined results" to always be 0.
1180 if (shiftAmt == BitWidth)
1181 return APInt(BitWidth, 0);
1182
Reid Spencer02ae8b72007-05-17 06:26:29 +00001183 // If none of the bits are shifted out, the result is *this. This avoids
1184 // issues with shifting byt he size of the integer type, which produces
1185 // undefined results in the code below. This is also an optimization.
1186 if (shiftAmt == 0)
1187 return *this;
1188
Reid Spencerba81c2b2007-02-26 01:19:48 +00001189 // Create some space for the result.
1190 uint64_t * val = new uint64_t[getNumWords()];
1191
1192 // If we are shifting less than a word, compute the shift with a simple carry
1193 if (shiftAmt < APINT_BITS_PER_WORD) {
1194 uint64_t carry = 0;
1195 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spenceraf8fb192007-03-01 05:39:56 +00001196 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencerba81c2b2007-02-26 01:19:48 +00001197 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1198 }
1199 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001200 }
1201
Reid Spencerba81c2b2007-02-26 01:19:48 +00001202 // Compute some values needed by the remaining shift algorithms
1203 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1204 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1205
1206 // If we are shifting whole words, just move whole words
1207 if (wordShift == 0) {
1208 for (uint32_t i = 0; i < getNumWords() - offset; ++i)
1209 val[i] = pVal[i+offset];
1210 for (uint32_t i = getNumWords()-offset; i < getNumWords(); i++)
1211 val[i] = 0;
1212 return APInt(val,BitWidth).clearUnusedBits();
1213 }
1214
1215 // Shift the low order words
1216 uint32_t breakWord = getNumWords() - offset -1;
1217 for (uint32_t i = 0; i < breakWord; ++i)
Reid Spenceraf8fb192007-03-01 05:39:56 +00001218 val[i] = (pVal[i+offset] >> wordShift) |
1219 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencerba81c2b2007-02-26 01:19:48 +00001220 // Shift the break word.
1221 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1222
1223 // Remaining words are 0
1224 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
1225 val[i] = 0;
1226 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001227}
1228
Zhou Shengff4304f2007-02-09 07:48:24 +00001229/// Left-shift this APInt by shiftAmt.
Zhou Sheng0b706b12007-02-08 14:35:19 +00001230/// @brief Left-shift function.
Reid Spenceraf0e9562007-02-18 18:38:44 +00001231APInt APInt::shl(uint32_t shiftAmt) const {
Reid Spencer5bce8542007-02-24 20:19:37 +00001232 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer87553802007-02-25 00:56:44 +00001233 if (isSingleWord()) {
Reid Spencer5bce8542007-02-24 20:19:37 +00001234 if (shiftAmt == BitWidth)
Reid Spencer87553802007-02-25 00:56:44 +00001235 return APInt(BitWidth, 0); // avoid undefined shift results
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001236 return APInt(BitWidth, VAL << shiftAmt);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001237 }
Reid Spencer5bce8542007-02-24 20:19:37 +00001238
Reid Spencer87553802007-02-25 00:56:44 +00001239 // If all the bits were shifted out, the result is 0. This avoids issues
1240 // with shifting by the size of the integer type, which produces undefined
1241 // results. We define these "undefined results" to always be 0.
1242 if (shiftAmt == BitWidth)
1243 return APInt(BitWidth, 0);
1244
Reid Spencer92c72832007-05-12 18:01:57 +00001245 // If none of the bits are shifted out, the result is *this. This avoids a
1246 // lshr by the words size in the loop below which can produce incorrect
1247 // results. It also avoids the expensive computation below for a common case.
1248 if (shiftAmt == 0)
1249 return *this;
1250
Reid Spencer87553802007-02-25 00:56:44 +00001251 // Create some space for the result.
1252 uint64_t * val = new uint64_t[getNumWords()];
1253
1254 // If we are shifting less than a word, do it the easy way
1255 if (shiftAmt < APINT_BITS_PER_WORD) {
1256 uint64_t carry = 0;
Reid Spencer87553802007-02-25 00:56:44 +00001257 for (uint32_t i = 0; i < getNumWords(); i++) {
1258 val[i] = pVal[i] << shiftAmt | carry;
1259 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1260 }
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001261 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001262 }
1263
Reid Spencer87553802007-02-25 00:56:44 +00001264 // Compute some values needed by the remaining shift algorithms
1265 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1266 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1267
1268 // If we are shifting whole words, just move whole words
1269 if (wordShift == 0) {
1270 for (uint32_t i = 0; i < offset; i++)
1271 val[i] = 0;
1272 for (uint32_t i = offset; i < getNumWords(); i++)
1273 val[i] = pVal[i-offset];
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001274 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer5bce8542007-02-24 20:19:37 +00001275 }
Reid Spencer87553802007-02-25 00:56:44 +00001276
1277 // Copy whole words from this to Result.
1278 uint32_t i = getNumWords() - 1;
1279 for (; i > offset; --i)
1280 val[i] = pVal[i-offset] << wordShift |
1281 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencer438d71e2007-02-25 01:08:58 +00001282 val[offset] = pVal[0] << wordShift;
Reid Spencer87553802007-02-25 00:56:44 +00001283 for (i = 0; i < offset; ++i)
1284 val[i] = 0;
Reid Spencer5d0d05c2007-02-25 19:32:03 +00001285 return APInt(val, BitWidth).clearUnusedBits();
Zhou Sheng0b706b12007-02-08 14:35:19 +00001286}
1287
Reid Spencer19dc32a2007-05-13 23:44:59 +00001288APInt APInt::rotl(uint32_t rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001289 if (rotateAmt == 0)
1290 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001291 // Don't get too fancy, just use existing shift/or facilities
1292 APInt hi(*this);
1293 APInt lo(*this);
1294 hi.shl(rotateAmt);
1295 lo.lshr(BitWidth - rotateAmt);
1296 return hi | lo;
1297}
1298
1299APInt APInt::rotr(uint32_t rotateAmt) const {
Reid Spencer69944e82007-05-14 00:15:28 +00001300 if (rotateAmt == 0)
1301 return *this;
Reid Spencer19dc32a2007-05-13 23:44:59 +00001302 // Don't get too fancy, just use existing shift/or facilities
1303 APInt hi(*this);
1304 APInt lo(*this);
1305 lo.lshr(rotateAmt);
1306 hi.shl(BitWidth - rotateAmt);
1307 return hi | lo;
1308}
Reid Spenceraf8fb192007-03-01 05:39:56 +00001309
1310// Square Root - this method computes and returns the square root of "this".
1311// Three mechanisms are used for computation. For small values (<= 5 bits),
1312// a table lookup is done. This gets some performance for common cases. For
1313// values using less than 52 bits, the value is converted to double and then
1314// the libc sqrt function is called. The result is rounded and then converted
1315// back to a uint64_t which is then used to construct the result. Finally,
1316// the Babylonian method for computing square roots is used.
1317APInt APInt::sqrt() const {
1318
1319 // Determine the magnitude of the value.
1320 uint32_t magnitude = getActiveBits();
1321
1322 // Use a fast table for some small values. This also gets rid of some
1323 // rounding errors in libc sqrt for small values.
1324 if (magnitude <= 5) {
Reid Spencer4e1e87f2007-03-01 17:47:31 +00001325 static const uint8_t results[32] = {
Reid Spencerb5ca2cd2007-03-01 06:23:32 +00001326 /* 0 */ 0,
1327 /* 1- 2 */ 1, 1,
1328 /* 3- 6 */ 2, 2, 2, 2,
1329 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1330 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1331 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1332 /* 31 */ 6
1333 };
1334 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spenceraf8fb192007-03-01 05:39:56 +00001335 }
1336
1337 // If the magnitude of the value fits in less than 52 bits (the precision of
1338 // an IEEE double precision floating point value), then we can use the
1339 // libc sqrt function which will probably use a hardware sqrt computation.
1340 // This should be faster than the algorithm below.
Jeff Cohenca5183d2007-03-05 00:00:42 +00001341 if (magnitude < 52) {
1342#ifdef _MSC_VER
1343 // Amazingly, VC++ doesn't have round().
1344 return APInt(BitWidth,
1345 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1346#else
Reid Spenceraf8fb192007-03-01 05:39:56 +00001347 return APInt(BitWidth,
1348 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenca5183d2007-03-05 00:00:42 +00001349#endif
1350 }
Reid Spenceraf8fb192007-03-01 05:39:56 +00001351
1352 // Okay, all the short cuts are exhausted. We must compute it. The following
1353 // is a classical Babylonian method for computing the square root. This code
1354 // was adapted to APINt from a wikipedia article on such computations.
1355 // See http://www.wikipedia.org/ and go to the page named
1356 // Calculate_an_integer_square_root.
1357 uint32_t nbits = BitWidth, i = 4;
1358 APInt testy(BitWidth, 16);
1359 APInt x_old(BitWidth, 1);
1360 APInt x_new(BitWidth, 0);
1361 APInt two(BitWidth, 2);
1362
1363 // Select a good starting value using binary logarithms.
1364 for (;; i += 2, testy = testy.shl(2))
1365 if (i >= nbits || this->ule(testy)) {
1366 x_old = x_old.shl(i / 2);
1367 break;
1368 }
1369
1370 // Use the Babylonian method to arrive at the integer square root:
1371 for (;;) {
1372 x_new = (this->udiv(x_old) + x_old).udiv(two);
1373 if (x_old.ule(x_new))
1374 break;
1375 x_old = x_new;
1376 }
1377
1378 // Make sure we return the closest approximation
Reid Spencerf09aef72007-03-02 04:21:55 +00001379 // NOTE: The rounding calculation below is correct. It will produce an
1380 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
1381 // determined to be a rounding issue with pari/gp as it begins to use a
1382 // floating point representation after 192 bits. There are no discrepancies
1383 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spenceraf8fb192007-03-01 05:39:56 +00001384 APInt square(x_old * x_old);
1385 APInt nextSquare((x_old + 1) * (x_old +1));
1386 if (this->ult(square))
1387 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001388 else if (this->ule(nextSquare)) {
1389 APInt midpoint((nextSquare - square).udiv(two));
1390 APInt offset(*this - square);
1391 if (offset.ult(midpoint))
Reid Spenceraf8fb192007-03-01 05:39:56 +00001392 return x_old;
Reid Spencerf09aef72007-03-02 04:21:55 +00001393 else
1394 return x_old + 1;
1395 } else
Reid Spenceraf8fb192007-03-01 05:39:56 +00001396 assert(0 && "Error in APInt::sqrt computation");
1397 return x_old + 1;
1398}
1399
Reid Spencer9c0696f2007-02-20 08:51:03 +00001400/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1401/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1402/// variables here have the same names as in the algorithm. Comments explain
1403/// the algorithm and any deviation from it.
1404static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r,
1405 uint32_t m, uint32_t n) {
1406 assert(u && "Must provide dividend");
1407 assert(v && "Must provide divisor");
1408 assert(q && "Must provide quotient");
Reid Spencer9d6c9192007-02-24 03:58:46 +00001409 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001410 assert(n>1 && "n must be > 1");
1411
1412 // Knuth uses the value b as the base of the number system. In our case b
1413 // is 2^31 so we just set it to -1u.
1414 uint64_t b = uint64_t(1) << 32;
1415
Reid Spencer9d6c9192007-02-24 03:58:46 +00001416 DEBUG(cerr << "KnuthDiv: m=" << m << " n=" << n << '\n');
1417 DEBUG(cerr << "KnuthDiv: original:");
1418 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1419 DEBUG(cerr << " by");
1420 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1421 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001422 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1423 // u and v by d. Note that we have taken Knuth's advice here to use a power
1424 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1425 // 2 allows us to shift instead of multiply and it is easy to determine the
1426 // shift amount from the leading zeros. We are basically normalizing the u
1427 // and v so that its high bits are shifted to the top of v's range without
1428 // overflow. Note that this can require an extra word in u so that u must
1429 // be of length m+n+1.
1430 uint32_t shift = CountLeadingZeros_32(v[n-1]);
1431 uint32_t v_carry = 0;
1432 uint32_t u_carry = 0;
1433 if (shift) {
1434 for (uint32_t i = 0; i < m+n; ++i) {
1435 uint32_t u_tmp = u[i] >> (32 - shift);
1436 u[i] = (u[i] << shift) | u_carry;
1437 u_carry = u_tmp;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001438 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001439 for (uint32_t i = 0; i < n; ++i) {
1440 uint32_t v_tmp = v[i] >> (32 - shift);
1441 v[i] = (v[i] << shift) | v_carry;
1442 v_carry = v_tmp;
1443 }
1444 }
1445 u[m+n] = u_carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001446 DEBUG(cerr << "KnuthDiv: normal:");
1447 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1448 DEBUG(cerr << " by");
1449 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1450 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001451
1452 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1453 int j = m;
1454 do {
Reid Spencer9d6c9192007-02-24 03:58:46 +00001455 DEBUG(cerr << "KnuthDiv: quotient digit #" << j << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001456 // D3. [Calculate q'.].
1457 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1458 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1459 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1460 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1461 // on v[n-2] determines at high speed most of the cases in which the trial
1462 // value qp is one too large, and it eliminates all cases where qp is two
1463 // too large.
Reid Spencer92904632007-02-23 01:57:13 +00001464 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001465 DEBUG(cerr << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencer92904632007-02-23 01:57:13 +00001466 uint64_t qp = dividend / v[n-1];
1467 uint64_t rp = dividend % v[n-1];
Reid Spencer9c0696f2007-02-20 08:51:03 +00001468 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1469 qp--;
1470 rp += v[n-1];
Reid Spencer610fad82007-02-24 10:01:42 +00001471 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencer9d6c9192007-02-24 03:58:46 +00001472 qp--;
Reid Spencer92904632007-02-23 01:57:13 +00001473 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001474 DEBUG(cerr << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001475
Reid Spencer92904632007-02-23 01:57:13 +00001476 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1477 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1478 // consists of a simple multiplication by a one-place number, combined with
Reid Spencer610fad82007-02-24 10:01:42 +00001479 // a subtraction.
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001480 bool isNeg = false;
Reid Spencer92904632007-02-23 01:57:13 +00001481 for (uint32_t i = 0; i < n; ++i) {
Reid Spencer610fad82007-02-24 10:01:42 +00001482 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencer9d6c9192007-02-24 03:58:46 +00001483 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencer610fad82007-02-24 10:01:42 +00001484 bool borrow = subtrahend > u_tmp;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001485 DEBUG(cerr << "KnuthDiv: u_tmp == " << u_tmp
Reid Spencer610fad82007-02-24 10:01:42 +00001486 << ", subtrahend == " << subtrahend
1487 << ", borrow = " << borrow << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001488
Reid Spencer610fad82007-02-24 10:01:42 +00001489 uint64_t result = u_tmp - subtrahend;
1490 uint32_t k = j + i;
1491 u[k++] = result & (b-1); // subtract low word
1492 u[k++] = result >> 32; // subtract high word
1493 while (borrow && k <= m+n) { // deal with borrow to the left
1494 borrow = u[k] == 0;
1495 u[k]--;
1496 k++;
1497 }
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001498 isNeg |= borrow;
Reid Spencer610fad82007-02-24 10:01:42 +00001499 DEBUG(cerr << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
1500 u[j+i+1] << '\n');
Reid Spencer9d6c9192007-02-24 03:58:46 +00001501 }
1502 DEBUG(cerr << "KnuthDiv: after subtraction:");
1503 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1504 DEBUG(cerr << '\n');
Reid Spencer610fad82007-02-24 10:01:42 +00001505 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1506 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1507 // true value plus b**(n+1), namely as the b's complement of
Reid Spencer92904632007-02-23 01:57:13 +00001508 // the true value, and a "borrow" to the left should be remembered.
1509 //
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001510 if (isNeg) {
Reid Spencer610fad82007-02-24 10:01:42 +00001511 bool carry = true; // true because b's complement is "complement + 1"
1512 for (uint32_t i = 0; i <= m+n; ++i) {
1513 u[i] = ~u[i] + carry; // b's complement
1514 carry = carry && u[i] == 0;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001515 }
Reid Spencer92904632007-02-23 01:57:13 +00001516 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001517 DEBUG(cerr << "KnuthDiv: after complement:");
1518 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1519 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001520
1521 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
1522 // negative, go to step D6; otherwise go on to step D7.
1523 q[j] = qp;
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001524 if (isNeg) {
Reid Spencer9c0696f2007-02-20 08:51:03 +00001525 // D6. [Add back]. The probability that this step is necessary is very
1526 // small, on the order of only 2/b. Make sure that test data accounts for
Reid Spencer92904632007-02-23 01:57:13 +00001527 // this possibility. Decrease q[j] by 1
1528 q[j]--;
1529 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1530 // A carry will occur to the left of u[j+n], and it should be ignored
1531 // since it cancels with the borrow that occurred in D4.
1532 bool carry = false;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001533 for (uint32_t i = 0; i < n; i++) {
Reid Spencer9d6c9192007-02-24 03:58:46 +00001534 uint32_t limit = std::min(u[j+i],v[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001535 u[j+i] += v[i] + carry;
Reid Spencer9d6c9192007-02-24 03:58:46 +00001536 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001537 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001538 u[j+n] += carry;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001539 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001540 DEBUG(cerr << "KnuthDiv: after correction:");
1541 DEBUG(for (int i = m+n; i >=0; i--) cerr <<" " << u[i]);
1542 DEBUG(cerr << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001543
Reid Spencer92904632007-02-23 01:57:13 +00001544 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1545 } while (--j >= 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001546
Reid Spencer9d6c9192007-02-24 03:58:46 +00001547 DEBUG(cerr << "KnuthDiv: quotient:");
1548 DEBUG(for (int i = m; i >=0; i--) cerr <<" " << q[i]);
1549 DEBUG(cerr << '\n');
1550
Reid Spencer9c0696f2007-02-20 08:51:03 +00001551 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1552 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1553 // compute the remainder (urem uses this).
1554 if (r) {
1555 // The value d is expressed by the "shift" value above since we avoided
1556 // multiplication by d by using a shift left. So, all we have to do is
1557 // shift right here. In order to mak
Reid Spencer1050ec52007-02-24 20:38:01 +00001558 if (shift) {
1559 uint32_t carry = 0;
1560 DEBUG(cerr << "KnuthDiv: remainder:");
1561 for (int i = n-1; i >= 0; i--) {
1562 r[i] = (u[i] >> shift) | carry;
1563 carry = u[i] << (32 - shift);
1564 DEBUG(cerr << " " << r[i]);
1565 }
1566 } else {
1567 for (int i = n-1; i >= 0; i--) {
1568 r[i] = u[i];
1569 DEBUG(cerr << " " << r[i]);
1570 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001571 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001572 DEBUG(cerr << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001573 }
Reid Spencer9d6c9192007-02-24 03:58:46 +00001574 DEBUG(cerr << std::setbase(10) << '\n');
Reid Spencer9c0696f2007-02-20 08:51:03 +00001575}
1576
Reid Spencer9c0696f2007-02-20 08:51:03 +00001577void APInt::divide(const APInt LHS, uint32_t lhsWords,
1578 const APInt &RHS, uint32_t rhsWords,
1579 APInt *Quotient, APInt *Remainder)
1580{
1581 assert(lhsWords >= rhsWords && "Fractional result");
1582
1583 // First, compose the values into an array of 32-bit words instead of
1584 // 64-bit words. This is a necessity of both the "short division" algorithm
1585 // and the the Knuth "classical algorithm" which requires there to be native
1586 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1587 // can't use 64-bit operands here because we don't have native results of
1588 // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't
1589 // work on large-endian machines.
1590 uint64_t mask = ~0ull >> (sizeof(uint32_t)*8);
1591 uint32_t n = rhsWords * 2;
1592 uint32_t m = (lhsWords * 2) - n;
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001593
1594 // Allocate space for the temporary values we need either on the stack, if
1595 // it will fit, or on the heap if it won't.
1596 uint32_t SPACE[128];
1597 uint32_t *U = 0;
1598 uint32_t *V = 0;
1599 uint32_t *Q = 0;
1600 uint32_t *R = 0;
1601 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1602 U = &SPACE[0];
1603 V = &SPACE[m+n+1];
1604 Q = &SPACE[(m+n+1) + n];
1605 if (Remainder)
1606 R = &SPACE[(m+n+1) + n + (m+n)];
1607 } else {
1608 U = new uint32_t[m + n + 1];
1609 V = new uint32_t[n];
1610 Q = new uint32_t[m+n];
1611 if (Remainder)
1612 R = new uint32_t[n];
1613 }
1614
1615 // Initialize the dividend
Reid Spencer9c0696f2007-02-20 08:51:03 +00001616 memset(U, 0, (m+n+1)*sizeof(uint32_t));
1617 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001618 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001619 U[i * 2] = tmp & mask;
1620 U[i * 2 + 1] = tmp >> (sizeof(uint32_t)*8);
1621 }
1622 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1623
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001624 // Initialize the divisor
Reid Spencer9c0696f2007-02-20 08:51:03 +00001625 memset(V, 0, (n)*sizeof(uint32_t));
1626 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer15aab8a2007-02-22 00:58:45 +00001627 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001628 V[i * 2] = tmp & mask;
1629 V[i * 2 + 1] = tmp >> (sizeof(uint32_t)*8);
1630 }
1631
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001632 // initialize the quotient and remainder
Reid Spencer9c0696f2007-02-20 08:51:03 +00001633 memset(Q, 0, (m+n) * sizeof(uint32_t));
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001634 if (Remainder)
Reid Spencer9c0696f2007-02-20 08:51:03 +00001635 memset(R, 0, n * sizeof(uint32_t));
Reid Spencer9c0696f2007-02-20 08:51:03 +00001636
1637 // Now, adjust m and n for the Knuth division. n is the number of words in
1638 // the divisor. m is the number of words by which the dividend exceeds the
1639 // divisor (i.e. m+n is the length of the dividend). These sizes must not
1640 // contain any zero words or the Knuth algorithm fails.
1641 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1642 n--;
1643 m++;
1644 }
1645 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1646 m--;
1647
1648 // If we're left with only a single word for the divisor, Knuth doesn't work
1649 // so we implement the short division algorithm here. This is much simpler
1650 // and faster because we are certain that we can divide a 64-bit quantity
1651 // by a 32-bit quantity at hardware speed and short division is simply a
1652 // series of such operations. This is just like doing short division but we
1653 // are using base 2^32 instead of base 10.
1654 assert(n != 0 && "Divide by zero?");
1655 if (n == 1) {
1656 uint32_t divisor = V[0];
1657 uint32_t remainder = 0;
1658 for (int i = m+n-1; i >= 0; i--) {
1659 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1660 if (partial_dividend == 0) {
1661 Q[i] = 0;
1662 remainder = 0;
1663 } else if (partial_dividend < divisor) {
1664 Q[i] = 0;
1665 remainder = partial_dividend;
1666 } else if (partial_dividend == divisor) {
1667 Q[i] = 1;
1668 remainder = 0;
1669 } else {
1670 Q[i] = partial_dividend / divisor;
1671 remainder = partial_dividend - (Q[i] * divisor);
1672 }
1673 }
1674 if (R)
1675 R[0] = remainder;
1676 } else {
1677 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1678 // case n > 1.
1679 KnuthDiv(U, V, Q, R, m, n);
1680 }
1681
1682 // If the caller wants the quotient
1683 if (Quotient) {
1684 // Set up the Quotient value's memory.
1685 if (Quotient->BitWidth != LHS.BitWidth) {
1686 if (Quotient->isSingleWord())
1687 Quotient->VAL = 0;
1688 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001689 delete [] Quotient->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001690 Quotient->BitWidth = LHS.BitWidth;
1691 if (!Quotient->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001692 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001693 } else
1694 Quotient->clear();
1695
1696 // The quotient is in Q. Reconstitute the quotient into Quotient's low
1697 // order words.
1698 if (lhsWords == 1) {
1699 uint64_t tmp =
1700 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1701 if (Quotient->isSingleWord())
1702 Quotient->VAL = tmp;
1703 else
1704 Quotient->pVal[0] = tmp;
1705 } else {
1706 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1707 for (unsigned i = 0; i < lhsWords; ++i)
1708 Quotient->pVal[i] =
1709 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1710 }
1711 }
1712
1713 // If the caller wants the remainder
1714 if (Remainder) {
1715 // Set up the Remainder value's memory.
1716 if (Remainder->BitWidth != RHS.BitWidth) {
1717 if (Remainder->isSingleWord())
1718 Remainder->VAL = 0;
1719 else
Reid Spencer9ac44112007-02-26 23:38:21 +00001720 delete [] Remainder->pVal;
Reid Spencer9c0696f2007-02-20 08:51:03 +00001721 Remainder->BitWidth = RHS.BitWidth;
1722 if (!Remainder->isSingleWord())
Reid Spencere0cdd332007-02-21 08:21:52 +00001723 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencer9c0696f2007-02-20 08:51:03 +00001724 } else
1725 Remainder->clear();
1726
1727 // The remainder is in R. Reconstitute the remainder into Remainder's low
1728 // order words.
1729 if (rhsWords == 1) {
1730 uint64_t tmp =
1731 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1732 if (Remainder->isSingleWord())
1733 Remainder->VAL = tmp;
1734 else
1735 Remainder->pVal[0] = tmp;
1736 } else {
1737 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1738 for (unsigned i = 0; i < rhsWords; ++i)
1739 Remainder->pVal[i] =
1740 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1741 }
1742 }
1743
1744 // Clean up the memory we allocated.
Reid Spencer24c4a8f2007-02-25 01:56:07 +00001745 if (U != &SPACE[0]) {
1746 delete [] U;
1747 delete [] V;
1748 delete [] Q;
1749 delete [] R;
1750 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001751}
1752
Reid Spencere81d2da2007-02-16 22:36:51 +00001753APInt APInt::udiv(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001754 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001755
1756 // First, deal with the easy case
1757 if (isSingleWord()) {
1758 assert(RHS.VAL != 0 && "Divide by zero?");
1759 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001760 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001761
Reid Spencer71bd08f2007-02-17 02:07:07 +00001762 // Get some facts about the LHS and RHS number of bits and words
Reid Spenceraf0e9562007-02-18 18:38:44 +00001763 uint32_t rhsBits = RHS.getActiveBits();
1764 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001765 assert(rhsWords && "Divided by zero???");
Reid Spencer9c0696f2007-02-20 08:51:03 +00001766 uint32_t lhsBits = this->getActiveBits();
Reid Spenceraf0e9562007-02-18 18:38:44 +00001767 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001768
1769 // Deal with some degenerate cases
1770 if (!lhsWords)
Reid Spencere0cdd332007-02-21 08:21:52 +00001771 // 0 / X ===> 0
1772 return APInt(BitWidth, 0);
1773 else if (lhsWords < rhsWords || this->ult(RHS)) {
1774 // X / Y ===> 0, iff X < Y
1775 return APInt(BitWidth, 0);
1776 } else if (*this == RHS) {
1777 // X / X ===> 1
1778 return APInt(BitWidth, 1);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001779 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001780 // All high words are zero, just use native divide
Reid Spencere0cdd332007-02-21 08:21:52 +00001781 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001782 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001783
1784 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1785 APInt Quotient(1,0); // to hold result.
1786 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1787 return Quotient;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001788}
1789
Reid Spencere81d2da2007-02-16 22:36:51 +00001790APInt APInt::urem(const APInt& RHS) const {
Reid Spencercd6f2bf2007-02-17 00:18:01 +00001791 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer71bd08f2007-02-17 02:07:07 +00001792 if (isSingleWord()) {
1793 assert(RHS.VAL != 0 && "Remainder by zero?");
1794 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Sheng0b706b12007-02-08 14:35:19 +00001795 }
Reid Spencer71bd08f2007-02-17 02:07:07 +00001796
Reid Spencere0cdd332007-02-21 08:21:52 +00001797 // Get some facts about the LHS
1798 uint32_t lhsBits = getActiveBits();
1799 uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001800
1801 // Get some facts about the RHS
Reid Spenceraf0e9562007-02-18 18:38:44 +00001802 uint32_t rhsBits = RHS.getActiveBits();
1803 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001804 assert(rhsWords && "Performing remainder operation by zero ???");
1805
Reid Spencer71bd08f2007-02-17 02:07:07 +00001806 // Check the degenerate cases
Reid Spencer9c0696f2007-02-20 08:51:03 +00001807 if (lhsWords == 0) {
Reid Spencere0cdd332007-02-21 08:21:52 +00001808 // 0 % Y ===> 0
1809 return APInt(BitWidth, 0);
1810 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1811 // X % Y ===> X, iff X < Y
1812 return *this;
1813 } else if (*this == RHS) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001814 // X % X == 0;
Reid Spencere0cdd332007-02-21 08:21:52 +00001815 return APInt(BitWidth, 0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001816 } else if (lhsWords == 1) {
Reid Spencer71bd08f2007-02-17 02:07:07 +00001817 // All high words are zero, just use native remainder
Reid Spencere0cdd332007-02-21 08:21:52 +00001818 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer71bd08f2007-02-17 02:07:07 +00001819 }
Reid Spencer9c0696f2007-02-20 08:51:03 +00001820
Reid Spencer19dc32a2007-05-13 23:44:59 +00001821 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencer9c0696f2007-02-20 08:51:03 +00001822 APInt Remainder(1,0);
1823 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1824 return Remainder;
Zhou Sheng0b706b12007-02-08 14:35:19 +00001825}
Reid Spencer5e0a8512007-02-17 03:16:00 +00001826
Reid Spencer19dc32a2007-05-13 23:44:59 +00001827void APInt::udivrem(const APInt &LHS, const APInt &RHS,
1828 APInt &Quotient, APInt &Remainder) {
1829 // Get some size facts about the dividend and divisor
1830 uint32_t lhsBits = LHS.getActiveBits();
1831 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1832 uint32_t rhsBits = RHS.getActiveBits();
1833 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
1834
1835 // Check the degenerate cases
1836 if (lhsWords == 0) {
1837 Quotient = 0; // 0 / Y ===> 0
1838 Remainder = 0; // 0 % Y ===> 0
1839 return;
1840 }
1841
1842 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1843 Quotient = 0; // X / Y ===> 0, iff X < Y
1844 Remainder = LHS; // X % Y ===> X, iff X < Y
1845 return;
1846 }
1847
1848 if (LHS == RHS) {
1849 Quotient = 1; // X / X ===> 1
1850 Remainder = 0; // X % X ===> 0;
1851 return;
1852 }
1853
1854 if (lhsWords == 1 && rhsWords == 1) {
1855 // There is only one word to consider so use the native versions.
1856 if (LHS.isSingleWord()) {
1857 Quotient = APInt(LHS.getBitWidth(), LHS.VAL / RHS.VAL);
1858 Remainder = APInt(LHS.getBitWidth(), LHS.VAL % RHS.VAL);
1859 } else {
1860 Quotient = APInt(LHS.getBitWidth(), LHS.pVal[0] / RHS.pVal[0]);
1861 Remainder = APInt(LHS.getBitWidth(), LHS.pVal[0] % RHS.pVal[0]);
1862 }
1863 return;
1864 }
1865
1866 // Okay, lets do it the long way
1867 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1868}
1869
Reid Spencer385f7542007-02-21 03:55:44 +00001870void APInt::fromString(uint32_t numbits, const char *str, uint32_t slen,
Reid Spencer5e0a8512007-02-17 03:16:00 +00001871 uint8_t radix) {
Reid Spencer385f7542007-02-21 03:55:44 +00001872 // Check our assumptions here
Reid Spencer5e0a8512007-02-17 03:16:00 +00001873 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
1874 "Radix should be 2, 8, 10, or 16!");
Reid Spencer385f7542007-02-21 03:55:44 +00001875 assert(str && "String is null?");
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001876 bool isNeg = str[0] == '-';
1877 if (isNeg)
Reid Spencer9eec2412007-02-25 23:44:53 +00001878 str++, slen--;
Chris Lattnera5ae15e2007-05-03 18:15:36 +00001879 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
1880 assert((slen*3 <= numbits || radix != 8) && "Insufficient bit width");
1881 assert((slen*4 <= numbits || radix != 16) && "Insufficient bit width");
1882 assert(((slen*64)/22 <= numbits || radix != 10) && "Insufficient bit width");
Reid Spencer385f7542007-02-21 03:55:44 +00001883
1884 // Allocate memory
1885 if (!isSingleWord())
1886 pVal = getClearedMemory(getNumWords());
1887
1888 // Figure out if we can shift instead of multiply
1889 uint32_t shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
1890
1891 // Set up an APInt for the digit to add outside the loop so we don't
1892 // constantly construct/destruct it.
1893 APInt apdigit(getBitWidth(), 0);
1894 APInt apradix(getBitWidth(), radix);
1895
1896 // Enter digit traversal loop
1897 for (unsigned i = 0; i < slen; i++) {
1898 // Get a digit
1899 uint32_t digit = 0;
1900 char cdigit = str[i];
Reid Spencer6551dcd2007-05-16 19:18:22 +00001901 if (radix == 16) {
1902 if (!isxdigit(cdigit))
1903 assert(0 && "Invalid hex digit in string");
1904 if (isdigit(cdigit))
1905 digit = cdigit - '0';
1906 else if (cdigit >= 'a')
Reid Spencer385f7542007-02-21 03:55:44 +00001907 digit = cdigit - 'a' + 10;
1908 else if (cdigit >= 'A')
1909 digit = cdigit - 'A' + 10;
1910 else
Reid Spencer6551dcd2007-05-16 19:18:22 +00001911 assert(0 && "huh? we shouldn't get here");
1912 } else if (isdigit(cdigit)) {
1913 digit = cdigit - '0';
1914 } else {
Reid Spencer385f7542007-02-21 03:55:44 +00001915 assert(0 && "Invalid character in digit string");
Reid Spencer6551dcd2007-05-16 19:18:22 +00001916 }
Reid Spencer385f7542007-02-21 03:55:44 +00001917
Reid Spencer6551dcd2007-05-16 19:18:22 +00001918 // Shift or multiply the value by the radix
Reid Spencer385f7542007-02-21 03:55:44 +00001919 if (shift)
Reid Spencer6551dcd2007-05-16 19:18:22 +00001920 *this <<= shift;
Reid Spencer385f7542007-02-21 03:55:44 +00001921 else
1922 *this *= apradix;
1923
1924 // Add in the digit we just interpreted
Reid Spencer5bce8542007-02-24 20:19:37 +00001925 if (apdigit.isSingleWord())
1926 apdigit.VAL = digit;
1927 else
1928 apdigit.pVal[0] = digit;
Reid Spencer385f7542007-02-21 03:55:44 +00001929 *this += apdigit;
Reid Spencer5e0a8512007-02-17 03:16:00 +00001930 }
Reid Spencer9eec2412007-02-25 23:44:53 +00001931 // If its negative, put it in two's complement form
Reid Spencer47fbe9e2007-02-26 07:44:38 +00001932 if (isNeg) {
1933 (*this)--;
Reid Spencer9eec2412007-02-25 23:44:53 +00001934 this->flip();
Reid Spencer9eec2412007-02-25 23:44:53 +00001935 }
Reid Spencer5e0a8512007-02-17 03:16:00 +00001936}
Reid Spencer9c0696f2007-02-20 08:51:03 +00001937
Reid Spencer9c0696f2007-02-20 08:51:03 +00001938std::string APInt::toString(uint8_t radix, bool wantSigned) const {
1939 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
1940 "Radix should be 2, 8, 10, or 16!");
1941 static const char *digits[] = {
1942 "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
1943 };
1944 std::string result;
1945 uint32_t bits_used = getActiveBits();
1946 if (isSingleWord()) {
1947 char buf[65];
1948 const char *format = (radix == 10 ? (wantSigned ? "%lld" : "%llu") :
1949 (radix == 16 ? "%llX" : (radix == 8 ? "%llo" : 0)));
1950 if (format) {
1951 if (wantSigned) {
1952 int64_t sextVal = (int64_t(VAL) << (APINT_BITS_PER_WORD-BitWidth)) >>
1953 (APINT_BITS_PER_WORD-BitWidth);
1954 sprintf(buf, format, sextVal);
1955 } else
1956 sprintf(buf, format, VAL);
1957 } else {
1958 memset(buf, 0, 65);
1959 uint64_t v = VAL;
1960 while (bits_used) {
1961 uint32_t bit = v & 1;
1962 bits_used--;
1963 buf[bits_used] = digits[bit][0];
1964 v >>=1;
1965 }
1966 }
1967 result = buf;
1968 return result;
1969 }
1970
1971 if (radix != 10) {
Reid Spencerfb0709a2007-05-17 19:23:02 +00001972 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
1973 // because the number of bits per digit (1,3 and 4 respectively) divides
1974 // equaly. We just shift until there value is zero.
1975
1976 // First, check for a zero value and just short circuit the logic below.
1977 if (*this == 0)
1978 result = "0";
1979 else {
1980 APInt tmp(*this);
1981 size_t insert_at = 0;
1982 if (wantSigned && this->isNegative()) {
1983 // They want to print the signed version and it is a negative value
1984 // Flip the bits and add one to turn it into the equivalent positive
1985 // value and put a '-' in the result.
1986 tmp.flip();
1987 tmp++;
1988 result = "-";
1989 insert_at = 1;
1990 }
1991 // Just shift tmp right for each digit width until it becomes zero
1992 uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1));
1993 uint64_t mask = radix - 1;
1994 APInt zero(tmp.getBitWidth(), 0);
1995 while (tmp.ne(zero)) {
Reid Spencer20a4c232007-05-19 00:29:55 +00001996 unsigned digit = (tmp.isSingleWord() ? tmp.VAL : tmp.pVal[0]) & mask;
Reid Spencerfb0709a2007-05-17 19:23:02 +00001997 result.insert(insert_at, digits[digit]);
Reid Spencer20a4c232007-05-19 00:29:55 +00001998 tmp = tmp.lshr(shift);
Reid Spencer9c0696f2007-02-20 08:51:03 +00001999 }
2000 }
2001 return result;
2002 }
2003
2004 APInt tmp(*this);
2005 APInt divisor(4, radix);
2006 APInt zero(tmp.getBitWidth(), 0);
2007 size_t insert_at = 0;
2008 if (wantSigned && tmp[BitWidth-1]) {
2009 // They want to print the signed version and it is a negative value
2010 // Flip the bits and add one to turn it into the equivalent positive
2011 // value and put a '-' in the result.
2012 tmp.flip();
2013 tmp++;
2014 result = "-";
2015 insert_at = 1;
2016 }
Reid Spencere549c492007-02-21 00:29:48 +00002017 if (tmp == APInt(tmp.getBitWidth(), 0))
Reid Spencer9c0696f2007-02-20 08:51:03 +00002018 result = "0";
2019 else while (tmp.ne(zero)) {
2020 APInt APdigit(1,0);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002021 APInt tmp2(tmp.getBitWidth(), 0);
Reid Spencer385f7542007-02-21 03:55:44 +00002022 divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
2023 &APdigit);
Reid Spencer794f4722007-02-26 21:02:27 +00002024 uint32_t digit = APdigit.getZExtValue();
Reid Spencer385f7542007-02-21 03:55:44 +00002025 assert(digit < radix && "divide failed");
2026 result.insert(insert_at,digits[digit]);
Reid Spencer9c0696f2007-02-20 08:51:03 +00002027 tmp = tmp2;
2028 }
2029
2030 return result;
2031}
2032
Reid Spencer385f7542007-02-21 03:55:44 +00002033void APInt::dump() const
2034{
Reid Spencer610fad82007-02-24 10:01:42 +00002035 cerr << "APInt(" << BitWidth << ")=" << std::setbase(16);
Reid Spencer385f7542007-02-21 03:55:44 +00002036 if (isSingleWord())
Reid Spencer610fad82007-02-24 10:01:42 +00002037 cerr << VAL;
Reid Spencer385f7542007-02-21 03:55:44 +00002038 else for (unsigned i = getNumWords(); i > 0; i--) {
Reid Spencer610fad82007-02-24 10:01:42 +00002039 cerr << pVal[i-1] << " ";
Reid Spencer385f7542007-02-21 03:55:44 +00002040 }
Chris Lattner9132a2b2007-08-23 05:15:32 +00002041 cerr << " U(" << this->toStringUnsigned(10) << ") S("
Dale Johannesen9e3d3ab2007-09-14 22:26:36 +00002042 << this->toStringSigned(10) << ")" << std::setbase(10);
Reid Spencer385f7542007-02-21 03:55:44 +00002043}
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002044
2045// This implements a variety of operations on a representation of
2046// arbitrary precision, two's-complement, bignum integer values.
2047
2048/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2049 and unrestricting assumption. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002050COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002051
2052/* Some handy functions local to this file. */
2053namespace {
2054
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002055 /* Returns the integer part with the least significant BITS set.
2056 BITS cannot be zero. */
2057 inline integerPart
2058 lowBitMask(unsigned int bits)
2059 {
2060 assert (bits != 0 && bits <= integerPartWidth);
2061
2062 return ~(integerPart) 0 >> (integerPartWidth - bits);
2063 }
2064
Neil Booth055c0b32007-10-06 00:43:45 +00002065 /* Returns the value of the lower half of PART. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002066 inline integerPart
2067 lowHalf(integerPart part)
2068 {
2069 return part & lowBitMask(integerPartWidth / 2);
2070 }
2071
Neil Booth055c0b32007-10-06 00:43:45 +00002072 /* Returns the value of the upper half of PART. */
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002073 inline integerPart
2074 highHalf(integerPart part)
2075 {
2076 return part >> (integerPartWidth / 2);
2077 }
2078
Neil Booth055c0b32007-10-06 00:43:45 +00002079 /* Returns the bit number of the most significant set bit of a part.
2080 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002081 unsigned int
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002082 partMSB(integerPart value)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002083 {
2084 unsigned int n, msb;
2085
2086 if (value == 0)
2087 return -1U;
2088
2089 n = integerPartWidth / 2;
2090
2091 msb = 0;
2092 do {
2093 if (value >> n) {
2094 value >>= n;
2095 msb += n;
2096 }
2097
2098 n >>= 1;
2099 } while (n);
2100
2101 return msb;
2102 }
2103
Neil Booth055c0b32007-10-06 00:43:45 +00002104 /* Returns the bit number of the least significant set bit of a
2105 part. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002106 unsigned int
2107 partLSB(integerPart value)
2108 {
2109 unsigned int n, lsb;
2110
2111 if (value == 0)
2112 return -1U;
2113
2114 lsb = integerPartWidth - 1;
2115 n = integerPartWidth / 2;
2116
2117 do {
2118 if (value << n) {
2119 value <<= n;
2120 lsb -= n;
2121 }
2122
2123 n >>= 1;
2124 } while (n);
2125
2126 return lsb;
2127 }
2128}
2129
2130/* Sets the least significant part of a bignum to the input value, and
2131 zeroes out higher parts. */
2132void
2133APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2134{
2135 unsigned int i;
2136
Neil Booth68e53ad2007-10-08 13:47:12 +00002137 assert (parts > 0);
2138
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002139 dst[0] = part;
2140 for(i = 1; i < parts; i++)
2141 dst[i] = 0;
2142}
2143
2144/* Assign one bignum to another. */
2145void
2146APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2147{
2148 unsigned int i;
2149
2150 for(i = 0; i < parts; i++)
2151 dst[i] = src[i];
2152}
2153
2154/* Returns true if a bignum is zero, false otherwise. */
2155bool
2156APInt::tcIsZero(const integerPart *src, unsigned int parts)
2157{
2158 unsigned int i;
2159
2160 for(i = 0; i < parts; i++)
2161 if (src[i])
2162 return false;
2163
2164 return true;
2165}
2166
2167/* Extract the given bit of a bignum; returns 0 or 1. */
2168int
2169APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2170{
2171 return(parts[bit / integerPartWidth]
2172 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2173}
2174
2175/* Set the given bit of a bignum. */
2176void
2177APInt::tcSetBit(integerPart *parts, unsigned int bit)
2178{
2179 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2180}
2181
Neil Booth055c0b32007-10-06 00:43:45 +00002182/* Returns the bit number of the least significant set bit of a
2183 number. If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002184unsigned int
2185APInt::tcLSB(const integerPart *parts, unsigned int n)
2186{
2187 unsigned int i, lsb;
2188
2189 for(i = 0; i < n; i++) {
2190 if (parts[i] != 0) {
2191 lsb = partLSB(parts[i]);
2192
2193 return lsb + i * integerPartWidth;
2194 }
2195 }
2196
2197 return -1U;
2198}
2199
Neil Booth055c0b32007-10-06 00:43:45 +00002200/* Returns the bit number of the most significant set bit of a number.
2201 If the input number has no bits set -1U is returned. */
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002202unsigned int
2203APInt::tcMSB(const integerPart *parts, unsigned int n)
2204{
2205 unsigned int msb;
2206
2207 do {
2208 --n;
2209
2210 if (parts[n] != 0) {
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002211 msb = partMSB(parts[n]);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002212
2213 return msb + n * integerPartWidth;
2214 }
2215 } while (n);
2216
2217 return -1U;
2218}
2219
Neil Booth68e53ad2007-10-08 13:47:12 +00002220/* Copy the bit vector of width srcBITS from SRC, starting at bit
2221 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2222 the least significant bit of DST. All high bits above srcBITS in
2223 DST are zero-filled. */
2224void
2225APInt::tcExtract(integerPart *dst, unsigned int dstCount, const integerPart *src,
2226 unsigned int srcBits, unsigned int srcLSB)
2227{
2228 unsigned int firstSrcPart, dstParts, shift, n;
2229
2230 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
2231 assert (dstParts <= dstCount);
2232
2233 firstSrcPart = srcLSB / integerPartWidth;
2234 tcAssign (dst, src + firstSrcPart, dstParts);
2235
2236 shift = srcLSB % integerPartWidth;
2237 tcShiftRight (dst, dstParts, shift);
2238
2239 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2240 in DST. If this is less that srcBits, append the rest, else
2241 clear the high bits. */
2242 n = dstParts * integerPartWidth - shift;
2243 if (n < srcBits) {
2244 integerPart mask = lowBitMask (srcBits - n);
2245 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2246 << n % integerPartWidth);
2247 } else if (n > srcBits) {
Neil Booth1e8390d2007-10-12 15:31:31 +00002248 if (srcBits % integerPartWidth)
2249 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Booth68e53ad2007-10-08 13:47:12 +00002250 }
2251
2252 /* Clear high parts. */
2253 while (dstParts < dstCount)
2254 dst[dstParts++] = 0;
2255}
2256
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002257/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2258integerPart
2259APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2260 integerPart c, unsigned int parts)
2261{
2262 unsigned int i;
2263
2264 assert(c <= 1);
2265
2266 for(i = 0; i < parts; i++) {
2267 integerPart l;
2268
2269 l = dst[i];
2270 if (c) {
2271 dst[i] += rhs[i] + 1;
2272 c = (dst[i] <= l);
2273 } else {
2274 dst[i] += rhs[i];
2275 c = (dst[i] < l);
2276 }
2277 }
2278
2279 return c;
2280}
2281
2282/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2283integerPart
2284APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2285 integerPart c, unsigned int parts)
2286{
2287 unsigned int i;
2288
2289 assert(c <= 1);
2290
2291 for(i = 0; i < parts; i++) {
2292 integerPart l;
2293
2294 l = dst[i];
2295 if (c) {
2296 dst[i] -= rhs[i] + 1;
2297 c = (dst[i] >= l);
2298 } else {
2299 dst[i] -= rhs[i];
2300 c = (dst[i] > l);
2301 }
2302 }
2303
2304 return c;
2305}
2306
2307/* Negate a bignum in-place. */
2308void
2309APInt::tcNegate(integerPart *dst, unsigned int parts)
2310{
2311 tcComplement(dst, parts);
2312 tcIncrement(dst, parts);
2313}
2314
Neil Booth055c0b32007-10-06 00:43:45 +00002315/* DST += SRC * MULTIPLIER + CARRY if add is true
2316 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002317
2318 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2319 they must start at the same point, i.e. DST == SRC.
2320
2321 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2322 returned. Otherwise DST is filled with the least significant
2323 DSTPARTS parts of the result, and if all of the omitted higher
2324 parts were zero return zero, otherwise overflow occurred and
2325 return one. */
2326int
2327APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2328 integerPart multiplier, integerPart carry,
2329 unsigned int srcParts, unsigned int dstParts,
2330 bool add)
2331{
2332 unsigned int i, n;
2333
2334 /* Otherwise our writes of DST kill our later reads of SRC. */
2335 assert(dst <= src || dst >= src + srcParts);
2336 assert(dstParts <= srcParts + 1);
2337
2338 /* N loops; minimum of dstParts and srcParts. */
2339 n = dstParts < srcParts ? dstParts: srcParts;
2340
2341 for(i = 0; i < n; i++) {
2342 integerPart low, mid, high, srcPart;
2343
2344 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2345
2346 This cannot overflow, because
2347
2348 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2349
2350 which is less than n^2. */
2351
2352 srcPart = src[i];
2353
2354 if (multiplier == 0 || srcPart == 0) {
2355 low = carry;
2356 high = 0;
2357 } else {
2358 low = lowHalf(srcPart) * lowHalf(multiplier);
2359 high = highHalf(srcPart) * highHalf(multiplier);
2360
2361 mid = lowHalf(srcPart) * highHalf(multiplier);
2362 high += highHalf(mid);
2363 mid <<= integerPartWidth / 2;
2364 if (low + mid < low)
2365 high++;
2366 low += mid;
2367
2368 mid = highHalf(srcPart) * lowHalf(multiplier);
2369 high += highHalf(mid);
2370 mid <<= integerPartWidth / 2;
2371 if (low + mid < low)
2372 high++;
2373 low += mid;
2374
2375 /* Now add carry. */
2376 if (low + carry < low)
2377 high++;
2378 low += carry;
2379 }
2380
2381 if (add) {
2382 /* And now DST[i], and store the new low part there. */
2383 if (low + dst[i] < low)
2384 high++;
2385 dst[i] += low;
2386 } else
2387 dst[i] = low;
2388
2389 carry = high;
2390 }
2391
2392 if (i < dstParts) {
2393 /* Full multiplication, there is no overflow. */
2394 assert(i + 1 == dstParts);
2395 dst[i] = carry;
2396 return 0;
2397 } else {
2398 /* We overflowed if there is carry. */
2399 if (carry)
2400 return 1;
2401
2402 /* We would overflow if any significant unwritten parts would be
2403 non-zero. This is true if any remaining src parts are non-zero
2404 and the multiplier is non-zero. */
2405 if (multiplier)
2406 for(; i < srcParts; i++)
2407 if (src[i])
2408 return 1;
2409
2410 /* We fitted in the narrow destination. */
2411 return 0;
2412 }
2413}
2414
2415/* DST = LHS * RHS, where DST has the same width as the operands and
2416 is filled with the least significant parts of the result. Returns
2417 one if overflow occurred, otherwise zero. DST must be disjoint
2418 from both operands. */
2419int
2420APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2421 const integerPart *rhs, unsigned int parts)
2422{
2423 unsigned int i;
2424 int overflow;
2425
2426 assert(dst != lhs && dst != rhs);
2427
2428 overflow = 0;
2429 tcSet(dst, 0, parts);
2430
2431 for(i = 0; i < parts; i++)
2432 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2433 parts - i, true);
2434
2435 return overflow;
2436}
2437
Neil Booth978661d2007-10-06 00:24:48 +00002438/* DST = LHS * RHS, where DST has width the sum of the widths of the
2439 operands. No overflow occurs. DST must be disjoint from both
2440 operands. Returns the number of parts required to hold the
2441 result. */
2442unsigned int
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002443APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth978661d2007-10-06 00:24:48 +00002444 const integerPart *rhs, unsigned int lhsParts,
2445 unsigned int rhsParts)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002446{
Neil Booth978661d2007-10-06 00:24:48 +00002447 /* Put the narrower number on the LHS for less loops below. */
2448 if (lhsParts > rhsParts) {
2449 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2450 } else {
2451 unsigned int n;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002452
Neil Booth978661d2007-10-06 00:24:48 +00002453 assert(dst != lhs && dst != rhs);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002454
Neil Booth978661d2007-10-06 00:24:48 +00002455 tcSet(dst, 0, rhsParts);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002456
Neil Booth978661d2007-10-06 00:24:48 +00002457 for(n = 0; n < lhsParts; n++)
2458 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002459
Neil Booth978661d2007-10-06 00:24:48 +00002460 n = lhsParts + rhsParts;
2461
2462 return n - (dst[n - 1] == 0);
2463 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002464}
2465
2466/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2467 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2468 set REMAINDER to the remainder, return zero. i.e.
2469
2470 OLD_LHS = RHS * LHS + REMAINDER
2471
2472 SCRATCH is a bignum of the same size as the operands and result for
2473 use by the routine; its contents need not be initialized and are
2474 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2475*/
2476int
2477APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2478 integerPart *remainder, integerPart *srhs,
2479 unsigned int parts)
2480{
2481 unsigned int n, shiftCount;
2482 integerPart mask;
2483
2484 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2485
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002486 shiftCount = tcMSB(rhs, parts) + 1;
2487 if (shiftCount == 0)
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002488 return true;
2489
Chris Lattnerb39cdde2007-08-20 22:49:32 +00002490 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002491 n = shiftCount / integerPartWidth;
2492 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2493
2494 tcAssign(srhs, rhs, parts);
2495 tcShiftLeft(srhs, parts, shiftCount);
2496 tcAssign(remainder, lhs, parts);
2497 tcSet(lhs, 0, parts);
2498
2499 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2500 the total. */
2501 for(;;) {
2502 int compare;
2503
2504 compare = tcCompare(remainder, srhs, parts);
2505 if (compare >= 0) {
2506 tcSubtract(remainder, srhs, 0, parts);
2507 lhs[n] |= mask;
2508 }
2509
2510 if (shiftCount == 0)
2511 break;
2512 shiftCount--;
2513 tcShiftRight(srhs, parts, 1);
2514 if ((mask >>= 1) == 0)
2515 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2516 }
2517
2518 return false;
2519}
2520
2521/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2522 There are no restrictions on COUNT. */
2523void
2524APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2525{
Neil Booth68e53ad2007-10-08 13:47:12 +00002526 if (count) {
2527 unsigned int jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002528
Neil Booth68e53ad2007-10-08 13:47:12 +00002529 /* Jump is the inter-part jump; shift is is intra-part shift. */
2530 jump = count / integerPartWidth;
2531 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002532
Neil Booth68e53ad2007-10-08 13:47:12 +00002533 while (parts > jump) {
2534 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002535
Neil Booth68e53ad2007-10-08 13:47:12 +00002536 parts--;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002537
Neil Booth68e53ad2007-10-08 13:47:12 +00002538 /* dst[i] comes from the two parts src[i - jump] and, if we have
2539 an intra-part shift, src[i - jump - 1]. */
2540 part = dst[parts - jump];
2541 if (shift) {
2542 part <<= shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002543 if (parts >= jump + 1)
2544 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2545 }
2546
Neil Booth68e53ad2007-10-08 13:47:12 +00002547 dst[parts] = part;
2548 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002549
Neil Booth68e53ad2007-10-08 13:47:12 +00002550 while (parts > 0)
2551 dst[--parts] = 0;
2552 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002553}
2554
2555/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2556 zero. There are no restrictions on COUNT. */
2557void
2558APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2559{
Neil Booth68e53ad2007-10-08 13:47:12 +00002560 if (count) {
2561 unsigned int i, jump, shift;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002562
Neil Booth68e53ad2007-10-08 13:47:12 +00002563 /* Jump is the inter-part jump; shift is is intra-part shift. */
2564 jump = count / integerPartWidth;
2565 shift = count % integerPartWidth;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002566
Neil Booth68e53ad2007-10-08 13:47:12 +00002567 /* Perform the shift. This leaves the most significant COUNT bits
2568 of the result at zero. */
2569 for(i = 0; i < parts; i++) {
2570 integerPart part;
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002571
Neil Booth68e53ad2007-10-08 13:47:12 +00002572 if (i + jump >= parts) {
2573 part = 0;
2574 } else {
2575 part = dst[i + jump];
2576 if (shift) {
2577 part >>= shift;
2578 if (i + jump + 1 < parts)
2579 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2580 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002581 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002582
Neil Booth68e53ad2007-10-08 13:47:12 +00002583 dst[i] = part;
2584 }
Chris Lattnerfe8e14a2007-08-16 15:56:55 +00002585 }
2586}
2587
2588/* Bitwise and of two bignums. */
2589void
2590APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2591{
2592 unsigned int i;
2593
2594 for(i = 0; i < parts; i++)
2595 dst[i] &= rhs[i];
2596}
2597
2598/* Bitwise inclusive or of two bignums. */
2599void
2600APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2601{
2602 unsigned int i;
2603
2604 for(i = 0; i < parts; i++)
2605 dst[i] |= rhs[i];
2606}
2607
2608/* Bitwise exclusive or of two bignums. */
2609void
2610APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2611{
2612 unsigned int i;
2613
2614 for(i = 0; i < parts; i++)
2615 dst[i] ^= rhs[i];
2616}
2617
2618/* Complement a bignum in-place. */
2619void
2620APInt::tcComplement(integerPart *dst, unsigned int parts)
2621{
2622 unsigned int i;
2623
2624 for(i = 0; i < parts; i++)
2625 dst[i] = ~dst[i];
2626}
2627
2628/* Comparison (unsigned) of two bignums. */
2629int
2630APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2631 unsigned int parts)
2632{
2633 while (parts) {
2634 parts--;
2635 if (lhs[parts] == rhs[parts])
2636 continue;
2637
2638 if (lhs[parts] > rhs[parts])
2639 return 1;
2640 else
2641 return -1;
2642 }
2643
2644 return 0;
2645}
2646
2647/* Increment a bignum in-place, return the carry flag. */
2648integerPart
2649APInt::tcIncrement(integerPart *dst, unsigned int parts)
2650{
2651 unsigned int i;
2652
2653 for(i = 0; i < parts; i++)
2654 if (++dst[i] != 0)
2655 break;
2656
2657 return i == parts;
2658}
2659
2660/* Set the least significant BITS bits of a bignum, clear the
2661 rest. */
2662void
2663APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2664 unsigned int bits)
2665{
2666 unsigned int i;
2667
2668 i = 0;
2669 while (bits > integerPartWidth) {
2670 dst[i++] = ~(integerPart) 0;
2671 bits -= integerPartWidth;
2672 }
2673
2674 if (bits)
2675 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2676
2677 while (i < parts)
2678 dst[i++] = 0;
2679}