blob: 173f28c8d1990189ecf854c3a031cde378309150 [file] [log] [blame]
Zhou Shengdac63782007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Reid Spencer997d9e42007-02-27 19:31:09 +00005// This file was developed by Sheng Zhou and is distributed under the
6// University of Illinois Open Source License. See LICENSE.TXT for details.
Zhou Shengdac63782007-02-06 03:00:16 +00007//
8//===----------------------------------------------------------------------===//
9//
Reid Spencera41e93b2007-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 Shengdac63782007-02-06 03:00:16 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencera5e0d202007-02-24 03:58:46 +000015#define DEBUG_TYPE "apint"
Zhou Shengdac63782007-02-06 03:00:16 +000016#include "llvm/ADT/APInt.h"
17#include "llvm/DerivedTypes.h"
Reid Spencera5e0d202007-02-24 03:58:46 +000018#include "llvm/Support/Debug.h"
Zhou Shengdac63782007-02-06 03:00:16 +000019#include "llvm/Support/MathExtras.h"
Jeff Cohenb622c112007-03-05 00:00:42 +000020#include <math.h>
Jeff Cohene06855e2007-03-20 20:42:36 +000021#include <limits>
Zhou Sheng3e8022d2007-02-07 06:14:53 +000022#include <cstring>
Zhou Shengdac63782007-02-06 03:00:16 +000023#include <cstdlib>
Reid Spencer1ba83352007-02-21 03:55:44 +000024#ifndef NDEBUG
Reid Spencer1ba83352007-02-21 03:55:44 +000025#include <iomanip>
26#endif
27
Zhou Shengdac63782007-02-06 03:00:16 +000028using namespace llvm;
29
Reid Spencera41e93b2007-02-25 19:32:03 +000030/// A utility function for allocating memory, checking for allocation failures,
31/// and ensuring the contents are zeroed.
Reid Spencera856b6e2007-02-18 18:38:44 +000032inline static uint64_t* getClearedMemory(uint32_t numWords) {
33 uint64_t * result = new uint64_t[numWords];
34 assert(result && "APInt memory allocation fails!");
35 memset(result, 0, numWords * sizeof(uint64_t));
36 return result;
Zhou Sheng94b623a2007-02-06 06:04:53 +000037}
38
Reid Spencera41e93b2007-02-25 19:32:03 +000039/// A utility function for allocating memory and checking for allocation
40/// failure. The content is not zeroed.
Reid Spencera856b6e2007-02-18 18:38:44 +000041inline static uint64_t* getMemory(uint32_t numWords) {
42 uint64_t * result = new uint64_t[numWords];
43 assert(result && "APInt memory allocation fails!");
44 return result;
45}
46
Reid Spencerb1ec2e82007-03-19 21:19:02 +000047APInt::APInt(uint32_t numBits, uint64_t val, bool isSigned)
Reid Spencer6fae35a2007-03-19 20:37:47 +000048 : BitWidth(numBits), VAL(0) {
Reid Spencer1d072122007-02-16 22:36:51 +000049 assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small");
50 assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large");
Reid Spencera41e93b2007-02-25 19:32:03 +000051 if (isSingleWord())
52 VAL = val;
Zhou Shengdac63782007-02-06 03:00:16 +000053 else {
Reid Spencera856b6e2007-02-18 18:38:44 +000054 pVal = getClearedMemory(getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +000055 pVal[0] = val;
Reid Spencer6fae35a2007-03-19 20:37:47 +000056 if (isSigned && int64_t(val) < 0)
57 for (unsigned i = 1; i < getNumWords(); ++i)
58 pVal[i] = -1ULL;
Zhou Shengdac63782007-02-06 03:00:16 +000059 }
Reid Spencera41e93b2007-02-25 19:32:03 +000060 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +000061}
62
Reid Spencera856b6e2007-02-18 18:38:44 +000063APInt::APInt(uint32_t numBits, uint32_t numWords, uint64_t bigVal[])
Reid Spencer1ba83352007-02-21 03:55:44 +000064 : BitWidth(numBits), VAL(0) {
Reid Spencer1d072122007-02-16 22:36:51 +000065 assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small");
66 assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large");
Zhou Shengdac63782007-02-06 03:00:16 +000067 assert(bigVal && "Null pointer detected!");
68 if (isSingleWord())
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000069 VAL = bigVal[0];
Zhou Shengdac63782007-02-06 03:00:16 +000070 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000071 // Get memory, cleared to 0
72 pVal = getClearedMemory(getNumWords());
73 // Calculate the number of words to copy
74 uint32_t words = std::min<uint32_t>(numWords, getNumWords());
75 // Copy the words from bigVal to pVal
76 memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +000077 }
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000078 // Make sure unused high bits are cleared
79 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +000080}
81
Reid Spencera856b6e2007-02-18 18:38:44 +000082APInt::APInt(uint32_t numbits, const char StrStart[], uint32_t slen,
Reid Spencerfb77b2b2007-02-20 08:51:03 +000083 uint8_t radix)
Reid Spencer1ba83352007-02-21 03:55:44 +000084 : BitWidth(numbits), VAL(0) {
Reid Spencer4c50b522007-05-13 23:44:59 +000085 assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small");
86 assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large");
Reid Spencer1d072122007-02-16 22:36:51 +000087 fromString(numbits, StrStart, slen, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +000088}
89
Reid Spencerfb77b2b2007-02-20 08:51:03 +000090APInt::APInt(uint32_t numbits, const std::string& Val, uint8_t radix)
Reid Spencer1ba83352007-02-21 03:55:44 +000091 : BitWidth(numbits), VAL(0) {
Reid Spencer4c50b522007-05-13 23:44:59 +000092 assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small");
93 assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large");
Zhou Sheng3e8022d2007-02-07 06:14:53 +000094 assert(!Val.empty() && "String empty?");
Reid Spencer1d072122007-02-16 22:36:51 +000095 fromString(numbits, Val.c_str(), Val.size(), radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +000096}
97
Reid Spencer7a6a8d52007-02-20 23:40:25 +000098APInt::APInt(const APInt& that)
Reid Spencer1ba83352007-02-21 03:55:44 +000099 : BitWidth(that.BitWidth), VAL(0) {
Reid Spencer4c50b522007-05-13 23:44:59 +0000100 assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small");
101 assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large");
Reid Spencera856b6e2007-02-18 18:38:44 +0000102 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000103 VAL = that.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000104 else {
Reid Spencera856b6e2007-02-18 18:38:44 +0000105 pVal = getMemory(getNumWords());
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000106 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000107 }
108}
109
110APInt::~APInt() {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000111 if (!isSingleWord() && pVal)
Reid Spencer7c16cd22007-02-26 23:38:21 +0000112 delete [] pVal;
Zhou Shengdac63782007-02-06 03:00:16 +0000113}
114
Zhou Shengdac63782007-02-06 03:00:16 +0000115APInt& APInt::operator=(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000116 // Don't do anything for X = X
117 if (this == &RHS)
118 return *this;
119
120 // If the bitwidths are the same, we can avoid mucking with memory
121 if (BitWidth == RHS.getBitWidth()) {
122 if (isSingleWord())
123 VAL = RHS.VAL;
124 else
125 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
126 return *this;
127 }
128
129 if (isSingleWord())
130 if (RHS.isSingleWord())
131 VAL = RHS.VAL;
132 else {
133 VAL = 0;
134 pVal = getMemory(RHS.getNumWords());
135 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
136 }
137 else if (getNumWords() == RHS.getNumWords())
138 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
139 else if (RHS.isSingleWord()) {
140 delete [] pVal;
Reid Spencera856b6e2007-02-18 18:38:44 +0000141 VAL = RHS.VAL;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000142 } else {
143 delete [] pVal;
144 pVal = getMemory(RHS.getNumWords());
145 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
146 }
147 BitWidth = RHS.BitWidth;
148 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000149}
150
Zhou Shengdac63782007-02-06 03:00:16 +0000151APInt& APInt::operator=(uint64_t RHS) {
Reid Spencer1d072122007-02-16 22:36:51 +0000152 if (isSingleWord())
153 VAL = RHS;
Zhou Shengdac63782007-02-06 03:00:16 +0000154 else {
155 pVal[0] = RHS;
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000156 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000157 }
Reid Spencer7c16cd22007-02-26 23:38:21 +0000158 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000159}
160
Reid Spencera856b6e2007-02-18 18:38:44 +0000161/// add_1 - This function adds a single "digit" integer, y, to the multiple
162/// "digit" integer array, x[]. x[] is modified to reflect the addition and
163/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer100502d2007-02-17 03:16:00 +0000164/// @returns the carry of the addition.
Reid Spencera41e93b2007-02-25 19:32:03 +0000165static bool add_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000166 for (uint32_t i = 0; i < len; ++i) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000167 dest[i] = y + x[i];
168 if (dest[i] < y)
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000169 y = 1; // Carry one to next digit.
Reid Spenceree0a6852007-02-18 06:39:42 +0000170 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000171 y = 0; // No need to carry so exit early
Reid Spenceree0a6852007-02-18 06:39:42 +0000172 break;
173 }
Reid Spencer100502d2007-02-17 03:16:00 +0000174 }
Reid Spenceree0a6852007-02-18 06:39:42 +0000175 return y;
Reid Spencer100502d2007-02-17 03:16:00 +0000176}
177
Zhou Shengdac63782007-02-06 03:00:16 +0000178/// @brief Prefix increment operator. Increments the APInt by one.
179APInt& APInt::operator++() {
Reid Spencer1d072122007-02-16 22:36:51 +0000180 if (isSingleWord())
181 ++VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000182 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000183 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000184 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000185}
186
Reid Spencera856b6e2007-02-18 18:38:44 +0000187/// sub_1 - This function subtracts a single "digit" (64-bit word), y, from
188/// the multi-digit integer array, x[], propagating the borrowed 1 value until
189/// no further borrowing is neeeded or it runs out of "digits" in x. The result
190/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
191/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencera41e93b2007-02-25 19:32:03 +0000192/// @returns the borrow out of the subtraction
193static bool sub_1(uint64_t x[], uint32_t len, uint64_t y) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000194 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000195 uint64_t X = x[i];
Reid Spenceree0a6852007-02-18 06:39:42 +0000196 x[i] -= y;
197 if (y > X)
Reid Spencera856b6e2007-02-18 18:38:44 +0000198 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer100502d2007-02-17 03:16:00 +0000199 else {
Reid Spencera856b6e2007-02-18 18:38:44 +0000200 y = 0; // No need to borrow
201 break; // Remaining digits are unchanged so exit early
Reid Spencer100502d2007-02-17 03:16:00 +0000202 }
203 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000204 return bool(y);
Reid Spencer100502d2007-02-17 03:16:00 +0000205}
206
Zhou Shengdac63782007-02-06 03:00:16 +0000207/// @brief Prefix decrement operator. Decrements the APInt by one.
208APInt& APInt::operator--() {
Reid Spencera856b6e2007-02-18 18:38:44 +0000209 if (isSingleWord())
210 --VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000211 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000212 sub_1(pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000213 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000214}
215
Reid Spencera41e93b2007-02-25 19:32:03 +0000216/// add - This function adds the integer array x to the integer array Y and
217/// places the result in dest.
218/// @returns the carry out from the addition
219/// @brief General addition of 64-bit integer arrays
Reid Spencera5e0d202007-02-24 03:58:46 +0000220static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
221 uint32_t len) {
222 bool carry = false;
Reid Spencera856b6e2007-02-18 18:38:44 +0000223 for (uint32_t i = 0; i< len; ++i) {
Reid Spencercb292e42007-02-23 01:57:13 +0000224 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000225 dest[i] = x[i] + y[i] + carry;
Reid Spencerdb2abec2007-02-21 05:44:56 +0000226 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer100502d2007-02-17 03:16:00 +0000227 }
228 return carry;
229}
230
Reid Spencera41e93b2007-02-25 19:32:03 +0000231/// Adds the RHS APint to this APInt.
232/// @returns this, after addition of RHS.
233/// @brief Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000234APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000235 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000236 if (isSingleWord())
237 VAL += RHS.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000238 else {
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000239 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000240 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000241 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000242}
243
Reid Spencera41e93b2007-02-25 19:32:03 +0000244/// Subtracts the integer array y from the integer array x
245/// @returns returns the borrow out.
246/// @brief Generalized subtraction of 64-bit integer arrays.
Reid Spencera5e0d202007-02-24 03:58:46 +0000247static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
248 uint32_t len) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000249 bool borrow = false;
Reid Spencera856b6e2007-02-18 18:38:44 +0000250 for (uint32_t i = 0; i < len; ++i) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000251 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
252 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
253 dest[i] = x_tmp - y[i];
Reid Spencer100502d2007-02-17 03:16:00 +0000254 }
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000255 return borrow;
Reid Spencer100502d2007-02-17 03:16:00 +0000256}
257
Reid Spencera41e93b2007-02-25 19:32:03 +0000258/// Subtracts the RHS APInt from this APInt
259/// @returns this, after subtraction
260/// @brief Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000261APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000262 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000263 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000264 VAL -= RHS.VAL;
265 else
266 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000267 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000268}
269
Reid Spencera41e93b2007-02-25 19:32:03 +0000270/// Multiplies an integer array, x by a a uint64_t integer and places the result
271/// into dest.
272/// @returns the carry out of the multiplication.
273/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000274static uint64_t mul_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) {
275 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer100502d2007-02-17 03:16:00 +0000276 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencera41e93b2007-02-25 19:32:03 +0000277 uint64_t carry = 0;
278
279 // For each digit of x.
Reid Spencera856b6e2007-02-18 18:38:44 +0000280 for (uint32_t i = 0; i < len; ++i) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000281 // Split x into high and low words
282 uint64_t lx = x[i] & 0xffffffffULL;
283 uint64_t hx = x[i] >> 32;
284 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer100502d2007-02-17 03:16:00 +0000285 // hasCarry == 0, no carry
286 // hasCarry == 1, has carry
287 // hasCarry == 2, no carry and the calculation result == 0.
288 uint8_t hasCarry = 0;
289 dest[i] = carry + lx * ly;
290 // Determine if the add above introduces carry.
291 hasCarry = (dest[i] < carry) ? 1 : 0;
292 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
293 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
294 // (2^32 - 1) + 2^32 = 2^64.
295 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
296
297 carry += (lx * hy) & 0xffffffffULL;
298 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
299 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
300 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
301 }
Reid Spencer100502d2007-02-17 03:16:00 +0000302 return carry;
303}
304
Reid Spencera41e93b2007-02-25 19:32:03 +0000305/// Multiplies integer array x by integer array y and stores the result into
306/// the integer array dest. Note that dest's size must be >= xlen + ylen.
307/// @brief Generalized multiplicate of integer arrays.
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000308static void mul(uint64_t dest[], uint64_t x[], uint32_t xlen, uint64_t y[],
309 uint32_t ylen) {
Reid Spencer100502d2007-02-17 03:16:00 +0000310 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Reid Spencera856b6e2007-02-18 18:38:44 +0000311 for (uint32_t i = 1; i < ylen; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000312 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencer58a6a432007-02-21 08:21:52 +0000313 uint64_t carry = 0, lx = 0, hx = 0;
Reid Spencera856b6e2007-02-18 18:38:44 +0000314 for (uint32_t j = 0; j < xlen; ++j) {
Reid Spencer100502d2007-02-17 03:16:00 +0000315 lx = x[j] & 0xffffffffULL;
316 hx = x[j] >> 32;
317 // hasCarry - A flag to indicate if has carry.
318 // hasCarry == 0, no carry
319 // hasCarry == 1, has carry
320 // hasCarry == 2, no carry and the calculation result == 0.
321 uint8_t hasCarry = 0;
322 uint64_t resul = carry + lx * ly;
323 hasCarry = (resul < carry) ? 1 : 0;
324 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
325 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
326
327 carry += (lx * hy) & 0xffffffffULL;
328 resul = (carry << 32) | (resul & 0xffffffffULL);
329 dest[i+j] += resul;
330 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
331 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
332 ((lx * hy) >> 32) + hx * hy;
333 }
334 dest[i+xlen] = carry;
335 }
336}
337
Zhou Shengdac63782007-02-06 03:00:16 +0000338APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000339 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer58a6a432007-02-21 08:21:52 +0000340 if (isSingleWord()) {
Reid Spencer4bb430c2007-02-20 20:42:10 +0000341 VAL *= RHS.VAL;
Reid Spencer58a6a432007-02-21 08:21:52 +0000342 clearUnusedBits();
343 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000344 }
Reid Spencer58a6a432007-02-21 08:21:52 +0000345
346 // Get some bit facts about LHS and check for zero
347 uint32_t lhsBits = getActiveBits();
348 uint32_t lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
349 if (!lhsWords)
350 // 0 * X ===> 0
351 return *this;
352
353 // Get some bit facts about RHS and check for zero
354 uint32_t rhsBits = RHS.getActiveBits();
355 uint32_t rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
356 if (!rhsWords) {
357 // X * 0 ===> 0
358 clear();
359 return *this;
360 }
361
362 // Allocate space for the result
363 uint32_t destWords = rhsWords + lhsWords;
364 uint64_t *dest = getMemory(destWords);
365
366 // Perform the long multiply
367 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
368
369 // Copy result back into *this
370 clear();
371 uint32_t wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
372 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
373
374 // delete dest array and return
375 delete[] dest;
Zhou Shengdac63782007-02-06 03:00:16 +0000376 return *this;
377}
378
Zhou Shengdac63782007-02-06 03:00:16 +0000379APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000380 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000381 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000382 VAL &= RHS.VAL;
383 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000384 }
Reid Spencera856b6e2007-02-18 18:38:44 +0000385 uint32_t numWords = getNumWords();
386 for (uint32_t i = 0; i < numWords; ++i)
387 pVal[i] &= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000388 return *this;
389}
390
Zhou Shengdac63782007-02-06 03:00:16 +0000391APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000392 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000393 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000394 VAL |= RHS.VAL;
395 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000396 }
Reid Spencera856b6e2007-02-18 18:38:44 +0000397 uint32_t numWords = getNumWords();
398 for (uint32_t i = 0; i < numWords; ++i)
399 pVal[i] |= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000400 return *this;
401}
402
Zhou Shengdac63782007-02-06 03:00:16 +0000403APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000404 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000405 if (isSingleWord()) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000406 VAL ^= RHS.VAL;
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000407 this->clearUnusedBits();
Reid Spenceree0a6852007-02-18 06:39:42 +0000408 return *this;
409 }
Reid Spencera856b6e2007-02-18 18:38:44 +0000410 uint32_t numWords = getNumWords();
411 for (uint32_t i = 0; i < numWords; ++i)
412 pVal[i] ^= RHS.pVal[i];
Reid Spencera41e93b2007-02-25 19:32:03 +0000413 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000414}
415
Zhou Shengdac63782007-02-06 03:00:16 +0000416APInt APInt::operator&(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000417 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera856b6e2007-02-18 18:38:44 +0000418 if (isSingleWord())
419 return APInt(getBitWidth(), VAL & RHS.VAL);
420
Reid Spencera856b6e2007-02-18 18:38:44 +0000421 uint32_t numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000422 uint64_t* val = getMemory(numWords);
Reid Spencera856b6e2007-02-18 18:38:44 +0000423 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000424 val[i] = pVal[i] & RHS.pVal[i];
425 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000426}
427
Zhou Shengdac63782007-02-06 03:00:16 +0000428APInt APInt::operator|(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000429 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera856b6e2007-02-18 18:38:44 +0000430 if (isSingleWord())
431 return APInt(getBitWidth(), VAL | RHS.VAL);
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000432
Reid Spencera856b6e2007-02-18 18:38:44 +0000433 uint32_t numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000434 uint64_t *val = getMemory(numWords);
Reid Spencera856b6e2007-02-18 18:38:44 +0000435 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000436 val[i] = pVal[i] | RHS.pVal[i];
437 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000438}
439
Zhou Shengdac63782007-02-06 03:00:16 +0000440APInt APInt::operator^(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000441 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000442 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000443 return APInt(BitWidth, VAL ^ RHS.VAL);
Reid Spencera41e93b2007-02-25 19:32:03 +0000444
Reid Spencera856b6e2007-02-18 18:38:44 +0000445 uint32_t numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000446 uint64_t *val = getMemory(numWords);
Reid Spencera856b6e2007-02-18 18:38:44 +0000447 for (uint32_t i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000448 val[i] = pVal[i] ^ RHS.pVal[i];
449
450 // 0^0==1 so clear the high bits in case they got set.
451 return APInt(val, getBitWidth()).clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000452}
453
Zhou Shengdac63782007-02-06 03:00:16 +0000454bool APInt::operator !() const {
455 if (isSingleWord())
456 return !VAL;
Reid Spencera856b6e2007-02-18 18:38:44 +0000457
458 for (uint32_t i = 0; i < getNumWords(); ++i)
459 if (pVal[i])
460 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000461 return true;
462}
463
Zhou Shengdac63782007-02-06 03:00:16 +0000464APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000465 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000466 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000467 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer4bb430c2007-02-20 20:42:10 +0000468 APInt Result(*this);
469 Result *= RHS;
Reid Spencera41e93b2007-02-25 19:32:03 +0000470 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000471}
472
Zhou Shengdac63782007-02-06 03:00:16 +0000473APInt APInt::operator+(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000474 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000475 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000476 return APInt(BitWidth, VAL + RHS.VAL);
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000477 APInt Result(BitWidth, 0);
478 add(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000479 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000480}
481
Zhou Shengdac63782007-02-06 03:00:16 +0000482APInt APInt::operator-(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000483 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000484 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000485 return APInt(BitWidth, VAL - RHS.VAL);
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000486 APInt Result(BitWidth, 0);
487 sub(Result.pVal, this->pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000488 return Result.clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000489}
490
Reid Spencera856b6e2007-02-18 18:38:44 +0000491bool APInt::operator[](uint32_t bitPosition) const {
Reid Spencera41e93b2007-02-25 19:32:03 +0000492 return (maskBit(bitPosition) &
493 (isSingleWord() ? VAL : pVal[whichWord(bitPosition)])) != 0;
Zhou Shengdac63782007-02-06 03:00:16 +0000494}
495
Zhou Shengdac63782007-02-06 03:00:16 +0000496bool APInt::operator==(const APInt& RHS) const {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000497 assert(BitWidth == RHS.BitWidth && "Comparison requires equal bit widths");
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000498 if (isSingleWord())
499 return VAL == RHS.VAL;
500
Reid Spencera41e93b2007-02-25 19:32:03 +0000501 // Get some facts about the number of bits used in the two operands.
Reid Spencera856b6e2007-02-18 18:38:44 +0000502 uint32_t n1 = getActiveBits();
503 uint32_t n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000504
505 // If the number of bits isn't the same, they aren't equal
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000506 if (n1 != n2)
507 return false;
508
Reid Spencera41e93b2007-02-25 19:32:03 +0000509 // If the number of bits fits in a word, we only need to compare the low word.
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000510 if (n1 <= APINT_BITS_PER_WORD)
511 return pVal[0] == RHS.pVal[0];
512
Reid Spencera41e93b2007-02-25 19:32:03 +0000513 // Otherwise, compare everything
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000514 for (int i = whichWord(n1 - 1); i >= 0; --i)
515 if (pVal[i] != RHS.pVal[i])
516 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000517 return true;
518}
519
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000520bool APInt::operator==(uint64_t Val) const {
521 if (isSingleWord())
522 return VAL == Val;
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000523
524 uint32_t n = getActiveBits();
525 if (n <= APINT_BITS_PER_WORD)
526 return pVal[0] == Val;
527 else
528 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000529}
530
Reid Spencer1d072122007-02-16 22:36:51 +0000531bool APInt::ult(const APInt& RHS) const {
532 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
533 if (isSingleWord())
534 return VAL < RHS.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000535
536 // Get active bit length of both operands
537 uint32_t n1 = getActiveBits();
538 uint32_t n2 = RHS.getActiveBits();
539
540 // If magnitude of LHS is less than RHS, return true.
541 if (n1 < n2)
542 return true;
543
544 // If magnitude of RHS is greather than LHS, return false.
545 if (n2 < n1)
546 return false;
547
548 // If they bot fit in a word, just compare the low order word
549 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
550 return pVal[0] < RHS.pVal[0];
551
552 // Otherwise, compare all words
Reid Spencer54abdcf2007-02-27 18:23:40 +0000553 uint32_t topWord = whichWord(std::max(n1,n2)-1);
554 for (int i = topWord; i >= 0; --i) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000555 if (pVal[i] > RHS.pVal[i])
Reid Spencer1d072122007-02-16 22:36:51 +0000556 return false;
Reid Spencera41e93b2007-02-25 19:32:03 +0000557 if (pVal[i] < RHS.pVal[i])
558 return true;
Zhou Shengdac63782007-02-06 03:00:16 +0000559 }
560 return false;
561}
562
Reid Spencer1d072122007-02-16 22:36:51 +0000563bool APInt::slt(const APInt& RHS) const {
564 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000565 if (isSingleWord()) {
566 int64_t lhsSext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
567 int64_t rhsSext = (int64_t(RHS.VAL) << (64-BitWidth)) >> (64-BitWidth);
568 return lhsSext < rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000569 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000570
571 APInt lhs(*this);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000572 APInt rhs(RHS);
573 bool lhsNeg = isNegative();
574 bool rhsNeg = rhs.isNegative();
575 if (lhsNeg) {
576 // Sign bit is set so perform two's complement to make it positive
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000577 lhs.flip();
578 lhs++;
579 }
Reid Spencer54abdcf2007-02-27 18:23:40 +0000580 if (rhsNeg) {
581 // Sign bit is set so perform two's complement to make it positive
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000582 rhs.flip();
583 rhs++;
584 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000585
586 // Now we have unsigned values to compare so do the comparison if necessary
587 // based on the negativeness of the values.
Reid Spencer54abdcf2007-02-27 18:23:40 +0000588 if (lhsNeg)
589 if (rhsNeg)
590 return lhs.ugt(rhs);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000591 else
592 return true;
Reid Spencer54abdcf2007-02-27 18:23:40 +0000593 else if (rhsNeg)
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000594 return false;
595 else
596 return lhs.ult(rhs);
Zhou Shengdac63782007-02-06 03:00:16 +0000597}
598
Reid Spencera856b6e2007-02-18 18:38:44 +0000599APInt& APInt::set(uint32_t bitPosition) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000600 if (isSingleWord())
601 VAL |= maskBit(bitPosition);
602 else
603 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000604 return *this;
605}
606
Zhou Shengdac63782007-02-06 03:00:16 +0000607APInt& APInt::set() {
Reid Spencera41e93b2007-02-25 19:32:03 +0000608 if (isSingleWord()) {
609 VAL = -1ULL;
610 return clearUnusedBits();
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000611 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000612
613 // Set all the bits in all the words.
Zhou Sheng0458c1d2007-03-21 04:34:37 +0000614 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000615 pVal[i] = -1ULL;
616 // Clear the unused ones
617 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000618}
619
620/// Set the given bit to 0 whose position is given as "bitPosition".
621/// @brief Set a given bit to 0.
Reid Spencera856b6e2007-02-18 18:38:44 +0000622APInt& APInt::clear(uint32_t bitPosition) {
623 if (isSingleWord())
624 VAL &= ~maskBit(bitPosition);
625 else
626 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000627 return *this;
628}
629
630/// @brief Set every bit to 0.
631APInt& APInt::clear() {
Reid Spencera856b6e2007-02-18 18:38:44 +0000632 if (isSingleWord())
633 VAL = 0;
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000634 else
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000635 memset(pVal, 0, getNumWords() * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000636 return *this;
637}
638
Zhou Shengdac63782007-02-06 03:00:16 +0000639/// @brief Bitwise NOT operator. Performs a bitwise logical NOT operation on
640/// this APInt.
641APInt APInt::operator~() const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000642 APInt Result(*this);
643 Result.flip();
644 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000645}
646
647/// @brief Toggle every bit to its opposite value.
648APInt& APInt::flip() {
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000649 if (isSingleWord()) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000650 VAL ^= -1ULL;
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000651 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000652 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000653 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000654 pVal[i] ^= -1ULL;
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000655 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000656}
657
658/// Toggle a given bit to its opposite value whose position is given
659/// as "bitPosition".
660/// @brief Toggles a given bit to its opposite value.
Reid Spencera856b6e2007-02-18 18:38:44 +0000661APInt& APInt::flip(uint32_t bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000662 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Zhou Shengdac63782007-02-06 03:00:16 +0000663 if ((*this)[bitPosition]) clear(bitPosition);
664 else set(bitPosition);
665 return *this;
666}
667
Reid Spencer9329e7b2007-04-13 19:19:07 +0000668uint32_t APInt::getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) {
669 assert(str != 0 && "Invalid value string");
670 assert(slen > 0 && "Invalid string length");
671
672 // Each computation below needs to know if its negative
673 uint32_t isNegative = str[0] == '-';
674 if (isNegative) {
675 slen--;
676 str++;
677 }
678 // For radixes of power-of-two values, the bits required is accurately and
679 // easily computed
680 if (radix == 2)
681 return slen + isNegative;
682 if (radix == 8)
683 return slen * 3 + isNegative;
684 if (radix == 16)
685 return slen * 4 + isNegative;
686
687 // Otherwise it must be radix == 10, the hard case
688 assert(radix == 10 && "Invalid radix");
689
690 // This is grossly inefficient but accurate. We could probably do something
691 // with a computation of roughly slen*64/20 and then adjust by the value of
692 // the first few digits. But, I'm not sure how accurate that could be.
693
694 // Compute a sufficient number of bits that is always large enough but might
695 // be too large. This avoids the assertion in the constructor.
696 uint32_t sufficient = slen*64/18;
697
698 // Convert to the actual binary value.
699 APInt tmp(sufficient, str, slen, radix);
700
701 // Compute how many bits are required.
Reid Spencer67378b22007-04-14 00:00:10 +0000702 return isNegative + tmp.logBase2() + 1;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000703}
704
Reid Spencerb2bc9852007-02-26 21:02:27 +0000705uint64_t APInt::getHashValue() const {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000706 // Put the bit width into the low order bits.
707 uint64_t hash = BitWidth;
Reid Spencerb2bc9852007-02-26 21:02:27 +0000708
709 // Add the sum of the words to the hash.
710 if (isSingleWord())
Reid Spencer7c16cd22007-02-26 23:38:21 +0000711 hash += VAL << 6; // clear separation of up to 64 bits
Reid Spencerb2bc9852007-02-26 21:02:27 +0000712 else
713 for (uint32_t i = 0; i < getNumWords(); ++i)
Reid Spencer7c16cd22007-02-26 23:38:21 +0000714 hash += pVal[i] << 6; // clear sepration of up to 64 bits
Reid Spencerb2bc9852007-02-26 21:02:27 +0000715 return hash;
716}
717
Zhou Shengdac63782007-02-06 03:00:16 +0000718/// HiBits - This function returns the high "numBits" bits of this APInt.
Reid Spencera856b6e2007-02-18 18:38:44 +0000719APInt APInt::getHiBits(uint32_t numBits) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000720 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000721}
722
723/// LoBits - This function returns the low "numBits" bits of this APInt.
Reid Spencera856b6e2007-02-18 18:38:44 +0000724APInt APInt::getLoBits(uint32_t numBits) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000725 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
726 BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000727}
728
Reid Spencer1d072122007-02-16 22:36:51 +0000729bool APInt::isPowerOf2() const {
730 return (!!*this) && !(*this & (*this - APInt(BitWidth,1)));
731}
732
Reid Spencera856b6e2007-02-18 18:38:44 +0000733uint32_t APInt::countLeadingZeros() const {
Reid Spencera856b6e2007-02-18 18:38:44 +0000734 uint32_t Count = 0;
Reid Spencer74cf82e2007-02-21 00:29:48 +0000735 if (isSingleWord())
736 Count = CountLeadingZeros_64(VAL);
737 else {
738 for (uint32_t i = getNumWords(); i > 0u; --i) {
739 if (pVal[i-1] == 0)
740 Count += APINT_BITS_PER_WORD;
741 else {
742 Count += CountLeadingZeros_64(pVal[i-1]);
743 break;
744 }
745 }
Zhou Shengdac63782007-02-06 03:00:16 +0000746 }
Reid Spencere4ce71d2007-02-22 00:22:00 +0000747 uint32_t remainder = BitWidth % APINT_BITS_PER_WORD;
748 if (remainder)
749 Count -= APINT_BITS_PER_WORD - remainder;
750 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000751}
752
Reid Spencer31acef52007-02-27 21:59:26 +0000753static uint32_t countLeadingOnes_64(uint64_t V, uint32_t skip) {
754 uint32_t Count = 0;
755 if (skip)
756 V <<= skip;
757 while (V && (V & (1ULL << 63))) {
758 Count++;
759 V <<= 1;
760 }
761 return Count;
762}
763
764uint32_t APInt::countLeadingOnes() const {
765 if (isSingleWord())
766 return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth);
767
768 uint32_t highWordBits = BitWidth % APINT_BITS_PER_WORD;
769 uint32_t shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits);
770 int i = getNumWords() - 1;
771 uint32_t Count = countLeadingOnes_64(pVal[i], shift);
772 if (Count == highWordBits) {
773 for (i--; i >= 0; --i) {
774 if (pVal[i] == -1ULL)
775 Count += APINT_BITS_PER_WORD;
776 else {
777 Count += countLeadingOnes_64(pVal[i], 0);
778 break;
779 }
780 }
781 }
782 return Count;
783}
784
Reid Spencera856b6e2007-02-18 18:38:44 +0000785uint32_t APInt::countTrailingZeros() const {
Zhou Shengdac63782007-02-06 03:00:16 +0000786 if (isSingleWord())
Reid Spencerfbd48a52007-02-18 00:44:22 +0000787 return CountTrailingZeros_64(VAL);
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000788 uint32_t Count = 0;
789 uint32_t i = 0;
790 for (; i < getNumWords() && pVal[i] == 0; ++i)
791 Count += APINT_BITS_PER_WORD;
792 if (i < getNumWords())
793 Count += CountTrailingZeros_64(pVal[i]);
794 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000795}
796
Reid Spencera856b6e2007-02-18 18:38:44 +0000797uint32_t APInt::countPopulation() const {
Zhou Shengdac63782007-02-06 03:00:16 +0000798 if (isSingleWord())
799 return CountPopulation_64(VAL);
Reid Spencera856b6e2007-02-18 18:38:44 +0000800 uint32_t Count = 0;
801 for (uint32_t i = 0; i < getNumWords(); ++i)
Zhou Shengdac63782007-02-06 03:00:16 +0000802 Count += CountPopulation_64(pVal[i]);
803 return Count;
804}
805
Reid Spencer1d072122007-02-16 22:36:51 +0000806APInt APInt::byteSwap() const {
807 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
808 if (BitWidth == 16)
Jeff Cohene06855e2007-03-20 20:42:36 +0000809 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Reid Spencer1d072122007-02-16 22:36:51 +0000810 else if (BitWidth == 32)
Jeff Cohene06855e2007-03-20 20:42:36 +0000811 return APInt(BitWidth, ByteSwap_32(uint32_t(VAL)));
Reid Spencer1d072122007-02-16 22:36:51 +0000812 else if (BitWidth == 48) {
Jeff Cohene06855e2007-03-20 20:42:36 +0000813 uint32_t Tmp1 = uint32_t(VAL >> 16);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000814 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohene06855e2007-03-20 20:42:36 +0000815 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000816 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohene06855e2007-03-20 20:42:36 +0000817 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Reid Spencer1d072122007-02-16 22:36:51 +0000818 } else if (BitWidth == 64)
Reid Spencera32372d12007-02-17 00:18:01 +0000819 return APInt(BitWidth, ByteSwap_64(VAL));
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000820 else {
Reid Spencera32372d12007-02-17 00:18:01 +0000821 APInt Result(BitWidth, 0);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000822 char *pByte = (char*)Result.pVal;
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000823 for (uint32_t i = 0; i < BitWidth / APINT_WORD_SIZE / 2; ++i) {
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000824 char Tmp = pByte[i];
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000825 pByte[i] = pByte[BitWidth / APINT_WORD_SIZE - 1 - i];
826 pByte[BitWidth / APINT_WORD_SIZE - i - 1] = Tmp;
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000827 }
828 return Result;
829 }
Zhou Shengdac63782007-02-06 03:00:16 +0000830}
831
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000832APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
833 const APInt& API2) {
Zhou Shengdac63782007-02-06 03:00:16 +0000834 APInt A = API1, B = API2;
835 while (!!B) {
836 APInt T = B;
Reid Spencer1d072122007-02-16 22:36:51 +0000837 B = APIntOps::urem(A, B);
Zhou Shengdac63782007-02-06 03:00:16 +0000838 A = T;
839 }
840 return A;
841}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000842
Reid Spencer54abdcf2007-02-27 18:23:40 +0000843APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, uint32_t width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000844 union {
845 double D;
846 uint64_t I;
847 } T;
848 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000849
850 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000851 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000852
853 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000854 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000855
856 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000857 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000858 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000859
860 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
861 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
862
863 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000864 if (exp < 52)
Reid Spencer54abdcf2007-02-27 18:23:40 +0000865 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
866 APInt(width, mantissa >> (52 - exp));
867
868 // If the client didn't provide enough bits for us to shift the mantissa into
869 // then the result is undefined, just return 0
870 if (width <= exp - 52)
871 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000872
873 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000874 APInt Tmp(width, mantissa);
Reid Spencer1d072122007-02-16 22:36:51 +0000875 Tmp = Tmp.shl(exp - 52);
Zhou Shengd707d632007-02-12 20:02:55 +0000876 return isNeg ? -Tmp : Tmp;
877}
878
Reid Spencer51535252007-02-13 22:41:58 +0000879/// RoundToDouble - This function convert this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000880/// The layout for double is as following (IEEE Standard 754):
881/// --------------------------------------
882/// | Sign Exponent Fraction Bias |
883/// |-------------------------------------- |
884/// | 1[63] 11[62-52] 52[51-00] 1023 |
885/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000886double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000887
888 // Handle the simple case where the value is contained in one uint64_t.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000889 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
890 if (isSigned) {
891 int64_t sext = (int64_t(VAL) << (64-BitWidth)) >> (64-BitWidth);
892 return double(sext);
893 } else
894 return double(VAL);
895 }
896
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000897 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000898 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000899
900 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000901 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000902
903 // Figure out how many bits we're using.
Reid Spencera856b6e2007-02-18 18:38:44 +0000904 uint32_t n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000905
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000906 // The exponent (without bias normalization) is just the number of bits
907 // we are using. Note that the sign bit is gone since we constructed the
908 // absolute value.
909 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000910
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000911 // Return infinity for exponent overflow
912 if (exp > 1023) {
913 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000914 return std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000915 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000916 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000917 }
918 exp += 1023; // Increment for 1023 bias
919
920 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
921 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000922 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000923 unsigned hiWord = whichWord(n-1);
924 if (hiWord == 0) {
925 mantissa = Tmp.pVal[0];
926 if (n > 52)
927 mantissa >>= n - 52; // shift down, we want the top 52 bits.
928 } else {
929 assert(hiWord > 0 && "huh?");
930 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
931 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
932 mantissa = hibits | lobits;
933 }
934
Zhou Shengd707d632007-02-12 20:02:55 +0000935 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000936 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +0000937 union {
938 double D;
939 uint64_t I;
940 } T;
941 T.I = sign | (exp << 52) | mantissa;
942 return T.D;
943}
944
Reid Spencer1d072122007-02-16 22:36:51 +0000945// Truncate to new width.
Reid Spencer91d3b3f2007-02-28 17:34:32 +0000946APInt &APInt::trunc(uint32_t width) {
Reid Spencer1d072122007-02-16 22:36:51 +0000947 assert(width < BitWidth && "Invalid APInt Truncate request");
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000948 assert(width >= IntegerType::MIN_INT_BITS && "Can't truncate to 0 bits");
949 uint32_t wordsBefore = getNumWords();
950 BitWidth = width;
951 uint32_t wordsAfter = getNumWords();
952 if (wordsBefore != wordsAfter) {
953 if (wordsAfter == 1) {
954 uint64_t *tmp = pVal;
955 VAL = pVal[0];
Reid Spencer7c16cd22007-02-26 23:38:21 +0000956 delete [] tmp;
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000957 } else {
958 uint64_t *newVal = getClearedMemory(wordsAfter);
959 for (uint32_t i = 0; i < wordsAfter; ++i)
960 newVal[i] = pVal[i];
Reid Spencer7c16cd22007-02-26 23:38:21 +0000961 delete [] pVal;
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000962 pVal = newVal;
963 }
964 }
Reid Spencer91d3b3f2007-02-28 17:34:32 +0000965 return clearUnusedBits();
Reid Spencer1d072122007-02-16 22:36:51 +0000966}
967
968// Sign extend to a new width.
Reid Spencer91d3b3f2007-02-28 17:34:32 +0000969APInt &APInt::sext(uint32_t width) {
Reid Spencer1d072122007-02-16 22:36:51 +0000970 assert(width > BitWidth && "Invalid APInt SignExtend request");
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000971 assert(width <= IntegerType::MAX_INT_BITS && "Too many bits");
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000972 // If the sign bit isn't set, this is the same as zext.
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000973 if (!isNegative()) {
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000974 zext(width);
Reid Spencer91d3b3f2007-02-28 17:34:32 +0000975 return *this;
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000976 }
977
978 // The sign bit is set. First, get some facts
979 uint32_t wordsBefore = getNumWords();
980 uint32_t wordBits = BitWidth % APINT_BITS_PER_WORD;
981 BitWidth = width;
982 uint32_t wordsAfter = getNumWords();
983
984 // Mask the high order word appropriately
985 if (wordsBefore == wordsAfter) {
986 uint32_t newWordBits = width % APINT_BITS_PER_WORD;
987 // The extension is contained to the wordsBefore-1th word.
Reid Spencerc442c842007-03-02 01:19:42 +0000988 uint64_t mask = ~0ULL;
989 if (newWordBits)
990 mask >>= APINT_BITS_PER_WORD - newWordBits;
991 mask <<= wordBits;
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000992 if (wordsBefore == 1)
993 VAL |= mask;
994 else
995 pVal[wordsBefore-1] |= mask;
Reid Spencer1b8dfcba2007-03-01 23:30:25 +0000996 return clearUnusedBits();
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000997 }
998
Reid Spencerfb55b7b2007-02-25 23:54:00 +0000999 uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001000 uint64_t *newVal = getMemory(wordsAfter);
1001 if (wordsBefore == 1)
1002 newVal[0] = VAL | mask;
1003 else {
1004 for (uint32_t i = 0; i < wordsBefore; ++i)
1005 newVal[i] = pVal[i];
1006 newVal[wordsBefore-1] |= mask;
1007 }
1008 for (uint32_t i = wordsBefore; i < wordsAfter; i++)
1009 newVal[i] = -1ULL;
1010 if (wordsBefore != 1)
Reid Spencer7c16cd22007-02-26 23:38:21 +00001011 delete [] pVal;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001012 pVal = newVal;
Reid Spencer91d3b3f2007-02-28 17:34:32 +00001013 return clearUnusedBits();
Reid Spencer1d072122007-02-16 22:36:51 +00001014}
1015
1016// Zero extend to a new width.
Reid Spencer91d3b3f2007-02-28 17:34:32 +00001017APInt &APInt::zext(uint32_t width) {
Reid Spencer1d072122007-02-16 22:36:51 +00001018 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001019 assert(width <= IntegerType::MAX_INT_BITS && "Too many bits");
1020 uint32_t wordsBefore = getNumWords();
1021 BitWidth = width;
1022 uint32_t wordsAfter = getNumWords();
1023 if (wordsBefore != wordsAfter) {
1024 uint64_t *newVal = getClearedMemory(wordsAfter);
1025 if (wordsBefore == 1)
1026 newVal[0] = VAL;
1027 else
1028 for (uint32_t i = 0; i < wordsBefore; ++i)
1029 newVal[i] = pVal[i];
1030 if (wordsBefore != 1)
Reid Spencer7c16cd22007-02-26 23:38:21 +00001031 delete [] pVal;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001032 pVal = newVal;
1033 }
Reid Spencer91d3b3f2007-02-28 17:34:32 +00001034 return *this;
Reid Spencer1d072122007-02-16 22:36:51 +00001035}
1036
Reid Spencer742d1702007-03-01 17:15:32 +00001037APInt &APInt::zextOrTrunc(uint32_t width) {
1038 if (BitWidth < width)
1039 return zext(width);
1040 if (BitWidth > width)
1041 return trunc(width);
1042 return *this;
1043}
1044
1045APInt &APInt::sextOrTrunc(uint32_t width) {
1046 if (BitWidth < width)
1047 return sext(width);
1048 if (BitWidth > width)
1049 return trunc(width);
1050 return *this;
1051}
1052
Zhou Shenge93db8f2007-02-09 07:48:24 +00001053/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001054/// @brief Arithmetic right-shift function.
Reid Spencera856b6e2007-02-18 18:38:44 +00001055APInt APInt::ashr(uint32_t shiftAmt) const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001056 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer1825dd02007-03-02 22:39:11 +00001057 // Handle a degenerate case
1058 if (shiftAmt == 0)
1059 return *this;
1060
1061 // Handle single word shifts with built-in ashr
Reid Spencer522ca7c2007-02-25 01:56:07 +00001062 if (isSingleWord()) {
1063 if (shiftAmt == BitWidth)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001064 return APInt(BitWidth, 0); // undefined
1065 else {
1066 uint32_t SignBit = APINT_BITS_PER_WORD - BitWidth;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001067 return APInt(BitWidth,
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001068 (((int64_t(VAL) << SignBit) >> SignBit) >> shiftAmt));
1069 }
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001070 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001071
Reid Spencer1825dd02007-03-02 22:39:11 +00001072 // If all the bits were shifted out, the result is, technically, undefined.
1073 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1074 // issues in the algorithm below.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001075 if (shiftAmt == BitWidth) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001076 if (isNegative())
1077 return APInt(BitWidth, -1ULL);
Reid Spencera41e93b2007-02-25 19:32:03 +00001078 else
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001079 return APInt(BitWidth, 0);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001080 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001081
1082 // Create some space for the result.
1083 uint64_t * val = new uint64_t[getNumWords()];
1084
Reid Spencer1825dd02007-03-02 22:39:11 +00001085 // Compute some values needed by the following shift algorithms
1086 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1087 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1088 uint32_t breakWord = getNumWords() - 1 - offset; // last word affected
1089 uint32_t bitsInWord = whichBit(BitWidth); // how many bits in last word?
1090 if (bitsInWord == 0)
1091 bitsInWord = APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001092
1093 // If we are shifting whole words, just move whole words
1094 if (wordShift == 0) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001095 // Move the words containing significant bits
1096 for (uint32_t i = 0; i <= breakWord; ++i)
1097 val[i] = pVal[i+offset]; // move whole word
1098
1099 // Adjust the top significant word for sign bit fill, if negative
1100 if (isNegative())
1101 if (bitsInWord < APINT_BITS_PER_WORD)
1102 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1103 } else {
1104 // Shift the low order words
1105 for (uint32_t i = 0; i < breakWord; ++i) {
1106 // This combines the shifted corresponding word with the low bits from
1107 // the next word (shifted into this word's high bits).
1108 val[i] = (pVal[i+offset] >> wordShift) |
1109 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1110 }
1111
1112 // Shift the break word. In this case there are no bits from the next word
1113 // to include in this word.
1114 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1115
1116 // Deal with sign extenstion in the break word, and possibly the word before
1117 // it.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001118 if (isNegative()) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001119 if (wordShift > bitsInWord) {
1120 if (breakWord > 0)
1121 val[breakWord-1] |=
1122 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1123 val[breakWord] |= ~0ULL;
1124 } else
1125 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnerdad2d092007-05-03 18:15:36 +00001126 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001127 }
1128
Reid Spencer1825dd02007-03-02 22:39:11 +00001129 // Remaining words are 0 or -1, just assign them.
1130 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001131 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001132 val[i] = fillValue;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001133 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001134}
1135
Zhou Shenge93db8f2007-02-09 07:48:24 +00001136/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001137/// @brief Logical right-shift function.
Reid Spencera856b6e2007-02-18 18:38:44 +00001138APInt APInt::lshr(uint32_t shiftAmt) const {
Chris Lattnerdad2d092007-05-03 18:15:36 +00001139 if (isSingleWord()) {
Reid Spencer522ca7c2007-02-25 01:56:07 +00001140 if (shiftAmt == BitWidth)
1141 return APInt(BitWidth, 0);
1142 else
1143 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001144 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001145
Reid Spencer44eef162007-02-26 01:19:48 +00001146 // If all the bits were shifted out, the result is 0. This avoids issues
1147 // with shifting by the size of the integer type, which produces undefined
1148 // results. We define these "undefined results" to always be 0.
1149 if (shiftAmt == BitWidth)
1150 return APInt(BitWidth, 0);
1151
Reid Spencerfffdf102007-05-17 06:26:29 +00001152 // If none of the bits are shifted out, the result is *this. This avoids
1153 // issues with shifting byt he size of the integer type, which produces
1154 // undefined results in the code below. This is also an optimization.
1155 if (shiftAmt == 0)
1156 return *this;
1157
Reid Spencer44eef162007-02-26 01:19:48 +00001158 // Create some space for the result.
1159 uint64_t * val = new uint64_t[getNumWords()];
1160
1161 // If we are shifting less than a word, compute the shift with a simple carry
1162 if (shiftAmt < APINT_BITS_PER_WORD) {
1163 uint64_t carry = 0;
1164 for (int i = getNumWords()-1; i >= 0; --i) {
Reid Spencerd99feaf2007-03-01 05:39:56 +00001165 val[i] = (pVal[i] >> shiftAmt) | carry;
Reid Spencer44eef162007-02-26 01:19:48 +00001166 carry = pVal[i] << (APINT_BITS_PER_WORD - shiftAmt);
1167 }
1168 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencera41e93b2007-02-25 19:32:03 +00001169 }
1170
Reid Spencer44eef162007-02-26 01:19:48 +00001171 // Compute some values needed by the remaining shift algorithms
1172 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1173 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1174
1175 // If we are shifting whole words, just move whole words
1176 if (wordShift == 0) {
1177 for (uint32_t i = 0; i < getNumWords() - offset; ++i)
1178 val[i] = pVal[i+offset];
1179 for (uint32_t i = getNumWords()-offset; i < getNumWords(); i++)
1180 val[i] = 0;
1181 return APInt(val,BitWidth).clearUnusedBits();
1182 }
1183
1184 // Shift the low order words
1185 uint32_t breakWord = getNumWords() - offset -1;
1186 for (uint32_t i = 0; i < breakWord; ++i)
Reid Spencerd99feaf2007-03-01 05:39:56 +00001187 val[i] = (pVal[i+offset] >> wordShift) |
1188 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencer44eef162007-02-26 01:19:48 +00001189 // Shift the break word.
1190 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1191
1192 // Remaining words are 0
1193 for (uint32_t i = breakWord+1; i < getNumWords(); ++i)
1194 val[i] = 0;
1195 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001196}
1197
Zhou Shenge93db8f2007-02-09 07:48:24 +00001198/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001199/// @brief Left-shift function.
Reid Spencera856b6e2007-02-18 18:38:44 +00001200APInt APInt::shl(uint32_t shiftAmt) const {
Reid Spencer632ebdf2007-02-24 20:19:37 +00001201 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencera5c84d92007-02-25 00:56:44 +00001202 if (isSingleWord()) {
Reid Spencer632ebdf2007-02-24 20:19:37 +00001203 if (shiftAmt == BitWidth)
Reid Spencera5c84d92007-02-25 00:56:44 +00001204 return APInt(BitWidth, 0); // avoid undefined shift results
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001205 return APInt(BitWidth, VAL << shiftAmt);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001206 }
Reid Spencer632ebdf2007-02-24 20:19:37 +00001207
Reid Spencera5c84d92007-02-25 00:56:44 +00001208 // If all the bits were shifted out, the result is 0. This avoids issues
1209 // with shifting by the size of the integer type, which produces undefined
1210 // results. We define these "undefined results" to always be 0.
1211 if (shiftAmt == BitWidth)
1212 return APInt(BitWidth, 0);
1213
Reid Spencer81ee0202007-05-12 18:01:57 +00001214 // If none of the bits are shifted out, the result is *this. This avoids a
1215 // lshr by the words size in the loop below which can produce incorrect
1216 // results. It also avoids the expensive computation below for a common case.
1217 if (shiftAmt == 0)
1218 return *this;
1219
Reid Spencera5c84d92007-02-25 00:56:44 +00001220 // Create some space for the result.
1221 uint64_t * val = new uint64_t[getNumWords()];
1222
1223 // If we are shifting less than a word, do it the easy way
1224 if (shiftAmt < APINT_BITS_PER_WORD) {
1225 uint64_t carry = 0;
Reid Spencera5c84d92007-02-25 00:56:44 +00001226 for (uint32_t i = 0; i < getNumWords(); i++) {
1227 val[i] = pVal[i] << shiftAmt | carry;
1228 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1229 }
Reid Spencera41e93b2007-02-25 19:32:03 +00001230 return APInt(val, BitWidth).clearUnusedBits();
Reid Spencer632ebdf2007-02-24 20:19:37 +00001231 }
1232
Reid Spencera5c84d92007-02-25 00:56:44 +00001233 // Compute some values needed by the remaining shift algorithms
1234 uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
1235 uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
1236
1237 // If we are shifting whole words, just move whole words
1238 if (wordShift == 0) {
1239 for (uint32_t i = 0; i < offset; i++)
1240 val[i] = 0;
1241 for (uint32_t i = offset; i < getNumWords(); i++)
1242 val[i] = pVal[i-offset];
Reid Spencera41e93b2007-02-25 19:32:03 +00001243 return APInt(val,BitWidth).clearUnusedBits();
Reid Spencer632ebdf2007-02-24 20:19:37 +00001244 }
Reid Spencera5c84d92007-02-25 00:56:44 +00001245
1246 // Copy whole words from this to Result.
1247 uint32_t i = getNumWords() - 1;
1248 for (; i > offset; --i)
1249 val[i] = pVal[i-offset] << wordShift |
1250 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencerab0e08a2007-02-25 01:08:58 +00001251 val[offset] = pVal[0] << wordShift;
Reid Spencera5c84d92007-02-25 00:56:44 +00001252 for (i = 0; i < offset; ++i)
1253 val[i] = 0;
Reid Spencera41e93b2007-02-25 19:32:03 +00001254 return APInt(val, BitWidth).clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001255}
1256
Reid Spencer4c50b522007-05-13 23:44:59 +00001257APInt APInt::rotl(uint32_t rotateAmt) const {
Reid Spencer98ed7db2007-05-14 00:15:28 +00001258 if (rotateAmt == 0)
1259 return *this;
Reid Spencer4c50b522007-05-13 23:44:59 +00001260 // Don't get too fancy, just use existing shift/or facilities
1261 APInt hi(*this);
1262 APInt lo(*this);
1263 hi.shl(rotateAmt);
1264 lo.lshr(BitWidth - rotateAmt);
1265 return hi | lo;
1266}
1267
1268APInt APInt::rotr(uint32_t rotateAmt) const {
Reid Spencer98ed7db2007-05-14 00:15:28 +00001269 if (rotateAmt == 0)
1270 return *this;
Reid Spencer4c50b522007-05-13 23:44:59 +00001271 // Don't get too fancy, just use existing shift/or facilities
1272 APInt hi(*this);
1273 APInt lo(*this);
1274 lo.lshr(rotateAmt);
1275 hi.shl(BitWidth - rotateAmt);
1276 return hi | lo;
1277}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001278
1279// Square Root - this method computes and returns the square root of "this".
1280// Three mechanisms are used for computation. For small values (<= 5 bits),
1281// a table lookup is done. This gets some performance for common cases. For
1282// values using less than 52 bits, the value is converted to double and then
1283// the libc sqrt function is called. The result is rounded and then converted
1284// back to a uint64_t which is then used to construct the result. Finally,
1285// the Babylonian method for computing square roots is used.
1286APInt APInt::sqrt() const {
1287
1288 // Determine the magnitude of the value.
1289 uint32_t magnitude = getActiveBits();
1290
1291 // Use a fast table for some small values. This also gets rid of some
1292 // rounding errors in libc sqrt for small values.
1293 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001294 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001295 /* 0 */ 0,
1296 /* 1- 2 */ 1, 1,
1297 /* 3- 6 */ 2, 2, 2, 2,
1298 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1299 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1300 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1301 /* 31 */ 6
1302 };
1303 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001304 }
1305
1306 // If the magnitude of the value fits in less than 52 bits (the precision of
1307 // an IEEE double precision floating point value), then we can use the
1308 // libc sqrt function which will probably use a hardware sqrt computation.
1309 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001310 if (magnitude < 52) {
1311#ifdef _MSC_VER
1312 // Amazingly, VC++ doesn't have round().
1313 return APInt(BitWidth,
1314 uint64_t(::sqrt(double(isSingleWord()?VAL:pVal[0]))) + 0.5);
1315#else
Reid Spencerd99feaf2007-03-01 05:39:56 +00001316 return APInt(BitWidth,
1317 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenb622c112007-03-05 00:00:42 +00001318#endif
1319 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001320
1321 // Okay, all the short cuts are exhausted. We must compute it. The following
1322 // is a classical Babylonian method for computing the square root. This code
1323 // was adapted to APINt from a wikipedia article on such computations.
1324 // See http://www.wikipedia.org/ and go to the page named
1325 // Calculate_an_integer_square_root.
1326 uint32_t nbits = BitWidth, i = 4;
1327 APInt testy(BitWidth, 16);
1328 APInt x_old(BitWidth, 1);
1329 APInt x_new(BitWidth, 0);
1330 APInt two(BitWidth, 2);
1331
1332 // Select a good starting value using binary logarithms.
1333 for (;; i += 2, testy = testy.shl(2))
1334 if (i >= nbits || this->ule(testy)) {
1335 x_old = x_old.shl(i / 2);
1336 break;
1337 }
1338
1339 // Use the Babylonian method to arrive at the integer square root:
1340 for (;;) {
1341 x_new = (this->udiv(x_old) + x_old).udiv(two);
1342 if (x_old.ule(x_new))
1343 break;
1344 x_old = x_new;
1345 }
1346
1347 // Make sure we return the closest approximation
Reid Spencercf817562007-03-02 04:21:55 +00001348 // NOTE: The rounding calculation below is correct. It will produce an
1349 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
1350 // determined to be a rounding issue with pari/gp as it begins to use a
1351 // floating point representation after 192 bits. There are no discrepancies
1352 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001353 APInt square(x_old * x_old);
1354 APInt nextSquare((x_old + 1) * (x_old +1));
1355 if (this->ult(square))
1356 return x_old;
Reid Spencercf817562007-03-02 04:21:55 +00001357 else if (this->ule(nextSquare)) {
1358 APInt midpoint((nextSquare - square).udiv(two));
1359 APInt offset(*this - square);
1360 if (offset.ult(midpoint))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001361 return x_old;
Reid Spencercf817562007-03-02 04:21:55 +00001362 else
1363 return x_old + 1;
1364 } else
Reid Spencerd99feaf2007-03-01 05:39:56 +00001365 assert(0 && "Error in APInt::sqrt computation");
1366 return x_old + 1;
1367}
1368
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001369/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1370/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1371/// variables here have the same names as in the algorithm. Comments explain
1372/// the algorithm and any deviation from it.
1373static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r,
1374 uint32_t m, uint32_t n) {
1375 assert(u && "Must provide dividend");
1376 assert(v && "Must provide divisor");
1377 assert(q && "Must provide quotient");
Reid Spencera5e0d202007-02-24 03:58:46 +00001378 assert(u != v && u != q && v != q && "Must us different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001379 assert(n>1 && "n must be > 1");
1380
1381 // Knuth uses the value b as the base of the number system. In our case b
1382 // is 2^31 so we just set it to -1u.
1383 uint64_t b = uint64_t(1) << 32;
1384
Reid Spencera5e0d202007-02-24 03:58:46 +00001385 DEBUG(cerr << "KnuthDiv: m=" << m << " n=" << n << '\n');
1386 DEBUG(cerr << "KnuthDiv: original:");
1387 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1388 DEBUG(cerr << " by");
1389 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1390 DEBUG(cerr << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001391 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1392 // u and v by d. Note that we have taken Knuth's advice here to use a power
1393 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1394 // 2 allows us to shift instead of multiply and it is easy to determine the
1395 // shift amount from the leading zeros. We are basically normalizing the u
1396 // and v so that its high bits are shifted to the top of v's range without
1397 // overflow. Note that this can require an extra word in u so that u must
1398 // be of length m+n+1.
1399 uint32_t shift = CountLeadingZeros_32(v[n-1]);
1400 uint32_t v_carry = 0;
1401 uint32_t u_carry = 0;
1402 if (shift) {
1403 for (uint32_t i = 0; i < m+n; ++i) {
1404 uint32_t u_tmp = u[i] >> (32 - shift);
1405 u[i] = (u[i] << shift) | u_carry;
1406 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001407 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001408 for (uint32_t i = 0; i < n; ++i) {
1409 uint32_t v_tmp = v[i] >> (32 - shift);
1410 v[i] = (v[i] << shift) | v_carry;
1411 v_carry = v_tmp;
1412 }
1413 }
1414 u[m+n] = u_carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001415 DEBUG(cerr << "KnuthDiv: normal:");
1416 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << std::setbase(16) << u[i]);
1417 DEBUG(cerr << " by");
1418 DEBUG(for (int i = n; i >0; i--) cerr << " " << std::setbase(16) << v[i-1]);
1419 DEBUG(cerr << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001420
1421 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1422 int j = m;
1423 do {
Reid Spencera5e0d202007-02-24 03:58:46 +00001424 DEBUG(cerr << "KnuthDiv: quotient digit #" << j << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001425 // D3. [Calculate q'.].
1426 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1427 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1428 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1429 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1430 // on v[n-2] determines at high speed most of the cases in which the trial
1431 // value qp is one too large, and it eliminates all cases where qp is two
1432 // too large.
Reid Spencercb292e42007-02-23 01:57:13 +00001433 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
Reid Spencera5e0d202007-02-24 03:58:46 +00001434 DEBUG(cerr << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001435 uint64_t qp = dividend / v[n-1];
1436 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001437 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1438 qp--;
1439 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001440 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001441 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001442 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001443 DEBUG(cerr << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001444
Reid Spencercb292e42007-02-23 01:57:13 +00001445 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1446 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1447 // consists of a simple multiplication by a one-place number, combined with
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001448 // a subtraction.
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001449 bool isNeg = false;
Reid Spencercb292e42007-02-23 01:57:13 +00001450 for (uint32_t i = 0; i < n; ++i) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001451 uint64_t u_tmp = uint64_t(u[j+i]) | (uint64_t(u[j+i+1]) << 32);
Reid Spencera5e0d202007-02-24 03:58:46 +00001452 uint64_t subtrahend = uint64_t(qp) * uint64_t(v[i]);
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001453 bool borrow = subtrahend > u_tmp;
Reid Spencera5e0d202007-02-24 03:58:46 +00001454 DEBUG(cerr << "KnuthDiv: u_tmp == " << u_tmp
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001455 << ", subtrahend == " << subtrahend
1456 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001457
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001458 uint64_t result = u_tmp - subtrahend;
1459 uint32_t k = j + i;
1460 u[k++] = result & (b-1); // subtract low word
1461 u[k++] = result >> 32; // subtract high word
1462 while (borrow && k <= m+n) { // deal with borrow to the left
1463 borrow = u[k] == 0;
1464 u[k]--;
1465 k++;
1466 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001467 isNeg |= borrow;
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001468 DEBUG(cerr << "KnuthDiv: u[j+i] == " << u[j+i] << ", u[j+i+1] == " <<
1469 u[j+i+1] << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001470 }
1471 DEBUG(cerr << "KnuthDiv: after subtraction:");
1472 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1473 DEBUG(cerr << '\n');
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001474 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1475 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1476 // true value plus b**(n+1), namely as the b's complement of
Reid Spencercb292e42007-02-23 01:57:13 +00001477 // the true value, and a "borrow" to the left should be remembered.
1478 //
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001479 if (isNeg) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001480 bool carry = true; // true because b's complement is "complement + 1"
1481 for (uint32_t i = 0; i <= m+n; ++i) {
1482 u[i] = ~u[i] + carry; // b's complement
1483 carry = carry && u[i] == 0;
Reid Spencera5e0d202007-02-24 03:58:46 +00001484 }
Reid Spencercb292e42007-02-23 01:57:13 +00001485 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001486 DEBUG(cerr << "KnuthDiv: after complement:");
1487 DEBUG(for (int i = m+n; i >=0; i--) cerr << " " << u[i]);
1488 DEBUG(cerr << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001489
1490 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
1491 // negative, go to step D6; otherwise go on to step D7.
1492 q[j] = qp;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001493 if (isNeg) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001494 // D6. [Add back]. The probability that this step is necessary is very
1495 // small, on the order of only 2/b. Make sure that test data accounts for
Reid Spencercb292e42007-02-23 01:57:13 +00001496 // this possibility. Decrease q[j] by 1
1497 q[j]--;
1498 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1499 // A carry will occur to the left of u[j+n], and it should be ignored
1500 // since it cancels with the borrow that occurred in D4.
1501 bool carry = false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001502 for (uint32_t i = 0; i < n; i++) {
Reid Spencera5e0d202007-02-24 03:58:46 +00001503 uint32_t limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001504 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001505 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001506 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001507 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001508 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001509 DEBUG(cerr << "KnuthDiv: after correction:");
1510 DEBUG(for (int i = m+n; i >=0; i--) cerr <<" " << u[i]);
1511 DEBUG(cerr << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001512
Reid Spencercb292e42007-02-23 01:57:13 +00001513 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1514 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001515
Reid Spencera5e0d202007-02-24 03:58:46 +00001516 DEBUG(cerr << "KnuthDiv: quotient:");
1517 DEBUG(for (int i = m; i >=0; i--) cerr <<" " << q[i]);
1518 DEBUG(cerr << '\n');
1519
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001520 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1521 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1522 // compute the remainder (urem uses this).
1523 if (r) {
1524 // The value d is expressed by the "shift" value above since we avoided
1525 // multiplication by d by using a shift left. So, all we have to do is
1526 // shift right here. In order to mak
Reid Spencer468ad9112007-02-24 20:38:01 +00001527 if (shift) {
1528 uint32_t carry = 0;
1529 DEBUG(cerr << "KnuthDiv: remainder:");
1530 for (int i = n-1; i >= 0; i--) {
1531 r[i] = (u[i] >> shift) | carry;
1532 carry = u[i] << (32 - shift);
1533 DEBUG(cerr << " " << r[i]);
1534 }
1535 } else {
1536 for (int i = n-1; i >= 0; i--) {
1537 r[i] = u[i];
1538 DEBUG(cerr << " " << r[i]);
1539 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001540 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001541 DEBUG(cerr << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001542 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001543 DEBUG(cerr << std::setbase(10) << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001544}
1545
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001546void APInt::divide(const APInt LHS, uint32_t lhsWords,
1547 const APInt &RHS, uint32_t rhsWords,
1548 APInt *Quotient, APInt *Remainder)
1549{
1550 assert(lhsWords >= rhsWords && "Fractional result");
1551
1552 // First, compose the values into an array of 32-bit words instead of
1553 // 64-bit words. This is a necessity of both the "short division" algorithm
1554 // and the the Knuth "classical algorithm" which requires there to be native
1555 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1556 // can't use 64-bit operands here because we don't have native results of
1557 // 128-bits. Furthremore, casting the 64-bit values to 32-bit values won't
1558 // work on large-endian machines.
1559 uint64_t mask = ~0ull >> (sizeof(uint32_t)*8);
1560 uint32_t n = rhsWords * 2;
1561 uint32_t m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001562
1563 // Allocate space for the temporary values we need either on the stack, if
1564 // it will fit, or on the heap if it won't.
1565 uint32_t SPACE[128];
1566 uint32_t *U = 0;
1567 uint32_t *V = 0;
1568 uint32_t *Q = 0;
1569 uint32_t *R = 0;
1570 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1571 U = &SPACE[0];
1572 V = &SPACE[m+n+1];
1573 Q = &SPACE[(m+n+1) + n];
1574 if (Remainder)
1575 R = &SPACE[(m+n+1) + n + (m+n)];
1576 } else {
1577 U = new uint32_t[m + n + 1];
1578 V = new uint32_t[n];
1579 Q = new uint32_t[m+n];
1580 if (Remainder)
1581 R = new uint32_t[n];
1582 }
1583
1584 // Initialize the dividend
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001585 memset(U, 0, (m+n+1)*sizeof(uint32_t));
1586 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001587 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001588 U[i * 2] = tmp & mask;
1589 U[i * 2 + 1] = tmp >> (sizeof(uint32_t)*8);
1590 }
1591 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1592
Reid Spencer522ca7c2007-02-25 01:56:07 +00001593 // Initialize the divisor
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001594 memset(V, 0, (n)*sizeof(uint32_t));
1595 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001596 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001597 V[i * 2] = tmp & mask;
1598 V[i * 2 + 1] = tmp >> (sizeof(uint32_t)*8);
1599 }
1600
Reid Spencer522ca7c2007-02-25 01:56:07 +00001601 // initialize the quotient and remainder
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001602 memset(Q, 0, (m+n) * sizeof(uint32_t));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001603 if (Remainder)
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001604 memset(R, 0, n * sizeof(uint32_t));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001605
1606 // Now, adjust m and n for the Knuth division. n is the number of words in
1607 // the divisor. m is the number of words by which the dividend exceeds the
1608 // divisor (i.e. m+n is the length of the dividend). These sizes must not
1609 // contain any zero words or the Knuth algorithm fails.
1610 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1611 n--;
1612 m++;
1613 }
1614 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1615 m--;
1616
1617 // If we're left with only a single word for the divisor, Knuth doesn't work
1618 // so we implement the short division algorithm here. This is much simpler
1619 // and faster because we are certain that we can divide a 64-bit quantity
1620 // by a 32-bit quantity at hardware speed and short division is simply a
1621 // series of such operations. This is just like doing short division but we
1622 // are using base 2^32 instead of base 10.
1623 assert(n != 0 && "Divide by zero?");
1624 if (n == 1) {
1625 uint32_t divisor = V[0];
1626 uint32_t remainder = 0;
1627 for (int i = m+n-1; i >= 0; i--) {
1628 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1629 if (partial_dividend == 0) {
1630 Q[i] = 0;
1631 remainder = 0;
1632 } else if (partial_dividend < divisor) {
1633 Q[i] = 0;
1634 remainder = partial_dividend;
1635 } else if (partial_dividend == divisor) {
1636 Q[i] = 1;
1637 remainder = 0;
1638 } else {
1639 Q[i] = partial_dividend / divisor;
1640 remainder = partial_dividend - (Q[i] * divisor);
1641 }
1642 }
1643 if (R)
1644 R[0] = remainder;
1645 } else {
1646 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1647 // case n > 1.
1648 KnuthDiv(U, V, Q, R, m, n);
1649 }
1650
1651 // If the caller wants the quotient
1652 if (Quotient) {
1653 // Set up the Quotient value's memory.
1654 if (Quotient->BitWidth != LHS.BitWidth) {
1655 if (Quotient->isSingleWord())
1656 Quotient->VAL = 0;
1657 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001658 delete [] Quotient->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001659 Quotient->BitWidth = LHS.BitWidth;
1660 if (!Quotient->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001661 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001662 } else
1663 Quotient->clear();
1664
1665 // The quotient is in Q. Reconstitute the quotient into Quotient's low
1666 // order words.
1667 if (lhsWords == 1) {
1668 uint64_t tmp =
1669 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1670 if (Quotient->isSingleWord())
1671 Quotient->VAL = tmp;
1672 else
1673 Quotient->pVal[0] = tmp;
1674 } else {
1675 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1676 for (unsigned i = 0; i < lhsWords; ++i)
1677 Quotient->pVal[i] =
1678 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1679 }
1680 }
1681
1682 // If the caller wants the remainder
1683 if (Remainder) {
1684 // Set up the Remainder value's memory.
1685 if (Remainder->BitWidth != RHS.BitWidth) {
1686 if (Remainder->isSingleWord())
1687 Remainder->VAL = 0;
1688 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001689 delete [] Remainder->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001690 Remainder->BitWidth = RHS.BitWidth;
1691 if (!Remainder->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001692 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001693 } else
1694 Remainder->clear();
1695
1696 // The remainder is in R. Reconstitute the remainder into Remainder's low
1697 // order words.
1698 if (rhsWords == 1) {
1699 uint64_t tmp =
1700 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1701 if (Remainder->isSingleWord())
1702 Remainder->VAL = tmp;
1703 else
1704 Remainder->pVal[0] = tmp;
1705 } else {
1706 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1707 for (unsigned i = 0; i < rhsWords; ++i)
1708 Remainder->pVal[i] =
1709 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1710 }
1711 }
1712
1713 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001714 if (U != &SPACE[0]) {
1715 delete [] U;
1716 delete [] V;
1717 delete [] Q;
1718 delete [] R;
1719 }
Reid Spencer100502d2007-02-17 03:16:00 +00001720}
1721
Reid Spencer1d072122007-02-16 22:36:51 +00001722APInt APInt::udiv(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001723 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001724
1725 // First, deal with the easy case
1726 if (isSingleWord()) {
1727 assert(RHS.VAL != 0 && "Divide by zero?");
1728 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001729 }
Reid Spencer39867762007-02-17 02:07:07 +00001730
Reid Spencer39867762007-02-17 02:07:07 +00001731 // Get some facts about the LHS and RHS number of bits and words
Reid Spencera856b6e2007-02-18 18:38:44 +00001732 uint32_t rhsBits = RHS.getActiveBits();
1733 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001734 assert(rhsWords && "Divided by zero???");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001735 uint32_t lhsBits = this->getActiveBits();
Reid Spencera856b6e2007-02-18 18:38:44 +00001736 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001737
1738 // Deal with some degenerate cases
1739 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001740 // 0 / X ===> 0
1741 return APInt(BitWidth, 0);
1742 else if (lhsWords < rhsWords || this->ult(RHS)) {
1743 // X / Y ===> 0, iff X < Y
1744 return APInt(BitWidth, 0);
1745 } else if (*this == RHS) {
1746 // X / X ===> 1
1747 return APInt(BitWidth, 1);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001748 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001749 // All high words are zero, just use native divide
Reid Spencer58a6a432007-02-21 08:21:52 +00001750 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001751 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001752
1753 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1754 APInt Quotient(1,0); // to hold result.
1755 divide(*this, lhsWords, RHS, rhsWords, &Quotient, 0);
1756 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001757}
1758
Reid Spencer1d072122007-02-16 22:36:51 +00001759APInt APInt::urem(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001760 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001761 if (isSingleWord()) {
1762 assert(RHS.VAL != 0 && "Remainder by zero?");
1763 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001764 }
Reid Spencer39867762007-02-17 02:07:07 +00001765
Reid Spencer58a6a432007-02-21 08:21:52 +00001766 // Get some facts about the LHS
1767 uint32_t lhsBits = getActiveBits();
1768 uint32_t lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001769
1770 // Get some facts about the RHS
Reid Spencera856b6e2007-02-18 18:38:44 +00001771 uint32_t rhsBits = RHS.getActiveBits();
1772 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001773 assert(rhsWords && "Performing remainder operation by zero ???");
1774
Reid Spencer39867762007-02-17 02:07:07 +00001775 // Check the degenerate cases
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001776 if (lhsWords == 0) {
Reid Spencer58a6a432007-02-21 08:21:52 +00001777 // 0 % Y ===> 0
1778 return APInt(BitWidth, 0);
1779 } else if (lhsWords < rhsWords || this->ult(RHS)) {
1780 // X % Y ===> X, iff X < Y
1781 return *this;
1782 } else if (*this == RHS) {
Reid Spencer39867762007-02-17 02:07:07 +00001783 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001784 return APInt(BitWidth, 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001785 } else if (lhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001786 // All high words are zero, just use native remainder
Reid Spencer58a6a432007-02-21 08:21:52 +00001787 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001788 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001789
Reid Spencer4c50b522007-05-13 23:44:59 +00001790 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001791 APInt Remainder(1,0);
1792 divide(*this, lhsWords, RHS, rhsWords, 0, &Remainder);
1793 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001794}
Reid Spencer100502d2007-02-17 03:16:00 +00001795
Reid Spencer4c50b522007-05-13 23:44:59 +00001796void APInt::udivrem(const APInt &LHS, const APInt &RHS,
1797 APInt &Quotient, APInt &Remainder) {
1798 // Get some size facts about the dividend and divisor
1799 uint32_t lhsBits = LHS.getActiveBits();
1800 uint32_t lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1801 uint32_t rhsBits = RHS.getActiveBits();
1802 uint32_t rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
1803
1804 // Check the degenerate cases
1805 if (lhsWords == 0) {
1806 Quotient = 0; // 0 / Y ===> 0
1807 Remainder = 0; // 0 % Y ===> 0
1808 return;
1809 }
1810
1811 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1812 Quotient = 0; // X / Y ===> 0, iff X < Y
1813 Remainder = LHS; // X % Y ===> X, iff X < Y
1814 return;
1815 }
1816
1817 if (LHS == RHS) {
1818 Quotient = 1; // X / X ===> 1
1819 Remainder = 0; // X % X ===> 0;
1820 return;
1821 }
1822
1823 if (lhsWords == 1 && rhsWords == 1) {
1824 // There is only one word to consider so use the native versions.
1825 if (LHS.isSingleWord()) {
1826 Quotient = APInt(LHS.getBitWidth(), LHS.VAL / RHS.VAL);
1827 Remainder = APInt(LHS.getBitWidth(), LHS.VAL % RHS.VAL);
1828 } else {
1829 Quotient = APInt(LHS.getBitWidth(), LHS.pVal[0] / RHS.pVal[0]);
1830 Remainder = APInt(LHS.getBitWidth(), LHS.pVal[0] % RHS.pVal[0]);
1831 }
1832 return;
1833 }
1834
1835 // Okay, lets do it the long way
1836 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1837}
1838
Reid Spencer1ba83352007-02-21 03:55:44 +00001839void APInt::fromString(uint32_t numbits, const char *str, uint32_t slen,
Reid Spencer100502d2007-02-17 03:16:00 +00001840 uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00001841 // Check our assumptions here
Reid Spencer100502d2007-02-17 03:16:00 +00001842 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
1843 "Radix should be 2, 8, 10, or 16!");
Reid Spencer1ba83352007-02-21 03:55:44 +00001844 assert(str && "String is null?");
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001845 bool isNeg = str[0] == '-';
1846 if (isNeg)
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001847 str++, slen--;
Chris Lattnerdad2d092007-05-03 18:15:36 +00001848 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
1849 assert((slen*3 <= numbits || radix != 8) && "Insufficient bit width");
1850 assert((slen*4 <= numbits || radix != 16) && "Insufficient bit width");
1851 assert(((slen*64)/22 <= numbits || radix != 10) && "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00001852
1853 // Allocate memory
1854 if (!isSingleWord())
1855 pVal = getClearedMemory(getNumWords());
1856
1857 // Figure out if we can shift instead of multiply
1858 uint32_t shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
1859
1860 // Set up an APInt for the digit to add outside the loop so we don't
1861 // constantly construct/destruct it.
1862 APInt apdigit(getBitWidth(), 0);
1863 APInt apradix(getBitWidth(), radix);
1864
1865 // Enter digit traversal loop
1866 for (unsigned i = 0; i < slen; i++) {
1867 // Get a digit
1868 uint32_t digit = 0;
1869 char cdigit = str[i];
Reid Spencera93c9812007-05-16 19:18:22 +00001870 if (radix == 16) {
1871 if (!isxdigit(cdigit))
1872 assert(0 && "Invalid hex digit in string");
1873 if (isdigit(cdigit))
1874 digit = cdigit - '0';
1875 else if (cdigit >= 'a')
Reid Spencer1ba83352007-02-21 03:55:44 +00001876 digit = cdigit - 'a' + 10;
1877 else if (cdigit >= 'A')
1878 digit = cdigit - 'A' + 10;
1879 else
Reid Spencera93c9812007-05-16 19:18:22 +00001880 assert(0 && "huh? we shouldn't get here");
1881 } else if (isdigit(cdigit)) {
1882 digit = cdigit - '0';
1883 } else {
Reid Spencer1ba83352007-02-21 03:55:44 +00001884 assert(0 && "Invalid character in digit string");
Reid Spencera93c9812007-05-16 19:18:22 +00001885 }
Reid Spencer1ba83352007-02-21 03:55:44 +00001886
Reid Spencera93c9812007-05-16 19:18:22 +00001887 // Shift or multiply the value by the radix
Reid Spencer1ba83352007-02-21 03:55:44 +00001888 if (shift)
Reid Spencera93c9812007-05-16 19:18:22 +00001889 *this <<= shift;
Reid Spencer1ba83352007-02-21 03:55:44 +00001890 else
1891 *this *= apradix;
1892
1893 // Add in the digit we just interpreted
Reid Spencer632ebdf2007-02-24 20:19:37 +00001894 if (apdigit.isSingleWord())
1895 apdigit.VAL = digit;
1896 else
1897 apdigit.pVal[0] = digit;
Reid Spencer1ba83352007-02-21 03:55:44 +00001898 *this += apdigit;
Reid Spencer100502d2007-02-17 03:16:00 +00001899 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001900 // If its negative, put it in two's complement form
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001901 if (isNeg) {
1902 (*this)--;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001903 this->flip();
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001904 }
Reid Spencer100502d2007-02-17 03:16:00 +00001905}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001906
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001907std::string APInt::toString(uint8_t radix, bool wantSigned) const {
1908 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2) &&
1909 "Radix should be 2, 8, 10, or 16!");
1910 static const char *digits[] = {
1911 "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
1912 };
1913 std::string result;
1914 uint32_t bits_used = getActiveBits();
1915 if (isSingleWord()) {
1916 char buf[65];
1917 const char *format = (radix == 10 ? (wantSigned ? "%lld" : "%llu") :
1918 (radix == 16 ? "%llX" : (radix == 8 ? "%llo" : 0)));
1919 if (format) {
1920 if (wantSigned) {
1921 int64_t sextVal = (int64_t(VAL) << (APINT_BITS_PER_WORD-BitWidth)) >>
1922 (APINT_BITS_PER_WORD-BitWidth);
1923 sprintf(buf, format, sextVal);
1924 } else
1925 sprintf(buf, format, VAL);
1926 } else {
1927 memset(buf, 0, 65);
1928 uint64_t v = VAL;
1929 while (bits_used) {
1930 uint32_t bit = v & 1;
1931 bits_used--;
1932 buf[bits_used] = digits[bit][0];
1933 v >>=1;
1934 }
1935 }
1936 result = buf;
1937 return result;
1938 }
1939
1940 if (radix != 10) {
Reid Spencer5c138132007-05-17 19:23:02 +00001941 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
1942 // because the number of bits per digit (1,3 and 4 respectively) divides
1943 // equaly. We just shift until there value is zero.
1944
1945 // First, check for a zero value and just short circuit the logic below.
1946 if (*this == 0)
1947 result = "0";
1948 else {
1949 APInt tmp(*this);
1950 size_t insert_at = 0;
1951 if (wantSigned && this->isNegative()) {
1952 // They want to print the signed version and it is a negative value
1953 // Flip the bits and add one to turn it into the equivalent positive
1954 // value and put a '-' in the result.
1955 tmp.flip();
1956 tmp++;
1957 result = "-";
1958 insert_at = 1;
1959 }
1960 // Just shift tmp right for each digit width until it becomes zero
1961 uint32_t shift = (radix == 16 ? 4 : (radix == 8 ? 3 : 1));
1962 uint64_t mask = radix - 1;
1963 APInt zero(tmp.getBitWidth(), 0);
1964 while (tmp.ne(zero)) {
Reid Spencerb6af1aa2007-05-19 00:29:55 +00001965 unsigned digit = (tmp.isSingleWord() ? tmp.VAL : tmp.pVal[0]) & mask;
Reid Spencer5c138132007-05-17 19:23:02 +00001966 result.insert(insert_at, digits[digit]);
Reid Spencerb6af1aa2007-05-19 00:29:55 +00001967 tmp = tmp.lshr(shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001968 }
1969 }
1970 return result;
1971 }
1972
1973 APInt tmp(*this);
1974 APInt divisor(4, radix);
1975 APInt zero(tmp.getBitWidth(), 0);
1976 size_t insert_at = 0;
1977 if (wantSigned && tmp[BitWidth-1]) {
1978 // They want to print the signed version and it is a negative value
1979 // Flip the bits and add one to turn it into the equivalent positive
1980 // value and put a '-' in the result.
1981 tmp.flip();
1982 tmp++;
1983 result = "-";
1984 insert_at = 1;
1985 }
Reid Spencer74cf82e2007-02-21 00:29:48 +00001986 if (tmp == APInt(tmp.getBitWidth(), 0))
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001987 result = "0";
1988 else while (tmp.ne(zero)) {
1989 APInt APdigit(1,0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001990 APInt tmp2(tmp.getBitWidth(), 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00001991 divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
1992 &APdigit);
Reid Spencerb2bc9852007-02-26 21:02:27 +00001993 uint32_t digit = APdigit.getZExtValue();
Reid Spencer1ba83352007-02-21 03:55:44 +00001994 assert(digit < radix && "divide failed");
1995 result.insert(insert_at,digits[digit]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001996 tmp = tmp2;
1997 }
1998
1999 return result;
2000}
2001
Reid Spencer1ba83352007-02-21 03:55:44 +00002002#ifndef NDEBUG
2003void APInt::dump() const
2004{
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00002005 cerr << "APInt(" << BitWidth << ")=" << std::setbase(16);
Reid Spencer1ba83352007-02-21 03:55:44 +00002006 if (isSingleWord())
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00002007 cerr << VAL;
Reid Spencer1ba83352007-02-21 03:55:44 +00002008 else for (unsigned i = getNumWords(); i > 0; i--) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00002009 cerr << pVal[i-1] << " ";
Reid Spencer1ba83352007-02-21 03:55:44 +00002010 }
Reid Spencer31acef52007-02-27 21:59:26 +00002011 cerr << " U(" << this->toString(10) << ") S(" << this->toStringSigned(10)
2012 << ")\n" << std::setbase(10);
Reid Spencer1ba83352007-02-21 03:55:44 +00002013}
2014#endif
Chris Lattner6b695682007-08-16 15:56:55 +00002015
2016// This implements a variety of operations on a representation of
2017// arbitrary precision, two's-complement, bignum integer values.
2018
2019/* Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2020 and unrestricting assumption. */
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002021COMPILE_TIME_ASSERT(integerPartWidth % 2 == 0);
Chris Lattner6b695682007-08-16 15:56:55 +00002022
2023/* Some handy functions local to this file. */
2024namespace {
2025
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002026 /* Returns the integer part with the least significant BITS set.
2027 BITS cannot be zero. */
2028 inline integerPart
2029 lowBitMask(unsigned int bits)
2030 {
2031 assert (bits != 0 && bits <= integerPartWidth);
2032
2033 return ~(integerPart) 0 >> (integerPartWidth - bits);
2034 }
2035
2036 /* Returns the value of the lower nibble of PART. */
2037 inline integerPart
2038 lowHalf(integerPart part)
2039 {
2040 return part & lowBitMask(integerPartWidth / 2);
2041 }
2042
2043 /* Returns the value of the upper nibble of PART. */
2044 inline integerPart
2045 highHalf(integerPart part)
2046 {
2047 return part >> (integerPartWidth / 2);
2048 }
2049
Chris Lattner6b695682007-08-16 15:56:55 +00002050 /* Returns the bit number of the most significant bit of a part. If
2051 the input number has no bits set -1U is returned. */
2052 unsigned int
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002053 partMSB(integerPart value)
Chris Lattner6b695682007-08-16 15:56:55 +00002054 {
2055 unsigned int n, msb;
2056
2057 if (value == 0)
2058 return -1U;
2059
2060 n = integerPartWidth / 2;
2061
2062 msb = 0;
2063 do {
2064 if (value >> n) {
2065 value >>= n;
2066 msb += n;
2067 }
2068
2069 n >>= 1;
2070 } while (n);
2071
2072 return msb;
2073 }
2074
2075 /* Returns the bit number of the least significant bit of a part.
2076 If the input number has no bits set -1U is returned. */
2077 unsigned int
2078 partLSB(integerPart value)
2079 {
2080 unsigned int n, lsb;
2081
2082 if (value == 0)
2083 return -1U;
2084
2085 lsb = integerPartWidth - 1;
2086 n = integerPartWidth / 2;
2087
2088 do {
2089 if (value << n) {
2090 value <<= n;
2091 lsb -= n;
2092 }
2093
2094 n >>= 1;
2095 } while (n);
2096
2097 return lsb;
2098 }
2099}
2100
2101/* Sets the least significant part of a bignum to the input value, and
2102 zeroes out higher parts. */
2103void
2104APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2105{
2106 unsigned int i;
2107
2108 dst[0] = part;
2109 for(i = 1; i < parts; i++)
2110 dst[i] = 0;
2111}
2112
2113/* Assign one bignum to another. */
2114void
2115APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2116{
2117 unsigned int i;
2118
2119 for(i = 0; i < parts; i++)
2120 dst[i] = src[i];
2121}
2122
2123/* Returns true if a bignum is zero, false otherwise. */
2124bool
2125APInt::tcIsZero(const integerPart *src, unsigned int parts)
2126{
2127 unsigned int i;
2128
2129 for(i = 0; i < parts; i++)
2130 if (src[i])
2131 return false;
2132
2133 return true;
2134}
2135
2136/* Extract the given bit of a bignum; returns 0 or 1. */
2137int
2138APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2139{
2140 return(parts[bit / integerPartWidth]
2141 & ((integerPart) 1 << bit % integerPartWidth)) != 0;
2142}
2143
2144/* Set the given bit of a bignum. */
2145void
2146APInt::tcSetBit(integerPart *parts, unsigned int bit)
2147{
2148 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2149}
2150
2151/* Returns the bit number of the least significant bit of a number.
2152 If the input number has no bits set -1U is returned. */
2153unsigned int
2154APInt::tcLSB(const integerPart *parts, unsigned int n)
2155{
2156 unsigned int i, lsb;
2157
2158 for(i = 0; i < n; i++) {
2159 if (parts[i] != 0) {
2160 lsb = partLSB(parts[i]);
2161
2162 return lsb + i * integerPartWidth;
2163 }
2164 }
2165
2166 return -1U;
2167}
2168
2169/* Returns the bit number of the most significant bit of a number. If
2170 the input number has no bits set -1U is returned. */
2171unsigned int
2172APInt::tcMSB(const integerPart *parts, unsigned int n)
2173{
2174 unsigned int msb;
2175
2176 do {
2177 --n;
2178
2179 if (parts[n] != 0) {
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002180 msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002181
2182 return msb + n * integerPartWidth;
2183 }
2184 } while (n);
2185
2186 return -1U;
2187}
2188
2189/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2190integerPart
2191APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2192 integerPart c, unsigned int parts)
2193{
2194 unsigned int i;
2195
2196 assert(c <= 1);
2197
2198 for(i = 0; i < parts; i++) {
2199 integerPart l;
2200
2201 l = dst[i];
2202 if (c) {
2203 dst[i] += rhs[i] + 1;
2204 c = (dst[i] <= l);
2205 } else {
2206 dst[i] += rhs[i];
2207 c = (dst[i] < l);
2208 }
2209 }
2210
2211 return c;
2212}
2213
2214/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2215integerPart
2216APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2217 integerPart c, unsigned int parts)
2218{
2219 unsigned int i;
2220
2221 assert(c <= 1);
2222
2223 for(i = 0; i < parts; i++) {
2224 integerPart l;
2225
2226 l = dst[i];
2227 if (c) {
2228 dst[i] -= rhs[i] + 1;
2229 c = (dst[i] >= l);
2230 } else {
2231 dst[i] -= rhs[i];
2232 c = (dst[i] > l);
2233 }
2234 }
2235
2236 return c;
2237}
2238
2239/* Negate a bignum in-place. */
2240void
2241APInt::tcNegate(integerPart *dst, unsigned int parts)
2242{
2243 tcComplement(dst, parts);
2244 tcIncrement(dst, parts);
2245}
2246
2247/* DST += SRC * MULTIPLIER + PART if add is true
2248 DST = SRC * MULTIPLIER + PART if add is false
2249
2250 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2251 they must start at the same point, i.e. DST == SRC.
2252
2253 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2254 returned. Otherwise DST is filled with the least significant
2255 DSTPARTS parts of the result, and if all of the omitted higher
2256 parts were zero return zero, otherwise overflow occurred and
2257 return one. */
2258int
2259APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2260 integerPart multiplier, integerPart carry,
2261 unsigned int srcParts, unsigned int dstParts,
2262 bool add)
2263{
2264 unsigned int i, n;
2265
2266 /* Otherwise our writes of DST kill our later reads of SRC. */
2267 assert(dst <= src || dst >= src + srcParts);
2268 assert(dstParts <= srcParts + 1);
2269
2270 /* N loops; minimum of dstParts and srcParts. */
2271 n = dstParts < srcParts ? dstParts: srcParts;
2272
2273 for(i = 0; i < n; i++) {
2274 integerPart low, mid, high, srcPart;
2275
2276 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2277
2278 This cannot overflow, because
2279
2280 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2281
2282 which is less than n^2. */
2283
2284 srcPart = src[i];
2285
2286 if (multiplier == 0 || srcPart == 0) {
2287 low = carry;
2288 high = 0;
2289 } else {
2290 low = lowHalf(srcPart) * lowHalf(multiplier);
2291 high = highHalf(srcPart) * highHalf(multiplier);
2292
2293 mid = lowHalf(srcPart) * highHalf(multiplier);
2294 high += highHalf(mid);
2295 mid <<= integerPartWidth / 2;
2296 if (low + mid < low)
2297 high++;
2298 low += mid;
2299
2300 mid = highHalf(srcPart) * lowHalf(multiplier);
2301 high += highHalf(mid);
2302 mid <<= integerPartWidth / 2;
2303 if (low + mid < low)
2304 high++;
2305 low += mid;
2306
2307 /* Now add carry. */
2308 if (low + carry < low)
2309 high++;
2310 low += carry;
2311 }
2312
2313 if (add) {
2314 /* And now DST[i], and store the new low part there. */
2315 if (low + dst[i] < low)
2316 high++;
2317 dst[i] += low;
2318 } else
2319 dst[i] = low;
2320
2321 carry = high;
2322 }
2323
2324 if (i < dstParts) {
2325 /* Full multiplication, there is no overflow. */
2326 assert(i + 1 == dstParts);
2327 dst[i] = carry;
2328 return 0;
2329 } else {
2330 /* We overflowed if there is carry. */
2331 if (carry)
2332 return 1;
2333
2334 /* We would overflow if any significant unwritten parts would be
2335 non-zero. This is true if any remaining src parts are non-zero
2336 and the multiplier is non-zero. */
2337 if (multiplier)
2338 for(; i < srcParts; i++)
2339 if (src[i])
2340 return 1;
2341
2342 /* We fitted in the narrow destination. */
2343 return 0;
2344 }
2345}
2346
2347/* DST = LHS * RHS, where DST has the same width as the operands and
2348 is filled with the least significant parts of the result. Returns
2349 one if overflow occurred, otherwise zero. DST must be disjoint
2350 from both operands. */
2351int
2352APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2353 const integerPart *rhs, unsigned int parts)
2354{
2355 unsigned int i;
2356 int overflow;
2357
2358 assert(dst != lhs && dst != rhs);
2359
2360 overflow = 0;
2361 tcSet(dst, 0, parts);
2362
2363 for(i = 0; i < parts; i++)
2364 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2365 parts - i, true);
2366
2367 return overflow;
2368}
2369
2370/* DST = LHS * RHS, where DST has twice the width as the operands. No
2371 overflow occurs. DST must be disjoint from both operands. */
2372void
2373APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
2374 const integerPart *rhs, unsigned int parts)
2375{
2376 unsigned int i;
2377 int overflow;
2378
2379 assert(dst != lhs && dst != rhs);
2380
2381 overflow = 0;
2382 tcSet(dst, 0, parts);
2383
2384 for(i = 0; i < parts; i++)
2385 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2386 parts + 1, true);
2387
2388 assert(!overflow);
2389}
2390
2391/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2392 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2393 set REMAINDER to the remainder, return zero. i.e.
2394
2395 OLD_LHS = RHS * LHS + REMAINDER
2396
2397 SCRATCH is a bignum of the same size as the operands and result for
2398 use by the routine; its contents need not be initialized and are
2399 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2400*/
2401int
2402APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2403 integerPart *remainder, integerPart *srhs,
2404 unsigned int parts)
2405{
2406 unsigned int n, shiftCount;
2407 integerPart mask;
2408
2409 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2410
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002411 shiftCount = tcMSB(rhs, parts) + 1;
2412 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002413 return true;
2414
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002415 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattner6b695682007-08-16 15:56:55 +00002416 n = shiftCount / integerPartWidth;
2417 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2418
2419 tcAssign(srhs, rhs, parts);
2420 tcShiftLeft(srhs, parts, shiftCount);
2421 tcAssign(remainder, lhs, parts);
2422 tcSet(lhs, 0, parts);
2423
2424 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2425 the total. */
2426 for(;;) {
2427 int compare;
2428
2429 compare = tcCompare(remainder, srhs, parts);
2430 if (compare >= 0) {
2431 tcSubtract(remainder, srhs, 0, parts);
2432 lhs[n] |= mask;
2433 }
2434
2435 if (shiftCount == 0)
2436 break;
2437 shiftCount--;
2438 tcShiftRight(srhs, parts, 1);
2439 if ((mask >>= 1) == 0)
2440 mask = (integerPart) 1 << (integerPartWidth - 1), n--;
2441 }
2442
2443 return false;
2444}
2445
2446/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2447 There are no restrictions on COUNT. */
2448void
2449APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2450{
2451 unsigned int jump, shift;
2452
2453 /* Jump is the inter-part jump; shift is is intra-part shift. */
2454 jump = count / integerPartWidth;
2455 shift = count % integerPartWidth;
2456
2457 while (parts > jump) {
2458 integerPart part;
2459
2460 parts--;
2461
2462 /* dst[i] comes from the two parts src[i - jump] and, if we have
2463 an intra-part shift, src[i - jump - 1]. */
2464 part = dst[parts - jump];
2465 if (shift) {
2466 part <<= shift;
2467 if (parts >= jump + 1)
2468 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2469 }
2470
2471 dst[parts] = part;
2472 }
2473
2474 while (parts > 0)
2475 dst[--parts] = 0;
2476}
2477
2478/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2479 zero. There are no restrictions on COUNT. */
2480void
2481APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2482{
2483 unsigned int i, jump, shift;
2484
2485 /* Jump is the inter-part jump; shift is is intra-part shift. */
2486 jump = count / integerPartWidth;
2487 shift = count % integerPartWidth;
2488
2489 /* Perform the shift. This leaves the most significant COUNT bits
2490 of the result at zero. */
2491 for(i = 0; i < parts; i++) {
2492 integerPart part;
2493
2494 if (i + jump >= parts) {
2495 part = 0;
2496 } else {
2497 part = dst[i + jump];
2498 if (shift) {
2499 part >>= shift;
2500 if (i + jump + 1 < parts)
2501 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2502 }
2503 }
2504
2505 dst[i] = part;
2506 }
2507}
2508
2509/* Bitwise and of two bignums. */
2510void
2511APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2512{
2513 unsigned int i;
2514
2515 for(i = 0; i < parts; i++)
2516 dst[i] &= rhs[i];
2517}
2518
2519/* Bitwise inclusive or of two bignums. */
2520void
2521APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2522{
2523 unsigned int i;
2524
2525 for(i = 0; i < parts; i++)
2526 dst[i] |= rhs[i];
2527}
2528
2529/* Bitwise exclusive or of two bignums. */
2530void
2531APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2532{
2533 unsigned int i;
2534
2535 for(i = 0; i < parts; i++)
2536 dst[i] ^= rhs[i];
2537}
2538
2539/* Complement a bignum in-place. */
2540void
2541APInt::tcComplement(integerPart *dst, unsigned int parts)
2542{
2543 unsigned int i;
2544
2545 for(i = 0; i < parts; i++)
2546 dst[i] = ~dst[i];
2547}
2548
2549/* Comparison (unsigned) of two bignums. */
2550int
2551APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2552 unsigned int parts)
2553{
2554 while (parts) {
2555 parts--;
2556 if (lhs[parts] == rhs[parts])
2557 continue;
2558
2559 if (lhs[parts] > rhs[parts])
2560 return 1;
2561 else
2562 return -1;
2563 }
2564
2565 return 0;
2566}
2567
2568/* Increment a bignum in-place, return the carry flag. */
2569integerPart
2570APInt::tcIncrement(integerPart *dst, unsigned int parts)
2571{
2572 unsigned int i;
2573
2574 for(i = 0; i < parts; i++)
2575 if (++dst[i] != 0)
2576 break;
2577
2578 return i == parts;
2579}
2580
2581/* Set the least significant BITS bits of a bignum, clear the
2582 rest. */
2583void
2584APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2585 unsigned int bits)
2586{
2587 unsigned int i;
2588
2589 i = 0;
2590 while (bits > integerPartWidth) {
2591 dst[i++] = ~(integerPart) 0;
2592 bits -= integerPartWidth;
2593 }
2594
2595 if (bits)
2596 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2597
2598 while (i < parts)
2599 dst[i++] = 0;
2600}