blob: 836498e6c0eae5c8e9f886aef16ff397991c6bc3 [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"
Vassil Vassilev2ec8b152016-09-14 08:55:18 +000025#include <climits>
Chris Lattner17f71652008-08-17 07:19:36 +000026#include <cmath>
Zhou Shengdac63782007-02-06 03:00:16 +000027#include <cstdlib>
Chandler Carruthed0881b2012-12-03 16:50:05 +000028#include <cstring>
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;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +000066
Douglas Gregore4e20f42011-09-20 18:11:52 +000067 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;
Craig Topperf78a6f02017-03-01 21:06:18 +000084 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +000085}
86
Chris Lattnerd57b7602008-10-11 22:07:19 +000087void APInt::initSlowCase(const APInt& that) {
88 pVal = getMemory(getNumWords());
89 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
90}
91
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000092void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +000093 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000094 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengdac63782007-02-06 03:00:16 +000095 if (isSingleWord())
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000096 VAL = bigVal[0];
Zhou Shengdac63782007-02-06 03:00:16 +000097 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000098 // Get memory, cleared to 0
99 pVal = getClearedMemory(getNumWords());
100 // Calculate the number of words to copy
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000101 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000102 // Copy the words from bigVal to pVal
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000103 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000104 }
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000105 // Make sure unused high bits are cleared
106 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000107}
108
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000109APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
110 : BitWidth(numBits), VAL(0) {
111 initFromArray(bigVal);
112}
113
114APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
115 : BitWidth(numBits), VAL(0) {
116 initFromArray(makeArrayRef(bigVal, numWords));
117}
118
Benjamin Kramer92d89982010-07-14 22:38:02 +0000119APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer1ba83352007-02-21 03:55:44 +0000120 : BitWidth(numbits), VAL(0) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000121 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000122 fromString(numbits, Str, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000123}
124
Chris Lattner1ac3e252008-08-20 17:02:31 +0000125APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000126 // Don't do anything for X = X
127 if (this == &RHS)
128 return *this;
129
Reid Spencer7c16cd22007-02-26 23:38:21 +0000130 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner1ac3e252008-08-20 17:02:31 +0000131 // assume same bit-width single-word case is already handled
132 assert(!isSingleWord());
133 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer7c16cd22007-02-26 23:38:21 +0000134 return *this;
135 }
136
Chris Lattner1ac3e252008-08-20 17:02:31 +0000137 if (isSingleWord()) {
138 // assume case where both are single words is already handled
139 assert(!RHS.isSingleWord());
140 VAL = 0;
141 pVal = getMemory(RHS.getNumWords());
142 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopher820256b2009-08-21 04:06:45 +0000143 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer7c16cd22007-02-26 23:38:21 +0000144 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
145 else if (RHS.isSingleWord()) {
146 delete [] pVal;
Reid Spencera856b6e2007-02-18 18:38:44 +0000147 VAL = RHS.VAL;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000148 } else {
149 delete [] pVal;
150 pVal = getMemory(RHS.getNumWords());
151 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
152 }
153 BitWidth = RHS.BitWidth;
154 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000155}
156
Zhou Shengdac63782007-02-06 03:00:16 +0000157APInt& APInt::operator=(uint64_t RHS) {
Eric Christopher820256b2009-08-21 04:06:45 +0000158 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000159 VAL = RHS;
Zhou Shengdac63782007-02-06 03:00:16 +0000160 else {
161 pVal[0] = RHS;
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000162 memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000163 }
Reid Spencer7c16cd22007-02-26 23:38:21 +0000164 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000165}
166
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000167/// This method 'profiles' an APInt for use with FoldingSet.
Ted Kremenek5c75d542008-01-19 04:23:33 +0000168void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek901540f2008-02-19 20:50:41 +0000169 ID.AddInteger(BitWidth);
Eric Christopher820256b2009-08-21 04:06:45 +0000170
Ted Kremenek5c75d542008-01-19 04:23:33 +0000171 if (isSingleWord()) {
172 ID.AddInteger(VAL);
173 return;
174 }
175
Chris Lattner77527f52009-01-21 18:09:24 +0000176 unsigned NumWords = getNumWords();
Ted Kremenek5c75d542008-01-19 04:23:33 +0000177 for (unsigned i = 0; i < NumWords; ++i)
178 ID.AddInteger(pVal[i]);
179}
180
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000181/// This function adds a single "digit" integer, y, to the multiple
Reid Spencera856b6e2007-02-18 18:38:44 +0000182/// "digit" integer array, x[]. x[] is modified to reflect the addition and
183/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer100502d2007-02-17 03:16:00 +0000184/// @returns the carry of the addition.
Chris Lattner77527f52009-01-21 18:09:24 +0000185static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
186 for (unsigned i = 0; i < len; ++i) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000187 dest[i] = y + x[i];
188 if (dest[i] < y)
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000189 y = 1; // Carry one to next digit.
Reid Spenceree0a6852007-02-18 06:39:42 +0000190 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000191 y = 0; // No need to carry so exit early
Reid Spenceree0a6852007-02-18 06:39:42 +0000192 break;
193 }
Reid Spencer100502d2007-02-17 03:16:00 +0000194 }
Reid Spenceree0a6852007-02-18 06:39:42 +0000195 return y;
Reid Spencer100502d2007-02-17 03:16:00 +0000196}
197
Zhou Shengdac63782007-02-06 03:00:16 +0000198/// @brief Prefix increment operator. Increments the APInt by one.
199APInt& APInt::operator++() {
Eric Christopher820256b2009-08-21 04:06:45 +0000200 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000201 ++VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000202 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000203 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000204 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000205}
206
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000207/// This function subtracts a single "digit" (64-bit word), y, from
Eric Christopher820256b2009-08-21 04:06:45 +0000208/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Joerg Sonnenbergerd7baada2017-01-05 17:59:22 +0000209/// no further borrowing is needed or it runs out of "digits" in x. The result
Reid Spencera856b6e2007-02-18 18:38:44 +0000210/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
211/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencera41e93b2007-02-25 19:32:03 +0000212/// @returns the borrow out of the subtraction
Chris Lattner77527f52009-01-21 18:09:24 +0000213static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
214 for (unsigned i = 0; i < len; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000215 uint64_t X = x[i];
Reid Spenceree0a6852007-02-18 06:39:42 +0000216 x[i] -= y;
Eric Christopher820256b2009-08-21 04:06:45 +0000217 if (y > X)
Reid Spencera856b6e2007-02-18 18:38:44 +0000218 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer100502d2007-02-17 03:16:00 +0000219 else {
Reid Spencera856b6e2007-02-18 18:38:44 +0000220 y = 0; // No need to borrow
221 break; // Remaining digits are unchanged so exit early
Reid Spencer100502d2007-02-17 03:16:00 +0000222 }
223 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000224 return bool(y);
Reid Spencer100502d2007-02-17 03:16:00 +0000225}
226
Zhou Shengdac63782007-02-06 03:00:16 +0000227/// @brief Prefix decrement operator. Decrements the APInt by one.
228APInt& APInt::operator--() {
Eric Christopher820256b2009-08-21 04:06:45 +0000229 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000230 --VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000231 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000232 sub_1(pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000233 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000234}
235
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000236/// This function adds the integer array x to the integer array Y and
Eric Christopher820256b2009-08-21 04:06:45 +0000237/// places the result in dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000238/// @returns the carry out from the addition
239/// @brief General addition of 64-bit integer arrays
Eric Christopher820256b2009-08-21 04:06:45 +0000240static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000241 unsigned len) {
Reid Spencera5e0d202007-02-24 03:58:46 +0000242 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000243 for (unsigned i = 0; i< len; ++i) {
Reid Spencercb292e42007-02-23 01:57:13 +0000244 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000245 dest[i] = x[i] + y[i] + carry;
Reid Spencerdb2abec2007-02-21 05:44:56 +0000246 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer100502d2007-02-17 03:16:00 +0000247 }
248 return carry;
249}
250
Reid Spencera41e93b2007-02-25 19:32:03 +0000251/// Adds the RHS APint to this APInt.
252/// @returns this, after addition of RHS.
Eric Christopher820256b2009-08-21 04:06:45 +0000253/// @brief Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000254APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000255 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000256 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000257 VAL += RHS.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000258 else {
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000259 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000260 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000261 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000262}
263
Pete Cooperfea21392016-07-22 20:55:46 +0000264APInt& APInt::operator+=(uint64_t RHS) {
265 if (isSingleWord())
266 VAL += RHS;
267 else
268 add_1(pVal, pVal, getNumWords(), RHS);
269 return clearUnusedBits();
270}
271
Eric Christopher820256b2009-08-21 04:06:45 +0000272/// Subtracts the integer array y from the integer array x
Reid Spencera41e93b2007-02-25 19:32:03 +0000273/// @returns returns the borrow out.
274/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopher820256b2009-08-21 04:06:45 +0000275static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000276 unsigned len) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000277 bool borrow = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000278 for (unsigned i = 0; i < len; ++i) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000279 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
280 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
281 dest[i] = x_tmp - y[i];
Reid Spencer100502d2007-02-17 03:16:00 +0000282 }
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000283 return borrow;
Reid Spencer100502d2007-02-17 03:16:00 +0000284}
285
Reid Spencera41e93b2007-02-25 19:32:03 +0000286/// Subtracts the RHS APInt from this APInt
287/// @returns this, after subtraction
Eric Christopher820256b2009-08-21 04:06:45 +0000288/// @brief Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000289APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000290 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000291 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000292 VAL -= RHS.VAL;
293 else
294 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000295 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000296}
297
Pete Cooperfea21392016-07-22 20:55:46 +0000298APInt& APInt::operator-=(uint64_t RHS) {
299 if (isSingleWord())
300 VAL -= RHS;
301 else
302 sub_1(pVal, getNumWords(), RHS);
303 return clearUnusedBits();
304}
305
Dan Gohman4a618822010-02-10 16:03:48 +0000306/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopher820256b2009-08-21 04:06:45 +0000307/// into dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000308/// @returns the carry out of the multiplication.
309/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner77527f52009-01-21 18:09:24 +0000310static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000311 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer100502d2007-02-17 03:16:00 +0000312 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencera41e93b2007-02-25 19:32:03 +0000313 uint64_t carry = 0;
314
315 // For each digit of x.
Chris Lattner77527f52009-01-21 18:09:24 +0000316 for (unsigned i = 0; i < len; ++i) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000317 // Split x into high and low words
318 uint64_t lx = x[i] & 0xffffffffULL;
319 uint64_t hx = x[i] >> 32;
320 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer100502d2007-02-17 03:16:00 +0000321 // hasCarry == 0, no carry
322 // hasCarry == 1, has carry
323 // hasCarry == 2, no carry and the calculation result == 0.
324 uint8_t hasCarry = 0;
325 dest[i] = carry + lx * ly;
326 // Determine if the add above introduces carry.
327 hasCarry = (dest[i] < carry) ? 1 : 0;
328 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopher820256b2009-08-21 04:06:45 +0000329 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer100502d2007-02-17 03:16:00 +0000330 // (2^32 - 1) + 2^32 = 2^64.
331 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
332
333 carry += (lx * hy) & 0xffffffffULL;
334 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopher820256b2009-08-21 04:06:45 +0000335 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000336 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
337 }
Reid Spencer100502d2007-02-17 03:16:00 +0000338 return carry;
339}
340
Eric Christopher820256b2009-08-21 04:06:45 +0000341/// Multiplies integer array x by integer array y and stores the result into
Reid Spencera41e93b2007-02-25 19:32:03 +0000342/// the integer array dest. Note that dest's size must be >= xlen + ylen.
343/// @brief Generalized multiplicate of integer arrays.
Chris Lattner77527f52009-01-21 18:09:24 +0000344static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
345 unsigned ylen) {
Reid Spencer100502d2007-02-17 03:16:00 +0000346 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner77527f52009-01-21 18:09:24 +0000347 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000348 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencer58a6a432007-02-21 08:21:52 +0000349 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner77527f52009-01-21 18:09:24 +0000350 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer100502d2007-02-17 03:16:00 +0000351 lx = x[j] & 0xffffffffULL;
352 hx = x[j] >> 32;
353 // hasCarry - A flag to indicate if has carry.
354 // hasCarry == 0, no carry
355 // hasCarry == 1, has carry
356 // hasCarry == 2, no carry and the calculation result == 0.
357 uint8_t hasCarry = 0;
358 uint64_t resul = carry + lx * ly;
359 hasCarry = (resul < carry) ? 1 : 0;
360 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
361 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
362
363 carry += (lx * hy) & 0xffffffffULL;
364 resul = (carry << 32) | (resul & 0xffffffffULL);
365 dest[i+j] += resul;
366 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopher820256b2009-08-21 04:06:45 +0000367 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000368 ((lx * hy) >> 32) + hx * hy;
369 }
370 dest[i+xlen] = carry;
371 }
372}
373
Zhou Shengdac63782007-02-06 03:00:16 +0000374APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000375 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer58a6a432007-02-21 08:21:52 +0000376 if (isSingleWord()) {
Reid Spencer4bb430c2007-02-20 20:42:10 +0000377 VAL *= RHS.VAL;
Reid Spencer58a6a432007-02-21 08:21:52 +0000378 clearUnusedBits();
379 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000380 }
Reid Spencer58a6a432007-02-21 08:21:52 +0000381
382 // Get some bit facts about LHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000383 unsigned lhsBits = getActiveBits();
384 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopher820256b2009-08-21 04:06:45 +0000385 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +0000386 // 0 * X ===> 0
387 return *this;
388
389 // Get some bit facts about RHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000390 unsigned rhsBits = RHS.getActiveBits();
391 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencer58a6a432007-02-21 08:21:52 +0000392 if (!rhsWords) {
393 // X * 0 ===> 0
Jay Foad25a5e4c2010-12-01 08:53:58 +0000394 clearAllBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000395 return *this;
396 }
397
398 // Allocate space for the result
Chris Lattner77527f52009-01-21 18:09:24 +0000399 unsigned destWords = rhsWords + lhsWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000400 uint64_t *dest = getMemory(destWords);
401
402 // Perform the long multiply
403 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
404
405 // Copy result back into *this
Jay Foad25a5e4c2010-12-01 08:53:58 +0000406 clearAllBits();
Chris Lattner77527f52009-01-21 18:09:24 +0000407 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000408 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
Eli Friedman19546412011-10-07 23:40:49 +0000409 clearUnusedBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000410
411 // delete dest array and return
412 delete[] dest;
Zhou Shengdac63782007-02-06 03:00:16 +0000413 return *this;
414}
415
Zhou Shengdac63782007-02-06 03:00:16 +0000416APInt& APInt::operator&=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000417 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000418 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000419 VAL &= RHS.VAL;
420 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000421 }
Chris Lattner77527f52009-01-21 18:09:24 +0000422 unsigned numWords = getNumWords();
423 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000424 pVal[i] &= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000425 return *this;
426}
427
Amaury Sechetfb1756b2017-02-03 22:54:41 +0000428APInt &APInt::operator&=(uint64_t RHS) {
429 if (isSingleWord()) {
430 VAL &= RHS;
431 return *this;
432 }
433 pVal[0] &= RHS;
434 unsigned numWords = getNumWords();
435 for (unsigned i = 1; i < numWords; ++i)
436 pVal[i] = 0;
437 return *this;
438}
439
Zhou Shengdac63782007-02-06 03:00:16 +0000440APInt& APInt::operator|=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000441 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000442 if (isSingleWord()) {
Reid Spencera856b6e2007-02-18 18:38:44 +0000443 VAL |= RHS.VAL;
444 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +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];
Zhou Shengdac63782007-02-06 03:00:16 +0000449 return *this;
450}
451
Zhou Shengdac63782007-02-06 03:00:16 +0000452APInt& APInt::operator^=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000453 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Zhou Shengdac63782007-02-06 03:00:16 +0000454 if (isSingleWord()) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000455 VAL ^= RHS.VAL;
456 return *this;
Eric Christopher820256b2009-08-21 04:06:45 +0000457 }
Chris Lattner77527f52009-01-21 18:09:24 +0000458 unsigned numWords = getNumWords();
459 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000460 pVal[i] ^= RHS.pVal[i];
Craig Topper9028f052017-01-24 02:10:15 +0000461 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000462}
463
Chris Lattner1ac3e252008-08-20 17:02:31 +0000464APInt APInt::AndSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000465 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000466 uint64_t* val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000467 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000468 val[i] = pVal[i] & RHS.pVal[i];
469 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000470}
471
Chris Lattner1ac3e252008-08-20 17:02:31 +0000472APInt APInt::OrSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000473 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000474 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000475 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000476 val[i] = pVal[i] | RHS.pVal[i];
477 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000478}
479
Chris Lattner1ac3e252008-08-20 17:02:31 +0000480APInt APInt::XorSlowCase(const APInt& RHS) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000481 unsigned numWords = getNumWords();
Reid Spencera41e93b2007-02-25 19:32:03 +0000482 uint64_t *val = getMemory(numWords);
Chris Lattner77527f52009-01-21 18:09:24 +0000483 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera41e93b2007-02-25 19:32:03 +0000484 val[i] = pVal[i] ^ RHS.pVal[i];
485
Craig Topper9028f052017-01-24 02:10:15 +0000486 return APInt(val, getBitWidth());
Zhou Shengdac63782007-02-06 03:00:16 +0000487}
488
Zhou Shengdac63782007-02-06 03:00:16 +0000489APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000490 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000491 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000492 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer4bb430c2007-02-20 20:42:10 +0000493 APInt Result(*this);
494 Result *= RHS;
Eli Friedman19546412011-10-07 23:40:49 +0000495 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000496}
497
Chris Lattner1ac3e252008-08-20 17:02:31 +0000498bool APInt::EqualSlowCase(const APInt& RHS) const {
Matthias Braun5117fcd2016-02-15 20:06:19 +0000499 return std::equal(pVal, pVal + getNumWords(), RHS.pVal);
Zhou Shengdac63782007-02-06 03:00:16 +0000500}
501
Chris Lattner1ac3e252008-08-20 17:02:31 +0000502bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000503 unsigned n = getActiveBits();
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000504 if (n <= APINT_BITS_PER_WORD)
505 return pVal[0] == Val;
506 else
507 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000508}
509
Reid Spencer1d072122007-02-16 22:36:51 +0000510bool APInt::ult(const APInt& RHS) const {
511 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
512 if (isSingleWord())
513 return VAL < RHS.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000514
515 // Get active bit length of both operands
Chris Lattner77527f52009-01-21 18:09:24 +0000516 unsigned n1 = getActiveBits();
517 unsigned n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000518
519 // If magnitude of LHS is less than RHS, return true.
520 if (n1 < n2)
521 return true;
522
523 // If magnitude of RHS is greather than LHS, return false.
524 if (n2 < n1)
525 return false;
526
527 // If they bot fit in a word, just compare the low order word
528 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
529 return pVal[0] < RHS.pVal[0];
530
531 // Otherwise, compare all words
Chris Lattner77527f52009-01-21 18:09:24 +0000532 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000533 for (int i = topWord; i >= 0; --i) {
Eric Christopher820256b2009-08-21 04:06:45 +0000534 if (pVal[i] > RHS.pVal[i])
Reid Spencer1d072122007-02-16 22:36:51 +0000535 return false;
Eric Christopher820256b2009-08-21 04:06:45 +0000536 if (pVal[i] < RHS.pVal[i])
Reid Spencera41e93b2007-02-25 19:32:03 +0000537 return true;
Zhou Shengdac63782007-02-06 03:00:16 +0000538 }
539 return false;
540}
541
Reid Spencer1d072122007-02-16 22:36:51 +0000542bool APInt::slt(const APInt& RHS) const {
543 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000544 if (isSingleWord()) {
David Majnemer5f1c0172016-06-24 20:51:47 +0000545 int64_t lhsSext = SignExtend64(VAL, BitWidth);
546 int64_t rhsSext = SignExtend64(RHS.VAL, BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000547 return lhsSext < rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000548 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000549
Reid Spencer54abdcf2007-02-27 18:23:40 +0000550 bool lhsNeg = isNegative();
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000551 bool rhsNeg = RHS.isNegative();
Reid Spencera41e93b2007-02-25 19:32:03 +0000552
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000553 // If the sign bits don't match, then (LHS < RHS) if LHS is negative
554 if (lhsNeg != rhsNeg)
555 return lhsNeg;
556
557 // Otherwise we can just use an unsigned comparision, because even negative
558 // numbers compare correctly this way if both have the same signed-ness.
559 return ult(RHS);
Zhou Shengdac63782007-02-06 03:00:16 +0000560}
561
Jay Foad25a5e4c2010-12-01 08:53:58 +0000562void APInt::setBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000563 if (isSingleWord())
Reid Spencera41e93b2007-02-25 19:32:03 +0000564 VAL |= maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000565 else
Reid Spencera41e93b2007-02-25 19:32:03 +0000566 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000567}
568
Simon Pilgrimaed35222017-02-24 10:15:29 +0000569void APInt::setBits(unsigned loBit, unsigned hiBit) {
570 assert(hiBit <= BitWidth && "hiBit out of range");
571 assert(loBit <= hiBit && loBit <= BitWidth && "loBit out of range");
572
573 if (loBit == hiBit)
574 return;
575
576 if (isSingleWord())
577 *this |= APInt::getBitsSet(BitWidth, loBit, hiBit);
578 else {
579 unsigned hiBit1 = hiBit - 1;
580 unsigned loWord = whichWord(loBit);
581 unsigned hiWord = whichWord(hiBit1);
582 if (loWord == hiWord) {
583 // Set bits are all within the same word, create a [loBit,hiBit) mask.
584 uint64_t mask = UINT64_MAX;
585 mask >>= (APINT_BITS_PER_WORD - (hiBit - loBit));
586 mask <<= whichBit(loBit);
587 pVal[loWord] |= mask;
588 } else {
589 // Set bits span multiple words, create a lo mask with set bits starting
590 // at loBit, a hi mask with set bits below hiBit and set all bits of the
591 // words in between.
592 uint64_t loMask = UINT64_MAX << whichBit(loBit);
593 uint64_t hiMask = UINT64_MAX >> (64 - whichBit(hiBit1) - 1);
594 pVal[loWord] |= loMask;
595 pVal[hiWord] |= hiMask;
596 for (unsigned word = loWord + 1; word < hiWord; ++word)
597 pVal[word] = UINT64_MAX;
598 }
599 }
600}
601
Zhou Shengdac63782007-02-06 03:00:16 +0000602/// Set the given bit to 0 whose position is given as "bitPosition".
603/// @brief Set a given bit to 0.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000604void APInt::clearBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000605 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000606 VAL &= ~maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000607 else
Reid Spencera856b6e2007-02-18 18:38:44 +0000608 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000609}
610
Zhou Shengdac63782007-02-06 03:00:16 +0000611/// @brief Toggle every bit to its opposite value.
Zhou Shengdac63782007-02-06 03:00:16 +0000612
Eric Christopher820256b2009-08-21 04:06:45 +0000613/// Toggle a given bit to its opposite value whose position is given
Zhou Shengdac63782007-02-06 03:00:16 +0000614/// as "bitPosition".
615/// @brief Toggles a given bit to its opposite value.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000616void APInt::flipBit(unsigned bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000617 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad25a5e4c2010-12-01 08:53:58 +0000618 if ((*this)[bitPosition]) clearBit(bitPosition);
619 else setBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000620}
621
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000622APInt APInt::extractBits(unsigned numBits, unsigned bitPosition) const {
623 assert(numBits > 0 && "Can't extract zero bits");
624 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
625 "Illegal bit extraction");
626
627 if (isSingleWord())
628 return APInt(numBits, VAL >> bitPosition);
629
630 unsigned loBit = whichBit(bitPosition);
631 unsigned loWord = whichWord(bitPosition);
632 unsigned hiWord = whichWord(bitPosition + numBits - 1);
633
634 // Single word result extracting bits from a single word source.
635 if (loWord == hiWord)
636 return APInt(numBits, pVal[loWord] >> loBit);
637
638 // Extracting bits that start on a source word boundary can be done
639 // as a fast memory copy.
640 if (loBit == 0)
641 return APInt(numBits, makeArrayRef(pVal + loWord, 1 + hiWord - loWord));
642
643 // General case - shift + copy source words directly into place.
644 APInt Result(numBits, 0);
645 unsigned NumSrcWords = getNumWords();
646 unsigned NumDstWords = Result.getNumWords();
647
648 for (unsigned word = 0; word < NumDstWords; ++word) {
649 uint64_t w0 = pVal[loWord + word];
650 uint64_t w1 =
651 (loWord + word + 1) < NumSrcWords ? pVal[loWord + word + 1] : 0;
652 Result.pVal[word] = (w0 >> loBit) | (w1 << (APINT_BITS_PER_WORD - loBit));
653 }
654
655 return Result.clearUnusedBits();
656}
657
Benjamin Kramer92d89982010-07-14 22:38:02 +0000658unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000659 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000660 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +0000661 radix == 36) &&
662 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000663
664 size_t slen = str.size();
Reid Spencer9329e7b2007-04-13 19:19:07 +0000665
Eric Christopher43a1dec2009-08-21 04:10:31 +0000666 // Each computation below needs to know if it's negative.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000667 StringRef::iterator p = str.begin();
Eric Christopher43a1dec2009-08-21 04:10:31 +0000668 unsigned isNegative = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000669 if (*p == '-' || *p == '+') {
670 p++;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000671 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +0000672 assert(slen && "String is only a sign, needs a value.");
Reid Spencer9329e7b2007-04-13 19:19:07 +0000673 }
Eric Christopher43a1dec2009-08-21 04:10:31 +0000674
Reid Spencer9329e7b2007-04-13 19:19:07 +0000675 // For radixes of power-of-two values, the bits required is accurately and
676 // easily computed
677 if (radix == 2)
678 return slen + isNegative;
679 if (radix == 8)
680 return slen * 3 + isNegative;
681 if (radix == 16)
682 return slen * 4 + isNegative;
683
Douglas Gregor663c0682011-09-14 15:54:46 +0000684 // FIXME: base 36
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000685
Reid Spencer9329e7b2007-04-13 19:19:07 +0000686 // This is grossly inefficient but accurate. We could probably do something
687 // with a computation of roughly slen*64/20 and then adjust by the value of
688 // the first few digits. But, I'm not sure how accurate that could be.
689
690 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000691 // be too large. This avoids the assertion in the constructor. This
692 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
693 // bits in that case.
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000694 unsigned sufficient
Douglas Gregor663c0682011-09-14 15:54:46 +0000695 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
696 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000697
698 // Convert to the actual binary value.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000699 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000700
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000701 // Compute how many bits are required. If the log is infinite, assume we need
702 // just bit.
703 unsigned log = tmp.logBase2();
704 if (log == (unsigned)-1) {
705 return isNegative + 1;
706 } else {
707 return isNegative + log + 1;
708 }
Reid Spencer9329e7b2007-04-13 19:19:07 +0000709}
710
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000711hash_code llvm::hash_value(const APInt &Arg) {
712 if (Arg.isSingleWord())
713 return hash_combine(Arg.VAL);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000714
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000715 return hash_combine_range(Arg.pVal, Arg.pVal + Arg.getNumWords());
Reid Spencerb2bc9852007-02-26 21:02:27 +0000716}
717
Benjamin Kramerb4b51502015-03-25 16:49:59 +0000718bool APInt::isSplat(unsigned SplatSizeInBits) const {
719 assert(getBitWidth() % SplatSizeInBits == 0 &&
720 "SplatSizeInBits must divide width!");
721 // We can check that all parts of an integer are equal by making use of a
722 // little trick: rotate and check if it's still the same value.
723 return *this == rotl(SplatSizeInBits);
724}
725
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000726/// This function returns the high "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000727APInt APInt::getHiBits(unsigned numBits) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000728 return APIntOps::lshr(*this, BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000729}
730
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000731/// This function returns the low "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000732APInt APInt::getLoBits(unsigned numBits) const {
Eric Christopher820256b2009-08-21 04:06:45 +0000733 return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
Reid Spencer1d072122007-02-16 22:36:51 +0000734 BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000735}
736
Chris Lattner77527f52009-01-21 18:09:24 +0000737unsigned APInt::countLeadingZerosSlowCase() const {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000738 unsigned Count = 0;
739 for (int i = getNumWords()-1; i >= 0; --i) {
740 integerPart V = pVal[i];
741 if (V == 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +0000742 Count += APINT_BITS_PER_WORD;
743 else {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000744 Count += llvm::countLeadingZeros(V);
Chris Lattner1ac3e252008-08-20 17:02:31 +0000745 break;
Reid Spencer74cf82e2007-02-21 00:29:48 +0000746 }
Zhou Shengdac63782007-02-06 03:00:16 +0000747 }
Matthias Brauna6be4e82016-02-15 20:06:22 +0000748 // Adjust for unused bits in the most significant word (they are zero).
749 unsigned Mod = BitWidth % APINT_BITS_PER_WORD;
750 Count -= Mod > 0 ? APINT_BITS_PER_WORD - Mod : 0;
John McCalldf951bd2010-02-03 03:42:44 +0000751 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000752}
753
Chris Lattner77527f52009-01-21 18:09:24 +0000754unsigned APInt::countLeadingOnes() const {
Reid Spencer31acef52007-02-27 21:59:26 +0000755 if (isSingleWord())
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000756 return llvm::countLeadingOnes(VAL << (APINT_BITS_PER_WORD - BitWidth));
Reid Spencer31acef52007-02-27 21:59:26 +0000757
Chris Lattner77527f52009-01-21 18:09:24 +0000758 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwinec39eb82009-01-27 18:06:03 +0000759 unsigned shift;
760 if (!highWordBits) {
761 highWordBits = APINT_BITS_PER_WORD;
762 shift = 0;
763 } else {
764 shift = APINT_BITS_PER_WORD - highWordBits;
765 }
Reid Spencer31acef52007-02-27 21:59:26 +0000766 int i = getNumWords() - 1;
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000767 unsigned Count = llvm::countLeadingOnes(pVal[i] << shift);
Reid Spencer31acef52007-02-27 21:59:26 +0000768 if (Count == highWordBits) {
769 for (i--; i >= 0; --i) {
770 if (pVal[i] == -1ULL)
771 Count += APINT_BITS_PER_WORD;
772 else {
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000773 Count += llvm::countLeadingOnes(pVal[i]);
Reid Spencer31acef52007-02-27 21:59:26 +0000774 break;
775 }
776 }
777 }
778 return Count;
779}
780
Chris Lattner77527f52009-01-21 18:09:24 +0000781unsigned APInt::countTrailingZeros() const {
Zhou Shengdac63782007-02-06 03:00:16 +0000782 if (isSingleWord())
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +0000783 return std::min(unsigned(llvm::countTrailingZeros(VAL)), BitWidth);
Chris Lattner77527f52009-01-21 18:09:24 +0000784 unsigned Count = 0;
785 unsigned i = 0;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000786 for (; i < getNumWords() && pVal[i] == 0; ++i)
787 Count += APINT_BITS_PER_WORD;
788 if (i < getNumWords())
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +0000789 Count += llvm::countTrailingZeros(pVal[i]);
Chris Lattnerc2c4c742007-11-23 22:36:25 +0000790 return std::min(Count, BitWidth);
Zhou Shengdac63782007-02-06 03:00:16 +0000791}
792
Chris Lattner77527f52009-01-21 18:09:24 +0000793unsigned APInt::countTrailingOnesSlowCase() const {
794 unsigned Count = 0;
795 unsigned i = 0;
Dan Gohmanc354ebd2008-02-14 22:38:45 +0000796 for (; i < getNumWords() && pVal[i] == -1ULL; ++i)
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000797 Count += APINT_BITS_PER_WORD;
798 if (i < getNumWords())
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000799 Count += llvm::countTrailingOnes(pVal[i]);
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000800 return std::min(Count, BitWidth);
801}
802
Chris Lattner77527f52009-01-21 18:09:24 +0000803unsigned APInt::countPopulationSlowCase() const {
804 unsigned Count = 0;
805 for (unsigned i = 0; i < getNumWords(); ++i)
Benjamin Kramer5f6a9072015-02-12 15:35:40 +0000806 Count += llvm::countPopulation(pVal[i]);
Zhou Shengdac63782007-02-06 03:00:16 +0000807 return Count;
808}
809
Richard Smith4f9a8082011-11-23 21:33:37 +0000810/// Perform a logical right-shift from Src to Dst, which must be equal or
811/// non-overlapping, of Words words, by Shift, which must be less than 64.
812static void lshrNear(uint64_t *Dst, uint64_t *Src, unsigned Words,
813 unsigned Shift) {
814 uint64_t Carry = 0;
815 for (int I = Words - 1; I >= 0; --I) {
816 uint64_t Tmp = Src[I];
817 Dst[I] = (Tmp >> Shift) | Carry;
818 Carry = Tmp << (64 - Shift);
819 }
820}
821
Reid Spencer1d072122007-02-16 22:36:51 +0000822APInt APInt::byteSwap() const {
823 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
824 if (BitWidth == 16)
Jeff Cohene06855e2007-03-20 20:42:36 +0000825 return APInt(BitWidth, ByteSwap_16(uint16_t(VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000826 if (BitWidth == 32)
Chris Lattner77527f52009-01-21 18:09:24 +0000827 return APInt(BitWidth, ByteSwap_32(unsigned(VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000828 if (BitWidth == 48) {
Chris Lattner77527f52009-01-21 18:09:24 +0000829 unsigned Tmp1 = unsigned(VAL >> 16);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000830 Tmp1 = ByteSwap_32(Tmp1);
Jeff Cohene06855e2007-03-20 20:42:36 +0000831 uint16_t Tmp2 = uint16_t(VAL);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000832 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohene06855e2007-03-20 20:42:36 +0000833 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000834 }
Richard Smith4f9a8082011-11-23 21:33:37 +0000835 if (BitWidth == 64)
836 return APInt(BitWidth, ByteSwap_64(VAL));
837
838 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
839 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
840 Result.pVal[I] = ByteSwap_64(pVal[N - I - 1]);
841 if (Result.BitWidth != BitWidth) {
842 lshrNear(Result.pVal, Result.pVal, getNumWords(),
843 Result.BitWidth - BitWidth);
844 Result.BitWidth = BitWidth;
845 }
846 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000847}
848
Matt Arsenault155dda92016-03-21 15:00:35 +0000849APInt APInt::reverseBits() const {
850 switch (BitWidth) {
851 case 64:
852 return APInt(BitWidth, llvm::reverseBits<uint64_t>(VAL));
853 case 32:
854 return APInt(BitWidth, llvm::reverseBits<uint32_t>(VAL));
855 case 16:
856 return APInt(BitWidth, llvm::reverseBits<uint16_t>(VAL));
857 case 8:
858 return APInt(BitWidth, llvm::reverseBits<uint8_t>(VAL));
859 default:
860 break;
861 }
862
863 APInt Val(*this);
864 APInt Reversed(*this);
865 int S = BitWidth - 1;
866
867 const APInt One(BitWidth, 1);
868
869 for ((Val = Val.lshr(1)); Val != 0; (Val = Val.lshr(1))) {
870 Reversed <<= 1;
871 Reversed |= (Val & One);
872 --S;
873 }
874
875 Reversed <<= S;
876 return Reversed;
877}
878
Eric Christopher820256b2009-08-21 04:06:45 +0000879APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000880 const APInt& API2) {
Zhou Shengdac63782007-02-06 03:00:16 +0000881 APInt A = API1, B = API2;
882 while (!!B) {
883 APInt T = B;
Reid Spencer1d072122007-02-16 22:36:51 +0000884 B = APIntOps::urem(A, B);
Zhou Shengdac63782007-02-06 03:00:16 +0000885 A = T;
886 }
887 return A;
888}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000889
Chris Lattner77527f52009-01-21 18:09:24 +0000890APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000891 union {
892 double D;
893 uint64_t I;
894 } T;
895 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000896
897 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000898 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000899
900 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000901 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000902
903 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000904 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000905 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000906
907 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
908 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
909
910 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000911 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000912 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000913 APInt(width, mantissa >> (52 - exp));
914
915 // If the client didn't provide enough bits for us to shift the mantissa into
916 // then the result is undefined, just return 0
917 if (width <= exp - 52)
918 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000919
920 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000921 APInt Tmp(width, mantissa);
Chris Lattner77527f52009-01-21 18:09:24 +0000922 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd707d632007-02-12 20:02:55 +0000923 return isNeg ? -Tmp : Tmp;
924}
925
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000926/// This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000927/// The layout for double is as following (IEEE Standard 754):
928/// --------------------------------------
929/// | Sign Exponent Fraction Bias |
930/// |-------------------------------------- |
931/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000932/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000933double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000934
935 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000936 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000937 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
938 if (isSigned) {
David Majnemer03992262016-06-24 21:15:36 +0000939 int64_t sext = SignExtend64(getWord(0), BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000940 return double(sext);
941 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000942 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000943 }
944
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000945 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000946 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000947
948 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000949 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000950
951 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000952 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000953
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000954 // The exponent (without bias normalization) is just the number of bits
955 // we are using. Note that the sign bit is gone since we constructed the
956 // absolute value.
957 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000958
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000959 // Return infinity for exponent overflow
960 if (exp > 1023) {
961 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000962 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000963 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000964 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000965 }
966 exp += 1023; // Increment for 1023 bias
967
968 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
969 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000970 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000971 unsigned hiWord = whichWord(n-1);
972 if (hiWord == 0) {
973 mantissa = Tmp.pVal[0];
974 if (n > 52)
975 mantissa >>= n - 52; // shift down, we want the top 52 bits.
976 } else {
977 assert(hiWord > 0 && "huh?");
978 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
979 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
980 mantissa = hibits | lobits;
981 }
982
Zhou Shengd707d632007-02-12 20:02:55 +0000983 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000984 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +0000985 union {
986 double D;
987 uint64_t I;
988 } T;
989 T.I = sign | (exp << 52) | mantissa;
990 return T.D;
991}
992
Reid Spencer1d072122007-02-16 22:36:51 +0000993// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000994APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000995 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +0000996 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +0000997
998 if (width <= APINT_BITS_PER_WORD)
999 return APInt(width, getRawData()[0]);
1000
1001 APInt Result(getMemory(getNumWords(width)), width);
1002
1003 // Copy full words.
1004 unsigned i;
1005 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1006 Result.pVal[i] = pVal[i];
1007
1008 // Truncate and copy any partial word.
1009 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1010 if (bits != 0)
1011 Result.pVal[i] = pVal[i] << bits >> bits;
1012
1013 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001014}
1015
1016// Sign extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001017APInt APInt::sext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001018 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001019
1020 if (width <= APINT_BITS_PER_WORD) {
1021 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1022 val = (int64_t)val >> (width - BitWidth);
1023 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001024 }
1025
Jay Foad583abbc2010-12-07 08:25:19 +00001026 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001027
Jay Foad583abbc2010-12-07 08:25:19 +00001028 // Copy full words.
1029 unsigned i;
1030 uint64_t word = 0;
1031 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1032 word = getRawData()[i];
1033 Result.pVal[i] = word;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001034 }
1035
Jay Foad583abbc2010-12-07 08:25:19 +00001036 // Read and sign-extend any partial word.
1037 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1038 if (bits != 0)
1039 word = (int64_t)getRawData()[i] << bits >> bits;
1040 else
1041 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1042
1043 // Write remaining full words.
1044 for (; i != width / APINT_BITS_PER_WORD; i++) {
1045 Result.pVal[i] = word;
1046 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001047 }
Jay Foad583abbc2010-12-07 08:25:19 +00001048
1049 // Write any partial word.
1050 bits = (0 - width) % APINT_BITS_PER_WORD;
1051 if (bits != 0)
1052 Result.pVal[i] = word << bits >> bits;
1053
1054 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001055}
1056
1057// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001058APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001059 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001060
1061 if (width <= APINT_BITS_PER_WORD)
1062 return APInt(width, VAL);
1063
1064 APInt Result(getMemory(getNumWords(width)), width);
1065
1066 // Copy words.
1067 unsigned i;
1068 for (i = 0; i != getNumWords(); i++)
1069 Result.pVal[i] = getRawData()[i];
1070
1071 // Zero remaining words.
1072 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1073
1074 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001075}
1076
Jay Foad583abbc2010-12-07 08:25:19 +00001077APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001078 if (BitWidth < width)
1079 return zext(width);
1080 if (BitWidth > width)
1081 return trunc(width);
1082 return *this;
1083}
1084
Jay Foad583abbc2010-12-07 08:25:19 +00001085APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001086 if (BitWidth < width)
1087 return sext(width);
1088 if (BitWidth > width)
1089 return trunc(width);
1090 return *this;
1091}
1092
Rafael Espindolabb893fe2012-01-27 23:33:07 +00001093APInt APInt::zextOrSelf(unsigned width) const {
1094 if (BitWidth < width)
1095 return zext(width);
1096 return *this;
1097}
1098
1099APInt APInt::sextOrSelf(unsigned width) const {
1100 if (BitWidth < width)
1101 return sext(width);
1102 return *this;
1103}
1104
Zhou Shenge93db8f2007-02-09 07:48:24 +00001105/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001106/// @brief Arithmetic right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001107APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001108 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001109}
1110
1111/// Arithmetic right-shift this APInt by shiftAmt.
1112/// @brief Arithmetic right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001113APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001114 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer1825dd02007-03-02 22:39:11 +00001115 // Handle a degenerate case
1116 if (shiftAmt == 0)
1117 return *this;
1118
1119 // Handle single word shifts with built-in ashr
Reid Spencer522ca7c2007-02-25 01:56:07 +00001120 if (isSingleWord()) {
1121 if (shiftAmt == BitWidth)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001122 return APInt(BitWidth, 0); // undefined
Jonathan Roelofs851b79d2016-08-10 19:50:14 +00001123 return APInt(BitWidth, SignExtend64(VAL, BitWidth) >> shiftAmt);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001124 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001125
Reid Spencer1825dd02007-03-02 22:39:11 +00001126 // If all the bits were shifted out, the result is, technically, undefined.
1127 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1128 // issues in the algorithm below.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001129 if (shiftAmt == BitWidth) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001130 if (isNegative())
Zhou Sheng1247c072008-06-05 13:27:38 +00001131 return APInt(BitWidth, -1ULL, true);
Reid Spencera41e93b2007-02-25 19:32:03 +00001132 else
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001133 return APInt(BitWidth, 0);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001134 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001135
1136 // Create some space for the result.
1137 uint64_t * val = new uint64_t[getNumWords()];
1138
Reid Spencer1825dd02007-03-02 22:39:11 +00001139 // Compute some values needed by the following shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001140 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1141 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1142 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1143 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer1825dd02007-03-02 22:39:11 +00001144 if (bitsInWord == 0)
1145 bitsInWord = APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001146
1147 // If we are shifting whole words, just move whole words
1148 if (wordShift == 0) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001149 // Move the words containing significant bits
Chris Lattner77527f52009-01-21 18:09:24 +00001150 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001151 val[i] = pVal[i+offset]; // move whole word
1152
1153 // Adjust the top significant word for sign bit fill, if negative
1154 if (isNegative())
1155 if (bitsInWord < APINT_BITS_PER_WORD)
1156 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1157 } else {
Eric Christopher820256b2009-08-21 04:06:45 +00001158 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001159 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001160 // This combines the shifted corresponding word with the low bits from
1161 // the next word (shifted into this word's high bits).
Eric Christopher820256b2009-08-21 04:06:45 +00001162 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer1825dd02007-03-02 22:39:11 +00001163 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1164 }
1165
1166 // Shift the break word. In this case there are no bits from the next word
1167 // to include in this word.
1168 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1169
Alp Tokercb402912014-01-24 17:20:08 +00001170 // Deal with sign extension in the break word, and possibly the word before
Reid Spencer1825dd02007-03-02 22:39:11 +00001171 // it.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001172 if (isNegative()) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001173 if (wordShift > bitsInWord) {
1174 if (breakWord > 0)
Eric Christopher820256b2009-08-21 04:06:45 +00001175 val[breakWord-1] |=
Reid Spencer1825dd02007-03-02 22:39:11 +00001176 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1177 val[breakWord] |= ~0ULL;
Eric Christopher820256b2009-08-21 04:06:45 +00001178 } else
Reid Spencer1825dd02007-03-02 22:39:11 +00001179 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnerdad2d092007-05-03 18:15:36 +00001180 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001181 }
1182
Reid Spencer1825dd02007-03-02 22:39:11 +00001183 // Remaining words are 0 or -1, just assign them.
1184 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner77527f52009-01-21 18:09:24 +00001185 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001186 val[i] = fillValue;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001187 APInt Result(val, BitWidth);
1188 Result.clearUnusedBits();
1189 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001190}
1191
Zhou Shenge93db8f2007-02-09 07:48:24 +00001192/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001193/// @brief Logical right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001194APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001195 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001196}
1197
1198/// Logical right-shift this APInt by shiftAmt.
1199/// @brief Logical right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001200APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnerdad2d092007-05-03 18:15:36 +00001201 if (isSingleWord()) {
Ahmed Charles0dca5d82012-02-24 19:06:15 +00001202 if (shiftAmt >= BitWidth)
Reid Spencer522ca7c2007-02-25 01:56:07 +00001203 return APInt(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001204 else
Reid Spencer522ca7c2007-02-25 01:56:07 +00001205 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001206 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001207
Reid Spencer44eef162007-02-26 01:19:48 +00001208 // If all the bits were shifted out, the result is 0. This avoids issues
1209 // with shifting by the size of the integer type, which produces undefined
1210 // results. We define these "undefined results" to always be 0.
Chad Rosier3d464d82012-06-08 18:04:52 +00001211 if (shiftAmt >= BitWidth)
Reid Spencer44eef162007-02-26 01:19:48 +00001212 return APInt(BitWidth, 0);
1213
Reid Spencerfffdf102007-05-17 06:26:29 +00001214 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopher820256b2009-08-21 04:06:45 +00001215 // issues with shifting by the size of the integer type, which produces
Reid Spencerfffdf102007-05-17 06:26:29 +00001216 // undefined results in the code below. This is also an optimization.
1217 if (shiftAmt == 0)
1218 return *this;
1219
Reid Spencer44eef162007-02-26 01:19:48 +00001220 // Create some space for the result.
1221 uint64_t * val = new uint64_t[getNumWords()];
1222
1223 // If we are shifting less than a word, compute the shift with a simple carry
1224 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smith4f9a8082011-11-23 21:33:37 +00001225 lshrNear(val, pVal, getNumWords(), shiftAmt);
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001226 APInt Result(val, BitWidth);
1227 Result.clearUnusedBits();
1228 return Result;
Reid Spencera41e93b2007-02-25 19:32:03 +00001229 }
1230
Reid Spencer44eef162007-02-26 01:19:48 +00001231 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001232 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1233 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer44eef162007-02-26 01:19:48 +00001234
1235 // If we are shifting whole words, just move whole words
1236 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001237 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001238 val[i] = pVal[i+offset];
Chris Lattner77527f52009-01-21 18:09:24 +00001239 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencer44eef162007-02-26 01:19:48 +00001240 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001241 APInt Result(val, BitWidth);
1242 Result.clearUnusedBits();
1243 return Result;
Reid Spencer44eef162007-02-26 01:19:48 +00001244 }
1245
Eric Christopher820256b2009-08-21 04:06:45 +00001246 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001247 unsigned breakWord = getNumWords() - offset -1;
1248 for (unsigned i = 0; i < breakWord; ++i)
Reid Spencerd99feaf2007-03-01 05:39:56 +00001249 val[i] = (pVal[i+offset] >> wordShift) |
1250 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencer44eef162007-02-26 01:19:48 +00001251 // Shift the break word.
1252 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1253
1254 // Remaining words are 0
Chris Lattner77527f52009-01-21 18:09:24 +00001255 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001256 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001257 APInt Result(val, BitWidth);
1258 Result.clearUnusedBits();
1259 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001260}
1261
Zhou Shenge93db8f2007-02-09 07:48:24 +00001262/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001263/// @brief Left-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001264APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky030c4502009-01-19 17:42:33 +00001265 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner77527f52009-01-21 18:09:24 +00001266 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001267}
1268
Chris Lattner77527f52009-01-21 18:09:24 +00001269APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencera5c84d92007-02-25 00:56:44 +00001270 // If all the bits were shifted out, the result is 0. This avoids issues
1271 // with shifting by the size of the integer type, which produces undefined
1272 // results. We define these "undefined results" to always be 0.
1273 if (shiftAmt == BitWidth)
1274 return APInt(BitWidth, 0);
1275
Reid Spencer81ee0202007-05-12 18:01:57 +00001276 // If none of the bits are shifted out, the result is *this. This avoids a
1277 // lshr by the words size in the loop below which can produce incorrect
1278 // results. It also avoids the expensive computation below for a common case.
1279 if (shiftAmt == 0)
1280 return *this;
1281
Reid Spencera5c84d92007-02-25 00:56:44 +00001282 // Create some space for the result.
1283 uint64_t * val = new uint64_t[getNumWords()];
1284
1285 // If we are shifting less than a word, do it the easy way
1286 if (shiftAmt < APINT_BITS_PER_WORD) {
1287 uint64_t carry = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001288 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencera5c84d92007-02-25 00:56:44 +00001289 val[i] = pVal[i] << shiftAmt | carry;
1290 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1291 }
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001292 APInt Result(val, BitWidth);
1293 Result.clearUnusedBits();
1294 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001295 }
1296
Reid Spencera5c84d92007-02-25 00:56:44 +00001297 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001298 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1299 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencera5c84d92007-02-25 00:56:44 +00001300
1301 // If we are shifting whole words, just move whole words
1302 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001303 for (unsigned i = 0; i < offset; i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001304 val[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001305 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001306 val[i] = pVal[i-offset];
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001307 APInt Result(val, BitWidth);
1308 Result.clearUnusedBits();
1309 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001310 }
Reid Spencera5c84d92007-02-25 00:56:44 +00001311
1312 // Copy whole words from this to Result.
Chris Lattner77527f52009-01-21 18:09:24 +00001313 unsigned i = getNumWords() - 1;
Reid Spencera5c84d92007-02-25 00:56:44 +00001314 for (; i > offset; --i)
1315 val[i] = pVal[i-offset] << wordShift |
1316 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencerab0e08a2007-02-25 01:08:58 +00001317 val[offset] = pVal[0] << wordShift;
Reid Spencera5c84d92007-02-25 00:56:44 +00001318 for (i = 0; i < offset; ++i)
1319 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001320 APInt Result(val, BitWidth);
1321 Result.clearUnusedBits();
1322 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001323}
1324
Joey Gouly51c0ae52017-02-07 11:58:22 +00001325// Calculate the rotate amount modulo the bit width.
1326static unsigned rotateModulo(unsigned BitWidth, const APInt &rotateAmt) {
1327 unsigned rotBitWidth = rotateAmt.getBitWidth();
1328 APInt rot = rotateAmt;
1329 if (rotBitWidth < BitWidth) {
1330 // Extend the rotate APInt, so that the urem doesn't divide by 0.
1331 // e.g. APInt(1, 32) would give APInt(1, 0).
1332 rot = rotateAmt.zext(BitWidth);
1333 }
1334 rot = rot.urem(APInt(rot.getBitWidth(), BitWidth));
1335 return rot.getLimitedValue(BitWidth);
1336}
1337
Dan Gohman105c1d42008-02-29 01:40:47 +00001338APInt APInt::rotl(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001339 return rotl(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001340}
1341
Chris Lattner77527f52009-01-21 18:09:24 +00001342APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001343 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001344 if (rotateAmt == 0)
1345 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001346 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001347}
1348
Dan Gohman105c1d42008-02-29 01:40:47 +00001349APInt APInt::rotr(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001350 return rotr(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001351}
1352
Chris Lattner77527f52009-01-21 18:09:24 +00001353APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001354 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001355 if (rotateAmt == 0)
1356 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001357 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001358}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001359
1360// Square Root - this method computes and returns the square root of "this".
1361// Three mechanisms are used for computation. For small values (<= 5 bits),
1362// a table lookup is done. This gets some performance for common cases. For
1363// values using less than 52 bits, the value is converted to double and then
1364// the libc sqrt function is called. The result is rounded and then converted
1365// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001366// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001367APInt APInt::sqrt() const {
1368
1369 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001370 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001371
1372 // Use a fast table for some small values. This also gets rid of some
1373 // rounding errors in libc sqrt for small values.
1374 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001375 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001376 /* 0 */ 0,
1377 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001378 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001379 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1380 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1381 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1382 /* 31 */ 6
1383 };
1384 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001385 }
1386
1387 // If the magnitude of the value fits in less than 52 bits (the precision of
1388 // an IEEE double precision floating point value), then we can use the
1389 // libc sqrt function which will probably use a hardware sqrt computation.
1390 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001391 if (magnitude < 52) {
Eric Christopher820256b2009-08-21 04:06:45 +00001392 return APInt(BitWidth,
Reid Spencerd99feaf2007-03-01 05:39:56 +00001393 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenb622c112007-03-05 00:00:42 +00001394 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001395
1396 // Okay, all the short cuts are exhausted. We must compute it. The following
1397 // is a classical Babylonian method for computing the square root. This code
Sanjay Patel4cb54e02014-09-11 15:41:01 +00001398 // was adapted to APInt from a wikipedia article on such computations.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001399 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001400 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001401 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001402 APInt testy(BitWidth, 16);
1403 APInt x_old(BitWidth, 1);
1404 APInt x_new(BitWidth, 0);
1405 APInt two(BitWidth, 2);
1406
1407 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001408 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001409 if (i >= nbits || this->ule(testy)) {
1410 x_old = x_old.shl(i / 2);
1411 break;
1412 }
1413
Eric Christopher820256b2009-08-21 04:06:45 +00001414 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001415 for (;;) {
1416 x_new = (this->udiv(x_old) + x_old).udiv(two);
1417 if (x_old.ule(x_new))
1418 break;
1419 x_old = x_new;
1420 }
1421
1422 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001423 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001424 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001425 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001426 // floating point representation after 192 bits. There are no discrepancies
1427 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001428 APInt square(x_old * x_old);
1429 APInt nextSquare((x_old + 1) * (x_old +1));
1430 if (this->ult(square))
1431 return x_old;
David Blaikie54c94622011-12-01 20:58:30 +00001432 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1433 APInt midpoint((nextSquare - square).udiv(two));
1434 APInt offset(*this - square);
1435 if (offset.ult(midpoint))
1436 return x_old;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001437 return x_old + 1;
1438}
1439
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001440/// Computes the multiplicative inverse of this APInt for a given modulo. The
1441/// iterative extended Euclidean algorithm is used to solve for this value,
1442/// however we simplify it to speed up calculating only the inverse, and take
1443/// advantage of div+rem calculations. We also use some tricks to avoid copying
1444/// (potentially large) APInts around.
1445APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1446 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1447
1448 // Using the properties listed at the following web page (accessed 06/21/08):
1449 // http://www.numbertheory.org/php/euclid.html
1450 // (especially the properties numbered 3, 4 and 9) it can be proved that
1451 // BitWidth bits suffice for all the computations in the algorithm implemented
1452 // below. More precisely, this number of bits suffice if the multiplicative
1453 // inverse exists, but may not suffice for the general extended Euclidean
1454 // algorithm.
1455
1456 APInt r[2] = { modulo, *this };
1457 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1458 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001459
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001460 unsigned i;
1461 for (i = 0; r[i^1] != 0; i ^= 1) {
1462 // An overview of the math without the confusing bit-flipping:
1463 // q = r[i-2] / r[i-1]
1464 // r[i] = r[i-2] % r[i-1]
1465 // t[i] = t[i-2] - t[i-1] * q
1466 udivrem(r[i], r[i^1], q, r[i]);
1467 t[i] -= t[i^1] * q;
1468 }
1469
1470 // If this APInt and the modulo are not coprime, there is no multiplicative
1471 // inverse, so return 0. We check this by looking at the next-to-last
1472 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1473 // algorithm.
1474 if (r[i] != 1)
1475 return APInt(BitWidth, 0);
1476
1477 // The next-to-last t is the multiplicative inverse. However, we are
1478 // interested in a positive inverse. Calcuate a positive one from a negative
1479 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001480 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001481 return t[i].isNegative() ? t[i] + modulo : t[i];
1482}
1483
Jay Foadfe0c6482009-04-30 10:15:35 +00001484/// Calculate the magic numbers required to implement a signed integer division
1485/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1486/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1487/// Warren, Jr., chapter 10.
1488APInt::ms APInt::magic() const {
1489 const APInt& d = *this;
1490 unsigned p;
1491 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001492 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001493 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001494
Jay Foadfe0c6482009-04-30 10:15:35 +00001495 ad = d.abs();
1496 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1497 anc = t - 1 - t.urem(ad); // absolute value of nc
1498 p = d.getBitWidth() - 1; // initialize p
1499 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1500 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1501 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1502 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1503 do {
1504 p = p + 1;
1505 q1 = q1<<1; // update q1 = 2p/abs(nc)
1506 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1507 if (r1.uge(anc)) { // must be unsigned comparison
1508 q1 = q1 + 1;
1509 r1 = r1 - anc;
1510 }
1511 q2 = q2<<1; // update q2 = 2p/abs(d)
1512 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1513 if (r2.uge(ad)) { // must be unsigned comparison
1514 q2 = q2 + 1;
1515 r2 = r2 - ad;
1516 }
1517 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001518 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001519
Jay Foadfe0c6482009-04-30 10:15:35 +00001520 mag.m = q2 + 1;
1521 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1522 mag.s = p - d.getBitWidth(); // resulting shift
1523 return mag;
1524}
1525
1526/// Calculate the magic numbers required to implement an unsigned integer
1527/// division by a constant as a sequence of multiplies, adds and shifts.
1528/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1529/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001530/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001531/// of the divided value are known zero.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001532APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001533 const APInt& d = *this;
1534 unsigned p;
1535 APInt nc, delta, q1, r1, q2, r2;
1536 struct mu magu;
1537 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001538 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001539 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1540 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1541
Benjamin Kramer3aab6a82012-07-11 18:31:59 +00001542 nc = allOnes - (allOnes - d).urem(d);
Jay Foadfe0c6482009-04-30 10:15:35 +00001543 p = d.getBitWidth() - 1; // initialize p
1544 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1545 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1546 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1547 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1548 do {
1549 p = p + 1;
1550 if (r1.uge(nc - r1)) {
1551 q1 = q1 + q1 + 1; // update q1
1552 r1 = r1 + r1 - nc; // update r1
1553 }
1554 else {
1555 q1 = q1+q1; // update q1
1556 r1 = r1+r1; // update r1
1557 }
1558 if ((r2 + 1).uge(d - r2)) {
1559 if (q2.uge(signedMax)) magu.a = 1;
1560 q2 = q2+q2 + 1; // update q2
1561 r2 = r2+r2 + 1 - d; // update r2
1562 }
1563 else {
1564 if (q2.uge(signedMin)) magu.a = 1;
1565 q2 = q2+q2; // update q2
1566 r2 = r2+r2 + 1; // update r2
1567 }
1568 delta = d - 1 - r2;
1569 } while (p < d.getBitWidth()*2 &&
1570 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1571 magu.m = q2 + 1; // resulting magic number
1572 magu.s = p - d.getBitWidth(); // resulting shift
1573 return magu;
1574}
1575
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001576/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1577/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1578/// variables here have the same names as in the algorithm. Comments explain
1579/// the algorithm and any deviation from it.
Chris Lattner77527f52009-01-21 18:09:24 +00001580static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1581 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001582 assert(u && "Must provide dividend");
1583 assert(v && "Must provide divisor");
1584 assert(q && "Must provide quotient");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001585 assert(u != v && u != q && v != q && "Must use different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001586 assert(n>1 && "n must be > 1");
1587
Yaron Keren39fc5a62015-03-26 19:45:19 +00001588 // b denotes the base of the number system. In our case b is 2^32.
George Burgess IV381fc0e2016-08-25 01:05:08 +00001589 const uint64_t b = uint64_t(1) << 32;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001590
David Greenef32fcb42010-01-05 01:28:52 +00001591 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1592 DEBUG(dbgs() << "KnuthDiv: original:");
1593 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1594 DEBUG(dbgs() << " by");
1595 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1596 DEBUG(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001597 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1598 // u and v by d. Note that we have taken Knuth's advice here to use a power
1599 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1600 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001601 // shift amount from the leading zeros. We are basically normalizing the u
1602 // and v so that its high bits are shifted to the top of v's range without
1603 // overflow. Note that this can require an extra word in u so that u must
1604 // be of length m+n+1.
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +00001605 unsigned shift = countLeadingZeros(v[n-1]);
Chris Lattner77527f52009-01-21 18:09:24 +00001606 unsigned v_carry = 0;
1607 unsigned u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001608 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001609 for (unsigned i = 0; i < m+n; ++i) {
1610 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001611 u[i] = (u[i] << shift) | u_carry;
1612 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001613 }
Chris Lattner77527f52009-01-21 18:09:24 +00001614 for (unsigned i = 0; i < n; ++i) {
1615 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001616 v[i] = (v[i] << shift) | v_carry;
1617 v_carry = v_tmp;
1618 }
1619 }
1620 u[m+n] = u_carry;
Yaron Keren39fc5a62015-03-26 19:45:19 +00001621
David Greenef32fcb42010-01-05 01:28:52 +00001622 DEBUG(dbgs() << "KnuthDiv: normal:");
1623 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1624 DEBUG(dbgs() << " by");
1625 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1626 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001627
1628 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1629 int j = m;
1630 do {
David Greenef32fcb42010-01-05 01:28:52 +00001631 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001632 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001633 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1634 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1635 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1636 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1637 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001638 // value qp is one too large, and it eliminates all cases where qp is two
1639 // too large.
Reid Spencercb292e42007-02-23 01:57:13 +00001640 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greenef32fcb42010-01-05 01:28:52 +00001641 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001642 uint64_t qp = dividend / v[n-1];
1643 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001644 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1645 qp--;
1646 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001647 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001648 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001649 }
David Greenef32fcb42010-01-05 01:28:52 +00001650 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001651
Reid Spencercb292e42007-02-23 01:57:13 +00001652 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1653 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1654 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001655 // a subtraction.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001656 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1657 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1658 // true value plus b**(n+1), namely as the b's complement of
1659 // the true value, and a "borrow" to the left should be remembered.
Pawel Bylica86ac4472015-04-24 07:38:39 +00001660 int64_t borrow = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001661 for (unsigned i = 0; i < n; ++i) {
Pawel Bylica86ac4472015-04-24 07:38:39 +00001662 uint64_t p = uint64_t(qp) * uint64_t(v[i]);
1663 int64_t subres = int64_t(u[j+i]) - borrow - (unsigned)p;
1664 u[j+i] = (unsigned)subres;
1665 borrow = (p >> 32) - (subres >> 32);
1666 DEBUG(dbgs() << "KnuthDiv: u[j+i] = " << u[j+i]
Daniel Dunbar763ace92009-07-13 05:27:30 +00001667 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001668 }
Pawel Bylica86ac4472015-04-24 07:38:39 +00001669 bool isNeg = u[j+n] < borrow;
1670 u[j+n] -= (unsigned)borrow;
1671
David Greenef32fcb42010-01-05 01:28:52 +00001672 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1673 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1674 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001675
Eric Christopher820256b2009-08-21 04:06:45 +00001676 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001677 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner77527f52009-01-21 18:09:24 +00001678 q[j] = (unsigned)qp;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001679 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001680 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001681 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001682 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001683 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001684 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1685 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001686 // since it cancels with the borrow that occurred in D4.
1687 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001688 for (unsigned i = 0; i < n; i++) {
1689 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001690 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001691 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001692 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001693 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001694 }
David Greenef32fcb42010-01-05 01:28:52 +00001695 DEBUG(dbgs() << "KnuthDiv: after correction:");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001696 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
David Greenef32fcb42010-01-05 01:28:52 +00001697 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001698
Reid Spencercb292e42007-02-23 01:57:13 +00001699 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1700 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001701
David Greenef32fcb42010-01-05 01:28:52 +00001702 DEBUG(dbgs() << "KnuthDiv: quotient:");
1703 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1704 DEBUG(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001705
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001706 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1707 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1708 // compute the remainder (urem uses this).
1709 if (r) {
1710 // The value d is expressed by the "shift" value above since we avoided
1711 // multiplication by d by using a shift left. So, all we have to do is
1712 // shift right here. In order to mak
Reid Spencer468ad9112007-02-24 20:38:01 +00001713 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001714 unsigned carry = 0;
David Greenef32fcb42010-01-05 01:28:52 +00001715 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001716 for (int i = n-1; i >= 0; i--) {
1717 r[i] = (u[i] >> shift) | carry;
1718 carry = u[i] << (32 - shift);
David Greenef32fcb42010-01-05 01:28:52 +00001719 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001720 }
1721 } else {
1722 for (int i = n-1; i >= 0; i--) {
1723 r[i] = u[i];
David Greenef32fcb42010-01-05 01:28:52 +00001724 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001725 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001726 }
David Greenef32fcb42010-01-05 01:28:52 +00001727 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001728 }
David Greenef32fcb42010-01-05 01:28:52 +00001729 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001730}
1731
Benjamin Kramerc321e532016-06-08 19:09:22 +00001732void APInt::divide(const APInt &LHS, unsigned lhsWords, const APInt &RHS,
1733 unsigned rhsWords, APInt *Quotient, APInt *Remainder) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001734 assert(lhsWords >= rhsWords && "Fractional result");
1735
Eric Christopher820256b2009-08-21 04:06:45 +00001736 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001737 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001738 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001739 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1740 // can't use 64-bit operands here because we don't have native results of
1741 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001742 // work on large-endian machines.
Dan Gohmancff69532009-04-01 18:45:54 +00001743 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner77527f52009-01-21 18:09:24 +00001744 unsigned n = rhsWords * 2;
1745 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001746
1747 // Allocate space for the temporary values we need either on the stack, if
1748 // it will fit, or on the heap if it won't.
Chris Lattner77527f52009-01-21 18:09:24 +00001749 unsigned SPACE[128];
Craig Topperc10719f2014-04-07 04:17:22 +00001750 unsigned *U = nullptr;
1751 unsigned *V = nullptr;
1752 unsigned *Q = nullptr;
1753 unsigned *R = nullptr;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001754 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1755 U = &SPACE[0];
1756 V = &SPACE[m+n+1];
1757 Q = &SPACE[(m+n+1) + n];
1758 if (Remainder)
1759 R = &SPACE[(m+n+1) + n + (m+n)];
1760 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001761 U = new unsigned[m + n + 1];
1762 V = new unsigned[n];
1763 Q = new unsigned[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001764 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001765 R = new unsigned[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001766 }
1767
1768 // Initialize the dividend
Chris Lattner77527f52009-01-21 18:09:24 +00001769 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001770 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001771 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001772 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001773 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001774 }
1775 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1776
Reid Spencer522ca7c2007-02-25 01:56:07 +00001777 // Initialize the divisor
Chris Lattner77527f52009-01-21 18:09:24 +00001778 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001779 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001780 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001781 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001782 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001783 }
1784
Reid Spencer522ca7c2007-02-25 01:56:07 +00001785 // initialize the quotient and remainder
Chris Lattner77527f52009-01-21 18:09:24 +00001786 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001787 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001788 memset(R, 0, n * sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001789
Eric Christopher820256b2009-08-21 04:06:45 +00001790 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001791 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001792 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001793 // contain any zero words or the Knuth algorithm fails.
1794 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1795 n--;
1796 m++;
1797 }
1798 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1799 m--;
1800
1801 // If we're left with only a single word for the divisor, Knuth doesn't work
1802 // so we implement the short division algorithm here. This is much simpler
1803 // and faster because we are certain that we can divide a 64-bit quantity
1804 // by a 32-bit quantity at hardware speed and short division is simply a
1805 // series of such operations. This is just like doing short division but we
1806 // are using base 2^32 instead of base 10.
1807 assert(n != 0 && "Divide by zero?");
1808 if (n == 1) {
Chris Lattner77527f52009-01-21 18:09:24 +00001809 unsigned divisor = V[0];
1810 unsigned remainder = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001811 for (int i = m+n-1; i >= 0; i--) {
1812 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1813 if (partial_dividend == 0) {
1814 Q[i] = 0;
1815 remainder = 0;
1816 } else if (partial_dividend < divisor) {
1817 Q[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001818 remainder = (unsigned)partial_dividend;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001819 } else if (partial_dividend == divisor) {
1820 Q[i] = 1;
1821 remainder = 0;
1822 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001823 Q[i] = (unsigned)(partial_dividend / divisor);
1824 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001825 }
1826 }
1827 if (R)
1828 R[0] = remainder;
1829 } else {
1830 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1831 // case n > 1.
1832 KnuthDiv(U, V, Q, R, m, n);
1833 }
1834
1835 // If the caller wants the quotient
1836 if (Quotient) {
1837 // Set up the Quotient value's memory.
1838 if (Quotient->BitWidth != LHS.BitWidth) {
1839 if (Quotient->isSingleWord())
1840 Quotient->VAL = 0;
1841 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001842 delete [] Quotient->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001843 Quotient->BitWidth = LHS.BitWidth;
1844 if (!Quotient->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001845 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001846 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001847 Quotient->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001848
Eric Christopher820256b2009-08-21 04:06:45 +00001849 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001850 // order words.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001851 // This case is currently dead as all users of divide() handle trivial cases
1852 // earlier.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001853 if (lhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001854 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001855 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1856 if (Quotient->isSingleWord())
1857 Quotient->VAL = tmp;
1858 else
1859 Quotient->pVal[0] = tmp;
1860 } else {
1861 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1862 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001863 Quotient->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001864 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1865 }
1866 }
1867
1868 // If the caller wants the remainder
1869 if (Remainder) {
1870 // Set up the Remainder value's memory.
1871 if (Remainder->BitWidth != RHS.BitWidth) {
1872 if (Remainder->isSingleWord())
1873 Remainder->VAL = 0;
1874 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001875 delete [] Remainder->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001876 Remainder->BitWidth = RHS.BitWidth;
1877 if (!Remainder->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001878 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001879 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001880 Remainder->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001881
1882 // The remainder is in R. Reconstitute the remainder into Remainder's low
1883 // order words.
1884 if (rhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001885 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001886 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1887 if (Remainder->isSingleWord())
1888 Remainder->VAL = tmp;
1889 else
1890 Remainder->pVal[0] = tmp;
1891 } else {
1892 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1893 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001894 Remainder->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001895 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1896 }
1897 }
1898
1899 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001900 if (U != &SPACE[0]) {
1901 delete [] U;
1902 delete [] V;
1903 delete [] Q;
1904 delete [] R;
1905 }
Reid Spencer100502d2007-02-17 03:16:00 +00001906}
1907
Reid Spencer1d072122007-02-16 22:36:51 +00001908APInt APInt::udiv(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001909 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001910
1911 // First, deal with the easy case
1912 if (isSingleWord()) {
1913 assert(RHS.VAL != 0 && "Divide by zero?");
1914 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001915 }
Reid Spencer39867762007-02-17 02:07:07 +00001916
Reid Spencer39867762007-02-17 02:07:07 +00001917 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner77527f52009-01-21 18:09:24 +00001918 unsigned rhsBits = RHS.getActiveBits();
1919 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001920 assert(rhsWords && "Divided by zero???");
Chris Lattner77527f52009-01-21 18:09:24 +00001921 unsigned lhsBits = this->getActiveBits();
1922 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001923
1924 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001925 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001926 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001927 return APInt(BitWidth, 0);
Reid Spencer58a6a432007-02-21 08:21:52 +00001928 else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001929 // X / Y ===> 0, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001930 return APInt(BitWidth, 0);
1931 } else if (*this == RHS) {
1932 // X / X ===> 1
1933 return APInt(BitWidth, 1);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001934 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001935 // All high words are zero, just use native divide
Reid Spencer58a6a432007-02-21 08:21:52 +00001936 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001937 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001938
1939 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1940 APInt Quotient(1,0); // to hold result.
Craig Topperc10719f2014-04-07 04:17:22 +00001941 divide(*this, lhsWords, RHS, rhsWords, &Quotient, nullptr);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001942 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001943}
1944
Jakub Staszak6605c602013-02-20 00:17:42 +00001945APInt APInt::sdiv(const APInt &RHS) const {
1946 if (isNegative()) {
1947 if (RHS.isNegative())
1948 return (-(*this)).udiv(-RHS);
1949 return -((-(*this)).udiv(RHS));
1950 }
1951 if (RHS.isNegative())
1952 return -(this->udiv(-RHS));
1953 return this->udiv(RHS);
1954}
1955
Reid Spencer1d072122007-02-16 22:36:51 +00001956APInt APInt::urem(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001957 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001958 if (isSingleWord()) {
1959 assert(RHS.VAL != 0 && "Remainder by zero?");
1960 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001961 }
Reid Spencer39867762007-02-17 02:07:07 +00001962
Reid Spencer58a6a432007-02-21 08:21:52 +00001963 // Get some facts about the LHS
Chris Lattner77527f52009-01-21 18:09:24 +00001964 unsigned lhsBits = getActiveBits();
1965 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001966
1967 // Get some facts about the RHS
Chris Lattner77527f52009-01-21 18:09:24 +00001968 unsigned rhsBits = RHS.getActiveBits();
1969 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001970 assert(rhsWords && "Performing remainder operation by zero ???");
1971
Reid Spencer39867762007-02-17 02:07:07 +00001972 // Check the degenerate cases
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001973 if (lhsWords == 0) {
Reid Spencer58a6a432007-02-21 08:21:52 +00001974 // 0 % Y ===> 0
1975 return APInt(BitWidth, 0);
1976 } else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001977 // X % Y ===> X, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001978 return *this;
1979 } else if (*this == RHS) {
Reid Spencer39867762007-02-17 02:07:07 +00001980 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001981 return APInt(BitWidth, 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001982 } else if (lhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001983 // All high words are zero, just use native remainder
Reid Spencer58a6a432007-02-21 08:21:52 +00001984 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001985 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001986
Reid Spencer4c50b522007-05-13 23:44:59 +00001987 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001988 APInt Remainder(1,0);
Craig Topperc10719f2014-04-07 04:17:22 +00001989 divide(*this, lhsWords, RHS, rhsWords, nullptr, &Remainder);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001990 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001991}
Reid Spencer100502d2007-02-17 03:16:00 +00001992
Jakub Staszak6605c602013-02-20 00:17:42 +00001993APInt APInt::srem(const APInt &RHS) const {
1994 if (isNegative()) {
1995 if (RHS.isNegative())
1996 return -((-(*this)).urem(-RHS));
1997 return -((-(*this)).urem(RHS));
1998 }
1999 if (RHS.isNegative())
2000 return this->urem(-RHS);
2001 return this->urem(RHS);
2002}
2003
Eric Christopher820256b2009-08-21 04:06:45 +00002004void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00002005 APInt &Quotient, APInt &Remainder) {
David Majnemer7f039202014-12-14 09:41:56 +00002006 assert(LHS.BitWidth == RHS.BitWidth && "Bit widths must be the same");
2007
2008 // First, deal with the easy case
2009 if (LHS.isSingleWord()) {
2010 assert(RHS.VAL != 0 && "Divide by zero?");
2011 uint64_t QuotVal = LHS.VAL / RHS.VAL;
2012 uint64_t RemVal = LHS.VAL % RHS.VAL;
2013 Quotient = APInt(LHS.BitWidth, QuotVal);
2014 Remainder = APInt(LHS.BitWidth, RemVal);
2015 return;
2016 }
2017
Reid Spencer4c50b522007-05-13 23:44:59 +00002018 // Get some size facts about the dividend and divisor
Chris Lattner77527f52009-01-21 18:09:24 +00002019 unsigned lhsBits = LHS.getActiveBits();
2020 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2021 unsigned rhsBits = RHS.getActiveBits();
2022 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer4c50b522007-05-13 23:44:59 +00002023
2024 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00002025 if (lhsWords == 0) {
Reid Spencer4c50b522007-05-13 23:44:59 +00002026 Quotient = 0; // 0 / Y ===> 0
2027 Remainder = 0; // 0 % Y ===> 0
2028 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002029 }
2030
2031 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00002032 Remainder = LHS; // X % Y ===> X, iff X < Y
2033 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00002034 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002035 }
2036
Reid Spencer4c50b522007-05-13 23:44:59 +00002037 if (LHS == RHS) {
2038 Quotient = 1; // X / X ===> 1
2039 Remainder = 0; // X % X ===> 0;
2040 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002041 }
2042
Reid Spencer4c50b522007-05-13 23:44:59 +00002043 if (lhsWords == 1 && rhsWords == 1) {
2044 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00002045 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2046 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2047 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2048 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer4c50b522007-05-13 23:44:59 +00002049 return;
2050 }
2051
2052 // Okay, lets do it the long way
2053 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2054}
2055
Jakub Staszak6605c602013-02-20 00:17:42 +00002056void APInt::sdivrem(const APInt &LHS, const APInt &RHS,
2057 APInt &Quotient, APInt &Remainder) {
2058 if (LHS.isNegative()) {
2059 if (RHS.isNegative())
2060 APInt::udivrem(-LHS, -RHS, Quotient, Remainder);
2061 else {
2062 APInt::udivrem(-LHS, RHS, Quotient, Remainder);
2063 Quotient = -Quotient;
2064 }
2065 Remainder = -Remainder;
2066 } else if (RHS.isNegative()) {
2067 APInt::udivrem(LHS, -RHS, Quotient, Remainder);
2068 Quotient = -Quotient;
2069 } else {
2070 APInt::udivrem(LHS, RHS, Quotient, Remainder);
2071 }
2072}
2073
Chris Lattner2c819b02010-10-13 23:54:10 +00002074APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002075 APInt Res = *this+RHS;
2076 Overflow = isNonNegative() == RHS.isNonNegative() &&
2077 Res.isNonNegative() != isNonNegative();
2078 return Res;
2079}
2080
Chris Lattner698661c2010-10-14 00:05:07 +00002081APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2082 APInt Res = *this+RHS;
2083 Overflow = Res.ult(RHS);
2084 return Res;
2085}
2086
Chris Lattner2c819b02010-10-13 23:54:10 +00002087APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002088 APInt Res = *this - RHS;
2089 Overflow = isNonNegative() != RHS.isNonNegative() &&
2090 Res.isNonNegative() != isNonNegative();
2091 return Res;
2092}
2093
Chris Lattner698661c2010-10-14 00:05:07 +00002094APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00002095 APInt Res = *this-RHS;
2096 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00002097 return Res;
2098}
2099
Chris Lattner2c819b02010-10-13 23:54:10 +00002100APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002101 // MININT/-1 --> overflow.
2102 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2103 return sdiv(RHS);
2104}
2105
Chris Lattner2c819b02010-10-13 23:54:10 +00002106APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002107 APInt Res = *this * RHS;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002108
Chris Lattner79bdd882010-10-13 23:46:33 +00002109 if (*this != 0 && RHS != 0)
2110 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2111 else
2112 Overflow = false;
2113 return Res;
2114}
2115
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00002116APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2117 APInt Res = *this * RHS;
2118
2119 if (*this != 0 && RHS != 0)
2120 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2121 else
2122 Overflow = false;
2123 return Res;
2124}
2125
David Majnemera2521382014-10-13 21:48:30 +00002126APInt APInt::sshl_ov(const APInt &ShAmt, bool &Overflow) const {
2127 Overflow = ShAmt.uge(getBitWidth());
Chris Lattner79bdd882010-10-13 23:46:33 +00002128 if (Overflow)
David Majnemera2521382014-10-13 21:48:30 +00002129 return APInt(BitWidth, 0);
Chris Lattner79bdd882010-10-13 23:46:33 +00002130
2131 if (isNonNegative()) // Don't allow sign change.
David Majnemera2521382014-10-13 21:48:30 +00002132 Overflow = ShAmt.uge(countLeadingZeros());
Chris Lattner79bdd882010-10-13 23:46:33 +00002133 else
David Majnemera2521382014-10-13 21:48:30 +00002134 Overflow = ShAmt.uge(countLeadingOnes());
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002135
Chris Lattner79bdd882010-10-13 23:46:33 +00002136 return *this << ShAmt;
2137}
2138
David Majnemera2521382014-10-13 21:48:30 +00002139APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const {
2140 Overflow = ShAmt.uge(getBitWidth());
2141 if (Overflow)
2142 return APInt(BitWidth, 0);
2143
2144 Overflow = ShAmt.ugt(countLeadingZeros());
2145
2146 return *this << ShAmt;
2147}
2148
Chris Lattner79bdd882010-10-13 23:46:33 +00002149
2150
2151
Benjamin Kramer92d89982010-07-14 22:38:02 +00002152void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00002153 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002154 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002155 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002156 radix == 36) &&
2157 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002158
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002159 StringRef::iterator p = str.begin();
2160 size_t slen = str.size();
2161 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002162 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002163 p++;
2164 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00002165 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002166 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00002167 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002168 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2169 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002170 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2171 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00002172
2173 // Allocate memory
2174 if (!isSingleWord())
2175 pVal = getClearedMemory(getNumWords());
2176
2177 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00002178 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00002179
2180 // Set up an APInt for the digit to add outside the loop so we don't
2181 // constantly construct/destruct it.
2182 APInt apdigit(getBitWidth(), 0);
2183 APInt apradix(getBitWidth(), radix);
2184
2185 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002186 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00002187 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00002188 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00002189
Reid Spencera93c9812007-05-16 19:18:22 +00002190 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002191 if (slen > 1) {
2192 if (shift)
2193 *this <<= shift;
2194 else
2195 *this *= apradix;
2196 }
Reid Spencer1ba83352007-02-21 03:55:44 +00002197
2198 // Add in the digit we just interpreted
Reid Spencer632ebdf2007-02-24 20:19:37 +00002199 if (apdigit.isSingleWord())
2200 apdigit.VAL = digit;
2201 else
2202 apdigit.pVal[0] = digit;
Reid Spencer1ba83352007-02-21 03:55:44 +00002203 *this += apdigit;
Reid Spencer100502d2007-02-17 03:16:00 +00002204 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002205 // If its negative, put it in two's complement form
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00002206 if (isNeg) {
Jakub Staszak773be0c2013-03-20 23:56:19 +00002207 --(*this);
Jay Foad25a5e4c2010-12-01 08:53:58 +00002208 this->flipAllBits();
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002209 }
Reid Spencer100502d2007-02-17 03:16:00 +00002210}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002211
Chris Lattner17f71652008-08-17 07:19:36 +00002212void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002213 bool Signed, bool formatAsCLiteral) const {
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002214 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002215 Radix == 36) &&
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002216 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopher820256b2009-08-21 04:06:45 +00002217
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002218 const char *Prefix = "";
2219 if (formatAsCLiteral) {
2220 switch (Radix) {
2221 case 2:
2222 // Binary literals are a non-standard extension added in gcc 4.3:
2223 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2224 Prefix = "0b";
2225 break;
2226 case 8:
2227 Prefix = "0";
2228 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002229 case 10:
2230 break; // No prefix
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002231 case 16:
2232 Prefix = "0x";
2233 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002234 default:
2235 llvm_unreachable("Invalid radix!");
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002236 }
2237 }
2238
Chris Lattner17f71652008-08-17 07:19:36 +00002239 // First, check for a zero value and just short circuit the logic below.
2240 if (*this == 0) {
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002241 while (*Prefix) {
2242 Str.push_back(*Prefix);
2243 ++Prefix;
2244 };
Chris Lattner17f71652008-08-17 07:19:36 +00002245 Str.push_back('0');
2246 return;
2247 }
Eric Christopher820256b2009-08-21 04:06:45 +00002248
Douglas Gregor663c0682011-09-14 15:54:46 +00002249 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopher820256b2009-08-21 04:06:45 +00002250
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002251 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002252 char Buffer[65];
2253 char *BufPtr = Buffer+65;
Eric Christopher820256b2009-08-21 04:06:45 +00002254
Chris Lattner17f71652008-08-17 07:19:36 +00002255 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002256 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002257 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002258 } else {
2259 int64_t I = getSExtValue();
2260 if (I >= 0) {
2261 N = I;
2262 } else {
2263 Str.push_back('-');
2264 N = -(uint64_t)I;
2265 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002266 }
Eric Christopher820256b2009-08-21 04:06:45 +00002267
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002268 while (*Prefix) {
2269 Str.push_back(*Prefix);
2270 ++Prefix;
2271 };
2272
Chris Lattner17f71652008-08-17 07:19:36 +00002273 while (N) {
2274 *--BufPtr = Digits[N % Radix];
2275 N /= Radix;
2276 }
2277 Str.append(BufPtr, Buffer+65);
2278 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002279 }
2280
Chris Lattner17f71652008-08-17 07:19:36 +00002281 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002282
Chris Lattner17f71652008-08-17 07:19:36 +00002283 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002284 // They want to print the signed version and it is a negative value
2285 // Flip the bits and add one to turn it into the equivalent positive
2286 // value and put a '-' in the result.
Jay Foad25a5e4c2010-12-01 08:53:58 +00002287 Tmp.flipAllBits();
Jakub Staszak773be0c2013-03-20 23:56:19 +00002288 ++Tmp;
Chris Lattner17f71652008-08-17 07:19:36 +00002289 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002290 }
Eric Christopher820256b2009-08-21 04:06:45 +00002291
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002292 while (*Prefix) {
2293 Str.push_back(*Prefix);
2294 ++Prefix;
2295 };
2296
Chris Lattner17f71652008-08-17 07:19:36 +00002297 // We insert the digits backward, then reverse them to get the right order.
2298 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002299
2300 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2301 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattner17f71652008-08-17 07:19:36 +00002302 // equaly. We just shift until the value is zero.
Douglas Gregor663c0682011-09-14 15:54:46 +00002303 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattner17f71652008-08-17 07:19:36 +00002304 // Just shift tmp right for each digit width until it becomes zero
2305 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2306 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002307
Chris Lattner17f71652008-08-17 07:19:36 +00002308 while (Tmp != 0) {
2309 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2310 Str.push_back(Digits[Digit]);
2311 Tmp = Tmp.lshr(ShiftAmt);
2312 }
2313 } else {
Douglas Gregor663c0682011-09-14 15:54:46 +00002314 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattner17f71652008-08-17 07:19:36 +00002315 while (Tmp != 0) {
2316 APInt APdigit(1, 0);
2317 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopher820256b2009-08-21 04:06:45 +00002318 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattner17f71652008-08-17 07:19:36 +00002319 &APdigit);
Chris Lattner77527f52009-01-21 18:09:24 +00002320 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner17f71652008-08-17 07:19:36 +00002321 assert(Digit < Radix && "divide failed");
2322 Str.push_back(Digits[Digit]);
2323 Tmp = tmp2;
2324 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002325 }
Eric Christopher820256b2009-08-21 04:06:45 +00002326
Chris Lattner17f71652008-08-17 07:19:36 +00002327 // Reverse the digits before returning.
2328 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002329}
2330
Pawel Bylica6eeeac72015-04-06 13:31:39 +00002331/// Returns the APInt as a std::string. Note that this is an inefficient method.
2332/// It is better to pass in a SmallVector/SmallString to the methods above.
Chris Lattner17f71652008-08-17 07:19:36 +00002333std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2334 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002335 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002336 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002337}
Chris Lattner6b695682007-08-16 15:56:55 +00002338
Matthias Braun8c209aa2017-01-28 02:02:38 +00002339#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +00002340LLVM_DUMP_METHOD void APInt::dump() const {
Chris Lattner17f71652008-08-17 07:19:36 +00002341 SmallString<40> S, U;
2342 this->toStringUnsigned(U);
2343 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002344 dbgs() << "APInt(" << BitWidth << "b, "
Davide Italiano5a473d22017-01-31 21:26:18 +00002345 << U << "u " << S << "s)\n";
Chris Lattner17f71652008-08-17 07:19:36 +00002346}
Matthias Braun8c209aa2017-01-28 02:02:38 +00002347#endif
Chris Lattner17f71652008-08-17 07:19:36 +00002348
Chris Lattner0c19df42008-08-23 22:23:09 +00002349void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002350 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002351 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Yaron Keren92e1b622015-03-18 10:17:07 +00002352 OS << S;
Chris Lattner17f71652008-08-17 07:19:36 +00002353}
2354
Chris Lattner6b695682007-08-16 15:56:55 +00002355// This implements a variety of operations on a representation of
2356// arbitrary precision, two's-complement, bignum integer values.
2357
Chris Lattner96cffa62009-08-23 23:11:28 +00002358// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2359// and unrestricting assumption.
Benjamin Kramer7000ca32014-10-12 17:56:40 +00002360static_assert(integerPartWidth % 2 == 0, "Part width must be divisible by 2!");
Chris Lattner6b695682007-08-16 15:56:55 +00002361
2362/* Some handy functions local to this file. */
2363namespace {
2364
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002365 /* Returns the integer part with the least significant BITS set.
2366 BITS cannot be zero. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002367 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002368 lowBitMask(unsigned int bits)
2369 {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002370 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002371
2372 return ~(integerPart) 0 >> (integerPartWidth - bits);
2373 }
2374
Neil Boothc8b650a2007-10-06 00:43:45 +00002375 /* Returns the value of the lower half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002376 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002377 lowHalf(integerPart part)
2378 {
2379 return part & lowBitMask(integerPartWidth / 2);
2380 }
2381
Neil Boothc8b650a2007-10-06 00:43:45 +00002382 /* Returns the value of the upper half of PART. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002383 static inline integerPart
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002384 highHalf(integerPart part)
2385 {
2386 return part >> (integerPartWidth / 2);
2387 }
2388
Neil Boothc8b650a2007-10-06 00:43:45 +00002389 /* Returns the bit number of the most significant set bit of a part.
2390 If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002391 static unsigned int
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002392 partMSB(integerPart value)
Chris Lattner6b695682007-08-16 15:56:55 +00002393 {
Benjamin Kramerb565f892013-06-01 11:26:39 +00002394 return findLastSet(value, ZB_Max);
Chris Lattner6b695682007-08-16 15:56:55 +00002395 }
2396
Neil Boothc8b650a2007-10-06 00:43:45 +00002397 /* Returns the bit number of the least significant set bit of a
2398 part. If the input number has no bits set -1U is returned. */
Dan Gohmanf4bc7822008-04-10 21:11:47 +00002399 static unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002400 partLSB(integerPart value)
2401 {
Benjamin Kramerb565f892013-06-01 11:26:39 +00002402 return findFirstSet(value, ZB_Max);
Chris Lattner6b695682007-08-16 15:56:55 +00002403 }
Alexander Kornienkof00654e2015-06-23 09:49:53 +00002404}
Chris Lattner6b695682007-08-16 15:56:55 +00002405
2406/* Sets the least significant part of a bignum to the input value, and
2407 zeroes out higher parts. */
2408void
2409APInt::tcSet(integerPart *dst, integerPart part, unsigned int parts)
2410{
2411 unsigned int i;
2412
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002413 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002414
Chris Lattner6b695682007-08-16 15:56:55 +00002415 dst[0] = part;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002416 for (i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002417 dst[i] = 0;
2418}
2419
2420/* Assign one bignum to another. */
2421void
2422APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned int parts)
2423{
2424 unsigned int i;
2425
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002426 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002427 dst[i] = src[i];
2428}
2429
2430/* Returns true if a bignum is zero, false otherwise. */
2431bool
2432APInt::tcIsZero(const integerPart *src, unsigned int parts)
2433{
2434 unsigned int i;
2435
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002436 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002437 if (src[i])
2438 return false;
2439
2440 return true;
2441}
2442
2443/* Extract the given bit of a bignum; returns 0 or 1. */
2444int
2445APInt::tcExtractBit(const integerPart *parts, unsigned int bit)
2446{
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002447 return (parts[bit / integerPartWidth] &
2448 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002449}
2450
John McCalldcb9a7a2010-02-28 02:51:25 +00002451/* Set the given bit of a bignum. */
Chris Lattner6b695682007-08-16 15:56:55 +00002452void
2453APInt::tcSetBit(integerPart *parts, unsigned int bit)
2454{
2455 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2456}
2457
John McCalldcb9a7a2010-02-28 02:51:25 +00002458/* Clears the given bit of a bignum. */
2459void
2460APInt::tcClearBit(integerPart *parts, unsigned int bit)
2461{
2462 parts[bit / integerPartWidth] &=
2463 ~((integerPart) 1 << (bit % integerPartWidth));
2464}
2465
Neil Boothc8b650a2007-10-06 00:43:45 +00002466/* Returns the bit number of the least significant set bit of a
2467 number. If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002468unsigned int
2469APInt::tcLSB(const integerPart *parts, unsigned int n)
2470{
2471 unsigned int i, lsb;
2472
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002473 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002474 if (parts[i] != 0) {
2475 lsb = partLSB(parts[i]);
2476
2477 return lsb + i * integerPartWidth;
2478 }
2479 }
2480
2481 return -1U;
2482}
2483
Neil Boothc8b650a2007-10-06 00:43:45 +00002484/* Returns the bit number of the most significant set bit of a number.
2485 If the input number has no bits set -1U is returned. */
Chris Lattner6b695682007-08-16 15:56:55 +00002486unsigned int
2487APInt::tcMSB(const integerPart *parts, unsigned int n)
2488{
2489 unsigned int msb;
2490
2491 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002492 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002493
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002494 if (parts[n] != 0) {
2495 msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002496
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002497 return msb + n * integerPartWidth;
2498 }
Chris Lattner6b695682007-08-16 15:56:55 +00002499 } while (n);
2500
2501 return -1U;
2502}
2503
Neil Boothb6182162007-10-08 13:47:12 +00002504/* Copy the bit vector of width srcBITS from SRC, starting at bit
2505 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2506 the least significant bit of DST. All high bits above srcBITS in
2507 DST are zero-filled. */
2508void
Evan Chengdb338f32009-05-21 23:47:47 +00002509APInt::tcExtract(integerPart *dst, unsigned int dstCount,const integerPart *src,
Neil Boothb6182162007-10-08 13:47:12 +00002510 unsigned int srcBits, unsigned int srcLSB)
2511{
2512 unsigned int firstSrcPart, dstParts, shift, n;
2513
2514 dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002515 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002516
2517 firstSrcPart = srcLSB / integerPartWidth;
2518 tcAssign (dst, src + firstSrcPart, dstParts);
2519
2520 shift = srcLSB % integerPartWidth;
2521 tcShiftRight (dst, dstParts, shift);
2522
2523 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2524 in DST. If this is less that srcBits, append the rest, else
2525 clear the high bits. */
2526 n = dstParts * integerPartWidth - shift;
2527 if (n < srcBits) {
2528 integerPart mask = lowBitMask (srcBits - n);
2529 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2530 << n % integerPartWidth);
2531 } else if (n > srcBits) {
Neil Booth7e74b172007-10-12 15:31:31 +00002532 if (srcBits % integerPartWidth)
2533 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Boothb6182162007-10-08 13:47:12 +00002534 }
2535
2536 /* Clear high parts. */
2537 while (dstParts < dstCount)
2538 dst[dstParts++] = 0;
2539}
2540
Chris Lattner6b695682007-08-16 15:56:55 +00002541/* DST += RHS + C where C is zero or one. Returns the carry flag. */
2542integerPart
2543APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2544 integerPart c, unsigned int parts)
2545{
2546 unsigned int i;
2547
2548 assert(c <= 1);
2549
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002550 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002551 integerPart l;
2552
2553 l = dst[i];
2554 if (c) {
2555 dst[i] += rhs[i] + 1;
2556 c = (dst[i] <= l);
2557 } else {
2558 dst[i] += rhs[i];
2559 c = (dst[i] < l);
2560 }
2561 }
2562
2563 return c;
2564}
2565
2566/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
2567integerPart
2568APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2569 integerPart c, unsigned int parts)
2570{
2571 unsigned int i;
2572
2573 assert(c <= 1);
2574
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002575 for (i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002576 integerPart l;
2577
2578 l = dst[i];
2579 if (c) {
2580 dst[i] -= rhs[i] + 1;
2581 c = (dst[i] >= l);
2582 } else {
2583 dst[i] -= rhs[i];
2584 c = (dst[i] > l);
2585 }
2586 }
2587
2588 return c;
2589}
2590
2591/* Negate a bignum in-place. */
2592void
2593APInt::tcNegate(integerPart *dst, unsigned int parts)
2594{
2595 tcComplement(dst, parts);
2596 tcIncrement(dst, parts);
2597}
2598
Neil Boothc8b650a2007-10-06 00:43:45 +00002599/* DST += SRC * MULTIPLIER + CARRY if add is true
2600 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002601
2602 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2603 they must start at the same point, i.e. DST == SRC.
2604
2605 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2606 returned. Otherwise DST is filled with the least significant
2607 DSTPARTS parts of the result, and if all of the omitted higher
2608 parts were zero return zero, otherwise overflow occurred and
2609 return one. */
2610int
2611APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2612 integerPart multiplier, integerPart carry,
2613 unsigned int srcParts, unsigned int dstParts,
2614 bool add)
2615{
2616 unsigned int i, n;
2617
2618 /* Otherwise our writes of DST kill our later reads of SRC. */
2619 assert(dst <= src || dst >= src + srcParts);
2620 assert(dstParts <= srcParts + 1);
2621
2622 /* N loops; minimum of dstParts and srcParts. */
2623 n = dstParts < srcParts ? dstParts: srcParts;
2624
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002625 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002626 integerPart low, mid, high, srcPart;
2627
2628 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2629
2630 This cannot overflow, because
2631
2632 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2633
2634 which is less than n^2. */
2635
2636 srcPart = src[i];
2637
2638 if (multiplier == 0 || srcPart == 0) {
2639 low = carry;
2640 high = 0;
2641 } else {
2642 low = lowHalf(srcPart) * lowHalf(multiplier);
2643 high = highHalf(srcPart) * highHalf(multiplier);
2644
2645 mid = lowHalf(srcPart) * highHalf(multiplier);
2646 high += highHalf(mid);
2647 mid <<= integerPartWidth / 2;
2648 if (low + mid < low)
2649 high++;
2650 low += mid;
2651
2652 mid = highHalf(srcPart) * lowHalf(multiplier);
2653 high += highHalf(mid);
2654 mid <<= integerPartWidth / 2;
2655 if (low + mid < low)
2656 high++;
2657 low += mid;
2658
2659 /* Now add carry. */
2660 if (low + carry < low)
2661 high++;
2662 low += carry;
2663 }
2664
2665 if (add) {
2666 /* And now DST[i], and store the new low part there. */
2667 if (low + dst[i] < low)
2668 high++;
2669 dst[i] += low;
2670 } else
2671 dst[i] = low;
2672
2673 carry = high;
2674 }
2675
2676 if (i < dstParts) {
2677 /* Full multiplication, there is no overflow. */
2678 assert(i + 1 == dstParts);
2679 dst[i] = carry;
2680 return 0;
2681 } else {
2682 /* We overflowed if there is carry. */
2683 if (carry)
2684 return 1;
2685
2686 /* We would overflow if any significant unwritten parts would be
2687 non-zero. This is true if any remaining src parts are non-zero
2688 and the multiplier is non-zero. */
2689 if (multiplier)
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002690 for (; i < srcParts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002691 if (src[i])
2692 return 1;
2693
2694 /* We fitted in the narrow destination. */
2695 return 0;
2696 }
2697}
2698
2699/* DST = LHS * RHS, where DST has the same width as the operands and
2700 is filled with the least significant parts of the result. Returns
2701 one if overflow occurred, otherwise zero. DST must be disjoint
2702 from both operands. */
2703int
2704APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2705 const integerPart *rhs, unsigned int parts)
2706{
2707 unsigned int i;
2708 int overflow;
2709
2710 assert(dst != lhs && dst != rhs);
2711
2712 overflow = 0;
2713 tcSet(dst, 0, parts);
2714
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002715 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002716 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2717 parts - i, true);
2718
2719 return overflow;
2720}
2721
Neil Booth0ea72a92007-10-06 00:24:48 +00002722/* DST = LHS * RHS, where DST has width the sum of the widths of the
2723 operands. No overflow occurs. DST must be disjoint from both
2724 operands. Returns the number of parts required to hold the
2725 result. */
2726unsigned int
Chris Lattner6b695682007-08-16 15:56:55 +00002727APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
Neil Booth0ea72a92007-10-06 00:24:48 +00002728 const integerPart *rhs, unsigned int lhsParts,
2729 unsigned int rhsParts)
Chris Lattner6b695682007-08-16 15:56:55 +00002730{
Neil Booth0ea72a92007-10-06 00:24:48 +00002731 /* Put the narrower number on the LHS for less loops below. */
2732 if (lhsParts > rhsParts) {
2733 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2734 } else {
2735 unsigned int n;
Chris Lattner6b695682007-08-16 15:56:55 +00002736
Neil Booth0ea72a92007-10-06 00:24:48 +00002737 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002738
Neil Booth0ea72a92007-10-06 00:24:48 +00002739 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002740
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002741 for (n = 0; n < lhsParts; n++)
Neil Booth0ea72a92007-10-06 00:24:48 +00002742 tcMultiplyPart(&dst[n], rhs, lhs[n], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002743
Neil Booth0ea72a92007-10-06 00:24:48 +00002744 n = lhsParts + rhsParts;
2745
2746 return n - (dst[n - 1] == 0);
2747 }
Chris Lattner6b695682007-08-16 15:56:55 +00002748}
2749
2750/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2751 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2752 set REMAINDER to the remainder, return zero. i.e.
2753
2754 OLD_LHS = RHS * LHS + REMAINDER
2755
2756 SCRATCH is a bignum of the same size as the operands and result for
2757 use by the routine; its contents need not be initialized and are
2758 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2759*/
2760int
2761APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2762 integerPart *remainder, integerPart *srhs,
2763 unsigned int parts)
2764{
2765 unsigned int n, shiftCount;
2766 integerPart mask;
2767
2768 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2769
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002770 shiftCount = tcMSB(rhs, parts) + 1;
2771 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002772 return true;
2773
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002774 shiftCount = parts * integerPartWidth - shiftCount;
Chris Lattner6b695682007-08-16 15:56:55 +00002775 n = shiftCount / integerPartWidth;
2776 mask = (integerPart) 1 << (shiftCount % integerPartWidth);
2777
2778 tcAssign(srhs, rhs, parts);
2779 tcShiftLeft(srhs, parts, shiftCount);
2780 tcAssign(remainder, lhs, parts);
2781 tcSet(lhs, 0, parts);
2782
2783 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2784 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002785 for (;;) {
Chris Lattner6b695682007-08-16 15:56:55 +00002786 int compare;
2787
2788 compare = tcCompare(remainder, srhs, parts);
2789 if (compare >= 0) {
2790 tcSubtract(remainder, srhs, 0, parts);
2791 lhs[n] |= mask;
2792 }
2793
2794 if (shiftCount == 0)
2795 break;
2796 shiftCount--;
2797 tcShiftRight(srhs, parts, 1);
Richard Trieu7a083812016-02-18 22:09:30 +00002798 if ((mask >>= 1) == 0) {
2799 mask = (integerPart) 1 << (integerPartWidth - 1);
2800 n--;
2801 }
Chris Lattner6b695682007-08-16 15:56:55 +00002802 }
2803
2804 return false;
2805}
2806
2807/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2808 There are no restrictions on COUNT. */
2809void
2810APInt::tcShiftLeft(integerPart *dst, unsigned int parts, unsigned int count)
2811{
Neil Boothb6182162007-10-08 13:47:12 +00002812 if (count) {
2813 unsigned int jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002814
Neil Boothb6182162007-10-08 13:47:12 +00002815 /* Jump is the inter-part jump; shift is is intra-part shift. */
2816 jump = count / integerPartWidth;
2817 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002818
Neil Boothb6182162007-10-08 13:47:12 +00002819 while (parts > jump) {
2820 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002821
Neil Boothb6182162007-10-08 13:47:12 +00002822 parts--;
Chris Lattner6b695682007-08-16 15:56:55 +00002823
Neil Boothb6182162007-10-08 13:47:12 +00002824 /* dst[i] comes from the two parts src[i - jump] and, if we have
2825 an intra-part shift, src[i - jump - 1]. */
2826 part = dst[parts - jump];
2827 if (shift) {
2828 part <<= shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002829 if (parts >= jump + 1)
2830 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2831 }
2832
Neil Boothb6182162007-10-08 13:47:12 +00002833 dst[parts] = part;
2834 }
Chris Lattner6b695682007-08-16 15:56:55 +00002835
Neil Boothb6182162007-10-08 13:47:12 +00002836 while (parts > 0)
2837 dst[--parts] = 0;
2838 }
Chris Lattner6b695682007-08-16 15:56:55 +00002839}
2840
2841/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2842 zero. There are no restrictions on COUNT. */
2843void
2844APInt::tcShiftRight(integerPart *dst, unsigned int parts, unsigned int count)
2845{
Neil Boothb6182162007-10-08 13:47:12 +00002846 if (count) {
2847 unsigned int i, jump, shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002848
Neil Boothb6182162007-10-08 13:47:12 +00002849 /* Jump is the inter-part jump; shift is is intra-part shift. */
2850 jump = count / integerPartWidth;
2851 shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002852
Neil Boothb6182162007-10-08 13:47:12 +00002853 /* Perform the shift. This leaves the most significant COUNT bits
2854 of the result at zero. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002855 for (i = 0; i < parts; i++) {
Neil Boothb6182162007-10-08 13:47:12 +00002856 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002857
Neil Boothb6182162007-10-08 13:47:12 +00002858 if (i + jump >= parts) {
2859 part = 0;
2860 } else {
2861 part = dst[i + jump];
2862 if (shift) {
2863 part >>= shift;
2864 if (i + jump + 1 < parts)
2865 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2866 }
Chris Lattner6b695682007-08-16 15:56:55 +00002867 }
Chris Lattner6b695682007-08-16 15:56:55 +00002868
Neil Boothb6182162007-10-08 13:47:12 +00002869 dst[i] = part;
2870 }
Chris Lattner6b695682007-08-16 15:56:55 +00002871 }
2872}
2873
2874/* Bitwise and of two bignums. */
2875void
2876APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned int parts)
2877{
2878 unsigned int i;
2879
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002880 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002881 dst[i] &= rhs[i];
2882}
2883
2884/* Bitwise inclusive or of two bignums. */
2885void
2886APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned int parts)
2887{
2888 unsigned int i;
2889
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002890 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002891 dst[i] |= rhs[i];
2892}
2893
2894/* Bitwise exclusive or of two bignums. */
2895void
2896APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned int parts)
2897{
2898 unsigned int i;
2899
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002900 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002901 dst[i] ^= rhs[i];
2902}
2903
2904/* Complement a bignum in-place. */
2905void
2906APInt::tcComplement(integerPart *dst, unsigned int parts)
2907{
2908 unsigned int i;
2909
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002910 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002911 dst[i] = ~dst[i];
2912}
2913
2914/* Comparison (unsigned) of two bignums. */
2915int
2916APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2917 unsigned int parts)
2918{
2919 while (parts) {
2920 parts--;
2921 if (lhs[parts] == rhs[parts])
2922 continue;
2923
2924 if (lhs[parts] > rhs[parts])
2925 return 1;
2926 else
2927 return -1;
2928 }
2929
2930 return 0;
2931}
2932
2933/* Increment a bignum in-place, return the carry flag. */
2934integerPart
2935APInt::tcIncrement(integerPart *dst, unsigned int parts)
2936{
2937 unsigned int i;
2938
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002939 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002940 if (++dst[i] != 0)
2941 break;
2942
2943 return i == parts;
2944}
2945
Michael Gottesman9d406f42013-05-28 19:50:20 +00002946/* Decrement a bignum in-place, return the borrow flag. */
2947integerPart
2948APInt::tcDecrement(integerPart *dst, unsigned int parts) {
2949 for (unsigned int i = 0; i < parts; i++) {
2950 // If the current word is non-zero, then the decrement has no effect on the
2951 // higher-order words of the integer and no borrow can occur. Exit early.
2952 if (dst[i]--)
2953 return 0;
2954 }
2955 // If every word was zero, then there is a borrow.
2956 return 1;
2957}
2958
2959
Chris Lattner6b695682007-08-16 15:56:55 +00002960/* Set the least significant BITS bits of a bignum, clear the
2961 rest. */
2962void
2963APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned int parts,
2964 unsigned int bits)
2965{
2966 unsigned int i;
2967
2968 i = 0;
2969 while (bits > integerPartWidth) {
2970 dst[i++] = ~(integerPart) 0;
2971 bits -= integerPartWidth;
2972 }
2973
2974 if (bits)
2975 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2976
2977 while (i < parts)
2978 dst[i++] = 0;
2979}