blob: 318ce10ceaf0849629dc198533f687d059f86307 [file] [log] [blame]
Zhou Shengdac63782007-02-06 03:00:16 +00001//===-- APInt.cpp - Implement APInt class ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Zhou 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
15#include "llvm/ADT/APInt.h"
Mehdi Amini47b292d2016-04-16 07:51:28 +000016#include "llvm/ADT/ArrayRef.h"
Ted Kremenek5c75d542008-01-19 04:23:33 +000017#include "llvm/ADT/FoldingSet.h"
Chandler Carruth71bd7d12012-03-04 12:02:57 +000018#include "llvm/ADT/Hashing.h"
Chris Lattner17f71652008-08-17 07:19:36 +000019#include "llvm/ADT/SmallString.h"
Chandler Carruth71bd7d12012-03-04 12:02:57 +000020#include "llvm/ADT/StringRef.h"
Reid Spencera5e0d202007-02-24 03:58:46 +000021#include "llvm/Support/Debug.h"
Torok Edwin56d06592009-07-11 20:10:48 +000022#include "llvm/Support/ErrorHandling.h"
Zhou Shengdac63782007-02-06 03:00:16 +000023#include "llvm/Support/MathExtras.h"
Chris Lattner0c19df42008-08-23 22:23:09 +000024#include "llvm/Support/raw_ostream.h"
Chris Lattner17f71652008-08-17 07:19:36 +000025#include <cmath>
Zhou Shengdac63782007-02-06 03:00:16 +000026#include <cstdlib>
Chandler Carruthed0881b2012-12-03 16:50:05 +000027#include <cstring>
28#include <limits>
Zhou Shengdac63782007-02-06 03:00:16 +000029using namespace llvm;
30
Chandler Carruth64648262014-04-22 03:07:47 +000031#define DEBUG_TYPE "apint"
32
Reid Spencera41e93b2007-02-25 19:32:03 +000033/// A utility function for allocating memory, checking for allocation failures,
34/// and ensuring the contents are zeroed.
Chris Lattner77527f52009-01-21 18:09:24 +000035inline static uint64_t* getClearedMemory(unsigned numWords) {
Reid Spencera856b6e2007-02-18 18:38:44 +000036 uint64_t * result = new uint64_t[numWords];
37 assert(result && "APInt memory allocation fails!");
38 memset(result, 0, numWords * sizeof(uint64_t));
39 return result;
Zhou Sheng94b623a2007-02-06 06:04:53 +000040}
41
Eric Christopher820256b2009-08-21 04:06:45 +000042/// A utility function for allocating memory and checking for allocation
Reid Spencera41e93b2007-02-25 19:32:03 +000043/// failure. The content is not zeroed.
Chris Lattner77527f52009-01-21 18:09:24 +000044inline static uint64_t* getMemory(unsigned numWords) {
Reid Spencera856b6e2007-02-18 18:38:44 +000045 uint64_t * result = new uint64_t[numWords];
46 assert(result && "APInt memory allocation fails!");
47 return result;
48}
49
Erick Tryzelaardadb15712009-08-21 03:15:28 +000050/// A utility function that converts a character to a digit.
51inline static unsigned getDigit(char cdigit, uint8_t radix) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000052 unsigned r;
53
Douglas Gregor663c0682011-09-14 15:54:46 +000054 if (radix == 16 || radix == 36) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000055 r = cdigit - '0';
56 if (r <= 9)
57 return r;
58
59 r = cdigit - 'A';
Douglas Gregorc98ac852011-09-20 18:33:29 +000060 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000061 return r + 10;
62
63 r = cdigit - 'a';
Douglas Gregorc98ac852011-09-20 18:33:29 +000064 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000065 return r + 10;
Douglas Gregore4e20f42011-09-20 18:11:52 +000066
67 radix = 10;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000068 }
69
Erick Tryzelaar60964092009-08-21 06:48:37 +000070 r = cdigit - '0';
71 if (r < radix)
72 return r;
73
74 return -1U;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000075}
76
77
Pawel Bylica68304012016-06-27 08:31:48 +000078void APInt::initSlowCase(uint64_t val, bool isSigned) {
Chris Lattner1ac3e252008-08-20 17:02:31 +000079 pVal = getClearedMemory(getNumWords());
80 pVal[0] = val;
Eric Christopher820256b2009-08-21 04:06:45 +000081 if (isSigned && int64_t(val) < 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +000082 for (unsigned i = 1; i < getNumWords(); ++i)
83 pVal[i] = -1ULL;
Zhou Shengdac63782007-02-06 03:00:16 +000084}
85
Chris Lattnerd57b7602008-10-11 22:07:19 +000086void APInt::initSlowCase(const APInt& that) {
87 pVal = getMemory(getNumWords());
88 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
89}
90
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000091void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +000092 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000093 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengdac63782007-02-06 03:00:16 +000094 if (isSingleWord())
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000095 VAL = bigVal[0];
Zhou Shengdac63782007-02-06 03:00:16 +000096 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000097 // Get memory, cleared to 0
98 pVal = getClearedMemory(getNumWords());
99 // Calculate the number of words to copy
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000100 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000101 // Copy the words from bigVal to pVal
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000102 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000103 }
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000104 // Make sure unused high bits are cleared
105 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000106}
107
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000108APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
109 : BitWidth(numBits), VAL(0) {
110 initFromArray(bigVal);
111}
112
113APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
114 : BitWidth(numBits), VAL(0) {
115 initFromArray(makeArrayRef(bigVal, numWords));
116}
117
Benjamin Kramer92d89982010-07-14 22:38:02 +0000118APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer1ba83352007-02-21 03:55:44 +0000119 : BitWidth(numbits), VAL(0) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000120 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000121 fromString(numbits, Str, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000122}
123
Chris Lattner1ac3e252008-08-20 17:02:31 +0000124APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000125 // Don't do anything for X = X
126 if (this == &RHS)
127 return *this;
128
Reid Spencer7c16cd22007-02-26 23:38:21 +0000129 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner1ac3e252008-08-20 17:02:31 +0000130 // assume same bit-width single-word case is already handled
131 assert(!isSingleWord());
132 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer7c16cd22007-02-26 23:38:21 +0000133 return *this;
134 }
135
Chris Lattner1ac3e252008-08-20 17:02:31 +0000136 if (isSingleWord()) {
137 // assume case where both are single words is already handled
138 assert(!RHS.isSingleWord());
139 VAL = 0;
140 pVal = getMemory(RHS.getNumWords());
141 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopher820256b2009-08-21 04:06:45 +0000142 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer7c16cd22007-02-26 23:38:21 +0000143 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
144 else if (RHS.isSingleWord()) {
145 delete [] pVal;
Reid Spencera856b6e2007-02-18 18:38:44 +0000146 VAL = RHS.VAL;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000147 } else {
148 delete [] pVal;
149 pVal = getMemory(RHS.getNumWords());
150 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
151 }
152 BitWidth = RHS.BitWidth;
153 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000154}
155
Zhou Shengdac63782007-02-06 03:00:16 +0000156APInt& APInt::operator=(uint64_t RHS) {
Eric Christopher820256b2009-08-21 04:06:45 +0000157 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000158 VAL = RHS;
Zhou Shengdac63782007-02-06 03:00:16 +0000159 else {
160 pVal[0] = RHS;
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000161 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000162 }
Reid Spencer7c16cd22007-02-26 23:38:21 +0000163 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000164}
165
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000166/// This method 'profiles' an APInt for use with FoldingSet.
Ted Kremenek5c75d542008-01-19 04:23:33 +0000167void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek901540f2008-02-19 20:50:41 +0000168 ID.AddInteger(BitWidth);
Eric Christopher820256b2009-08-21 04:06:45 +0000169
Ted Kremenek5c75d542008-01-19 04:23:33 +0000170 if (isSingleWord()) {
171 ID.AddInteger(VAL);
172 return;
173 }
174
Chris Lattner77527f52009-01-21 18:09:24 +0000175 unsigned NumWords = getNumWords();
Ted Kremenek5c75d542008-01-19 04:23:33 +0000176 for (unsigned i = 0; i < NumWords; ++i)
177 ID.AddInteger(pVal[i]);
178}
179
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000180/// This function adds a single "digit" integer, y, to the multiple
Reid Spencera856b6e2007-02-18 18:38:44 +0000181/// "digit" integer array, x[]. x[] is modified to reflect the addition and
182/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer100502d2007-02-17 03:16:00 +0000183/// @returns the carry of the addition.
Chris Lattner77527f52009-01-21 18:09:24 +0000184static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
185 for (unsigned i = 0; i < len; ++i) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000186 dest[i] = y + x[i];
187 if (dest[i] < y)
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000188 y = 1; // Carry one to next digit.
Reid Spenceree0a6852007-02-18 06:39:42 +0000189 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000190 y = 0; // No need to carry so exit early
Reid Spenceree0a6852007-02-18 06:39:42 +0000191 break;
192 }
Reid Spencer100502d2007-02-17 03:16:00 +0000193 }
Reid Spenceree0a6852007-02-18 06:39:42 +0000194 return y;
Reid Spencer100502d2007-02-17 03:16:00 +0000195}
196
Zhou Shengdac63782007-02-06 03:00:16 +0000197/// @brief Prefix increment operator. Increments the APInt by one.
198APInt& APInt::operator++() {
Eric Christopher820256b2009-08-21 04:06:45 +0000199 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000200 ++VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000201 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000202 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000203 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000204}
205
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000206/// This function subtracts a single "digit" (64-bit word), y, from
Eric Christopher820256b2009-08-21 04:06:45 +0000207/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Reid Spencera856b6e2007-02-18 18:38:44 +0000208/// no further borrowing is neeeded or it runs out of "digits" in x. The result
209/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
210/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencera41e93b2007-02-25 19:32:03 +0000211/// @returns the borrow out of the subtraction
Chris Lattner77527f52009-01-21 18:09:24 +0000212static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
213 for (unsigned i = 0; i < len; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000214 uint64_t X = x[i];
Reid Spenceree0a6852007-02-18 06:39:42 +0000215 x[i] -= y;
Eric Christopher820256b2009-08-21 04:06:45 +0000216 if (y > X)
Reid Spencera856b6e2007-02-18 18:38:44 +0000217 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer100502d2007-02-17 03:16:00 +0000218 else {
Reid Spencera856b6e2007-02-18 18:38:44 +0000219 y = 0; // No need to borrow
220 break; // Remaining digits are unchanged so exit early
Reid Spencer100502d2007-02-17 03:16:00 +0000221 }
222 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000223 return bool(y);
Reid Spencer100502d2007-02-17 03:16:00 +0000224}
225
Zhou Shengdac63782007-02-06 03:00:16 +0000226/// @brief Prefix decrement operator. Decrements the APInt by one.
227APInt& APInt::operator--() {
Eric Christopher820256b2009-08-21 04:06:45 +0000228 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000229 --VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000230 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000231 sub_1(pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000232 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000233}
234
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000235/// This function adds the integer array x to the integer array Y and
Eric Christopher820256b2009-08-21 04:06:45 +0000236/// places the result in dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000237/// @returns the carry out from the addition
238/// @brief General addition of 64-bit integer arrays
Eric Christopher820256b2009-08-21 04:06:45 +0000239static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000240 unsigned len) {
Reid Spencera5e0d202007-02-24 03:58:46 +0000241 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000242 for (unsigned i = 0; i< len; ++i) {
Reid Spencercb292e42007-02-23 01:57:13 +0000243 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000244 dest[i] = x[i] + y[i] + carry;
Reid Spencerdb2abec2007-02-21 05:44:56 +0000245 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer100502d2007-02-17 03:16:00 +0000246 }
247 return carry;
248}
249
Reid Spencera41e93b2007-02-25 19:32:03 +0000250/// Adds the RHS APint to this APInt.
251/// @returns this, after addition of RHS.
Eric Christopher820256b2009-08-21 04:06:45 +0000252/// @brief Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000253APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000254 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000255 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000256 VAL += RHS.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000257 else {
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000258 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000259 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000260 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000261}
262
Pete Cooperfea21392016-07-22 20:55:46 +0000263APInt& APInt::operator+=(uint64_t RHS) {
264 if (isSingleWord())
265 VAL += RHS;
266 else
267 add_1(pVal, pVal, getNumWords(), RHS);
268 return clearUnusedBits();
269}
270
Eric Christopher820256b2009-08-21 04:06:45 +0000271/// Subtracts the integer array y from the integer array x
Reid Spencera41e93b2007-02-25 19:32:03 +0000272/// @returns returns the borrow out.
273/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopher820256b2009-08-21 04:06:45 +0000274static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000275 unsigned len) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000276 bool borrow = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000277 for (unsigned i = 0; i < len; ++i) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000278 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
279 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
280 dest[i] = x_tmp - y[i];
Reid Spencer100502d2007-02-17 03:16:00 +0000281 }
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000282 return borrow;
Reid Spencer100502d2007-02-17 03:16:00 +0000283}
284
Reid Spencera41e93b2007-02-25 19:32:03 +0000285/// Subtracts the RHS APInt from this APInt
286/// @returns this, after subtraction
Eric Christopher820256b2009-08-21 04:06:45 +0000287/// @brief Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000288APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000289 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000290 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000291 VAL -= RHS.VAL;
292 else
293 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000294 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000295}
296
Pete Cooperfea21392016-07-22 20:55:46 +0000297APInt& APInt::operator-=(uint64_t RHS) {
298 if (isSingleWord())
299 VAL -= RHS;
300 else
301 sub_1(pVal, getNumWords(), RHS);
302 return clearUnusedBits();
303}
304
Dan Gohman4a618822010-02-10 16:03:48 +0000305/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopher820256b2009-08-21 04:06:45 +0000306/// into dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000307/// @returns the carry out of the multiplication.
308/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner77527f52009-01-21 18:09:24 +0000309static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000310 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer100502d2007-02-17 03:16:00 +0000311 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencera41e93b2007-02-25 19:32:03 +0000312 uint64_t carry = 0;
313
314 // For each digit of x.
Chris Lattner77527f52009-01-21 18:09:24 +0000315 for (unsigned i = 0; i < len; ++i) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000316 // Split x into high and low words
317 uint64_t lx = x[i] & 0xffffffffULL;
318 uint64_t hx = x[i] >> 32;
319 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer100502d2007-02-17 03:16:00 +0000320 // hasCarry == 0, no carry
321 // hasCarry == 1, has carry
322 // hasCarry == 2, no carry and the calculation result == 0.
323 uint8_t hasCarry = 0;
324 dest[i] = carry + lx * ly;
325 // Determine if the add above introduces carry.
326 hasCarry = (dest[i] < carry) ? 1 : 0;
327 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopher820256b2009-08-21 04:06:45 +0000328 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer100502d2007-02-17 03:16:00 +0000329 // (2^32 - 1) + 2^32 = 2^64.
330 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
331
332 carry += (lx * hy) & 0xffffffffULL;
333 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopher820256b2009-08-21 04:06:45 +0000334 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000335 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
336 }
Reid Spencer100502d2007-02-17 03:16:00 +0000337 return carry;
338}
339
Eric Christopher820256b2009-08-21 04:06:45 +0000340/// Multiplies integer array x by integer array y and stores the result into
Reid Spencera41e93b2007-02-25 19:32:03 +0000341/// the integer array dest. Note that dest's size must be >= xlen + ylen.
342/// @brief Generalized multiplicate of integer arrays.
Chris Lattner77527f52009-01-21 18:09:24 +0000343static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
344 unsigned ylen) {
Reid Spencer100502d2007-02-17 03:16:00 +0000345 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner77527f52009-01-21 18:09:24 +0000346 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000347 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencer58a6a432007-02-21 08:21:52 +0000348 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner77527f52009-01-21 18:09:24 +0000349 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer100502d2007-02-17 03:16:00 +0000350 lx = x[j] & 0xffffffffULL;
351 hx = x[j] >> 32;
352 // hasCarry - A flag to indicate if has carry.
353 // hasCarry == 0, no carry
354 // hasCarry == 1, has carry
355 // hasCarry == 2, no carry and the calculation result == 0.
356 uint8_t hasCarry = 0;
357 uint64_t resul = carry + lx * ly;
358 hasCarry = (resul < carry) ? 1 : 0;
359 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
360 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
361
362 carry += (lx * hy) & 0xffffffffULL;
363 resul = (carry << 32) | (resul & 0xffffffffULL);
364 dest[i+j] += resul;
365 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopher820256b2009-08-21 04:06:45 +0000366 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000367 ((lx * hy) >> 32) + hx * hy;
368 }
369 dest[i+xlen] = carry;
370 }
371}
372
Zhou Shengdac63782007-02-06 03:00:16 +0000373APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000374 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer58a6a432007-02-21 08:21:52 +0000375 if (isSingleWord()) {
Reid Spencer4bb430c2007-02-20 20:42:10 +0000376 VAL *= RHS.VAL;
Reid Spencer58a6a432007-02-21 08:21:52 +0000377 clearUnusedBits();
378 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000379 }
Reid Spencer58a6a432007-02-21 08:21:52 +0000380
381 // Get some bit facts about LHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000382 unsigned lhsBits = getActiveBits();
383 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopher820256b2009-08-21 04:06:45 +0000384 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +0000385 // 0 * X ===> 0
386 return *this;
387
388 // Get some bit facts about RHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000389 unsigned rhsBits = RHS.getActiveBits();
390 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencer58a6a432007-02-21 08:21:52 +0000391 if (!rhsWords) {
392 // X * 0 ===> 0
Jay Foad25a5e4c2010-12-01 08:53:58 +0000393 clearAllBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000394 return *this;
395 }
396
397 // Allocate space for the result
Chris Lattner77527f52009-01-21 18:09:24 +0000398 unsigned destWords = rhsWords + lhsWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000399 uint64_t *dest = getMemory(destWords);
400
401 // Perform the long multiply
402 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
403
404 // Copy result back into *this
Jay Foad25a5e4c2010-12-01 08:53:58 +0000405 clearAllBits();
Chris Lattner77527f52009-01-21 18:09:24 +0000406 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000407 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
Eli Friedman19546412011-10-07 23:40:49 +0000408 clearUnusedBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000409
410 // delete dest array and return
411 delete[] dest;
Zhou Shengdac63782007-02-06 03:00:16 +0000412 return *this;
413}
414
Zhou Shengdac63782007-02-06 03:00:16 +0000415APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000416 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000417 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000418 VAL &= RHS.VAL;
419 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000420 }
Chris Lattner77527f52009-01-21 18:09:24 +0000421 unsigned numWords = getNumWords();
422 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000423 pVal[i] &= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000424 return *this;
425}
426
Zhou Shengdac63782007-02-06 03:00:16 +0000427APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000428 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000429 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000430 VAL |= RHS.VAL;
431 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000432 }
Chris Lattner77527f52009-01-21 18:09:24 +0000433 unsigned numWords = getNumWords();
434 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000435 pVal[i] |= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000436 return *this;
437}
438
Zhou Shengdac63782007-02-06 03:00:16 +0000439APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000440 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000441 if (isSingleWord()) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000442 VAL ^= RHS.VAL;
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000443 this->clearUnusedBits();
Reid Spenceree0a6852007-02-18 06:39:42 +0000444 return *this;
Eric Christopher820256b2009-08-21 04:06:45 +0000445 }
Chris Lattner77527f52009-01-21 18:09:24 +0000446 unsigned numWords = getNumWords();
447 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000448 pVal[i] ^= RHS.pVal[i];
Reid Spencera41e93b2007-02-25 19:32:03 +0000449 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000450}
451
Chris Lattner1ac3e252008-08-20 17:02:31 +0000452APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000453 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000454 uint64_t* val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000455 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000456 val[i] = pVal[i] & RHS.pVal[i];
457 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000458}
459
Chris Lattner1ac3e252008-08-20 17:02:31 +0000460APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000461 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000462 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000463 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000464 val[i] = pVal[i] | RHS.pVal[i];
465 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000466}
467
Chris Lattner1ac3e252008-08-20 17:02:31 +0000468APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000469 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000470 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000471 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000472 val[i] = pVal[i] ^ RHS.pVal[i];
473
Benjamin Kramerf9a29752014-10-10 10:18:12 +0000474 APInt Result(val, getBitWidth());
Reid Spencera41e93b2007-02-25 19:32:03 +0000475 // 0^0==1 so clear the high bits in case they got set.
Benjamin Kramerf9a29752014-10-10 10:18:12 +0000476 Result.clearUnusedBits();
477 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000478}
479
Zhou Shengdac63782007-02-06 03:00:16 +0000480APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000481 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000482 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000483 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer4bb430c2007-02-20 20:42:10 +0000484 APInt Result(*this);
485 Result *= RHS;
Eli Friedman19546412011-10-07 23:40:49 +0000486 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000487}
488
Chris Lattner1ac3e252008-08-20 17:02:31 +0000489bool APInt::EqualSlowCase(const APInt& RHS) const {
Matthias Braun5117fcd2016-02-15 20:06:19 +0000490 return std::equal(pVal, pVal + getNumWords(), RHS.pVal);
Zhou Shengdac63782007-02-06 03:00:16 +0000491}
492
Chris Lattner1ac3e252008-08-20 17:02:31 +0000493bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000494 unsigned n = getActiveBits();
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000495 if (n <= APINT_BITS_PER_WORD)
496 return pVal[0] == Val;
497 else
498 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000499}
500
Reid Spencer1d072122007-02-16 22:36:51 +0000501bool APInt::ult(const APInt& RHS) const {
502 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
503 if (isSingleWord())
504 return VAL < RHS.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000505
506 // Get active bit length of both operands
Chris Lattner77527f52009-01-21 18:09:24 +0000507 unsigned n1 = getActiveBits();
508 unsigned n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000509
510 // If magnitude of LHS is less than RHS, return true.
511 if (n1 < n2)
512 return true;
513
514 // If magnitude of RHS is greather than LHS, return false.
515 if (n2 < n1)
516 return false;
517
518 // If they bot fit in a word, just compare the low order word
519 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
520 return pVal[0] < RHS.pVal[0];
521
522 // Otherwise, compare all words
Chris Lattner77527f52009-01-21 18:09:24 +0000523 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000524 for (int i = topWord; i >= 0; --i) {
Eric Christopher820256b2009-08-21 04:06:45 +0000525 if (pVal[i] > RHS.pVal[i])
Reid Spencer1d072122007-02-16 22:36:51 +0000526 return false;
Eric Christopher820256b2009-08-21 04:06:45 +0000527 if (pVal[i] < RHS.pVal[i])
Reid Spencera41e93b2007-02-25 19:32:03 +0000528 return true;
Zhou Shengdac63782007-02-06 03:00:16 +0000529 }
530 return false;
531}
532
Reid Spencer1d072122007-02-16 22:36:51 +0000533bool APInt::slt(const APInt& RHS) const {
534 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000535 if (isSingleWord()) {
David Majnemer5f1c0172016-06-24 20:51:47 +0000536 int64_t lhsSext = SignExtend64(VAL, BitWidth);
537 int64_t rhsSext = SignExtend64(RHS.VAL, BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000538 return lhsSext < rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000539 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000540
Reid Spencer54abdcf2007-02-27 18:23:40 +0000541 bool lhsNeg = isNegative();
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000542 bool rhsNeg = RHS.isNegative();
Reid Spencera41e93b2007-02-25 19:32:03 +0000543
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000544 // If the sign bits don't match, then (LHS < RHS) if LHS is negative
545 if (lhsNeg != rhsNeg)
546 return lhsNeg;
547
548 // Otherwise we can just use an unsigned comparision, because even negative
549 // numbers compare correctly this way if both have the same signed-ness.
550 return ult(RHS);
Zhou Shengdac63782007-02-06 03:00:16 +0000551}
552
Jay Foad25a5e4c2010-12-01 08:53:58 +0000553void APInt::setBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000554 if (isSingleWord())
Reid Spencera41e93b2007-02-25 19:32:03 +0000555 VAL |= maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000556 else
Reid Spencera41e93b2007-02-25 19:32:03 +0000557 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000558}
559
Zhou Shengdac63782007-02-06 03:00:16 +0000560/// Set the given bit to 0 whose position is given as "bitPosition".
561/// @brief Set a given bit to 0.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000562void APInt::clearBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000563 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000564 VAL &= ~maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000565 else
Reid Spencera856b6e2007-02-18 18:38:44 +0000566 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000567}
568
Zhou Shengdac63782007-02-06 03:00:16 +0000569/// @brief Toggle every bit to its opposite value.
Zhou Shengdac63782007-02-06 03:00:16 +0000570
Eric Christopher820256b2009-08-21 04:06:45 +0000571/// Toggle a given bit to its opposite value whose position is given
Zhou Shengdac63782007-02-06 03:00:16 +0000572/// as "bitPosition".
573/// @brief Toggles a given bit to its opposite value.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000574void APInt::flipBit(unsigned bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000575 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad25a5e4c2010-12-01 08:53:58 +0000576 if ((*this)[bitPosition]) clearBit(bitPosition);
577 else setBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000578}
579
Benjamin Kramer92d89982010-07-14 22:38:02 +0000580unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000581 assert(!str.empty() && "Invalid string length");
Douglas Gregor663c0682011-09-14 15:54:46 +0000582 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
583 radix == 36) &&
584 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000585
586 size_t slen = str.size();
Reid Spencer9329e7b2007-04-13 19:19:07 +0000587
Eric Christopher43a1dec2009-08-21 04:10:31 +0000588 // Each computation below needs to know if it's negative.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000589 StringRef::iterator p = str.begin();
Eric Christopher43a1dec2009-08-21 04:10:31 +0000590 unsigned isNegative = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000591 if (*p == '-' || *p == '+') {
592 p++;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000593 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +0000594 assert(slen && "String is only a sign, needs a value.");
Reid Spencer9329e7b2007-04-13 19:19:07 +0000595 }
Eric Christopher43a1dec2009-08-21 04:10:31 +0000596
Reid Spencer9329e7b2007-04-13 19:19:07 +0000597 // For radixes of power-of-two values, the bits required is accurately and
598 // easily computed
599 if (radix == 2)
600 return slen + isNegative;
601 if (radix == 8)
602 return slen * 3 + isNegative;
603 if (radix == 16)
604 return slen * 4 + isNegative;
605
Douglas Gregor663c0682011-09-14 15:54:46 +0000606 // FIXME: base 36
607
Reid Spencer9329e7b2007-04-13 19:19:07 +0000608 // This is grossly inefficient but accurate. We could probably do something
609 // with a computation of roughly slen*64/20 and then adjust by the value of
610 // the first few digits. But, I'm not sure how accurate that could be.
611
612 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000613 // be too large. This avoids the assertion in the constructor. This
614 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
615 // bits in that case.
Douglas Gregor663c0682011-09-14 15:54:46 +0000616 unsigned sufficient
617 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
618 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000619
620 // Convert to the actual binary value.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000621 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000622
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000623 // Compute how many bits are required. If the log is infinite, assume we need
624 // just bit.
625 unsigned log = tmp.logBase2();
626 if (log == (unsigned)-1) {
627 return isNegative + 1;
628 } else {
629 return isNegative + log + 1;
630 }
Reid Spencer9329e7b2007-04-13 19:19:07 +0000631}
632
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000633hash_code llvm::hash_value(const APInt &Arg) {
634 if (Arg.isSingleWord())
635 return hash_combine(Arg.VAL);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000636
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000637 return hash_combine_range(Arg.pVal, Arg.pVal + Arg.getNumWords());
Reid Spencerb2bc9852007-02-26 21:02:27 +0000638}
639
Benjamin Kramerb4b51502015-03-25 16:49:59 +0000640bool APInt::isSplat(unsigned SplatSizeInBits) const {
641 assert(getBitWidth() % SplatSizeInBits == 0 &&
642 "SplatSizeInBits must divide width!");
643 // We can check that all parts of an integer are equal by making use of a
644 // little trick: rotate and check if it's still the same value.
645 return *this == rotl(SplatSizeInBits);
646}
647
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000648/// This function returns the high "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000649APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000650 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000651}
652
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000653/// This function returns the low "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000654APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopher820256b2009-08-21 04:06:45 +0000655 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencer1d072122007-02-16 22:36:51 +0000656 BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000657}
658
Chris Lattner77527f52009-01-21 18:09:24 +0000659unsigned APInt::countLeadingZerosSlowCase() const {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000660 unsigned Count = 0;
661 for (int i = getNumWords()-1; i >= 0; --i) {
662 integerPart V = pVal[i];
663 if (V == 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +0000664 Count += APINT_BITS_PER_WORD;
665 else {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000666 Count += llvm::countLeadingZeros(V);
Chris Lattner1ac3e252008-08-20 17:02:31 +0000667 break;
Reid Spencer74cf82e2007-02-21 00:29:48 +0000668 }
Zhou Shengdac63782007-02-06 03:00:16 +0000669 }
Matthias Brauna6be4e82016-02-15 20:06:22 +0000670 // Adjust for unused bits in the most significant word (they are zero).
671 unsigned Mod = BitWidth % APINT_BITS_PER_WORD;
672 Count -= Mod > 0 ? APINT_BITS_PER_WORD - Mod : 0;
John McCalldf951bd2010-02-03 03:42:44 +0000673 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000674}
675
Chris Lattner77527f52009-01-21 18:09:24 +0000676unsigned APInt::countLeadingOnes() const {
Reid Spencer31acef52007-02-27 21:59:26 +0000677 if (isSingleWord())
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000678 return llvm::countLeadingOnes(VAL << (APINT_BITS_PER_WORD - BitWidth));
Reid Spencer31acef52007-02-27 21:59:26 +0000679
Chris Lattner77527f52009-01-21 18:09:24 +0000680 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwinec39eb82009-01-27 18:06:03 +0000681 unsigned shift;
682 if (!highWordBits) {
683 highWordBits = APINT_BITS_PER_WORD;
684 shift = 0;
685 } else {
686 shift = APINT_BITS_PER_WORD - highWordBits;
687 }
Reid Spencer31acef52007-02-27 21:59:26 +0000688 int i = getNumWords() - 1;
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000689 unsigned Count = llvm::countLeadingOnes(pVal[i] << shift);
Reid Spencer31acef52007-02-27 21:59:26 +0000690 if (Count == highWordBits) {
691 for (i--; i >= 0; --i) {
692 if (pVal[i] == -1ULL)
693 Count += APINT_BITS_PER_WORD;
694 else {
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000695 Count += llvm::countLeadingOnes(pVal[i]);
Reid Spencer31acef52007-02-27 21:59:26 +0000696 break;
697 }
698 }
699 }
700 return Count;
701}
702
Chris Lattner77527f52009-01-21 18:09:24 +0000703unsigned APInt::countTrailingZeros() const {
Zhou Shengdac63782007-02-06 03:00:16 +0000704 if (isSingleWord())
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +0000705 return std::min(unsigned(llvm::countTrailingZeros(VAL)), BitWidth);
Chris Lattner77527f52009-01-21 18:09:24 +0000706 unsigned Count = 0;
707 unsigned i = 0;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000708 for (; i < getNumWords() && pVal[i] == 0; ++i)
709 Count += APINT_BITS_PER_WORD;
710 if (i < getNumWords())
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +0000711 Count += llvm::countTrailingZeros(pVal[i]);
Chris Lattnerc2c4c742007-11-23 22:36:25 +0000712 return std::min(Count, BitWidth);
Zhou Shengdac63782007-02-06 03:00:16 +0000713}
714
Chris Lattner77527f52009-01-21 18:09:24 +0000715unsigned APInt::countTrailingOnesSlowCase() const {
716 unsigned Count = 0;
717 unsigned i = 0;
Dan Gohmanc354ebd2008-02-14 22:38:45 +0000718 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000719 Count += APINT_BITS_PER_WORD;
720 if (i < getNumWords())
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000721 Count += llvm::countTrailingOnes(pVal[i]);
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000722 return std::min(Count, BitWidth);
723}
724
Chris Lattner77527f52009-01-21 18:09:24 +0000725unsigned APInt::countPopulationSlowCase() const {
726 unsigned Count = 0;
727 for (unsigned i = 0; i < getNumWords(); ++i)
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000728 Count += llvm::countPopulation(pVal[i]);
Zhou Shengdac63782007-02-06 03:00:16 +0000729 return Count;
730}
731
Richard Smith4f9a8082011-11-23 21:33:37 +0000732/// Perform a logical right-shift from Src to Dst, which must be equal or
733/// non-overlapping, of Words words, by Shift, which must be less than 64.
734static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
735 unsigned Shift) {
736 uint64_t Carry = 0;
737 for (int I = Words - 1; I >= 0; --I) {
738 uint64_t Tmp = Src[I];
739 Dst[I] = (Tmp >> Shift) | Carry;
740 Carry = Tmp << (64 - Shift);
741 }
742}
743
Reid Spencer1d072122007-02-16 22:36:51 +0000744APInt APInt::byteSwap() const {
745 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
746 if (BitWidth == 16)
Jeff Cohene06855e2007-03-20 20:42:36 +0000747 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000748 if (BitWidth == 32)
Chris Lattner77527f52009-01-21 18:09:24 +0000749 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000750 if (BitWidth == 48) {
Chris Lattner77527f52009-01-21 18:09:24 +0000751 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000752 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohene06855e2007-03-20 20:42:36 +0000753 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000754 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohene06855e2007-03-20 20:42:36 +0000755 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000756 }
Richard Smith4f9a8082011-11-23 21:33:37 +0000757 if (BitWidth == 64)
758 return APInt(BitWidth, ByteSwap_64(VAL));
759
760 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
761 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
762 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
763 if (Result.BitWidth != BitWidth) {
764 lshrNear(Result.pVal, Result.pVal, getNumWords(),
765 Result.BitWidth - BitWidth);
766 Result.BitWidth = BitWidth;
767 }
768 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000769}
770
Matt Arsenault155dda92016-03-21 15:00:35 +0000771APInt APInt::reverseBits() const {
772 switch (BitWidth) {
773 case 64:
774 return APInt(BitWidth, llvm::reverseBits<uint64_t>(VAL));
775 case 32:
776 return APInt(BitWidth, llvm::reverseBits<uint32_t>(VAL));
777 case 16:
778 return APInt(BitWidth, llvm::reverseBits<uint16_t>(VAL));
779 case 8:
780 return APInt(BitWidth, llvm::reverseBits<uint8_t>(VAL));
781 default:
782 break;
783 }
784
785 APInt Val(*this);
786 APInt Reversed(*this);
787 int S = BitWidth - 1;
788
789 const APInt One(BitWidth, 1);
790
791 for ((Val = Val.lshr(1)); Val != 0; (Val = Val.lshr(1))) {
792 Reversed <<= 1;
793 Reversed |= (Val & One);
794 --S;
795 }
796
797 Reversed <<= S;
798 return Reversed;
799}
800
Eric Christopher820256b2009-08-21 04:06:45 +0000801APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000802 const APInt& API2) {
Zhou Shengdac63782007-02-06 03:00:16 +0000803 APInt A = API1, B = API2;
804 while (!!B) {
805 APInt T = B;
Reid Spencer1d072122007-02-16 22:36:51 +0000806 B = APIntOps::urem(A, B);
Zhou Shengdac63782007-02-06 03:00:16 +0000807 A = T;
808 }
809 return A;
810}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000811
Chris Lattner77527f52009-01-21 18:09:24 +0000812APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000813 union {
814 double D;
815 uint64_t I;
816 } T;
817 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000818
819 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000820 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000821
822 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000823 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000824
825 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000826 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000827 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000828
829 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
830 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
831
832 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000833 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000834 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000835 APInt(width, mantissa >> (52 - exp));
836
837 // If the client didn't provide enough bits for us to shift the mantissa into
838 // then the result is undefined, just return 0
839 if (width <= exp - 52)
840 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000841
842 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000843 APInt Tmp(width, mantissa);
Chris Lattner77527f52009-01-21 18:09:24 +0000844 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd707d632007-02-12 20:02:55 +0000845 return isNeg ? -Tmp : Tmp;
846}
847
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000848/// This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000849/// The layout for double is as following (IEEE Standard 754):
850/// --------------------------------------
851/// | Sign Exponent Fraction Bias |
852/// |-------------------------------------- |
853/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000854/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000855double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000856
857 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000858 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000859 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
860 if (isSigned) {
David Majnemer03992262016-06-24 21:15:36 +0000861 int64_t sext = SignExtend64(getWord(0), BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000862 return double(sext);
863 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000864 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000865 }
866
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000867 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000868 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000869
870 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000871 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000872
873 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000874 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000875
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000876 // The exponent (without bias normalization) is just the number of bits
877 // we are using. Note that the sign bit is gone since we constructed the
878 // absolute value.
879 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000880
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000881 // Return infinity for exponent overflow
882 if (exp > 1023) {
883 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000884 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000885 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000886 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000887 }
888 exp += 1023; // Increment for 1023 bias
889
890 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
891 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000892 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000893 unsigned hiWord = whichWord(n-1);
894 if (hiWord == 0) {
895 mantissa = Tmp.pVal[0];
896 if (n > 52)
897 mantissa >>= n - 52; // shift down, we want the top 52 bits.
898 } else {
899 assert(hiWord > 0 && "huh?");
900 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
901 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
902 mantissa = hibits | lobits;
903 }
904
Zhou Shengd707d632007-02-12 20:02:55 +0000905 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000906 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +0000907 union {
908 double D;
909 uint64_t I;
910 } T;
911 T.I = sign | (exp << 52) | mantissa;
912 return T.D;
913}
914
Reid Spencer1d072122007-02-16 22:36:51 +0000915// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000916APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000917 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +0000918 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +0000919
920 if (width <= APINT_BITS_PER_WORD)
921 return APInt(width, getRawData()[0]);
922
923 APInt Result(getMemory(getNumWords(width)), width);
924
925 // Copy full words.
926 unsigned i;
927 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
928 Result.pVal[i] = pVal[i];
929
930 // Truncate and copy any partial word.
931 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
932 if (bits != 0)
933 Result.pVal[i] = pVal[i] << bits >> bits;
934
935 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000936}
937
938// Sign extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000939APInt APInt::sext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000940 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +0000941
942 if (width <= APINT_BITS_PER_WORD) {
943 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
944 val = (int64_t)val >> (width - BitWidth);
945 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000946 }
947
Jay Foad583abbc2010-12-07 08:25:19 +0000948 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000949
Jay Foad583abbc2010-12-07 08:25:19 +0000950 // Copy full words.
951 unsigned i;
952 uint64_t word = 0;
953 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
954 word = getRawData()[i];
955 Result.pVal[i] = word;
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000956 }
957
Jay Foad583abbc2010-12-07 08:25:19 +0000958 // Read and sign-extend any partial word.
959 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
960 if (bits != 0)
961 word = (int64_t)getRawData()[i] << bits >> bits;
962 else
963 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
964
965 // Write remaining full words.
966 for (; i != width / APINT_BITS_PER_WORD; i++) {
967 Result.pVal[i] = word;
968 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000969 }
Jay Foad583abbc2010-12-07 08:25:19 +0000970
971 // Write any partial word.
972 bits = (0 - width) % APINT_BITS_PER_WORD;
973 if (bits != 0)
974 Result.pVal[i] = word << bits >> bits;
975
976 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000977}
978
979// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000980APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000981 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +0000982
983 if (width <= APINT_BITS_PER_WORD)
984 return APInt(width, VAL);
985
986 APInt Result(getMemory(getNumWords(width)), width);
987
988 // Copy words.
989 unsigned i;
990 for (i = 0; i != getNumWords(); i++)
991 Result.pVal[i] = getRawData()[i];
992
993 // Zero remaining words.
994 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
995
996 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000997}
998
Jay Foad583abbc2010-12-07 08:25:19 +0000999APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001000 if (BitWidth < width)
1001 return zext(width);
1002 if (BitWidth > width)
1003 return trunc(width);
1004 return *this;
1005}
1006
Jay Foad583abbc2010-12-07 08:25:19 +00001007APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001008 if (BitWidth < width)
1009 return sext(width);
1010 if (BitWidth > width)
1011 return trunc(width);
1012 return *this;
1013}
1014
Rafael Espindolabb893fe2012-01-27 23:33:07 +00001015APInt APInt::zextOrSelf(unsigned width) const {
1016 if (BitWidth < width)
1017 return zext(width);
1018 return *this;
1019}
1020
1021APInt APInt::sextOrSelf(unsigned width) const {
1022 if (BitWidth < width)
1023 return sext(width);
1024 return *this;
1025}
1026
Zhou Shenge93db8f2007-02-09 07:48:24 +00001027/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001028/// @brief Arithmetic right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001029APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001030 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001031}
1032
1033/// Arithmetic right-shift this APInt by shiftAmt.
1034/// @brief Arithmetic right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001035APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001036 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer1825dd02007-03-02 22:39:11 +00001037 // Handle a degenerate case
1038 if (shiftAmt == 0)
1039 return *this;
1040
1041 // Handle single word shifts with built-in ashr
Reid Spencer522ca7c2007-02-25 01:56:07 +00001042 if (isSingleWord()) {
1043 if (shiftAmt == BitWidth)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001044 return APInt(BitWidth, 0); // undefined
Jonathan Roelofs851b79d2016-08-10 19:50:14 +00001045 return APInt(BitWidth, SignExtend64(VAL, BitWidth) >> shiftAmt);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001046 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001047
Reid Spencer1825dd02007-03-02 22:39:11 +00001048 // If all the bits were shifted out, the result is, technically, undefined.
1049 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1050 // issues in the algorithm below.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001051 if (shiftAmt == BitWidth) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001052 if (isNegative())
Zhou Sheng1247c072008-06-05 13:27:38 +00001053 return APInt(BitWidth, -1ULL, true);
Reid Spencera41e93b2007-02-25 19:32:03 +00001054 else
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001055 return APInt(BitWidth, 0);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001056 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001057
1058 // Create some space for the result.
1059 uint64_t * val = new uint64_t[getNumWords()];
1060
Reid Spencer1825dd02007-03-02 22:39:11 +00001061 // Compute some values needed by the following shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001062 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1063 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1064 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1065 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer1825dd02007-03-02 22:39:11 +00001066 if (bitsInWord == 0)
1067 bitsInWord = APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001068
1069 // If we are shifting whole words, just move whole words
1070 if (wordShift == 0) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001071 // Move the words containing significant bits
Chris Lattner77527f52009-01-21 18:09:24 +00001072 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001073 val[i] = pVal[i+offset]; // move whole word
1074
1075 // Adjust the top significant word for sign bit fill, if negative
1076 if (isNegative())
1077 if (bitsInWord < APINT_BITS_PER_WORD)
1078 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1079 } else {
Eric Christopher820256b2009-08-21 04:06:45 +00001080 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001081 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001082 // This combines the shifted corresponding word with the low bits from
1083 // the next word (shifted into this word's high bits).
Eric Christopher820256b2009-08-21 04:06:45 +00001084 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer1825dd02007-03-02 22:39:11 +00001085 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1086 }
1087
1088 // Shift the break word. In this case there are no bits from the next word
1089 // to include in this word.
1090 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1091
Alp Tokercb402912014-01-24 17:20:08 +00001092 // Deal with sign extension in the break word, and possibly the word before
Reid Spencer1825dd02007-03-02 22:39:11 +00001093 // it.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001094 if (isNegative()) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001095 if (wordShift > bitsInWord) {
1096 if (breakWord > 0)
Eric Christopher820256b2009-08-21 04:06:45 +00001097 val[breakWord-1] |=
Reid Spencer1825dd02007-03-02 22:39:11 +00001098 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1099 val[breakWord] |= ~0ULL;
Eric Christopher820256b2009-08-21 04:06:45 +00001100 } else
Reid Spencer1825dd02007-03-02 22:39:11 +00001101 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnerdad2d092007-05-03 18:15:36 +00001102 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001103 }
1104
Reid Spencer1825dd02007-03-02 22:39:11 +00001105 // Remaining words are 0 or -1, just assign them.
1106 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner77527f52009-01-21 18:09:24 +00001107 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001108 val[i] = fillValue;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001109 APInt Result(val, BitWidth);
1110 Result.clearUnusedBits();
1111 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001112}
1113
Zhou Shenge93db8f2007-02-09 07:48:24 +00001114/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001115/// @brief Logical right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001116APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001117 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001118}
1119
1120/// Logical right-shift this APInt by shiftAmt.
1121/// @brief Logical right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001122APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnerdad2d092007-05-03 18:15:36 +00001123 if (isSingleWord()) {
Ahmed Charles0dca5d82012-02-24 19:06:15 +00001124 if (shiftAmt >= BitWidth)
Reid Spencer522ca7c2007-02-25 01:56:07 +00001125 return APInt(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001126 else
Reid Spencer522ca7c2007-02-25 01:56:07 +00001127 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001128 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001129
Reid Spencer44eef162007-02-26 01:19:48 +00001130 // If all the bits were shifted out, the result is 0. This avoids issues
1131 // with shifting by the size of the integer type, which produces undefined
1132 // results. We define these "undefined results" to always be 0.
Chad Rosier3d464d82012-06-08 18:04:52 +00001133 if (shiftAmt >= BitWidth)
Reid Spencer44eef162007-02-26 01:19:48 +00001134 return APInt(BitWidth, 0);
1135
Reid Spencerfffdf102007-05-17 06:26:29 +00001136 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopher820256b2009-08-21 04:06:45 +00001137 // issues with shifting by the size of the integer type, which produces
Reid Spencerfffdf102007-05-17 06:26:29 +00001138 // undefined results in the code below. This is also an optimization.
1139 if (shiftAmt == 0)
1140 return *this;
1141
Reid Spencer44eef162007-02-26 01:19:48 +00001142 // Create some space for the result.
1143 uint64_t * val = new uint64_t[getNumWords()];
1144
1145 // If we are shifting less than a word, compute the shift with a simple carry
1146 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smith4f9a8082011-11-23 21:33:37 +00001147 lshrNear(val, pVal, getNumWords(), shiftAmt);
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001148 APInt Result(val, BitWidth);
1149 Result.clearUnusedBits();
1150 return Result;
Reid Spencera41e93b2007-02-25 19:32:03 +00001151 }
1152
Reid Spencer44eef162007-02-26 01:19:48 +00001153 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001154 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1155 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer44eef162007-02-26 01:19:48 +00001156
1157 // If we are shifting whole words, just move whole words
1158 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001159 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001160 val[i] = pVal[i+offset];
Chris Lattner77527f52009-01-21 18:09:24 +00001161 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencer44eef162007-02-26 01:19:48 +00001162 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001163 APInt Result(val, BitWidth);
1164 Result.clearUnusedBits();
1165 return Result;
Reid Spencer44eef162007-02-26 01:19:48 +00001166 }
1167
Eric Christopher820256b2009-08-21 04:06:45 +00001168 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001169 unsigned breakWord = getNumWords() - offset -1;
1170 for (unsigned i = 0; i < breakWord; ++i)
Reid Spencerd99feaf2007-03-01 05:39:56 +00001171 val[i] = (pVal[i+offset] >> wordShift) |
1172 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencer44eef162007-02-26 01:19:48 +00001173 // Shift the break word.
1174 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1175
1176 // Remaining words are 0
Chris Lattner77527f52009-01-21 18:09:24 +00001177 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001178 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001179 APInt Result(val, BitWidth);
1180 Result.clearUnusedBits();
1181 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001182}
1183
Zhou Shenge93db8f2007-02-09 07:48:24 +00001184/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001185/// @brief Left-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001186APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky030c4502009-01-19 17:42:33 +00001187 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner77527f52009-01-21 18:09:24 +00001188 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001189}
1190
Chris Lattner77527f52009-01-21 18:09:24 +00001191APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencera5c84d92007-02-25 00:56:44 +00001192 // If all the bits were shifted out, the result is 0. This avoids issues
1193 // with shifting by the size of the integer type, which produces undefined
1194 // results. We define these "undefined results" to always be 0.
1195 if (shiftAmt == BitWidth)
1196 return APInt(BitWidth, 0);
1197
Reid Spencer81ee0202007-05-12 18:01:57 +00001198 // If none of the bits are shifted out, the result is *this. This avoids a
1199 // lshr by the words size in the loop below which can produce incorrect
1200 // results. It also avoids the expensive computation below for a common case.
1201 if (shiftAmt == 0)
1202 return *this;
1203
Reid Spencera5c84d92007-02-25 00:56:44 +00001204 // Create some space for the result.
1205 uint64_t * val = new uint64_t[getNumWords()];
1206
1207 // If we are shifting less than a word, do it the easy way
1208 if (shiftAmt < APINT_BITS_PER_WORD) {
1209 uint64_t carry = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001210 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencera5c84d92007-02-25 00:56:44 +00001211 val[i] = pVal[i] << shiftAmt | carry;
1212 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1213 }
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001214 APInt Result(val, BitWidth);
1215 Result.clearUnusedBits();
1216 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001217 }
1218
Reid Spencera5c84d92007-02-25 00:56:44 +00001219 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001220 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1221 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencera5c84d92007-02-25 00:56:44 +00001222
1223 // If we are shifting whole words, just move whole words
1224 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001225 for (unsigned i = 0; i < offset; i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001226 val[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001227 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001228 val[i] = pVal[i-offset];
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001229 APInt Result(val, BitWidth);
1230 Result.clearUnusedBits();
1231 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001232 }
Reid Spencera5c84d92007-02-25 00:56:44 +00001233
1234 // Copy whole words from this to Result.
Chris Lattner77527f52009-01-21 18:09:24 +00001235 unsigned i = getNumWords() - 1;
Reid Spencera5c84d92007-02-25 00:56:44 +00001236 for (; i > offset; --i)
1237 val[i] = pVal[i-offset] << wordShift |
1238 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencerab0e08a2007-02-25 01:08:58 +00001239 val[offset] = pVal[0] << wordShift;
Reid Spencera5c84d92007-02-25 00:56:44 +00001240 for (i = 0; i < offset; ++i)
1241 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001242 APInt Result(val, BitWidth);
1243 Result.clearUnusedBits();
1244 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001245}
1246
Dan Gohman105c1d42008-02-29 01:40:47 +00001247APInt APInt::rotl(const APInt &rotateAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001248 return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001249}
1250
Chris Lattner77527f52009-01-21 18:09:24 +00001251APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001252 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001253 if (rotateAmt == 0)
1254 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001255 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001256}
1257
Dan Gohman105c1d42008-02-29 01:40:47 +00001258APInt APInt::rotr(const APInt &rotateAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001259 return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001260}
1261
Chris Lattner77527f52009-01-21 18:09:24 +00001262APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001263 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001264 if (rotateAmt == 0)
1265 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001266 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001267}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001268
1269// Square Root - this method computes and returns the square root of "this".
1270// Three mechanisms are used for computation. For small values (<= 5 bits),
1271// a table lookup is done. This gets some performance for common cases. For
1272// values using less than 52 bits, the value is converted to double and then
1273// the libc sqrt function is called. The result is rounded and then converted
1274// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001275// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001276APInt APInt::sqrt() const {
1277
1278 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001279 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001280
1281 // Use a fast table for some small values. This also gets rid of some
1282 // rounding errors in libc sqrt for small values.
1283 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001284 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001285 /* 0 */ 0,
1286 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001287 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001288 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1289 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1290 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1291 /* 31 */ 6
1292 };
1293 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001294 }
1295
1296 // If the magnitude of the value fits in less than 52 bits (the precision of
1297 // an IEEE double precision floating point value), then we can use the
1298 // libc sqrt function which will probably use a hardware sqrt computation.
1299 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001300 if (magnitude < 52) {
Eric Christopher820256b2009-08-21 04:06:45 +00001301 return APInt(BitWidth,
Reid Spencerd99feaf2007-03-01 05:39:56 +00001302 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenb622c112007-03-05 00:00:42 +00001303 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001304
1305 // Okay, all the short cuts are exhausted. We must compute it. The following
1306 // is a classical Babylonian method for computing the square root. This code
Sanjay Patel4cb54e02014-09-11 15:41:01 +00001307 // was adapted to APInt from a wikipedia article on such computations.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001308 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001309 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001310 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001311 APInt testy(BitWidth, 16);
1312 APInt x_old(BitWidth, 1);
1313 APInt x_new(BitWidth, 0);
1314 APInt two(BitWidth, 2);
1315
1316 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001317 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001318 if (i >= nbits || this->ule(testy)) {
1319 x_old = x_old.shl(i / 2);
1320 break;
1321 }
1322
Eric Christopher820256b2009-08-21 04:06:45 +00001323 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001324 for (;;) {
1325 x_new = (this->udiv(x_old) + x_old).udiv(two);
1326 if (x_old.ule(x_new))
1327 break;
1328 x_old = x_new;
1329 }
1330
1331 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001332 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001333 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001334 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001335 // floating point representation after 192 bits. There are no discrepancies
1336 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001337 APInt square(x_old * x_old);
1338 APInt nextSquare((x_old + 1) * (x_old +1));
1339 if (this->ult(square))
1340 return x_old;
David Blaikie54c94622011-12-01 20:58:30 +00001341 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1342 APInt midpoint((nextSquare - square).udiv(two));
1343 APInt offset(*this - square);
1344 if (offset.ult(midpoint))
1345 return x_old;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001346 return x_old + 1;
1347}
1348
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001349/// Computes the multiplicative inverse of this APInt for a given modulo. The
1350/// iterative extended Euclidean algorithm is used to solve for this value,
1351/// however we simplify it to speed up calculating only the inverse, and take
1352/// advantage of div+rem calculations. We also use some tricks to avoid copying
1353/// (potentially large) APInts around.
1354APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1355 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1356
1357 // Using the properties listed at the following web page (accessed 06/21/08):
1358 // http://www.numbertheory.org/php/euclid.html
1359 // (especially the properties numbered 3, 4 and 9) it can be proved that
1360 // BitWidth bits suffice for all the computations in the algorithm implemented
1361 // below. More precisely, this number of bits suffice if the multiplicative
1362 // inverse exists, but may not suffice for the general extended Euclidean
1363 // algorithm.
1364
1365 APInt r[2] = { modulo, *this };
1366 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1367 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001368
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001369 unsigned i;
1370 for (i = 0; r[i^1] != 0; i ^= 1) {
1371 // An overview of the math without the confusing bit-flipping:
1372 // q = r[i-2] / r[i-1]
1373 // r[i] = r[i-2] % r[i-1]
1374 // t[i] = t[i-2] - t[i-1] * q
1375 udivrem(r[i], r[i^1], q, r[i]);
1376 t[i] -= t[i^1] * q;
1377 }
1378
1379 // If this APInt and the modulo are not coprime, there is no multiplicative
1380 // inverse, so return 0. We check this by looking at the next-to-last
1381 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1382 // algorithm.
1383 if (r[i] != 1)
1384 return APInt(BitWidth, 0);
1385
1386 // The next-to-last t is the multiplicative inverse. However, we are
1387 // interested in a positive inverse. Calcuate a positive one from a negative
1388 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001389 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001390 return t[i].isNegative() ? t[i] + modulo : t[i];
1391}
1392
Jay Foadfe0c6482009-04-30 10:15:35 +00001393/// Calculate the magic numbers required to implement a signed integer division
1394/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1395/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1396/// Warren, Jr., chapter 10.
1397APInt::ms APInt::magic() const {
1398 const APInt& d = *this;
1399 unsigned p;
1400 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001401 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001402 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001403
Jay Foadfe0c6482009-04-30 10:15:35 +00001404 ad = d.abs();
1405 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1406 anc = t - 1 - t.urem(ad); // absolute value of nc
1407 p = d.getBitWidth() - 1; // initialize p
1408 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1409 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1410 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1411 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1412 do {
1413 p = p + 1;
1414 q1 = q1<<1; // update q1 = 2p/abs(nc)
1415 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1416 if (r1.uge(anc)) { // must be unsigned comparison
1417 q1 = q1 + 1;
1418 r1 = r1 - anc;
1419 }
1420 q2 = q2<<1; // update q2 = 2p/abs(d)
1421 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1422 if (r2.uge(ad)) { // must be unsigned comparison
1423 q2 = q2 + 1;
1424 r2 = r2 - ad;
1425 }
1426 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001427 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001428
Jay Foadfe0c6482009-04-30 10:15:35 +00001429 mag.m = q2 + 1;
1430 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1431 mag.s = p - d.getBitWidth(); // resulting shift
1432 return mag;
1433}
1434
1435/// Calculate the magic numbers required to implement an unsigned integer
1436/// division by a constant as a sequence of multiplies, adds and shifts.
1437/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1438/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001439/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001440/// of the divided value are known zero.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001441APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001442 const APInt& d = *this;
1443 unsigned p;
1444 APInt nc, delta, q1, r1, q2, r2;
1445 struct mu magu;
1446 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001447 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001448 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1449 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1450
Benjamin Kramer3aab6a82012-07-11 18:31:59 +00001451 nc = allOnes - (allOnes - d).urem(d);
Jay Foadfe0c6482009-04-30 10:15:35 +00001452 p = d.getBitWidth() - 1; // initialize p
1453 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1454 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1455 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1456 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1457 do {
1458 p = p + 1;
1459 if (r1.uge(nc - r1)) {
1460 q1 = q1 + q1 + 1; // update q1
1461 r1 = r1 + r1 - nc; // update r1
1462 }
1463 else {
1464 q1 = q1+q1; // update q1
1465 r1 = r1+r1; // update r1
1466 }
1467 if ((r2 + 1).uge(d - r2)) {
1468 if (q2.uge(signedMax)) magu.a = 1;
1469 q2 = q2+q2 + 1; // update q2
1470 r2 = r2+r2 + 1 - d; // update r2
1471 }
1472 else {
1473 if (q2.uge(signedMin)) magu.a = 1;
1474 q2 = q2+q2; // update q2
1475 r2 = r2+r2 + 1; // update r2
1476 }
1477 delta = d - 1 - r2;
1478 } while (p < d.getBitWidth()*2 &&
1479 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1480 magu.m = q2 + 1; // resulting magic number
1481 magu.s = p - d.getBitWidth(); // resulting shift
1482 return magu;
1483}
1484
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001485/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1486/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1487/// variables here have the same names as in the algorithm. Comments explain
1488/// the algorithm and any deviation from it.
Chris Lattner77527f52009-01-21 18:09:24 +00001489static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1490 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001491 assert(u && "Must provide dividend");
1492 assert(v && "Must provide divisor");
1493 assert(q && "Must provide quotient");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001494 assert(u != v && u != q && v != q && "Must use different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001495 assert(n>1 && "n must be > 1");
1496
Yaron Keren39fc5a62015-03-26 19:45:19 +00001497 // b denotes the base of the number system. In our case b is 2^32.
George Burgess IV381fc0e2016-08-25 01:05:08 +00001498 const uint64_t b = uint64_t(1) << 32;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001499
David Greenef32fcb42010-01-05 01:28:52 +00001500 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1501 DEBUG(dbgs() << "KnuthDiv: original:");
1502 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1503 DEBUG(dbgs() << " by");
1504 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1505 DEBUG(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001506 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1507 // u and v by d. Note that we have taken Knuth's advice here to use a power
1508 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1509 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001510 // shift amount from the leading zeros. We are basically normalizing the u
1511 // and v so that its high bits are shifted to the top of v's range without
1512 // overflow. Note that this can require an extra word in u so that u must
1513 // be of length m+n+1.
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +00001514 unsigned shift = countLeadingZeros(v[n-1]);
Chris Lattner77527f52009-01-21 18:09:24 +00001515 unsigned v_carry = 0;
1516 unsigned u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001517 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001518 for (unsigned i = 0; i < m+n; ++i) {
1519 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001520 u[i] = (u[i] << shift) | u_carry;
1521 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001522 }
Chris Lattner77527f52009-01-21 18:09:24 +00001523 for (unsigned i = 0; i < n; ++i) {
1524 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001525 v[i] = (v[i] << shift) | v_carry;
1526 v_carry = v_tmp;
1527 }
1528 }
1529 u[m+n] = u_carry;
Yaron Keren39fc5a62015-03-26 19:45:19 +00001530
David Greenef32fcb42010-01-05 01:28:52 +00001531 DEBUG(dbgs() << "KnuthDiv: normal:");
1532 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1533 DEBUG(dbgs() << " by");
1534 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1535 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001536
1537 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1538 int j = m;
1539 do {
David Greenef32fcb42010-01-05 01:28:52 +00001540 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001541 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001542 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1543 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1544 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1545 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1546 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001547 // value qp is one too large, and it eliminates all cases where qp is two
1548 // too large.
Reid Spencercb292e42007-02-23 01:57:13 +00001549 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greenef32fcb42010-01-05 01:28:52 +00001550 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001551 uint64_t qp = dividend / v[n-1];
1552 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001553 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1554 qp--;
1555 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001556 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001557 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001558 }
David Greenef32fcb42010-01-05 01:28:52 +00001559 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001560
Reid Spencercb292e42007-02-23 01:57:13 +00001561 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1562 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1563 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001564 // a subtraction.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001565 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1566 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1567 // true value plus b**(n+1), namely as the b's complement of
1568 // the true value, and a "borrow" to the left should be remembered.
Pawel Bylica86ac4472015-04-24 07:38:39 +00001569 int64_t borrow = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001570 for (unsigned i = 0; i < n; ++i) {
Pawel Bylica86ac4472015-04-24 07:38:39 +00001571 uint64_t p = uint64_t(qp) * uint64_t(v[i]);
1572 int64_t subres = int64_t(u[j+i]) - borrow - (unsigned)p;
1573 u[j+i] = (unsigned)subres;
1574 borrow = (p >> 32) - (subres >> 32);
1575 DEBUG(dbgs() << "KnuthDiv: u[j+i] = " << u[j+i]
Daniel Dunbar763ace92009-07-13 05:27:30 +00001576 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001577 }
Pawel Bylica86ac4472015-04-24 07:38:39 +00001578 bool isNeg = u[j+n] < borrow;
1579 u[j+n] -= (unsigned)borrow;
1580
David Greenef32fcb42010-01-05 01:28:52 +00001581 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1582 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1583 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001584
Eric Christopher820256b2009-08-21 04:06:45 +00001585 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001586 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner77527f52009-01-21 18:09:24 +00001587 q[j] = (unsigned)qp;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001588 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001589 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001590 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001591 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001592 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001593 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1594 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001595 // since it cancels with the borrow that occurred in D4.
1596 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001597 for (unsigned i = 0; i < n; i++) {
1598 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001599 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001600 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001601 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001602 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001603 }
David Greenef32fcb42010-01-05 01:28:52 +00001604 DEBUG(dbgs() << "KnuthDiv: after correction:");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001605 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
David Greenef32fcb42010-01-05 01:28:52 +00001606 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001607
Reid Spencercb292e42007-02-23 01:57:13 +00001608 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1609 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001610
David Greenef32fcb42010-01-05 01:28:52 +00001611 DEBUG(dbgs() << "KnuthDiv: quotient:");
1612 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1613 DEBUG(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001614
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001615 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1616 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1617 // compute the remainder (urem uses this).
1618 if (r) {
1619 // The value d is expressed by the "shift" value above since we avoided
1620 // multiplication by d by using a shift left. So, all we have to do is
1621 // shift right here. In order to mak
Reid Spencer468ad9112007-02-24 20:38:01 +00001622 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001623 unsigned carry = 0;
David Greenef32fcb42010-01-05 01:28:52 +00001624 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001625 for (int i = n-1; i >= 0; i--) {
1626 r[i] = (u[i] >> shift) | carry;
1627 carry = u[i] << (32 - shift);
David Greenef32fcb42010-01-05 01:28:52 +00001628 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001629 }
1630 } else {
1631 for (int i = n-1; i >= 0; i--) {
1632 r[i] = u[i];
David Greenef32fcb42010-01-05 01:28:52 +00001633 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001634 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001635 }
David Greenef32fcb42010-01-05 01:28:52 +00001636 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001637 }
David Greenef32fcb42010-01-05 01:28:52 +00001638 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001639}
1640
Benjamin Kramerc321e532016-06-08 19:09:22 +00001641void APInt::divide(const APInt &LHS, unsigned lhsWords, const APInt &RHS,
1642 unsigned rhsWords, APInt *Quotient, APInt *Remainder) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001643 assert(lhsWords >= rhsWords && "Fractional result");
1644
Eric Christopher820256b2009-08-21 04:06:45 +00001645 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001646 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001647 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001648 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1649 // can't use 64-bit operands here because we don't have native results of
1650 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001651 // work on large-endian machines.
Dan Gohmancff69532009-04-01 18:45:54 +00001652 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner77527f52009-01-21 18:09:24 +00001653 unsigned n = rhsWords * 2;
1654 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001655
1656 // Allocate space for the temporary values we need either on the stack, if
1657 // it will fit, or on the heap if it won't.
Chris Lattner77527f52009-01-21 18:09:24 +00001658 unsigned SPACE[128];
Craig Topperc10719f2014-04-07 04:17:22 +00001659 unsigned *U = nullptr;
1660 unsigned *V = nullptr;
1661 unsigned *Q = nullptr;
1662 unsigned *R = nullptr;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001663 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1664 U = &SPACE[0];
1665 V = &SPACE[m+n+1];
1666 Q = &SPACE[(m+n+1) + n];
1667 if (Remainder)
1668 R = &SPACE[(m+n+1) + n + (m+n)];
1669 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001670 U = new unsigned[m + n + 1];
1671 V = new unsigned[n];
1672 Q = new unsigned[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001673 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001674 R = new unsigned[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001675 }
1676
1677 // Initialize the dividend
Chris Lattner77527f52009-01-21 18:09:24 +00001678 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001679 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001680 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001681 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001682 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001683 }
1684 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1685
Reid Spencer522ca7c2007-02-25 01:56:07 +00001686 // Initialize the divisor
Chris Lattner77527f52009-01-21 18:09:24 +00001687 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001688 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001689 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001690 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001691 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001692 }
1693
Reid Spencer522ca7c2007-02-25 01:56:07 +00001694 // initialize the quotient and remainder
Chris Lattner77527f52009-01-21 18:09:24 +00001695 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001696 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001697 memset(R, 0, n * sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001698
Eric Christopher820256b2009-08-21 04:06:45 +00001699 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001700 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001701 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001702 // contain any zero words or the Knuth algorithm fails.
1703 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1704 n--;
1705 m++;
1706 }
1707 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1708 m--;
1709
1710 // If we're left with only a single word for the divisor, Knuth doesn't work
1711 // so we implement the short division algorithm here. This is much simpler
1712 // and faster because we are certain that we can divide a 64-bit quantity
1713 // by a 32-bit quantity at hardware speed and short division is simply a
1714 // series of such operations. This is just like doing short division but we
1715 // are using base 2^32 instead of base 10.
1716 assert(n != 0 && "Divide by zero?");
1717 if (n == 1) {
Chris Lattner77527f52009-01-21 18:09:24 +00001718 unsigned divisor = V[0];
1719 unsigned remainder = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001720 for (int i = m+n-1; i >= 0; i--) {
1721 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1722 if (partial_dividend == 0) {
1723 Q[i] = 0;
1724 remainder = 0;
1725 } else if (partial_dividend < divisor) {
1726 Q[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001727 remainder = (unsigned)partial_dividend;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001728 } else if (partial_dividend == divisor) {
1729 Q[i] = 1;
1730 remainder = 0;
1731 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001732 Q[i] = (unsigned)(partial_dividend / divisor);
1733 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001734 }
1735 }
1736 if (R)
1737 R[0] = remainder;
1738 } else {
1739 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1740 // case n > 1.
1741 KnuthDiv(U, V, Q, R, m, n);
1742 }
1743
1744 // If the caller wants the quotient
1745 if (Quotient) {
1746 // Set up the Quotient value's memory.
1747 if (Quotient->BitWidth != LHS.BitWidth) {
1748 if (Quotient->isSingleWord())
1749 Quotient->VAL = 0;
1750 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001751 delete [] Quotient->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001752 Quotient->BitWidth = LHS.BitWidth;
1753 if (!Quotient->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001754 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001755 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001756 Quotient->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001757
Eric Christopher820256b2009-08-21 04:06:45 +00001758 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001759 // order words.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001760 // This case is currently dead as all users of divide() handle trivial cases
1761 // earlier.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001762 if (lhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001763 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001764 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1765 if (Quotient->isSingleWord())
1766 Quotient->VAL = tmp;
1767 else
1768 Quotient->pVal[0] = tmp;
1769 } else {
1770 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1771 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001772 Quotient->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001773 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1774 }
1775 }
1776
1777 // If the caller wants the remainder
1778 if (Remainder) {
1779 // Set up the Remainder value's memory.
1780 if (Remainder->BitWidth != RHS.BitWidth) {
1781 if (Remainder->isSingleWord())
1782 Remainder->VAL = 0;
1783 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001784 delete [] Remainder->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001785 Remainder->BitWidth = RHS.BitWidth;
1786 if (!Remainder->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001787 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001788 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001789 Remainder->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001790
1791 // The remainder is in R. Reconstitute the remainder into Remainder's low
1792 // order words.
1793 if (rhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001794 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001795 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1796 if (Remainder->isSingleWord())
1797 Remainder->VAL = tmp;
1798 else
1799 Remainder->pVal[0] = tmp;
1800 } else {
1801 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1802 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001803 Remainder->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001804 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1805 }
1806 }
1807
1808 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001809 if (U != &SPACE[0]) {
1810 delete [] U;
1811 delete [] V;
1812 delete [] Q;
1813 delete [] R;
1814 }
Reid Spencer100502d2007-02-17 03:16:00 +00001815}
1816
Reid Spencer1d072122007-02-16 22:36:51 +00001817APInt APInt::udiv(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001818 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001819
1820 // First, deal with the easy case
1821 if (isSingleWord()) {
1822 assert(RHS.VAL != 0 && "Divide by zero?");
1823 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001824 }
Reid Spencer39867762007-02-17 02:07:07 +00001825
Reid Spencer39867762007-02-17 02:07:07 +00001826 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner77527f52009-01-21 18:09:24 +00001827 unsigned rhsBits = RHS.getActiveBits();
1828 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001829 assert(rhsWords && "Divided by zero???");
Chris Lattner77527f52009-01-21 18:09:24 +00001830 unsigned lhsBits = this->getActiveBits();
1831 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001832
1833 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001834 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001835 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001836 return APInt(BitWidth, 0);
Reid Spencer58a6a432007-02-21 08:21:52 +00001837 else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001838 // X / Y ===> 0, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001839 return APInt(BitWidth, 0);
1840 } else if (*this == RHS) {
1841 // X / X ===> 1
1842 return APInt(BitWidth, 1);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001843 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001844 // All high words are zero, just use native divide
Reid Spencer58a6a432007-02-21 08:21:52 +00001845 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001846 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001847
1848 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1849 APInt Quotient(1,0); // to hold result.
Craig Topperc10719f2014-04-07 04:17:22 +00001850 divide(*this, lhsWords, RHS, rhsWords, &Quotient, nullptr);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001851 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001852}
1853
Jakub Staszak6605c602013-02-20 00:17:42 +00001854APInt APInt::sdiv(const APInt &RHS) const {
1855 if (isNegative()) {
1856 if (RHS.isNegative())
1857 return (-(*this)).udiv(-RHS);
1858 return -((-(*this)).udiv(RHS));
1859 }
1860 if (RHS.isNegative())
1861 return -(this->udiv(-RHS));
1862 return this->udiv(RHS);
1863}
1864
Reid Spencer1d072122007-02-16 22:36:51 +00001865APInt APInt::urem(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001866 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001867 if (isSingleWord()) {
1868 assert(RHS.VAL != 0 && "Remainder by zero?");
1869 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001870 }
Reid Spencer39867762007-02-17 02:07:07 +00001871
Reid Spencer58a6a432007-02-21 08:21:52 +00001872 // Get some facts about the LHS
Chris Lattner77527f52009-01-21 18:09:24 +00001873 unsigned lhsBits = getActiveBits();
1874 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001875
1876 // Get some facts about the RHS
Chris Lattner77527f52009-01-21 18:09:24 +00001877 unsigned rhsBits = RHS.getActiveBits();
1878 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001879 assert(rhsWords && "Performing remainder operation by zero ???");
1880
Reid Spencer39867762007-02-17 02:07:07 +00001881 // Check the degenerate cases
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001882 if (lhsWords == 0) {
Reid Spencer58a6a432007-02-21 08:21:52 +00001883 // 0 % Y ===> 0
1884 return APInt(BitWidth, 0);
1885 } else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001886 // X % Y ===> X, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001887 return *this;
1888 } else if (*this == RHS) {
Reid Spencer39867762007-02-17 02:07:07 +00001889 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001890 return APInt(BitWidth, 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001891 } else if (lhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001892 // All high words are zero, just use native remainder
Reid Spencer58a6a432007-02-21 08:21:52 +00001893 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001894 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001895
Reid Spencer4c50b522007-05-13 23:44:59 +00001896 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001897 APInt Remainder(1,0);
Craig Topperc10719f2014-04-07 04:17:22 +00001898 divide(*this, lhsWords, RHS, rhsWords, nullptr, &Remainder);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001899 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001900}
Reid Spencer100502d2007-02-17 03:16:00 +00001901
Jakub Staszak6605c602013-02-20 00:17:42 +00001902APInt APInt::srem(const APInt &RHS) const {
1903 if (isNegative()) {
1904 if (RHS.isNegative())
1905 return -((-(*this)).urem(-RHS));
1906 return -((-(*this)).urem(RHS));
1907 }
1908 if (RHS.isNegative())
1909 return this->urem(-RHS);
1910 return this->urem(RHS);
1911}
1912
Eric Christopher820256b2009-08-21 04:06:45 +00001913void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00001914 APInt &Quotient, APInt &Remainder) {
David Majnemer7f039202014-12-14 09:41:56 +00001915 assert(LHS.BitWidth == RHS.BitWidth && "Bit widths must be the same");
1916
1917 // First, deal with the easy case
1918 if (LHS.isSingleWord()) {
1919 assert(RHS.VAL != 0 && "Divide by zero?");
1920 uint64_t QuotVal = LHS.VAL / RHS.VAL;
1921 uint64_t RemVal = LHS.VAL % RHS.VAL;
1922 Quotient = APInt(LHS.BitWidth, QuotVal);
1923 Remainder = APInt(LHS.BitWidth, RemVal);
1924 return;
1925 }
1926
Reid Spencer4c50b522007-05-13 23:44:59 +00001927 // Get some size facts about the dividend and divisor
Chris Lattner77527f52009-01-21 18:09:24 +00001928 unsigned lhsBits = LHS.getActiveBits();
1929 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
1930 unsigned rhsBits = RHS.getActiveBits();
1931 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer4c50b522007-05-13 23:44:59 +00001932
1933 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001934 if (lhsWords == 0) {
Reid Spencer4c50b522007-05-13 23:44:59 +00001935 Quotient = 0; // 0 / Y ===> 0
1936 Remainder = 0; // 0 % Y ===> 0
1937 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001938 }
1939
1940 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001941 Remainder = LHS; // X % Y ===> X, iff X < Y
1942 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00001943 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001944 }
1945
Reid Spencer4c50b522007-05-13 23:44:59 +00001946 if (LHS == RHS) {
1947 Quotient = 1; // X / X ===> 1
1948 Remainder = 0; // X % X ===> 0;
1949 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001950 }
1951
Reid Spencer4c50b522007-05-13 23:44:59 +00001952 if (lhsWords == 1 && rhsWords == 1) {
1953 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001954 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
1955 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
1956 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
1957 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer4c50b522007-05-13 23:44:59 +00001958 return;
1959 }
1960
1961 // Okay, lets do it the long way
1962 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
1963}
1964
Jakub Staszak6605c602013-02-20 00:17:42 +00001965void APInt::sdivrem(const APInt &LHS, const APInt &RHS,
1966 APInt &Quotient, APInt &Remainder) {
1967 if (LHS.isNegative()) {
1968 if (RHS.isNegative())
1969 APInt::udivrem(-LHS, -RHS, Quotient, Remainder);
1970 else {
1971 APInt::udivrem(-LHS, RHS, Quotient, Remainder);
1972 Quotient = -Quotient;
1973 }
1974 Remainder = -Remainder;
1975 } else if (RHS.isNegative()) {
1976 APInt::udivrem(LHS, -RHS, Quotient, Remainder);
1977 Quotient = -Quotient;
1978 } else {
1979 APInt::udivrem(LHS, RHS, Quotient, Remainder);
1980 }
1981}
1982
Chris Lattner2c819b02010-10-13 23:54:10 +00001983APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001984 APInt Res = *this+RHS;
1985 Overflow = isNonNegative() == RHS.isNonNegative() &&
1986 Res.isNonNegative() != isNonNegative();
1987 return Res;
1988}
1989
Chris Lattner698661c2010-10-14 00:05:07 +00001990APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
1991 APInt Res = *this+RHS;
1992 Overflow = Res.ult(RHS);
1993 return Res;
1994}
1995
Chris Lattner2c819b02010-10-13 23:54:10 +00001996APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001997 APInt Res = *this - RHS;
1998 Overflow = isNonNegative() != RHS.isNonNegative() &&
1999 Res.isNonNegative() != isNonNegative();
2000 return Res;
2001}
2002
Chris Lattner698661c2010-10-14 00:05:07 +00002003APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00002004 APInt Res = *this-RHS;
2005 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00002006 return Res;
2007}
2008
Chris Lattner2c819b02010-10-13 23:54:10 +00002009APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002010 // MININT/-1 --> overflow.
2011 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2012 return sdiv(RHS);
2013}
2014
Chris Lattner2c819b02010-10-13 23:54:10 +00002015APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002016 APInt Res = *this * RHS;
2017
2018 if (*this != 0 && RHS != 0)
2019 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2020 else
2021 Overflow = false;
2022 return Res;
2023}
2024
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00002025APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2026 APInt Res = *this * RHS;
2027
2028 if (*this != 0 && RHS != 0)
2029 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2030 else
2031 Overflow = false;
2032 return Res;
2033}
2034
David Majnemera2521382014-10-13 21:48:30 +00002035APInt APInt::sshl_ov(const APInt &ShAmt, bool &Overflow) const {
2036 Overflow = ShAmt.uge(getBitWidth());
Chris Lattner79bdd882010-10-13 23:46:33 +00002037 if (Overflow)
David Majnemera2521382014-10-13 21:48:30 +00002038 return APInt(BitWidth, 0);
Chris Lattner79bdd882010-10-13 23:46:33 +00002039
2040 if (isNonNegative()) // Don't allow sign change.
David Majnemera2521382014-10-13 21:48:30 +00002041 Overflow = ShAmt.uge(countLeadingZeros());
Chris Lattner79bdd882010-10-13 23:46:33 +00002042 else
David Majnemera2521382014-10-13 21:48:30 +00002043 Overflow = ShAmt.uge(countLeadingOnes());
Chris Lattner79bdd882010-10-13 23:46:33 +00002044
2045 return *this << ShAmt;
2046}
2047
David Majnemera2521382014-10-13 21:48:30 +00002048APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const {
2049 Overflow = ShAmt.uge(getBitWidth());
2050 if (Overflow)
2051 return APInt(BitWidth, 0);
2052
2053 Overflow = ShAmt.ugt(countLeadingZeros());
2054
2055 return *this << ShAmt;
2056}
2057
Chris Lattner79bdd882010-10-13 23:46:33 +00002058
2059
2060
Benjamin Kramer92d89982010-07-14 22:38:02 +00002061void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00002062 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002063 assert(!str.empty() && "Invalid string length");
Douglas Gregor663c0682011-09-14 15:54:46 +00002064 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2065 radix == 36) &&
2066 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002067
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002068 StringRef::iterator p = str.begin();
2069 size_t slen = str.size();
2070 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002071 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002072 p++;
2073 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00002074 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002075 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00002076 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002077 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2078 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002079 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2080 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00002081
2082 // Allocate memory
2083 if (!isSingleWord())
2084 pVal = getClearedMemory(getNumWords());
2085
2086 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00002087 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00002088
2089 // Set up an APInt for the digit to add outside the loop so we don't
2090 // constantly construct/destruct it.
2091 APInt apdigit(getBitWidth(), 0);
2092 APInt apradix(getBitWidth(), radix);
2093
2094 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002095 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00002096 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00002097 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00002098
Reid Spencera93c9812007-05-16 19:18:22 +00002099 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002100 if (slen > 1) {
2101 if (shift)
2102 *this <<= shift;
2103 else
2104 *this *= apradix;
2105 }
Reid Spencer1ba83352007-02-21 03:55:44 +00002106
2107 // Add in the digit we just interpreted
Reid Spencer632ebdf2007-02-24 20:19:37 +00002108 if (apdigit.isSingleWord())
2109 apdigit.VAL = digit;
2110 else
2111 apdigit.pVal[0] = digit;
Reid Spencer1ba83352007-02-21 03:55:44 +00002112 *this += apdigit;
Reid Spencer100502d2007-02-17 03:16:00 +00002113 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002114 // If its negative, put it in two's complement form
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00002115 if (isNeg) {
Jakub Staszak773be0c2013-03-20 23:56:19 +00002116 --(*this);
Jay Foad25a5e4c2010-12-01 08:53:58 +00002117 this->flipAllBits();
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002118 }
Reid Spencer100502d2007-02-17 03:16:00 +00002119}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002120
Chris Lattner17f71652008-08-17 07:19:36 +00002121void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002122 bool Signed, bool formatAsCLiteral) const {
Douglas Gregor663c0682011-09-14 15:54:46 +00002123 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2124 Radix == 36) &&
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002125 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopher820256b2009-08-21 04:06:45 +00002126
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002127 const char *Prefix = "";
2128 if (formatAsCLiteral) {
2129 switch (Radix) {
2130 case 2:
2131 // Binary literals are a non-standard extension added in gcc 4.3:
2132 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2133 Prefix = "0b";
2134 break;
2135 case 8:
2136 Prefix = "0";
2137 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002138 case 10:
2139 break; // No prefix
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002140 case 16:
2141 Prefix = "0x";
2142 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002143 default:
2144 llvm_unreachable("Invalid radix!");
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002145 }
2146 }
2147
Chris Lattner17f71652008-08-17 07:19:36 +00002148 // First, check for a zero value and just short circuit the logic below.
2149 if (*this == 0) {
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002150 while (*Prefix) {
2151 Str.push_back(*Prefix);
2152 ++Prefix;
2153 };
Chris Lattner17f71652008-08-17 07:19:36 +00002154 Str.push_back('0');
2155 return;
2156 }
Eric Christopher820256b2009-08-21 04:06:45 +00002157
Douglas Gregor663c0682011-09-14 15:54:46 +00002158 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopher820256b2009-08-21 04:06:45 +00002159
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002160 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002161 char Buffer[65];
2162 char *BufPtr = Buffer+65;
Eric Christopher820256b2009-08-21 04:06:45 +00002163
Chris Lattner17f71652008-08-17 07:19:36 +00002164 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002165 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002166 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002167 } else {
2168 int64_t I = getSExtValue();
2169 if (I >= 0) {
2170 N = I;
2171 } else {
2172 Str.push_back('-');
2173 N = -(uint64_t)I;
2174 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002175 }
Eric Christopher820256b2009-08-21 04:06:45 +00002176
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002177 while (*Prefix) {
2178 Str.push_back(*Prefix);
2179 ++Prefix;
2180 };
2181
Chris Lattner17f71652008-08-17 07:19:36 +00002182 while (N) {
2183 *--BufPtr = Digits[N % Radix];
2184 N /= Radix;
2185 }
2186 Str.append(BufPtr, Buffer+65);
2187 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002188 }
2189
Chris Lattner17f71652008-08-17 07:19:36 +00002190 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002191
Chris Lattner17f71652008-08-17 07:19:36 +00002192 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002193 // They want to print the signed version and it is a negative value
2194 // Flip the bits and add one to turn it into the equivalent positive
2195 // value and put a '-' in the result.
Jay Foad25a5e4c2010-12-01 08:53:58 +00002196 Tmp.flipAllBits();
Jakub Staszak773be0c2013-03-20 23:56:19 +00002197 ++Tmp;
Chris Lattner17f71652008-08-17 07:19:36 +00002198 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002199 }
Eric Christopher820256b2009-08-21 04:06:45 +00002200
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002201 while (*Prefix) {
2202 Str.push_back(*Prefix);
2203 ++Prefix;
2204 };
2205
Chris Lattner17f71652008-08-17 07:19:36 +00002206 // We insert the digits backward, then reverse them to get the right order.
2207 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002208
2209 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2210 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattner17f71652008-08-17 07:19:36 +00002211 // equaly. We just shift until the value is zero.
Douglas Gregor663c0682011-09-14 15:54:46 +00002212 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattner17f71652008-08-17 07:19:36 +00002213 // Just shift tmp right for each digit width until it becomes zero
2214 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2215 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002216
Chris Lattner17f71652008-08-17 07:19:36 +00002217 while (Tmp != 0) {
2218 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2219 Str.push_back(Digits[Digit]);
2220 Tmp = Tmp.lshr(ShiftAmt);
2221 }
2222 } else {
Douglas Gregor663c0682011-09-14 15:54:46 +00002223 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattner17f71652008-08-17 07:19:36 +00002224 while (Tmp != 0) {
2225 APInt APdigit(1, 0);
2226 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopher820256b2009-08-21 04:06:45 +00002227 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattner17f71652008-08-17 07:19:36 +00002228 &APdigit);
Chris Lattner77527f52009-01-21 18:09:24 +00002229 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner17f71652008-08-17 07:19:36 +00002230 assert(Digit < Radix && "divide failed");
2231 Str.push_back(Digits[Digit]);
2232 Tmp = tmp2;
2233 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002234 }
Eric Christopher820256b2009-08-21 04:06:45 +00002235
Chris Lattner17f71652008-08-17 07:19:36 +00002236 // Reverse the digits before returning.
2237 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002238}
2239
Pawel Bylica6eeeac72015-04-06 13:31:39 +00002240/// Returns the APInt as a std::string. Note that this is an inefficient method.
2241/// It is better to pass in a SmallVector/SmallString to the methods above.
Chris Lattner17f71652008-08-17 07:19:36 +00002242std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2243 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002244 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002245 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002246}
Chris Lattner6b695682007-08-16 15:56:55 +00002247
Chris Lattner17f71652008-08-17 07:19:36 +00002248
Yaron Kereneb2a2542016-01-29 20:50:44 +00002249LLVM_DUMP_METHOD void APInt::dump() const {
Chris Lattner17f71652008-08-17 07:19:36 +00002250 SmallString<40> S, U;
2251 this->toStringUnsigned(U);
2252 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002253 dbgs() << "APInt(" << BitWidth << "b, "
Yaron Keren09fb7c62015-03-10 07:33:23 +00002254 << U << "u " << S << "s)";
Chris Lattner17f71652008-08-17 07:19:36 +00002255}
2256
Chris Lattner0c19df42008-08-23 22:23:09 +00002257void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002258 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002259 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Yaron Keren92e1b622015-03-18 10:17:07 +00002260 OS << S;
Chris Lattner17f71652008-08-17 07:19:36 +00002261}
2262
Chris Lattner6b695682007-08-16 15:56:55 +00002263// This implements a variety of operations on a representation of
2264// arbitrary precision, two's-complement, bignum integer values.
2265
Chris Lattner96cffa62009-08-23 23:11:28 +00002266// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2267// and unrestricting assumption.
Benjamin Kramer7000ca32014-10-12 17:56:40 +00002268static_assert(integerPartWidth % 2 == 0, "Part width must be divisible by 2!");
Chris Lattner6b695682007-08-16 15:56:55 +00002269
2270/* Some handy functions local to this file. */
2271namespace {
2272
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002273 /* Returns the integer part with the least significant BITS set.
2274 BITS cannot be zero. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002275 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002276 lowBitMask(unsigned int bits)
2277 {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002278 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002279
2280 return ~(integerPart) 0 >> (integerPartWidth - bits);
2281 }
2282
Neil Boothc8b650a2007-10-06 00:43:45 +00002283 /* Returns the value of the lower half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002284 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002285 lowHalf(integerPart part)
2286 {
2287 return part & lowBitMask(integerPartWidth / 2);
2288 }
2289
Neil Boothc8b650a2007-10-06 00:43:45 +00002290 /* Returns the value of the upper half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002291 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002292 highHalf(integerPart part)
2293 {
2294 return part >> (integerPartWidth / 2);
2295 }
2296
Neil Boothc8b650a2007-10-06 00:43:45 +00002297 /* Returns the bit number of the most significant set bit of a part.
2298 If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002299 static unsigned int
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002300 partMSB(integerPart value)
Chris Lattner6b695682007-08-16 15:56:55 +00002301 {
Benjamin Kramerb565f892013-06-01 11:26:39 +00002302 return findLastSet(value, ZB_Max);
Chris Lattner6b695682007-08-16 15:56:55 +00002303 }
2304
Neil Boothc8b650a2007-10-06 00:43:45 +00002305 /* Returns the bit number of the least significant set bit of a
2306 part. If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002307 static unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002308 partLSB(integerPart value)
2309 {
Benjamin Kramerb565f892013-06-01 11:26:39 +00002310 return findFirstSet(value, ZB_Max);
Chris Lattner6b695682007-08-16 15:56:55 +00002311 }
Alexander Kornienkof00654e2015-06-23 09:49:53 +00002312}
Chris Lattner6b695682007-08-16 15:56:55 +00002313
2314/* Sets the least significant part of a bignum to the input value, and
2315 zeroes out higher parts. */
2316void
2317APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2318{
2319 unsigned int i;
2320
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002321 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002322
Chris Lattner6b695682007-08-16 15:56:55 +00002323 dst[0] = part;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002324 for (i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002325 dst[i] = 0;
2326}
2327
2328/* Assign one bignum to another. */
2329void
2330APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2331{
2332 unsigned int i;
2333
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002334 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002335 dst[i] = src[i];
2336}
2337
2338/* Returns true if a bignum is zero, false otherwise. */
2339bool
2340APInt::tcIsZero(const integerPart *src, unsigned int parts)
2341{
2342 unsigned int i;
2343
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002344 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002345 if (src[i])
2346 return false;
2347
2348 return true;
2349}
2350
2351/* Extract the given bit of a bignum; returns 0 or 1. */
2352int
2353APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2354{
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002355 return (parts[bit / integerPartWidth] &
2356 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002357}
2358
John McCalldcb9a7a2010-02-28 02:51:25 +00002359/* Set the given bit of a bignum. */
Chris Lattner6b695682007-08-16 15:56:55 +00002360void
2361APInt::tcSetBit(integerPart *parts, unsigned int bit)
2362{
2363 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2364}
2365
John McCalldcb9a7a2010-02-28 02:51:25 +00002366/* Clears the given bit of a bignum. */
2367void
2368APInt::tcClearBit(integerPart *parts, unsigned int bit)
2369{
2370 parts[bit / integerPartWidth] &=
2371 ~((integerPart) 1 << (bit % integerPartWidth));
2372}
2373
Neil Boothc8b650a2007-10-06 00:43:45 +00002374/* Returns the bit number of the least significant set bit of a
2375 number. If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002376unsigned int
2377APInt::tcLSB(const integerPart *parts, unsigned int n)
2378{
2379 unsigned int i, lsb;
2380
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002381 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002382 if (parts[i] != 0) {
2383 lsb = partLSB(parts[i]);
2384
2385 return lsb + i * integerPartWidth;
2386 }
2387 }
2388
2389 return -1U;
2390}
2391
Neil Boothc8b650a2007-10-06 00:43:45 +00002392/* Returns the bit number of the most significant set bit of a number.
2393 If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002394unsigned int
2395APInt::tcMSB(const integerPart *parts, unsigned int n)
2396{
2397 unsigned int msb;
2398
2399 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002400 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002401
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002402 if (parts[n] != 0) {
2403 msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002404
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002405 return msb + n * integerPartWidth;
2406 }
Chris Lattner6b695682007-08-16 15:56:55 +00002407 } while (n);
2408
2409 return -1U;
2410}
2411
Neil Boothb6182162007-10-08 13:47:12 +00002412/* Copy the bit vector of width srcBITS from SRC, starting at bit
2413 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2414 the least significant bit of DST. All high bits above srcBITS in
2415 DST are zero-filled. */
2416void
Evan Chengdb338f32009-05-21 23:47:47 +00002417APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Boothb6182162007-10-08 13:47:12 +00002418 unsigned int srcBits, unsigned int srcLSB)
2419{
2420 unsigned int firstSrcPart, dstParts, shift, n;
2421
2422 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002423 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002424
2425 firstSrcPart = srcLSB / integerPartWidth;
2426 tcAssign (dst, src + firstSrcPart, dstParts);
2427
2428 shift = srcLSB % integerPartWidth;
2429 tcShiftRight (dst, dstParts, shift);
2430
2431 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2432 in DST. If this is less that srcBits, append the rest, else
2433 clear the high bits. */
2434 n = dstParts * integerPartWidth - shift;
2435 if (n < srcBits) {
2436 integerPart mask = lowBitMask (srcBits - n);
2437 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2438 << n % integerPartWidth);
2439 } else if (n > srcBits) {
Neil Booth7e74b172007-10-12 15:31:31 +00002440 if (srcBits % integerPartWidth)
2441 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Boothb6182162007-10-08 13:47:12 +00002442 }
2443
2444 /* Clear high parts. */
2445 while (dstParts < dstCount)
2446 dst[dstParts++] = 0;
2447}
2448
Chris Lattner6b695682007-08-16 15:56:55 +00002449/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2450integerPart
2451APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2452 integerPart c, unsigned int parts)
2453{
2454 unsigned int i;
2455
2456 assert(c <= 1);
2457
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002458 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002459 integerPart l;
2460
2461 l = dst[i];
2462 if (c) {
2463 dst[i] += rhs[i] + 1;
2464 c = (dst[i] <= l);
2465 } else {
2466 dst[i] += rhs[i];
2467 c = (dst[i] < l);
2468 }
2469 }
2470
2471 return c;
2472}
2473
2474/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2475integerPart
2476APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2477 integerPart c, unsigned int parts)
2478{
2479 unsigned int i;
2480
2481 assert(c <= 1);
2482
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002483 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002484 integerPart l;
2485
2486 l = dst[i];
2487 if (c) {
2488 dst[i] -= rhs[i] + 1;
2489 c = (dst[i] >= l);
2490 } else {
2491 dst[i] -= rhs[i];
2492 c = (dst[i] > l);
2493 }
2494 }
2495
2496 return c;
2497}
2498
2499/* Negate a bignum in-place. */
2500void
2501APInt::tcNegate(integerPart *dst, unsigned int parts)
2502{
2503 tcComplement(dst, parts);
2504 tcIncrement(dst, parts);
2505}
2506
Neil Boothc8b650a2007-10-06 00:43:45 +00002507/* DST += SRC * MULTIPLIER + CARRY if add is true
2508 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002509
2510 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2511 they must start at the same point, i.e. DST == SRC.
2512
2513 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2514 returned. Otherwise DST is filled with the least significant
2515 DSTPARTS parts of the result, and if all of the omitted higher
2516 parts were zero return zero, otherwise overflow occurred and
2517 return one. */
2518int
2519APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2520 integerPart multiplier, integerPart carry,
2521 unsigned int srcParts, unsigned int dstParts,
2522 bool add)
2523{
2524 unsigned int i, n;
2525
2526 /* Otherwise our writes of DST kill our later reads of SRC. */
2527 assert(dst <= src || dst >= src + srcParts);
2528 assert(dstParts <= srcParts + 1);
2529
2530 /* N loops; minimum of dstParts and srcParts. */
2531 n = dstParts < srcParts ? dstParts: srcParts;
2532
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002533 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002534 integerPart low, mid, high, srcPart;
2535
2536 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2537
2538 This cannot overflow, because
2539
2540 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2541
2542 which is less than n^2. */
2543
2544 srcPart = src[i];
2545
2546 if (multiplier == 0 || srcPart == 0) {
2547 low = carry;
2548 high = 0;
2549 } else {
2550 low = lowHalf(srcPart) * lowHalf(multiplier);
2551 high = highHalf(srcPart) * highHalf(multiplier);
2552
2553 mid = lowHalf(srcPart) * highHalf(multiplier);
2554 high += highHalf(mid);
2555 mid <<= integerPartWidth / 2;
2556 if (low + mid < low)
2557 high++;
2558 low += mid;
2559
2560 mid = highHalf(srcPart) * lowHalf(multiplier);
2561 high += highHalf(mid);
2562 mid <<= integerPartWidth / 2;
2563 if (low + mid < low)
2564 high++;
2565 low += mid;
2566
2567 /* Now add carry. */
2568 if (low + carry < low)
2569 high++;
2570 low += carry;
2571 }
2572
2573 if (add) {
2574 /* And now DST[i], and store the new low part there. */
2575 if (low + dst[i] < low)
2576 high++;
2577 dst[i] += low;
2578 } else
2579 dst[i] = low;
2580
2581 carry = high;
2582 }
2583
2584 if (i < dstParts) {
2585 /* Full multiplication, there is no overflow. */
2586 assert(i + 1 == dstParts);
2587 dst[i] = carry;
2588 return 0;
2589 } else {
2590 /* We overflowed if there is carry. */
2591 if (carry)
2592 return 1;
2593
2594 /* We would overflow if any significant unwritten parts would be
2595 non-zero. This is true if any remaining src parts are non-zero
2596 and the multiplier is non-zero. */
2597 if (multiplier)
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002598 for (; i < srcParts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002599 if (src[i])
2600 return 1;
2601
2602 /* We fitted in the narrow destination. */
2603 return 0;
2604 }
2605}
2606
2607/* DST = LHS * RHS, where DST has the same width as the operands and
2608 is filled with the least significant parts of the result. Returns
2609 one if overflow occurred, otherwise zero. DST must be disjoint
2610 from both operands. */
2611int
2612APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2613 const integerPart *rhs, unsigned int parts)
2614{
2615 unsigned int i;
2616 int overflow;
2617
2618 assert(dst != lhs && dst != rhs);
2619
2620 overflow = 0;
2621 tcSet(dst, 0, parts);
2622
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002623 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002624 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2625 parts - i, true);
2626
2627 return overflow;
2628}
2629
Neil Booth0ea72a92007-10-06 00:24:48 +00002630/* DST = LHS * RHS, where DST has width the sum of the widths of the
2631 operands. No overflow occurs. DST must be disjoint from both
2632 operands. Returns the number of parts required to hold the
2633 result. */
2634unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002635APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth0ea72a92007-10-06 00:24:48 +00002636 const integerPart *rhs, unsigned int lhsParts,
2637 unsigned int rhsParts)
Chris Lattner6b695682007-08-16 15:56:55 +00002638{
Neil Booth0ea72a92007-10-06 00:24:48 +00002639 /* Put the narrower number on the LHS for less loops below. */
2640 if (lhsParts > rhsParts) {
2641 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2642 } else {
2643 unsigned int n;
Chris Lattner6b695682007-08-16 15:56:55 +00002644
Neil Booth0ea72a92007-10-06 00:24:48 +00002645 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002646
Neil Booth0ea72a92007-10-06 00:24:48 +00002647 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002648
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002649 for (n = 0; n < lhsParts; n++)
Neil Booth0ea72a92007-10-06 00:24:48 +00002650 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002651
Neil Booth0ea72a92007-10-06 00:24:48 +00002652 n = lhsParts + rhsParts;
2653
2654 return n - (dst[n - 1] == 0);
2655 }
Chris Lattner6b695682007-08-16 15:56:55 +00002656}
2657
2658/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2659 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2660 set REMAINDER to the remainder, return zero. i.e.
2661
2662 OLD_LHS = RHS * LHS + REMAINDER
2663
2664 SCRATCH is a bignum of the same size as the operands and result for
2665 use by the routine; its contents need not be initialized and are
2666 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2667*/
2668int
2669APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2670 integerPart *remainder, integerPart *srhs,
2671 unsigned int parts)
2672{
2673 unsigned int n, shiftCount;
2674 integerPart mask;
2675
2676 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2677
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002678 shiftCount = tcMSB(rhs, parts) + 1;
2679 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002680 return true;
2681
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002682 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattner6b695682007-08-16 15:56:55 +00002683 n = shiftCount / integerPartWidth;
2684 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2685
2686 tcAssign(srhs, rhs, parts);
2687 tcShiftLeft(srhs, parts, shiftCount);
2688 tcAssign(remainder, lhs, parts);
2689 tcSet(lhs, 0, parts);
2690
2691 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2692 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002693 for (;;) {
Chris Lattner6b695682007-08-16 15:56:55 +00002694 int compare;
2695
2696 compare = tcCompare(remainder, srhs, parts);
2697 if (compare >= 0) {
2698 tcSubtract(remainder, srhs, 0, parts);
2699 lhs[n] |= mask;
2700 }
2701
2702 if (shiftCount == 0)
2703 break;
2704 shiftCount--;
2705 tcShiftRight(srhs, parts, 1);
Richard Trieu7a083812016-02-18 22:09:30 +00002706 if ((mask >>= 1) == 0) {
2707 mask = (integerPart) 1 << (integerPartWidth - 1);
2708 n--;
2709 }
Chris Lattner6b695682007-08-16 15:56:55 +00002710 }
2711
2712 return false;
2713}
2714
2715/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2716 There are no restrictions on COUNT. */
2717void
2718APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2719{
Neil Boothb6182162007-10-08 13:47:12 +00002720 if (count) {
2721 unsigned int jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002722
Neil Boothb6182162007-10-08 13:47:12 +00002723 /* Jump is the inter-part jump; shift is is intra-part shift. */
2724 jump = count / integerPartWidth;
2725 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002726
Neil Boothb6182162007-10-08 13:47:12 +00002727 while (parts > jump) {
2728 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002729
Neil Boothb6182162007-10-08 13:47:12 +00002730 parts--;
Chris Lattner6b695682007-08-16 15:56:55 +00002731
Neil Boothb6182162007-10-08 13:47:12 +00002732 /* dst[i] comes from the two parts src[i - jump] and, if we have
2733 an intra-part shift, src[i - jump - 1]. */
2734 part = dst[parts - jump];
2735 if (shift) {
2736 part <<= shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002737 if (parts >= jump + 1)
2738 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2739 }
2740
Neil Boothb6182162007-10-08 13:47:12 +00002741 dst[parts] = part;
2742 }
Chris Lattner6b695682007-08-16 15:56:55 +00002743
Neil Boothb6182162007-10-08 13:47:12 +00002744 while (parts > 0)
2745 dst[--parts] = 0;
2746 }
Chris Lattner6b695682007-08-16 15:56:55 +00002747}
2748
2749/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2750 zero. There are no restrictions on COUNT. */
2751void
2752APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2753{
Neil Boothb6182162007-10-08 13:47:12 +00002754 if (count) {
2755 unsigned int i, jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002756
Neil Boothb6182162007-10-08 13:47:12 +00002757 /* Jump is the inter-part jump; shift is is intra-part shift. */
2758 jump = count / integerPartWidth;
2759 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002760
Neil Boothb6182162007-10-08 13:47:12 +00002761 /* Perform the shift. This leaves the most significant COUNT bits
2762 of the result at zero. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002763 for (i = 0; i < parts; i++) {
Neil Boothb6182162007-10-08 13:47:12 +00002764 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002765
Neil Boothb6182162007-10-08 13:47:12 +00002766 if (i + jump >= parts) {
2767 part = 0;
2768 } else {
2769 part = dst[i + jump];
2770 if (shift) {
2771 part >>= shift;
2772 if (i + jump + 1 < parts)
2773 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2774 }
Chris Lattner6b695682007-08-16 15:56:55 +00002775 }
Chris Lattner6b695682007-08-16 15:56:55 +00002776
Neil Boothb6182162007-10-08 13:47:12 +00002777 dst[i] = part;
2778 }
Chris Lattner6b695682007-08-16 15:56:55 +00002779 }
2780}
2781
2782/* Bitwise and of two bignums. */
2783void
2784APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2785{
2786 unsigned int i;
2787
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002788 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002789 dst[i] &= rhs[i];
2790}
2791
2792/* Bitwise inclusive or of two bignums. */
2793void
2794APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2795{
2796 unsigned int i;
2797
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002798 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002799 dst[i] |= rhs[i];
2800}
2801
2802/* Bitwise exclusive or of two bignums. */
2803void
2804APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2805{
2806 unsigned int i;
2807
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002808 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002809 dst[i] ^= rhs[i];
2810}
2811
2812/* Complement a bignum in-place. */
2813void
2814APInt::tcComplement(integerPart *dst, unsigned int parts)
2815{
2816 unsigned int i;
2817
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002818 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002819 dst[i] = ~dst[i];
2820}
2821
2822/* Comparison (unsigned) of two bignums. */
2823int
2824APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2825 unsigned int parts)
2826{
2827 while (parts) {
2828 parts--;
2829 if (lhs[parts] == rhs[parts])
2830 continue;
2831
2832 if (lhs[parts] > rhs[parts])
2833 return 1;
2834 else
2835 return -1;
2836 }
2837
2838 return 0;
2839}
2840
2841/* Increment a bignum in-place, return the carry flag. */
2842integerPart
2843APInt::tcIncrement(integerPart *dst, unsigned int parts)
2844{
2845 unsigned int i;
2846
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002847 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002848 if (++dst[i] != 0)
2849 break;
2850
2851 return i == parts;
2852}
2853
Michael Gottesman9d406f42013-05-28 19:50:20 +00002854/* Decrement a bignum in-place, return the borrow flag. */
2855integerPart
2856APInt::tcDecrement(integerPart *dst, unsigned int parts) {
2857 for (unsigned int i = 0; i < parts; i++) {
2858 // If the current word is non-zero, then the decrement has no effect on the
2859 // higher-order words of the integer and no borrow can occur. Exit early.
2860 if (dst[i]--)
2861 return 0;
2862 }
2863 // If every word was zero, then there is a borrow.
2864 return 1;
2865}
2866
2867
Chris Lattner6b695682007-08-16 15:56:55 +00002868/* Set the least significant BITS bits of a bignum, clear the
2869 rest. */
2870void
2871APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2872 unsigned int bits)
2873{
2874 unsigned int i;
2875
2876 i = 0;
2877 while (bits > integerPartWidth) {
2878 dst[i++] = ~(integerPart) 0;
2879 bits -= integerPartWidth;
2880 }
2881
2882 if (bits)
2883 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2884
2885 while (i < parts)
2886 dst[i++] = 0;
2887}