blob: 0d4255da7f00b1fdfb68bcb24183063bbe97cf1d [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) {
Craig Topper0085ffb2017-03-20 01:29:52 +000079 VAL = 0;
Chris Lattner1ac3e252008-08-20 17:02:31 +000080 pVal = getClearedMemory(getNumWords());
81 pVal[0] = val;
Eric Christopher820256b2009-08-21 04:06:45 +000082 if (isSigned && int64_t(val) < 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +000083 for (unsigned i = 1; i < getNumWords(); ++i)
84 pVal[i] = -1ULL;
Craig Topperf78a6f02017-03-01 21:06:18 +000085 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +000086}
87
Chris Lattnerd57b7602008-10-11 22:07:19 +000088void APInt::initSlowCase(const APInt& that) {
Craig Topper0085ffb2017-03-20 01:29:52 +000089 VAL = 0;
Chris Lattnerd57b7602008-10-11 22:07:19 +000090 pVal = getMemory(getNumWords());
91 memcpy(pVal, that.pVal, getNumWords() * APINT_WORD_SIZE);
92}
93
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000094void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +000095 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000096 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengdac63782007-02-06 03:00:16 +000097 if (isSingleWord())
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000098 VAL = bigVal[0];
Zhou Shengdac63782007-02-06 03:00:16 +000099 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000100 // Get memory, cleared to 0
Craig Topper0085ffb2017-03-20 01:29:52 +0000101 VAL = 0;
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000102 pVal = getClearedMemory(getNumWords());
103 // Calculate the number of words to copy
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000104 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000105 // Copy the words from bigVal to pVal
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000106 memcpy(pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000107 }
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000108 // Make sure unused high bits are cleared
109 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000110}
111
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000112APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
Craig Topper0085ffb2017-03-20 01:29:52 +0000113 : BitWidth(numBits) {
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000114 initFromArray(bigVal);
115}
116
117APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Craig Topper0085ffb2017-03-20 01:29:52 +0000118 : BitWidth(numBits) {
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000119 initFromArray(makeArrayRef(bigVal, numWords));
120}
121
Benjamin Kramer92d89982010-07-14 22:38:02 +0000122APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Reid Spencer1ba83352007-02-21 03:55:44 +0000123 : BitWidth(numbits), VAL(0) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000124 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000125 fromString(numbits, Str, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000126}
127
Chris Lattner1ac3e252008-08-20 17:02:31 +0000128APInt& APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000129 // Don't do anything for X = X
130 if (this == &RHS)
131 return *this;
132
Reid Spencer7c16cd22007-02-26 23:38:21 +0000133 if (BitWidth == RHS.getBitWidth()) {
Chris Lattner1ac3e252008-08-20 17:02:31 +0000134 // assume same bit-width single-word case is already handled
135 assert(!isSingleWord());
136 memcpy(pVal, RHS.pVal, getNumWords() * APINT_WORD_SIZE);
Reid Spencer7c16cd22007-02-26 23:38:21 +0000137 return *this;
138 }
139
Chris Lattner1ac3e252008-08-20 17:02:31 +0000140 if (isSingleWord()) {
141 // assume case where both are single words is already handled
142 assert(!RHS.isSingleWord());
143 VAL = 0;
144 pVal = getMemory(RHS.getNumWords());
145 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
Eric Christopher820256b2009-08-21 04:06:45 +0000146 } else if (getNumWords() == RHS.getNumWords())
Reid Spencer7c16cd22007-02-26 23:38:21 +0000147 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
148 else if (RHS.isSingleWord()) {
149 delete [] pVal;
Reid Spencera856b6e2007-02-18 18:38:44 +0000150 VAL = RHS.VAL;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000151 } else {
152 delete [] pVal;
153 pVal = getMemory(RHS.getNumWords());
154 memcpy(pVal, RHS.pVal, RHS.getNumWords() * APINT_WORD_SIZE);
155 }
156 BitWidth = RHS.BitWidth;
157 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000158}
159
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000160/// This method 'profiles' an APInt for use with FoldingSet.
Ted Kremenek5c75d542008-01-19 04:23:33 +0000161void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek901540f2008-02-19 20:50:41 +0000162 ID.AddInteger(BitWidth);
Eric Christopher820256b2009-08-21 04:06:45 +0000163
Ted Kremenek5c75d542008-01-19 04:23:33 +0000164 if (isSingleWord()) {
165 ID.AddInteger(VAL);
166 return;
167 }
168
Chris Lattner77527f52009-01-21 18:09:24 +0000169 unsigned NumWords = getNumWords();
Ted Kremenek5c75d542008-01-19 04:23:33 +0000170 for (unsigned i = 0; i < NumWords; ++i)
171 ID.AddInteger(pVal[i]);
172}
173
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000174/// This function adds a single "digit" integer, y, to the multiple
Reid Spencera856b6e2007-02-18 18:38:44 +0000175/// "digit" integer array, x[]. x[] is modified to reflect the addition and
176/// 1 is returned if there is a carry out, otherwise 0 is returned.
Reid Spencer100502d2007-02-17 03:16:00 +0000177/// @returns the carry of the addition.
Chris Lattner77527f52009-01-21 18:09:24 +0000178static bool add_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
179 for (unsigned i = 0; i < len; ++i) {
Reid Spenceree0a6852007-02-18 06:39:42 +0000180 dest[i] = y + x[i];
181 if (dest[i] < y)
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000182 y = 1; // Carry one to next digit.
Reid Spenceree0a6852007-02-18 06:39:42 +0000183 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000184 y = 0; // No need to carry so exit early
Reid Spenceree0a6852007-02-18 06:39:42 +0000185 break;
186 }
Reid Spencer100502d2007-02-17 03:16:00 +0000187 }
Reid Spenceree0a6852007-02-18 06:39:42 +0000188 return y;
Reid Spencer100502d2007-02-17 03:16:00 +0000189}
190
Zhou Shengdac63782007-02-06 03:00:16 +0000191/// @brief Prefix increment operator. Increments the APInt by one.
192APInt& APInt::operator++() {
Eric Christopher820256b2009-08-21 04:06:45 +0000193 if (isSingleWord())
Reid Spencer1d072122007-02-16 22:36:51 +0000194 ++VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000195 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000196 add_1(pVal, pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000197 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000198}
199
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000200/// This function subtracts a single "digit" (64-bit word), y, from
Eric Christopher820256b2009-08-21 04:06:45 +0000201/// the multi-digit integer array, x[], propagating the borrowed 1 value until
Joerg Sonnenbergerd7baada2017-01-05 17:59:22 +0000202/// no further borrowing is needed or it runs out of "digits" in x. The result
Reid Spencera856b6e2007-02-18 18:38:44 +0000203/// is 1 if "borrowing" exhausted the digits in x, or 0 if x was not exhausted.
204/// In other words, if y > x then this function returns 1, otherwise 0.
Reid Spencera41e93b2007-02-25 19:32:03 +0000205/// @returns the borrow out of the subtraction
Chris Lattner77527f52009-01-21 18:09:24 +0000206static bool sub_1(uint64_t x[], unsigned len, uint64_t y) {
207 for (unsigned i = 0; i < len; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000208 uint64_t X = x[i];
Reid Spenceree0a6852007-02-18 06:39:42 +0000209 x[i] -= y;
Eric Christopher820256b2009-08-21 04:06:45 +0000210 if (y > X)
Reid Spencera856b6e2007-02-18 18:38:44 +0000211 y = 1; // We have to "borrow 1" from next "digit"
Reid Spencer100502d2007-02-17 03:16:00 +0000212 else {
Reid Spencera856b6e2007-02-18 18:38:44 +0000213 y = 0; // No need to borrow
214 break; // Remaining digits are unchanged so exit early
Reid Spencer100502d2007-02-17 03:16:00 +0000215 }
216 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000217 return bool(y);
Reid Spencer100502d2007-02-17 03:16:00 +0000218}
219
Zhou Shengdac63782007-02-06 03:00:16 +0000220/// @brief Prefix decrement operator. Decrements the APInt by one.
221APInt& APInt::operator--() {
Eric Christopher820256b2009-08-21 04:06:45 +0000222 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000223 --VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000224 else
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000225 sub_1(pVal, getNumWords(), 1);
Reid Spencera41e93b2007-02-25 19:32:03 +0000226 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000227}
228
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000229/// This function adds the integer array x to the integer array Y and
Eric Christopher820256b2009-08-21 04:06:45 +0000230/// places the result in dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000231/// @returns the carry out from the addition
232/// @brief General addition of 64-bit integer arrays
Eric Christopher820256b2009-08-21 04:06:45 +0000233static bool add(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000234 unsigned len) {
Reid Spencera5e0d202007-02-24 03:58:46 +0000235 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000236 for (unsigned i = 0; i< len; ++i) {
Reid Spencercb292e42007-02-23 01:57:13 +0000237 uint64_t limit = std::min(x[i],y[i]); // must come first in case dest == x
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000238 dest[i] = x[i] + y[i] + carry;
Reid Spencerdb2abec2007-02-21 05:44:56 +0000239 carry = dest[i] < limit || (carry && dest[i] == limit);
Reid Spencer100502d2007-02-17 03:16:00 +0000240 }
241 return carry;
242}
243
Reid Spencera41e93b2007-02-25 19:32:03 +0000244/// Adds the RHS APint to this APInt.
245/// @returns this, after addition of RHS.
Eric Christopher820256b2009-08-21 04:06:45 +0000246/// @brief Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000247APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000248 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000249 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000250 VAL += RHS.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000251 else {
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000252 add(pVal, pVal, RHS.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000253 }
Reid Spencera41e93b2007-02-25 19:32:03 +0000254 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000255}
256
Pete Cooperfea21392016-07-22 20:55:46 +0000257APInt& APInt::operator+=(uint64_t RHS) {
258 if (isSingleWord())
259 VAL += RHS;
260 else
261 add_1(pVal, pVal, getNumWords(), RHS);
262 return clearUnusedBits();
263}
264
Eric Christopher820256b2009-08-21 04:06:45 +0000265/// Subtracts the integer array y from the integer array x
Reid Spencera41e93b2007-02-25 19:32:03 +0000266/// @returns returns the borrow out.
267/// @brief Generalized subtraction of 64-bit integer arrays.
Eric Christopher820256b2009-08-21 04:06:45 +0000268static bool sub(uint64_t *dest, const uint64_t *x, const uint64_t *y,
Chris Lattner77527f52009-01-21 18:09:24 +0000269 unsigned len) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000270 bool borrow = false;
Chris Lattner77527f52009-01-21 18:09:24 +0000271 for (unsigned i = 0; i < len; ++i) {
Reid Spencer1ba83352007-02-21 03:55:44 +0000272 uint64_t x_tmp = borrow ? x[i] - 1 : x[i];
273 borrow = y[i] > x_tmp || (borrow && x[i] == 0);
274 dest[i] = x_tmp - y[i];
Reid Spencer100502d2007-02-17 03:16:00 +0000275 }
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000276 return borrow;
Reid Spencer100502d2007-02-17 03:16:00 +0000277}
278
Reid Spencera41e93b2007-02-25 19:32:03 +0000279/// Subtracts the RHS APInt from this APInt
280/// @returns this, after subtraction
Eric Christopher820256b2009-08-21 04:06:45 +0000281/// @brief Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000282APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000283 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000284 if (isSingleWord())
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000285 VAL -= RHS.VAL;
286 else
287 sub(pVal, pVal, RHS.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000288 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000289}
290
Pete Cooperfea21392016-07-22 20:55:46 +0000291APInt& APInt::operator-=(uint64_t RHS) {
292 if (isSingleWord())
293 VAL -= RHS;
294 else
295 sub_1(pVal, getNumWords(), RHS);
296 return clearUnusedBits();
297}
298
Dan Gohman4a618822010-02-10 16:03:48 +0000299/// Multiplies an integer array, x, by a uint64_t integer and places the result
Eric Christopher820256b2009-08-21 04:06:45 +0000300/// into dest.
Reid Spencera41e93b2007-02-25 19:32:03 +0000301/// @returns the carry out of the multiplication.
302/// @brief Multiply a multi-digit APInt by a single digit (64-bit) integer.
Chris Lattner77527f52009-01-21 18:09:24 +0000303static uint64_t mul_1(uint64_t dest[], uint64_t x[], unsigned len, uint64_t y) {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000304 // Split y into high 32-bit part (hy) and low 32-bit part (ly)
Reid Spencer100502d2007-02-17 03:16:00 +0000305 uint64_t ly = y & 0xffffffffULL, hy = y >> 32;
Reid Spencera41e93b2007-02-25 19:32:03 +0000306 uint64_t carry = 0;
307
308 // For each digit of x.
Chris Lattner77527f52009-01-21 18:09:24 +0000309 for (unsigned i = 0; i < len; ++i) {
Reid Spencera41e93b2007-02-25 19:32:03 +0000310 // Split x into high and low words
311 uint64_t lx = x[i] & 0xffffffffULL;
312 uint64_t hx = x[i] >> 32;
313 // hasCarry - A flag to indicate if there is a carry to the next digit.
Reid Spencer100502d2007-02-17 03:16:00 +0000314 // hasCarry == 0, no carry
315 // hasCarry == 1, has carry
316 // hasCarry == 2, no carry and the calculation result == 0.
317 uint8_t hasCarry = 0;
318 dest[i] = carry + lx * ly;
319 // Determine if the add above introduces carry.
320 hasCarry = (dest[i] < carry) ? 1 : 0;
321 carry = hx * ly + (dest[i] >> 32) + (hasCarry ? (1ULL << 32) : 0);
Eric Christopher820256b2009-08-21 04:06:45 +0000322 // The upper limit of carry can be (2^32 - 1)(2^32 - 1) +
Reid Spencer100502d2007-02-17 03:16:00 +0000323 // (2^32 - 1) + 2^32 = 2^64.
324 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
325
326 carry += (lx * hy) & 0xffffffffULL;
327 dest[i] = (carry << 32) | (dest[i] & 0xffffffffULL);
Eric Christopher820256b2009-08-21 04:06:45 +0000328 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000329 (carry >> 32) + ((lx * hy) >> 32) + hx * hy;
330 }
Reid Spencer100502d2007-02-17 03:16:00 +0000331 return carry;
332}
333
Eric Christopher820256b2009-08-21 04:06:45 +0000334/// Multiplies integer array x by integer array y and stores the result into
Reid Spencera41e93b2007-02-25 19:32:03 +0000335/// the integer array dest. Note that dest's size must be >= xlen + ylen.
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000336/// @brief Generalized multiplication of integer arrays.
Chris Lattner77527f52009-01-21 18:09:24 +0000337static void mul(uint64_t dest[], uint64_t x[], unsigned xlen, uint64_t y[],
338 unsigned ylen) {
Reid Spencer100502d2007-02-17 03:16:00 +0000339 dest[xlen] = mul_1(dest, x, xlen, y[0]);
Chris Lattner77527f52009-01-21 18:09:24 +0000340 for (unsigned i = 1; i < ylen; ++i) {
Reid Spencer100502d2007-02-17 03:16:00 +0000341 uint64_t ly = y[i] & 0xffffffffULL, hy = y[i] >> 32;
Reid Spencer58a6a432007-02-21 08:21:52 +0000342 uint64_t carry = 0, lx = 0, hx = 0;
Chris Lattner77527f52009-01-21 18:09:24 +0000343 for (unsigned j = 0; j < xlen; ++j) {
Reid Spencer100502d2007-02-17 03:16:00 +0000344 lx = x[j] & 0xffffffffULL;
345 hx = x[j] >> 32;
346 // hasCarry - A flag to indicate if has carry.
347 // hasCarry == 0, no carry
348 // hasCarry == 1, has carry
349 // hasCarry == 2, no carry and the calculation result == 0.
350 uint8_t hasCarry = 0;
351 uint64_t resul = carry + lx * ly;
352 hasCarry = (resul < carry) ? 1 : 0;
353 carry = (hasCarry ? (1ULL << 32) : 0) + hx * ly + (resul >> 32);
354 hasCarry = (!carry && hasCarry) ? 1 : (!carry ? 2 : 0);
355
356 carry += (lx * hy) & 0xffffffffULL;
357 resul = (carry << 32) | (resul & 0xffffffffULL);
358 dest[i+j] += resul;
359 carry = (((!carry && hasCarry != 2) || hasCarry == 1) ? (1ULL << 32) : 0)+
Eric Christopher820256b2009-08-21 04:06:45 +0000360 (carry >> 32) + (dest[i+j] < resul ? 1 : 0) +
Reid Spencer100502d2007-02-17 03:16:00 +0000361 ((lx * hy) >> 32) + hx * hy;
362 }
363 dest[i+xlen] = carry;
364 }
365}
366
Zhou Shengdac63782007-02-06 03:00:16 +0000367APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000368 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer58a6a432007-02-21 08:21:52 +0000369 if (isSingleWord()) {
Reid Spencer4bb430c2007-02-20 20:42:10 +0000370 VAL *= RHS.VAL;
Reid Spencer58a6a432007-02-21 08:21:52 +0000371 clearUnusedBits();
372 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000373 }
Reid Spencer58a6a432007-02-21 08:21:52 +0000374
375 // Get some bit facts about LHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000376 unsigned lhsBits = getActiveBits();
377 unsigned lhsWords = !lhsBits ? 0 : whichWord(lhsBits - 1) + 1;
Eric Christopher820256b2009-08-21 04:06:45 +0000378 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +0000379 // 0 * X ===> 0
380 return *this;
381
382 // Get some bit facts about RHS and check for zero
Chris Lattner77527f52009-01-21 18:09:24 +0000383 unsigned rhsBits = RHS.getActiveBits();
384 unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1;
Reid Spencer58a6a432007-02-21 08:21:52 +0000385 if (!rhsWords) {
386 // X * 0 ===> 0
Jay Foad25a5e4c2010-12-01 08:53:58 +0000387 clearAllBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000388 return *this;
389 }
390
391 // Allocate space for the result
Chris Lattner77527f52009-01-21 18:09:24 +0000392 unsigned destWords = rhsWords + lhsWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000393 uint64_t *dest = getMemory(destWords);
394
395 // Perform the long multiply
396 mul(dest, pVal, lhsWords, RHS.pVal, rhsWords);
397
398 // Copy result back into *this
Jay Foad25a5e4c2010-12-01 08:53:58 +0000399 clearAllBits();
Chris Lattner77527f52009-01-21 18:09:24 +0000400 unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords;
Reid Spencer58a6a432007-02-21 08:21:52 +0000401 memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE);
Eli Friedman19546412011-10-07 23:40:49 +0000402 clearUnusedBits();
Reid Spencer58a6a432007-02-21 08:21:52 +0000403
404 // delete dest array and return
405 delete[] dest;
Zhou Shengdac63782007-02-06 03:00:16 +0000406 return *this;
407}
408
Craig Topperf496f9a2017-03-28 04:00:47 +0000409APInt& APInt::AndAssignSlowCase(const APInt& RHS) {
Chris Lattner77527f52009-01-21 18:09:24 +0000410 unsigned numWords = getNumWords();
411 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000412 pVal[i] &= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000413 return *this;
414}
415
Craig Topperf496f9a2017-03-28 04:00:47 +0000416APInt& APInt::OrAssignSlowCase(const APInt& RHS) {
Chris Lattner77527f52009-01-21 18:09:24 +0000417 unsigned numWords = getNumWords();
418 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000419 pVal[i] |= RHS.pVal[i];
Zhou Shengdac63782007-02-06 03:00:16 +0000420 return *this;
421}
422
Craig Topperf496f9a2017-03-28 04:00:47 +0000423APInt& APInt::XorAssignSlowCase(const APInt& RHS) {
Chris Lattner77527f52009-01-21 18:09:24 +0000424 unsigned numWords = getNumWords();
425 for (unsigned i = 0; i < numWords; ++i)
Reid Spencera856b6e2007-02-18 18:38:44 +0000426 pVal[i] ^= RHS.pVal[i];
Craig Topper9028f052017-01-24 02:10:15 +0000427 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000428}
429
Zhou Shengdac63782007-02-06 03:00:16 +0000430APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000431 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencera41e93b2007-02-25 19:32:03 +0000432 if (isSingleWord())
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000433 return APInt(BitWidth, VAL * RHS.VAL);
Reid Spencer4bb430c2007-02-20 20:42:10 +0000434 APInt Result(*this);
435 Result *= RHS;
Eli Friedman19546412011-10-07 23:40:49 +0000436 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000437}
438
Chris Lattner1ac3e252008-08-20 17:02:31 +0000439bool APInt::EqualSlowCase(const APInt& RHS) const {
Matthias Braun5117fcd2016-02-15 20:06:19 +0000440 return std::equal(pVal, pVal + getNumWords(), RHS.pVal);
Zhou Shengdac63782007-02-06 03:00:16 +0000441}
442
Chris Lattner1ac3e252008-08-20 17:02:31 +0000443bool APInt::EqualSlowCase(uint64_t Val) const {
Chris Lattner77527f52009-01-21 18:09:24 +0000444 unsigned n = getActiveBits();
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000445 if (n <= APINT_BITS_PER_WORD)
446 return pVal[0] == Val;
447 else
448 return false;
Zhou Shengdac63782007-02-06 03:00:16 +0000449}
450
Reid Spencer1d072122007-02-16 22:36:51 +0000451bool APInt::ult(const APInt& RHS) const {
452 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
453 if (isSingleWord())
454 return VAL < RHS.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000455
456 // Get active bit length of both operands
Chris Lattner77527f52009-01-21 18:09:24 +0000457 unsigned n1 = getActiveBits();
458 unsigned n2 = RHS.getActiveBits();
Reid Spencera41e93b2007-02-25 19:32:03 +0000459
460 // If magnitude of LHS is less than RHS, return true.
461 if (n1 < n2)
462 return true;
463
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000464 // If magnitude of RHS is greater than LHS, return false.
Reid Spencera41e93b2007-02-25 19:32:03 +0000465 if (n2 < n1)
466 return false;
467
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000468 // If they both fit in a word, just compare the low order word
Reid Spencera41e93b2007-02-25 19:32:03 +0000469 if (n1 <= APINT_BITS_PER_WORD && n2 <= APINT_BITS_PER_WORD)
470 return pVal[0] < RHS.pVal[0];
471
472 // Otherwise, compare all words
Chris Lattner77527f52009-01-21 18:09:24 +0000473 unsigned topWord = whichWord(std::max(n1,n2)-1);
Reid Spencer54abdcf2007-02-27 18:23:40 +0000474 for (int i = topWord; i >= 0; --i) {
Eric Christopher820256b2009-08-21 04:06:45 +0000475 if (pVal[i] > RHS.pVal[i])
Reid Spencer1d072122007-02-16 22:36:51 +0000476 return false;
Eric Christopher820256b2009-08-21 04:06:45 +0000477 if (pVal[i] < RHS.pVal[i])
Reid Spencera41e93b2007-02-25 19:32:03 +0000478 return true;
Zhou Shengdac63782007-02-06 03:00:16 +0000479 }
480 return false;
481}
482
Reid Spencer1d072122007-02-16 22:36:51 +0000483bool APInt::slt(const APInt& RHS) const {
484 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000485 if (isSingleWord()) {
David Majnemer5f1c0172016-06-24 20:51:47 +0000486 int64_t lhsSext = SignExtend64(VAL, BitWidth);
487 int64_t rhsSext = SignExtend64(RHS.VAL, BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000488 return lhsSext < rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000489 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000490
Reid Spencer54abdcf2007-02-27 18:23:40 +0000491 bool lhsNeg = isNegative();
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000492 bool rhsNeg = RHS.isNegative();
Reid Spencera41e93b2007-02-25 19:32:03 +0000493
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000494 // If the sign bits don't match, then (LHS < RHS) if LHS is negative
495 if (lhsNeg != rhsNeg)
496 return lhsNeg;
497
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000498 // Otherwise we can just use an unsigned comparison, because even negative
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000499 // numbers compare correctly this way if both have the same signed-ness.
500 return ult(RHS);
Zhou Shengdac63782007-02-06 03:00:16 +0000501}
502
Jay Foad25a5e4c2010-12-01 08:53:58 +0000503void APInt::setBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000504 if (isSingleWord())
Reid Spencera41e93b2007-02-25 19:32:03 +0000505 VAL |= maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000506 else
Reid Spencera41e93b2007-02-25 19:32:03 +0000507 pVal[whichWord(bitPosition)] |= maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000508}
509
Craig Topperbafdd032017-03-07 01:56:01 +0000510void APInt::setBitsSlowCase(unsigned loBit, unsigned hiBit) {
511 unsigned loWord = whichWord(loBit);
512 unsigned hiWord = whichWord(hiBit);
Simon Pilgrimaed35222017-02-24 10:15:29 +0000513
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000514 // Create an initial mask for the low word with zeros below loBit.
Craig Topperbafdd032017-03-07 01:56:01 +0000515 uint64_t loMask = UINT64_MAX << whichBit(loBit);
Simon Pilgrimaed35222017-02-24 10:15:29 +0000516
Craig Topperbafdd032017-03-07 01:56:01 +0000517 // If hiBit is not aligned, we need a high mask.
518 unsigned hiShiftAmt = whichBit(hiBit);
519 if (hiShiftAmt != 0) {
520 // Create a high mask with zeros above hiBit.
521 uint64_t hiMask = UINT64_MAX >> (APINT_BITS_PER_WORD - hiShiftAmt);
522 // If loWord and hiWord are equal, then we combine the masks. Otherwise,
523 // set the bits in hiWord.
524 if (hiWord == loWord)
525 loMask &= hiMask;
526 else
Simon Pilgrimaed35222017-02-24 10:15:29 +0000527 pVal[hiWord] |= hiMask;
Simon Pilgrimaed35222017-02-24 10:15:29 +0000528 }
Craig Topperbafdd032017-03-07 01:56:01 +0000529 // Apply the mask to the low word.
530 pVal[loWord] |= loMask;
531
532 // Fill any words between loWord and hiWord with all ones.
533 for (unsigned word = loWord + 1; word < hiWord; ++word)
534 pVal[word] = UINT64_MAX;
Simon Pilgrimaed35222017-02-24 10:15:29 +0000535}
536
Zhou Shengdac63782007-02-06 03:00:16 +0000537/// Set the given bit to 0 whose position is given as "bitPosition".
538/// @brief Set a given bit to 0.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000539void APInt::clearBit(unsigned bitPosition) {
Eric Christopher820256b2009-08-21 04:06:45 +0000540 if (isSingleWord())
Reid Spencera856b6e2007-02-18 18:38:44 +0000541 VAL &= ~maskBit(bitPosition);
Eric Christopher820256b2009-08-21 04:06:45 +0000542 else
Reid Spencera856b6e2007-02-18 18:38:44 +0000543 pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000544}
545
Zhou Shengdac63782007-02-06 03:00:16 +0000546/// @brief Toggle every bit to its opposite value.
Craig Topperafc9e352017-03-27 17:10:21 +0000547void APInt::flipAllBitsSlowCase() {
548 for (unsigned i = 0; i < getNumWords(); ++i)
549 pVal[i] ^= UINT64_MAX;
550 clearUnusedBits();
551}
Zhou Shengdac63782007-02-06 03:00:16 +0000552
Eric Christopher820256b2009-08-21 04:06:45 +0000553/// Toggle a given bit to its opposite value whose position is given
Zhou Shengdac63782007-02-06 03:00:16 +0000554/// as "bitPosition".
555/// @brief Toggles a given bit to its opposite value.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000556void APInt::flipBit(unsigned bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000557 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad25a5e4c2010-12-01 08:53:58 +0000558 if ((*this)[bitPosition]) clearBit(bitPosition);
559 else setBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000560}
561
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000562void APInt::insertBits(const APInt &subBits, unsigned bitPosition) {
563 unsigned subBitWidth = subBits.getBitWidth();
564 assert(0 < subBitWidth && (subBitWidth + bitPosition) <= BitWidth &&
565 "Illegal bit insertion");
566
567 // Insertion is a direct copy.
568 if (subBitWidth == BitWidth) {
569 *this = subBits;
570 return;
571 }
572
573 // Single word result can be done as a direct bitmask.
574 if (isSingleWord()) {
575 uint64_t mask = UINT64_MAX >> (APINT_BITS_PER_WORD - subBitWidth);
576 VAL &= ~(mask << bitPosition);
577 VAL |= (subBits.VAL << bitPosition);
578 return;
579 }
580
581 unsigned loBit = whichBit(bitPosition);
582 unsigned loWord = whichWord(bitPosition);
583 unsigned hi1Word = whichWord(bitPosition + subBitWidth - 1);
584
585 // Insertion within a single word can be done as a direct bitmask.
586 if (loWord == hi1Word) {
587 uint64_t mask = UINT64_MAX >> (APINT_BITS_PER_WORD - subBitWidth);
588 pVal[loWord] &= ~(mask << loBit);
589 pVal[loWord] |= (subBits.VAL << loBit);
590 return;
591 }
592
593 // Insert on word boundaries.
594 if (loBit == 0) {
595 // Direct copy whole words.
596 unsigned numWholeSubWords = subBitWidth / APINT_BITS_PER_WORD;
597 memcpy(pVal + loWord, subBits.getRawData(),
598 numWholeSubWords * APINT_WORD_SIZE);
599
600 // Mask+insert remaining bits.
601 unsigned remainingBits = subBitWidth % APINT_BITS_PER_WORD;
602 if (remainingBits != 0) {
603 uint64_t mask = UINT64_MAX >> (APINT_BITS_PER_WORD - remainingBits);
604 pVal[hi1Word] &= ~mask;
605 pVal[hi1Word] |= subBits.getWord(subBitWidth - 1);
606 }
607 return;
608 }
609
610 // General case - set/clear individual bits in dst based on src.
611 // TODO - there is scope for optimization here, but at the moment this code
612 // path is barely used so prefer readability over performance.
613 for (unsigned i = 0; i != subBitWidth; ++i) {
614 if (subBits[i])
615 setBit(bitPosition + i);
616 else
617 clearBit(bitPosition + i);
618 }
619}
620
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000621APInt APInt::extractBits(unsigned numBits, unsigned bitPosition) const {
622 assert(numBits > 0 && "Can't extract zero bits");
623 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
624 "Illegal bit extraction");
625
626 if (isSingleWord())
627 return APInt(numBits, VAL >> bitPosition);
628
629 unsigned loBit = whichBit(bitPosition);
630 unsigned loWord = whichWord(bitPosition);
631 unsigned hiWord = whichWord(bitPosition + numBits - 1);
632
633 // Single word result extracting bits from a single word source.
634 if (loWord == hiWord)
635 return APInt(numBits, pVal[loWord] >> loBit);
636
637 // Extracting bits that start on a source word boundary can be done
638 // as a fast memory copy.
639 if (loBit == 0)
640 return APInt(numBits, makeArrayRef(pVal + loWord, 1 + hiWord - loWord));
641
642 // General case - shift + copy source words directly into place.
643 APInt Result(numBits, 0);
644 unsigned NumSrcWords = getNumWords();
645 unsigned NumDstWords = Result.getNumWords();
646
647 for (unsigned word = 0; word < NumDstWords; ++word) {
648 uint64_t w0 = pVal[loWord + word];
649 uint64_t w1 =
650 (loWord + word + 1) < NumSrcWords ? pVal[loWord + word + 1] : 0;
651 Result.pVal[word] = (w0 >> loBit) | (w1 << (APINT_BITS_PER_WORD - loBit));
652 }
653
654 return Result.clearUnusedBits();
655}
656
Benjamin Kramer92d89982010-07-14 22:38:02 +0000657unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000658 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000659 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +0000660 radix == 36) &&
661 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000662
663 size_t slen = str.size();
Reid Spencer9329e7b2007-04-13 19:19:07 +0000664
Eric Christopher43a1dec2009-08-21 04:10:31 +0000665 // Each computation below needs to know if it's negative.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000666 StringRef::iterator p = str.begin();
Eric Christopher43a1dec2009-08-21 04:10:31 +0000667 unsigned isNegative = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000668 if (*p == '-' || *p == '+') {
669 p++;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000670 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +0000671 assert(slen && "String is only a sign, needs a value.");
Reid Spencer9329e7b2007-04-13 19:19:07 +0000672 }
Eric Christopher43a1dec2009-08-21 04:10:31 +0000673
Reid Spencer9329e7b2007-04-13 19:19:07 +0000674 // For radixes of power-of-two values, the bits required is accurately and
675 // easily computed
676 if (radix == 2)
677 return slen + isNegative;
678 if (radix == 8)
679 return slen * 3 + isNegative;
680 if (radix == 16)
681 return slen * 4 + isNegative;
682
Douglas Gregor663c0682011-09-14 15:54:46 +0000683 // FIXME: base 36
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000684
Reid Spencer9329e7b2007-04-13 19:19:07 +0000685 // This is grossly inefficient but accurate. We could probably do something
686 // with a computation of roughly slen*64/20 and then adjust by the value of
687 // the first few digits. But, I'm not sure how accurate that could be.
688
689 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000690 // be too large. This avoids the assertion in the constructor. This
691 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
692 // bits in that case.
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000693 unsigned sufficient
Douglas Gregor663c0682011-09-14 15:54:46 +0000694 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
695 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000696
697 // Convert to the actual binary value.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000698 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000699
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000700 // Compute how many bits are required. If the log is infinite, assume we need
701 // just bit.
702 unsigned log = tmp.logBase2();
703 if (log == (unsigned)-1) {
704 return isNegative + 1;
705 } else {
706 return isNegative + log + 1;
707 }
Reid Spencer9329e7b2007-04-13 19:19:07 +0000708}
709
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000710hash_code llvm::hash_value(const APInt &Arg) {
711 if (Arg.isSingleWord())
712 return hash_combine(Arg.VAL);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000713
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000714 return hash_combine_range(Arg.pVal, Arg.pVal + Arg.getNumWords());
Reid Spencerb2bc9852007-02-26 21:02:27 +0000715}
716
Benjamin Kramerb4b51502015-03-25 16:49:59 +0000717bool APInt::isSplat(unsigned SplatSizeInBits) const {
718 assert(getBitWidth() % SplatSizeInBits == 0 &&
719 "SplatSizeInBits must divide width!");
720 // We can check that all parts of an integer are equal by making use of a
721 // little trick: rotate and check if it's still the same value.
722 return *this == rotl(SplatSizeInBits);
723}
724
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000725/// This function returns the high "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000726APInt APInt::getHiBits(unsigned numBits) const {
Craig Toppere7e35602017-03-31 18:48:14 +0000727 return this->lshr(BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000728}
729
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000730/// This function returns the low "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000731APInt APInt::getLoBits(unsigned numBits) const {
Craig Toppere7e35602017-03-31 18:48:14 +0000732 APInt Result(getLowBitsSet(BitWidth, numBits));
733 Result &= *this;
734 return Result;
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
Craig Topper278ebd22017-04-01 20:30:57 +0000879APInt llvm::APIntOps::GreatestCommonDivisor(APInt A, APInt B) {
Zhou Shengdac63782007-02-06 03:00:16 +0000880 while (!!B) {
Craig Topper278ebd22017-04-01 20:30:57 +0000881 APInt R = A.urem(B);
882 A = std::move(B);
883 B = std::move(R);
Zhou Shengdac63782007-02-06 03:00:16 +0000884 }
885 return A;
886}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000887
Chris Lattner77527f52009-01-21 18:09:24 +0000888APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000889 union {
890 double D;
891 uint64_t I;
892 } T;
893 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000894
895 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000896 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000897
898 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000899 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000900
901 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000902 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000903 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000904
905 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
906 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
907
908 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000909 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000910 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000911 APInt(width, mantissa >> (52 - exp));
912
913 // If the client didn't provide enough bits for us to shift the mantissa into
914 // then the result is undefined, just return 0
915 if (width <= exp - 52)
916 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000917
918 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000919 APInt Tmp(width, mantissa);
Chris Lattner77527f52009-01-21 18:09:24 +0000920 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd707d632007-02-12 20:02:55 +0000921 return isNeg ? -Tmp : Tmp;
922}
923
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000924/// This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000925/// The layout for double is as following (IEEE Standard 754):
926/// --------------------------------------
927/// | Sign Exponent Fraction Bias |
928/// |-------------------------------------- |
929/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000930/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000931double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000932
933 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000934 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000935 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
936 if (isSigned) {
David Majnemer03992262016-06-24 21:15:36 +0000937 int64_t sext = SignExtend64(getWord(0), BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000938 return double(sext);
939 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000940 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000941 }
942
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000943 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000944 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000945
946 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000947 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000948
949 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000950 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000951
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000952 // The exponent (without bias normalization) is just the number of bits
953 // we are using. Note that the sign bit is gone since we constructed the
954 // absolute value.
955 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000956
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000957 // Return infinity for exponent overflow
958 if (exp > 1023) {
959 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000960 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000961 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000962 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000963 }
964 exp += 1023; // Increment for 1023 bias
965
966 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
967 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000968 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000969 unsigned hiWord = whichWord(n-1);
970 if (hiWord == 0) {
971 mantissa = Tmp.pVal[0];
972 if (n > 52)
973 mantissa >>= n - 52; // shift down, we want the top 52 bits.
974 } else {
975 assert(hiWord > 0 && "huh?");
976 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
977 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
978 mantissa = hibits | lobits;
979 }
980
Zhou Shengd707d632007-02-12 20:02:55 +0000981 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000982 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +0000983 union {
984 double D;
985 uint64_t I;
986 } T;
987 T.I = sign | (exp << 52) | mantissa;
988 return T.D;
989}
990
Reid Spencer1d072122007-02-16 22:36:51 +0000991// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000992APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000993 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +0000994 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +0000995
996 if (width <= APINT_BITS_PER_WORD)
997 return APInt(width, getRawData()[0]);
998
999 APInt Result(getMemory(getNumWords(width)), width);
1000
1001 // Copy full words.
1002 unsigned i;
1003 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1004 Result.pVal[i] = pVal[i];
1005
1006 // Truncate and copy any partial word.
1007 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1008 if (bits != 0)
1009 Result.pVal[i] = pVal[i] << bits >> bits;
1010
1011 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001012}
1013
1014// Sign extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001015APInt APInt::sext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001016 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001017
1018 if (width <= APINT_BITS_PER_WORD) {
1019 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1020 val = (int64_t)val >> (width - BitWidth);
1021 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001022 }
1023
Jay Foad583abbc2010-12-07 08:25:19 +00001024 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001025
Jay Foad583abbc2010-12-07 08:25:19 +00001026 // Copy full words.
1027 unsigned i;
1028 uint64_t word = 0;
1029 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1030 word = getRawData()[i];
1031 Result.pVal[i] = word;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001032 }
1033
Jay Foad583abbc2010-12-07 08:25:19 +00001034 // Read and sign-extend any partial word.
1035 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1036 if (bits != 0)
1037 word = (int64_t)getRawData()[i] << bits >> bits;
1038 else
1039 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1040
1041 // Write remaining full words.
1042 for (; i != width / APINT_BITS_PER_WORD; i++) {
1043 Result.pVal[i] = word;
1044 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001045 }
Jay Foad583abbc2010-12-07 08:25:19 +00001046
1047 // Write any partial word.
1048 bits = (0 - width) % APINT_BITS_PER_WORD;
1049 if (bits != 0)
1050 Result.pVal[i] = word << bits >> bits;
1051
1052 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001053}
1054
1055// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001056APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001057 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001058
1059 if (width <= APINT_BITS_PER_WORD)
1060 return APInt(width, VAL);
1061
1062 APInt Result(getMemory(getNumWords(width)), width);
1063
1064 // Copy words.
1065 unsigned i;
1066 for (i = 0; i != getNumWords(); i++)
1067 Result.pVal[i] = getRawData()[i];
1068
1069 // Zero remaining words.
1070 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1071
1072 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001073}
1074
Jay Foad583abbc2010-12-07 08:25:19 +00001075APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001076 if (BitWidth < width)
1077 return zext(width);
1078 if (BitWidth > width)
1079 return trunc(width);
1080 return *this;
1081}
1082
Jay Foad583abbc2010-12-07 08:25:19 +00001083APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001084 if (BitWidth < width)
1085 return sext(width);
1086 if (BitWidth > width)
1087 return trunc(width);
1088 return *this;
1089}
1090
Rafael Espindolabb893fe2012-01-27 23:33:07 +00001091APInt APInt::zextOrSelf(unsigned width) const {
1092 if (BitWidth < width)
1093 return zext(width);
1094 return *this;
1095}
1096
1097APInt APInt::sextOrSelf(unsigned width) const {
1098 if (BitWidth < width)
1099 return sext(width);
1100 return *this;
1101}
1102
Zhou Shenge93db8f2007-02-09 07:48:24 +00001103/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001104/// @brief Arithmetic right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001105APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001106 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001107}
1108
1109/// Arithmetic right-shift this APInt by shiftAmt.
1110/// @brief Arithmetic right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001111APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001112 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer1825dd02007-03-02 22:39:11 +00001113 // Handle a degenerate case
1114 if (shiftAmt == 0)
1115 return *this;
1116
1117 // Handle single word shifts with built-in ashr
Reid Spencer522ca7c2007-02-25 01:56:07 +00001118 if (isSingleWord()) {
1119 if (shiftAmt == BitWidth)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001120 return APInt(BitWidth, 0); // undefined
Jonathan Roelofs851b79d2016-08-10 19:50:14 +00001121 return APInt(BitWidth, SignExtend64(VAL, BitWidth) >> shiftAmt);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001122 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001123
Reid Spencer1825dd02007-03-02 22:39:11 +00001124 // If all the bits were shifted out, the result is, technically, undefined.
1125 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1126 // issues in the algorithm below.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001127 if (shiftAmt == BitWidth) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001128 if (isNegative())
Zhou Sheng1247c072008-06-05 13:27:38 +00001129 return APInt(BitWidth, -1ULL, true);
Reid Spencera41e93b2007-02-25 19:32:03 +00001130 else
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001131 return APInt(BitWidth, 0);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001132 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001133
1134 // Create some space for the result.
1135 uint64_t * val = new uint64_t[getNumWords()];
1136
Reid Spencer1825dd02007-03-02 22:39:11 +00001137 // Compute some values needed by the following shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001138 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1139 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1140 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1141 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer1825dd02007-03-02 22:39:11 +00001142 if (bitsInWord == 0)
1143 bitsInWord = APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001144
1145 // If we are shifting whole words, just move whole words
1146 if (wordShift == 0) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001147 // Move the words containing significant bits
Chris Lattner77527f52009-01-21 18:09:24 +00001148 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001149 val[i] = pVal[i+offset]; // move whole word
1150
1151 // Adjust the top significant word for sign bit fill, if negative
1152 if (isNegative())
1153 if (bitsInWord < APINT_BITS_PER_WORD)
1154 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1155 } else {
Eric Christopher820256b2009-08-21 04:06:45 +00001156 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001157 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001158 // This combines the shifted corresponding word with the low bits from
1159 // the next word (shifted into this word's high bits).
Eric Christopher820256b2009-08-21 04:06:45 +00001160 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer1825dd02007-03-02 22:39:11 +00001161 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1162 }
1163
1164 // Shift the break word. In this case there are no bits from the next word
1165 // to include in this word.
1166 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1167
Alp Tokercb402912014-01-24 17:20:08 +00001168 // Deal with sign extension in the break word, and possibly the word before
Reid Spencer1825dd02007-03-02 22:39:11 +00001169 // it.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001170 if (isNegative()) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001171 if (wordShift > bitsInWord) {
1172 if (breakWord > 0)
Eric Christopher820256b2009-08-21 04:06:45 +00001173 val[breakWord-1] |=
Reid Spencer1825dd02007-03-02 22:39:11 +00001174 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1175 val[breakWord] |= ~0ULL;
Eric Christopher820256b2009-08-21 04:06:45 +00001176 } else
Reid Spencer1825dd02007-03-02 22:39:11 +00001177 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnerdad2d092007-05-03 18:15:36 +00001178 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001179 }
1180
Reid Spencer1825dd02007-03-02 22:39:11 +00001181 // Remaining words are 0 or -1, just assign them.
1182 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner77527f52009-01-21 18:09:24 +00001183 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001184 val[i] = fillValue;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001185 APInt Result(val, BitWidth);
1186 Result.clearUnusedBits();
1187 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001188}
1189
Zhou Shenge93db8f2007-02-09 07:48:24 +00001190/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001191/// @brief Logical right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001192APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001193 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001194}
1195
1196/// Logical right-shift this APInt by shiftAmt.
1197/// @brief Logical right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001198APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnerdad2d092007-05-03 18:15:36 +00001199 if (isSingleWord()) {
Ahmed Charles0dca5d82012-02-24 19:06:15 +00001200 if (shiftAmt >= BitWidth)
Reid Spencer522ca7c2007-02-25 01:56:07 +00001201 return APInt(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001202 else
Reid Spencer522ca7c2007-02-25 01:56:07 +00001203 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001204 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001205
Reid Spencer44eef162007-02-26 01:19:48 +00001206 // If all the bits were shifted out, the result is 0. This avoids issues
1207 // with shifting by the size of the integer type, which produces undefined
1208 // results. We define these "undefined results" to always be 0.
Chad Rosier3d464d82012-06-08 18:04:52 +00001209 if (shiftAmt >= BitWidth)
Reid Spencer44eef162007-02-26 01:19:48 +00001210 return APInt(BitWidth, 0);
1211
Reid Spencerfffdf102007-05-17 06:26:29 +00001212 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopher820256b2009-08-21 04:06:45 +00001213 // issues with shifting by the size of the integer type, which produces
Reid Spencerfffdf102007-05-17 06:26:29 +00001214 // undefined results in the code below. This is also an optimization.
1215 if (shiftAmt == 0)
1216 return *this;
1217
Reid Spencer44eef162007-02-26 01:19:48 +00001218 // Create some space for the result.
1219 uint64_t * val = new uint64_t[getNumWords()];
1220
1221 // If we are shifting less than a word, compute the shift with a simple carry
1222 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smith4f9a8082011-11-23 21:33:37 +00001223 lshrNear(val, pVal, getNumWords(), shiftAmt);
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001224 APInt Result(val, BitWidth);
1225 Result.clearUnusedBits();
1226 return Result;
Reid Spencera41e93b2007-02-25 19:32:03 +00001227 }
1228
Reid Spencer44eef162007-02-26 01:19:48 +00001229 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001230 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1231 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer44eef162007-02-26 01:19:48 +00001232
1233 // If we are shifting whole words, just move whole words
1234 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001235 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001236 val[i] = pVal[i+offset];
Chris Lattner77527f52009-01-21 18:09:24 +00001237 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencer44eef162007-02-26 01:19:48 +00001238 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001239 APInt Result(val, BitWidth);
1240 Result.clearUnusedBits();
1241 return Result;
Reid Spencer44eef162007-02-26 01:19:48 +00001242 }
1243
Eric Christopher820256b2009-08-21 04:06:45 +00001244 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001245 unsigned breakWord = getNumWords() - offset -1;
1246 for (unsigned i = 0; i < breakWord; ++i)
Reid Spencerd99feaf2007-03-01 05:39:56 +00001247 val[i] = (pVal[i+offset] >> wordShift) |
1248 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencer44eef162007-02-26 01:19:48 +00001249 // Shift the break word.
1250 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1251
1252 // Remaining words are 0
Chris Lattner77527f52009-01-21 18:09:24 +00001253 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001254 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001255 APInt Result(val, BitWidth);
1256 Result.clearUnusedBits();
1257 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001258}
1259
Zhou Shenge93db8f2007-02-09 07:48:24 +00001260/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001261/// @brief Left-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001262APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky030c4502009-01-19 17:42:33 +00001263 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner77527f52009-01-21 18:09:24 +00001264 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001265}
1266
Chris Lattner77527f52009-01-21 18:09:24 +00001267APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencera5c84d92007-02-25 00:56:44 +00001268 // If all the bits were shifted out, the result is 0. This avoids issues
1269 // with shifting by the size of the integer type, which produces undefined
1270 // results. We define these "undefined results" to always be 0.
1271 if (shiftAmt == BitWidth)
1272 return APInt(BitWidth, 0);
1273
Reid Spencer81ee0202007-05-12 18:01:57 +00001274 // If none of the bits are shifted out, the result is *this. This avoids a
1275 // lshr by the words size in the loop below which can produce incorrect
1276 // results. It also avoids the expensive computation below for a common case.
1277 if (shiftAmt == 0)
1278 return *this;
1279
Reid Spencera5c84d92007-02-25 00:56:44 +00001280 // Create some space for the result.
1281 uint64_t * val = new uint64_t[getNumWords()];
1282
1283 // If we are shifting less than a word, do it the easy way
1284 if (shiftAmt < APINT_BITS_PER_WORD) {
1285 uint64_t carry = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001286 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencera5c84d92007-02-25 00:56:44 +00001287 val[i] = pVal[i] << shiftAmt | carry;
1288 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1289 }
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001290 APInt Result(val, BitWidth);
1291 Result.clearUnusedBits();
1292 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001293 }
1294
Reid Spencera5c84d92007-02-25 00:56:44 +00001295 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001296 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1297 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencera5c84d92007-02-25 00:56:44 +00001298
1299 // If we are shifting whole words, just move whole words
1300 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001301 for (unsigned i = 0; i < offset; i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001302 val[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001303 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001304 val[i] = pVal[i-offset];
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001305 APInt Result(val, BitWidth);
1306 Result.clearUnusedBits();
1307 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001308 }
Reid Spencera5c84d92007-02-25 00:56:44 +00001309
1310 // Copy whole words from this to Result.
Chris Lattner77527f52009-01-21 18:09:24 +00001311 unsigned i = getNumWords() - 1;
Reid Spencera5c84d92007-02-25 00:56:44 +00001312 for (; i > offset; --i)
1313 val[i] = pVal[i-offset] << wordShift |
1314 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencerab0e08a2007-02-25 01:08:58 +00001315 val[offset] = pVal[0] << wordShift;
Reid Spencera5c84d92007-02-25 00:56:44 +00001316 for (i = 0; i < offset; ++i)
1317 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001318 APInt Result(val, BitWidth);
1319 Result.clearUnusedBits();
1320 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001321}
1322
Joey Gouly51c0ae52017-02-07 11:58:22 +00001323// Calculate the rotate amount modulo the bit width.
1324static unsigned rotateModulo(unsigned BitWidth, const APInt &rotateAmt) {
1325 unsigned rotBitWidth = rotateAmt.getBitWidth();
1326 APInt rot = rotateAmt;
1327 if (rotBitWidth < BitWidth) {
1328 // Extend the rotate APInt, so that the urem doesn't divide by 0.
1329 // e.g. APInt(1, 32) would give APInt(1, 0).
1330 rot = rotateAmt.zext(BitWidth);
1331 }
1332 rot = rot.urem(APInt(rot.getBitWidth(), BitWidth));
1333 return rot.getLimitedValue(BitWidth);
1334}
1335
Dan Gohman105c1d42008-02-29 01:40:47 +00001336APInt APInt::rotl(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001337 return rotl(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001338}
1339
Chris Lattner77527f52009-01-21 18:09:24 +00001340APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001341 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001342 if (rotateAmt == 0)
1343 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001344 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001345}
1346
Dan Gohman105c1d42008-02-29 01:40:47 +00001347APInt APInt::rotr(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001348 return rotr(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001349}
1350
Chris Lattner77527f52009-01-21 18:09:24 +00001351APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001352 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001353 if (rotateAmt == 0)
1354 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001355 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001356}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001357
1358// Square Root - this method computes and returns the square root of "this".
1359// Three mechanisms are used for computation. For small values (<= 5 bits),
1360// a table lookup is done. This gets some performance for common cases. For
1361// values using less than 52 bits, the value is converted to double and then
1362// the libc sqrt function is called. The result is rounded and then converted
1363// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001364// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001365APInt APInt::sqrt() const {
1366
1367 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001368 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001369
1370 // Use a fast table for some small values. This also gets rid of some
1371 // rounding errors in libc sqrt for small values.
1372 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001373 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001374 /* 0 */ 0,
1375 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001376 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001377 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1378 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1379 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1380 /* 31 */ 6
1381 };
1382 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001383 }
1384
1385 // If the magnitude of the value fits in less than 52 bits (the precision of
1386 // an IEEE double precision floating point value), then we can use the
1387 // libc sqrt function which will probably use a hardware sqrt computation.
1388 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001389 if (magnitude < 52) {
Eric Christopher820256b2009-08-21 04:06:45 +00001390 return APInt(BitWidth,
Reid Spencerd99feaf2007-03-01 05:39:56 +00001391 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenb622c112007-03-05 00:00:42 +00001392 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001393
1394 // Okay, all the short cuts are exhausted. We must compute it. The following
1395 // is a classical Babylonian method for computing the square root. This code
Sanjay Patel4cb54e02014-09-11 15:41:01 +00001396 // was adapted to APInt from a wikipedia article on such computations.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001397 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001398 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001399 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001400 APInt testy(BitWidth, 16);
1401 APInt x_old(BitWidth, 1);
1402 APInt x_new(BitWidth, 0);
1403 APInt two(BitWidth, 2);
1404
1405 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001406 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001407 if (i >= nbits || this->ule(testy)) {
1408 x_old = x_old.shl(i / 2);
1409 break;
1410 }
1411
Eric Christopher820256b2009-08-21 04:06:45 +00001412 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001413 for (;;) {
1414 x_new = (this->udiv(x_old) + x_old).udiv(two);
1415 if (x_old.ule(x_new))
1416 break;
1417 x_old = x_new;
1418 }
1419
1420 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001421 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001422 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001423 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001424 // floating point representation after 192 bits. There are no discrepancies
1425 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001426 APInt square(x_old * x_old);
1427 APInt nextSquare((x_old + 1) * (x_old +1));
1428 if (this->ult(square))
1429 return x_old;
David Blaikie54c94622011-12-01 20:58:30 +00001430 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1431 APInt midpoint((nextSquare - square).udiv(two));
1432 APInt offset(*this - square);
1433 if (offset.ult(midpoint))
1434 return x_old;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001435 return x_old + 1;
1436}
1437
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001438/// Computes the multiplicative inverse of this APInt for a given modulo. The
1439/// iterative extended Euclidean algorithm is used to solve for this value,
1440/// however we simplify it to speed up calculating only the inverse, and take
1441/// advantage of div+rem calculations. We also use some tricks to avoid copying
1442/// (potentially large) APInts around.
1443APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1444 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1445
1446 // Using the properties listed at the following web page (accessed 06/21/08):
1447 // http://www.numbertheory.org/php/euclid.html
1448 // (especially the properties numbered 3, 4 and 9) it can be proved that
1449 // BitWidth bits suffice for all the computations in the algorithm implemented
1450 // below. More precisely, this number of bits suffice if the multiplicative
1451 // inverse exists, but may not suffice for the general extended Euclidean
1452 // algorithm.
1453
1454 APInt r[2] = { modulo, *this };
1455 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1456 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001457
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001458 unsigned i;
1459 for (i = 0; r[i^1] != 0; i ^= 1) {
1460 // An overview of the math without the confusing bit-flipping:
1461 // q = r[i-2] / r[i-1]
1462 // r[i] = r[i-2] % r[i-1]
1463 // t[i] = t[i-2] - t[i-1] * q
1464 udivrem(r[i], r[i^1], q, r[i]);
1465 t[i] -= t[i^1] * q;
1466 }
1467
1468 // If this APInt and the modulo are not coprime, there is no multiplicative
1469 // inverse, so return 0. We check this by looking at the next-to-last
1470 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1471 // algorithm.
1472 if (r[i] != 1)
1473 return APInt(BitWidth, 0);
1474
1475 // The next-to-last t is the multiplicative inverse. However, we are
1476 // interested in a positive inverse. Calcuate a positive one from a negative
1477 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001478 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001479 return t[i].isNegative() ? t[i] + modulo : t[i];
1480}
1481
Jay Foadfe0c6482009-04-30 10:15:35 +00001482/// Calculate the magic numbers required to implement a signed integer division
1483/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1484/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1485/// Warren, Jr., chapter 10.
1486APInt::ms APInt::magic() const {
1487 const APInt& d = *this;
1488 unsigned p;
1489 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001490 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001491 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001492
Jay Foadfe0c6482009-04-30 10:15:35 +00001493 ad = d.abs();
1494 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1495 anc = t - 1 - t.urem(ad); // absolute value of nc
1496 p = d.getBitWidth() - 1; // initialize p
1497 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1498 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1499 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1500 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1501 do {
1502 p = p + 1;
1503 q1 = q1<<1; // update q1 = 2p/abs(nc)
1504 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1505 if (r1.uge(anc)) { // must be unsigned comparison
1506 q1 = q1 + 1;
1507 r1 = r1 - anc;
1508 }
1509 q2 = q2<<1; // update q2 = 2p/abs(d)
1510 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1511 if (r2.uge(ad)) { // must be unsigned comparison
1512 q2 = q2 + 1;
1513 r2 = r2 - ad;
1514 }
1515 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001516 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001517
Jay Foadfe0c6482009-04-30 10:15:35 +00001518 mag.m = q2 + 1;
1519 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1520 mag.s = p - d.getBitWidth(); // resulting shift
1521 return mag;
1522}
1523
1524/// Calculate the magic numbers required to implement an unsigned integer
1525/// division by a constant as a sequence of multiplies, adds and shifts.
1526/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1527/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001528/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001529/// of the divided value are known zero.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001530APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001531 const APInt& d = *this;
1532 unsigned p;
1533 APInt nc, delta, q1, r1, q2, r2;
1534 struct mu magu;
1535 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001536 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001537 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1538 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1539
Benjamin Kramer3aab6a82012-07-11 18:31:59 +00001540 nc = allOnes - (allOnes - d).urem(d);
Jay Foadfe0c6482009-04-30 10:15:35 +00001541 p = d.getBitWidth() - 1; // initialize p
1542 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1543 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1544 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1545 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1546 do {
1547 p = p + 1;
1548 if (r1.uge(nc - r1)) {
1549 q1 = q1 + q1 + 1; // update q1
1550 r1 = r1 + r1 - nc; // update r1
1551 }
1552 else {
1553 q1 = q1+q1; // update q1
1554 r1 = r1+r1; // update r1
1555 }
1556 if ((r2 + 1).uge(d - r2)) {
1557 if (q2.uge(signedMax)) magu.a = 1;
1558 q2 = q2+q2 + 1; // update q2
1559 r2 = r2+r2 + 1 - d; // update r2
1560 }
1561 else {
1562 if (q2.uge(signedMin)) magu.a = 1;
1563 q2 = q2+q2; // update q2
1564 r2 = r2+r2 + 1; // update r2
1565 }
1566 delta = d - 1 - r2;
1567 } while (p < d.getBitWidth()*2 &&
1568 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1569 magu.m = q2 + 1; // resulting magic number
1570 magu.s = p - d.getBitWidth(); // resulting shift
1571 return magu;
1572}
1573
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001574/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1575/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1576/// variables here have the same names as in the algorithm. Comments explain
1577/// the algorithm and any deviation from it.
Chris Lattner77527f52009-01-21 18:09:24 +00001578static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1579 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001580 assert(u && "Must provide dividend");
1581 assert(v && "Must provide divisor");
1582 assert(q && "Must provide quotient");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001583 assert(u != v && u != q && v != q && "Must use different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001584 assert(n>1 && "n must be > 1");
1585
Yaron Keren39fc5a62015-03-26 19:45:19 +00001586 // b denotes the base of the number system. In our case b is 2^32.
George Burgess IV381fc0e2016-08-25 01:05:08 +00001587 const uint64_t b = uint64_t(1) << 32;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001588
David Greenef32fcb42010-01-05 01:28:52 +00001589 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1590 DEBUG(dbgs() << "KnuthDiv: original:");
1591 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1592 DEBUG(dbgs() << " by");
1593 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1594 DEBUG(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001595 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1596 // u and v by d. Note that we have taken Knuth's advice here to use a power
1597 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1598 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001599 // shift amount from the leading zeros. We are basically normalizing the u
1600 // and v so that its high bits are shifted to the top of v's range without
1601 // overflow. Note that this can require an extra word in u so that u must
1602 // be of length m+n+1.
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +00001603 unsigned shift = countLeadingZeros(v[n-1]);
Chris Lattner77527f52009-01-21 18:09:24 +00001604 unsigned v_carry = 0;
1605 unsigned u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001606 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001607 for (unsigned i = 0; i < m+n; ++i) {
1608 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001609 u[i] = (u[i] << shift) | u_carry;
1610 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001611 }
Chris Lattner77527f52009-01-21 18:09:24 +00001612 for (unsigned i = 0; i < n; ++i) {
1613 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001614 v[i] = (v[i] << shift) | v_carry;
1615 v_carry = v_tmp;
1616 }
1617 }
1618 u[m+n] = u_carry;
Yaron Keren39fc5a62015-03-26 19:45:19 +00001619
David Greenef32fcb42010-01-05 01:28:52 +00001620 DEBUG(dbgs() << "KnuthDiv: normal:");
1621 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1622 DEBUG(dbgs() << " by");
1623 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1624 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001625
1626 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1627 int j = m;
1628 do {
David Greenef32fcb42010-01-05 01:28:52 +00001629 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001630 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001631 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1632 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1633 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1634 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1635 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001636 // value qp is one too large, and it eliminates all cases where qp is two
1637 // too large.
Reid Spencercb292e42007-02-23 01:57:13 +00001638 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greenef32fcb42010-01-05 01:28:52 +00001639 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001640 uint64_t qp = dividend / v[n-1];
1641 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001642 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1643 qp--;
1644 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001645 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001646 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001647 }
David Greenef32fcb42010-01-05 01:28:52 +00001648 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001649
Reid Spencercb292e42007-02-23 01:57:13 +00001650 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1651 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1652 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001653 // a subtraction.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001654 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1655 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1656 // true value plus b**(n+1), namely as the b's complement of
1657 // the true value, and a "borrow" to the left should be remembered.
Pawel Bylica86ac4472015-04-24 07:38:39 +00001658 int64_t borrow = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001659 for (unsigned i = 0; i < n; ++i) {
Pawel Bylica86ac4472015-04-24 07:38:39 +00001660 uint64_t p = uint64_t(qp) * uint64_t(v[i]);
1661 int64_t subres = int64_t(u[j+i]) - borrow - (unsigned)p;
1662 u[j+i] = (unsigned)subres;
1663 borrow = (p >> 32) - (subres >> 32);
1664 DEBUG(dbgs() << "KnuthDiv: u[j+i] = " << u[j+i]
Daniel Dunbar763ace92009-07-13 05:27:30 +00001665 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001666 }
Pawel Bylica86ac4472015-04-24 07:38:39 +00001667 bool isNeg = u[j+n] < borrow;
1668 u[j+n] -= (unsigned)borrow;
1669
David Greenef32fcb42010-01-05 01:28:52 +00001670 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1671 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1672 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001673
Eric Christopher820256b2009-08-21 04:06:45 +00001674 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001675 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner77527f52009-01-21 18:09:24 +00001676 q[j] = (unsigned)qp;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001677 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001678 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001679 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001680 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001681 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001682 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1683 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001684 // since it cancels with the borrow that occurred in D4.
1685 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001686 for (unsigned i = 0; i < n; i++) {
1687 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001688 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001689 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001690 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001691 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001692 }
David Greenef32fcb42010-01-05 01:28:52 +00001693 DEBUG(dbgs() << "KnuthDiv: after correction:");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001694 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
David Greenef32fcb42010-01-05 01:28:52 +00001695 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001696
Reid Spencercb292e42007-02-23 01:57:13 +00001697 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1698 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001699
David Greenef32fcb42010-01-05 01:28:52 +00001700 DEBUG(dbgs() << "KnuthDiv: quotient:");
1701 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1702 DEBUG(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001703
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001704 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1705 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1706 // compute the remainder (urem uses this).
1707 if (r) {
1708 // The value d is expressed by the "shift" value above since we avoided
1709 // multiplication by d by using a shift left. So, all we have to do is
Simon Pilgrim0099beb2017-03-09 13:57:04 +00001710 // shift right here.
Reid Spencer468ad9112007-02-24 20:38:01 +00001711 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001712 unsigned carry = 0;
David Greenef32fcb42010-01-05 01:28:52 +00001713 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001714 for (int i = n-1; i >= 0; i--) {
1715 r[i] = (u[i] >> shift) | carry;
1716 carry = u[i] << (32 - shift);
David Greenef32fcb42010-01-05 01:28:52 +00001717 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001718 }
1719 } else {
1720 for (int i = n-1; i >= 0; i--) {
1721 r[i] = u[i];
David Greenef32fcb42010-01-05 01:28:52 +00001722 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001723 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001724 }
David Greenef32fcb42010-01-05 01:28:52 +00001725 DEBUG(dbgs() << '\n');
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}
1729
Benjamin Kramerc321e532016-06-08 19:09:22 +00001730void APInt::divide(const APInt &LHS, unsigned lhsWords, const APInt &RHS,
1731 unsigned rhsWords, APInt *Quotient, APInt *Remainder) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001732 assert(lhsWords >= rhsWords && "Fractional result");
1733
Eric Christopher820256b2009-08-21 04:06:45 +00001734 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001735 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001736 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001737 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1738 // can't use 64-bit operands here because we don't have native results of
1739 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001740 // work on large-endian machines.
Dan Gohmancff69532009-04-01 18:45:54 +00001741 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner77527f52009-01-21 18:09:24 +00001742 unsigned n = rhsWords * 2;
1743 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001744
1745 // Allocate space for the temporary values we need either on the stack, if
1746 // it will fit, or on the heap if it won't.
Chris Lattner77527f52009-01-21 18:09:24 +00001747 unsigned SPACE[128];
Craig Topperc10719f2014-04-07 04:17:22 +00001748 unsigned *U = nullptr;
1749 unsigned *V = nullptr;
1750 unsigned *Q = nullptr;
1751 unsigned *R = nullptr;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001752 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1753 U = &SPACE[0];
1754 V = &SPACE[m+n+1];
1755 Q = &SPACE[(m+n+1) + n];
1756 if (Remainder)
1757 R = &SPACE[(m+n+1) + n + (m+n)];
1758 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001759 U = new unsigned[m + n + 1];
1760 V = new unsigned[n];
1761 Q = new unsigned[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001762 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001763 R = new unsigned[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001764 }
1765
1766 // Initialize the dividend
Chris Lattner77527f52009-01-21 18:09:24 +00001767 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001768 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001769 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001770 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001771 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001772 }
1773 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1774
Reid Spencer522ca7c2007-02-25 01:56:07 +00001775 // Initialize the divisor
Chris Lattner77527f52009-01-21 18:09:24 +00001776 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001777 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001778 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001779 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001780 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001781 }
1782
Reid Spencer522ca7c2007-02-25 01:56:07 +00001783 // initialize the quotient and remainder
Chris Lattner77527f52009-01-21 18:09:24 +00001784 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001785 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001786 memset(R, 0, n * sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001787
Eric Christopher820256b2009-08-21 04:06:45 +00001788 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001789 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001790 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001791 // contain any zero words or the Knuth algorithm fails.
1792 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1793 n--;
1794 m++;
1795 }
1796 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1797 m--;
1798
1799 // If we're left with only a single word for the divisor, Knuth doesn't work
1800 // so we implement the short division algorithm here. This is much simpler
1801 // and faster because we are certain that we can divide a 64-bit quantity
1802 // by a 32-bit quantity at hardware speed and short division is simply a
1803 // series of such operations. This is just like doing short division but we
1804 // are using base 2^32 instead of base 10.
1805 assert(n != 0 && "Divide by zero?");
1806 if (n == 1) {
Chris Lattner77527f52009-01-21 18:09:24 +00001807 unsigned divisor = V[0];
1808 unsigned remainder = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001809 for (int i = m+n-1; i >= 0; i--) {
1810 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1811 if (partial_dividend == 0) {
1812 Q[i] = 0;
1813 remainder = 0;
1814 } else if (partial_dividend < divisor) {
1815 Q[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001816 remainder = (unsigned)partial_dividend;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001817 } else if (partial_dividend == divisor) {
1818 Q[i] = 1;
1819 remainder = 0;
1820 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001821 Q[i] = (unsigned)(partial_dividend / divisor);
1822 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001823 }
1824 }
1825 if (R)
1826 R[0] = remainder;
1827 } else {
1828 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1829 // case n > 1.
1830 KnuthDiv(U, V, Q, R, m, n);
1831 }
1832
1833 // If the caller wants the quotient
1834 if (Quotient) {
1835 // Set up the Quotient value's memory.
1836 if (Quotient->BitWidth != LHS.BitWidth) {
1837 if (Quotient->isSingleWord())
1838 Quotient->VAL = 0;
1839 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001840 delete [] Quotient->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001841 Quotient->BitWidth = LHS.BitWidth;
1842 if (!Quotient->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001843 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001844 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001845 Quotient->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001846
Eric Christopher820256b2009-08-21 04:06:45 +00001847 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001848 // order words.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001849 // This case is currently dead as all users of divide() handle trivial cases
1850 // earlier.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001851 if (lhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001852 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001853 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1854 if (Quotient->isSingleWord())
1855 Quotient->VAL = tmp;
1856 else
1857 Quotient->pVal[0] = tmp;
1858 } else {
1859 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1860 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001861 Quotient->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001862 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1863 }
1864 }
1865
1866 // If the caller wants the remainder
1867 if (Remainder) {
1868 // Set up the Remainder value's memory.
1869 if (Remainder->BitWidth != RHS.BitWidth) {
1870 if (Remainder->isSingleWord())
1871 Remainder->VAL = 0;
1872 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001873 delete [] Remainder->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001874 Remainder->BitWidth = RHS.BitWidth;
1875 if (!Remainder->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001876 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001877 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001878 Remainder->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001879
1880 // The remainder is in R. Reconstitute the remainder into Remainder's low
1881 // order words.
1882 if (rhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001883 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001884 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1885 if (Remainder->isSingleWord())
1886 Remainder->VAL = tmp;
1887 else
1888 Remainder->pVal[0] = tmp;
1889 } else {
1890 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1891 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001892 Remainder->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001893 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1894 }
1895 }
1896
1897 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001898 if (U != &SPACE[0]) {
1899 delete [] U;
1900 delete [] V;
1901 delete [] Q;
1902 delete [] R;
1903 }
Reid Spencer100502d2007-02-17 03:16:00 +00001904}
1905
Reid Spencer1d072122007-02-16 22:36:51 +00001906APInt APInt::udiv(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001907 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001908
1909 // First, deal with the easy case
1910 if (isSingleWord()) {
1911 assert(RHS.VAL != 0 && "Divide by zero?");
1912 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001913 }
Reid Spencer39867762007-02-17 02:07:07 +00001914
Reid Spencer39867762007-02-17 02:07:07 +00001915 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner77527f52009-01-21 18:09:24 +00001916 unsigned rhsBits = RHS.getActiveBits();
1917 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001918 assert(rhsWords && "Divided by zero???");
Chris Lattner77527f52009-01-21 18:09:24 +00001919 unsigned lhsBits = this->getActiveBits();
1920 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001921
1922 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001923 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001924 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001925 return APInt(BitWidth, 0);
Reid Spencer58a6a432007-02-21 08:21:52 +00001926 else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001927 // X / Y ===> 0, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001928 return APInt(BitWidth, 0);
1929 } else if (*this == RHS) {
1930 // X / X ===> 1
1931 return APInt(BitWidth, 1);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001932 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001933 // All high words are zero, just use native divide
Reid Spencer58a6a432007-02-21 08:21:52 +00001934 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001935 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001936
1937 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1938 APInt Quotient(1,0); // to hold result.
Craig Topperc10719f2014-04-07 04:17:22 +00001939 divide(*this, lhsWords, RHS, rhsWords, &Quotient, nullptr);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001940 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001941}
1942
Jakub Staszak6605c602013-02-20 00:17:42 +00001943APInt APInt::sdiv(const APInt &RHS) const {
1944 if (isNegative()) {
1945 if (RHS.isNegative())
1946 return (-(*this)).udiv(-RHS);
1947 return -((-(*this)).udiv(RHS));
1948 }
1949 if (RHS.isNegative())
1950 return -(this->udiv(-RHS));
1951 return this->udiv(RHS);
1952}
1953
Reid Spencer1d072122007-02-16 22:36:51 +00001954APInt APInt::urem(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001955 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001956 if (isSingleWord()) {
1957 assert(RHS.VAL != 0 && "Remainder by zero?");
1958 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001959 }
Reid Spencer39867762007-02-17 02:07:07 +00001960
Reid Spencer58a6a432007-02-21 08:21:52 +00001961 // Get some facts about the LHS
Chris Lattner77527f52009-01-21 18:09:24 +00001962 unsigned lhsBits = getActiveBits();
1963 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001964
1965 // Get some facts about the RHS
Chris Lattner77527f52009-01-21 18:09:24 +00001966 unsigned rhsBits = RHS.getActiveBits();
1967 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001968 assert(rhsWords && "Performing remainder operation by zero ???");
1969
Reid Spencer39867762007-02-17 02:07:07 +00001970 // Check the degenerate cases
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001971 if (lhsWords == 0) {
Reid Spencer58a6a432007-02-21 08:21:52 +00001972 // 0 % Y ===> 0
1973 return APInt(BitWidth, 0);
1974 } else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001975 // X % Y ===> X, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001976 return *this;
1977 } else if (*this == RHS) {
Reid Spencer39867762007-02-17 02:07:07 +00001978 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001979 return APInt(BitWidth, 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001980 } else if (lhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001981 // All high words are zero, just use native remainder
Reid Spencer58a6a432007-02-21 08:21:52 +00001982 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001983 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001984
Reid Spencer4c50b522007-05-13 23:44:59 +00001985 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001986 APInt Remainder(1,0);
Craig Topperc10719f2014-04-07 04:17:22 +00001987 divide(*this, lhsWords, RHS, rhsWords, nullptr, &Remainder);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001988 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001989}
Reid Spencer100502d2007-02-17 03:16:00 +00001990
Jakub Staszak6605c602013-02-20 00:17:42 +00001991APInt APInt::srem(const APInt &RHS) const {
1992 if (isNegative()) {
1993 if (RHS.isNegative())
1994 return -((-(*this)).urem(-RHS));
1995 return -((-(*this)).urem(RHS));
1996 }
1997 if (RHS.isNegative())
1998 return this->urem(-RHS);
1999 return this->urem(RHS);
2000}
2001
Eric Christopher820256b2009-08-21 04:06:45 +00002002void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00002003 APInt &Quotient, APInt &Remainder) {
David Majnemer7f039202014-12-14 09:41:56 +00002004 assert(LHS.BitWidth == RHS.BitWidth && "Bit widths must be the same");
2005
2006 // First, deal with the easy case
2007 if (LHS.isSingleWord()) {
2008 assert(RHS.VAL != 0 && "Divide by zero?");
2009 uint64_t QuotVal = LHS.VAL / RHS.VAL;
2010 uint64_t RemVal = LHS.VAL % RHS.VAL;
2011 Quotient = APInt(LHS.BitWidth, QuotVal);
2012 Remainder = APInt(LHS.BitWidth, RemVal);
2013 return;
2014 }
2015
Reid Spencer4c50b522007-05-13 23:44:59 +00002016 // Get some size facts about the dividend and divisor
Chris Lattner77527f52009-01-21 18:09:24 +00002017 unsigned lhsBits = LHS.getActiveBits();
2018 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2019 unsigned rhsBits = RHS.getActiveBits();
2020 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer4c50b522007-05-13 23:44:59 +00002021
2022 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00002023 if (lhsWords == 0) {
Reid Spencer4c50b522007-05-13 23:44:59 +00002024 Quotient = 0; // 0 / Y ===> 0
2025 Remainder = 0; // 0 % Y ===> 0
2026 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002027 }
2028
2029 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00002030 Remainder = LHS; // X % Y ===> X, iff X < Y
2031 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00002032 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002033 }
2034
Reid Spencer4c50b522007-05-13 23:44:59 +00002035 if (LHS == RHS) {
2036 Quotient = 1; // X / X ===> 1
2037 Remainder = 0; // X % X ===> 0;
2038 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002039 }
2040
Reid Spencer4c50b522007-05-13 23:44:59 +00002041 if (lhsWords == 1 && rhsWords == 1) {
2042 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00002043 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2044 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2045 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2046 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer4c50b522007-05-13 23:44:59 +00002047 return;
2048 }
2049
2050 // Okay, lets do it the long way
2051 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2052}
2053
Jakub Staszak6605c602013-02-20 00:17:42 +00002054void APInt::sdivrem(const APInt &LHS, const APInt &RHS,
2055 APInt &Quotient, APInt &Remainder) {
2056 if (LHS.isNegative()) {
2057 if (RHS.isNegative())
2058 APInt::udivrem(-LHS, -RHS, Quotient, Remainder);
2059 else {
2060 APInt::udivrem(-LHS, RHS, Quotient, Remainder);
2061 Quotient = -Quotient;
2062 }
2063 Remainder = -Remainder;
2064 } else if (RHS.isNegative()) {
2065 APInt::udivrem(LHS, -RHS, Quotient, Remainder);
2066 Quotient = -Quotient;
2067 } else {
2068 APInt::udivrem(LHS, RHS, Quotient, Remainder);
2069 }
2070}
2071
Chris Lattner2c819b02010-10-13 23:54:10 +00002072APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002073 APInt Res = *this+RHS;
2074 Overflow = isNonNegative() == RHS.isNonNegative() &&
2075 Res.isNonNegative() != isNonNegative();
2076 return Res;
2077}
2078
Chris Lattner698661c2010-10-14 00:05:07 +00002079APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2080 APInt Res = *this+RHS;
2081 Overflow = Res.ult(RHS);
2082 return Res;
2083}
2084
Chris Lattner2c819b02010-10-13 23:54:10 +00002085APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002086 APInt Res = *this - RHS;
2087 Overflow = isNonNegative() != RHS.isNonNegative() &&
2088 Res.isNonNegative() != isNonNegative();
2089 return Res;
2090}
2091
Chris Lattner698661c2010-10-14 00:05:07 +00002092APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00002093 APInt Res = *this-RHS;
2094 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00002095 return Res;
2096}
2097
Chris Lattner2c819b02010-10-13 23:54:10 +00002098APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002099 // MININT/-1 --> overflow.
2100 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2101 return sdiv(RHS);
2102}
2103
Chris Lattner2c819b02010-10-13 23:54:10 +00002104APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002105 APInt Res = *this * RHS;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002106
Chris Lattner79bdd882010-10-13 23:46:33 +00002107 if (*this != 0 && RHS != 0)
2108 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2109 else
2110 Overflow = false;
2111 return Res;
2112}
2113
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00002114APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2115 APInt Res = *this * RHS;
2116
2117 if (*this != 0 && RHS != 0)
2118 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2119 else
2120 Overflow = false;
2121 return Res;
2122}
2123
David Majnemera2521382014-10-13 21:48:30 +00002124APInt APInt::sshl_ov(const APInt &ShAmt, bool &Overflow) const {
2125 Overflow = ShAmt.uge(getBitWidth());
Chris Lattner79bdd882010-10-13 23:46:33 +00002126 if (Overflow)
David Majnemera2521382014-10-13 21:48:30 +00002127 return APInt(BitWidth, 0);
Chris Lattner79bdd882010-10-13 23:46:33 +00002128
2129 if (isNonNegative()) // Don't allow sign change.
David Majnemera2521382014-10-13 21:48:30 +00002130 Overflow = ShAmt.uge(countLeadingZeros());
Chris Lattner79bdd882010-10-13 23:46:33 +00002131 else
David Majnemera2521382014-10-13 21:48:30 +00002132 Overflow = ShAmt.uge(countLeadingOnes());
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002133
Chris Lattner79bdd882010-10-13 23:46:33 +00002134 return *this << ShAmt;
2135}
2136
David Majnemera2521382014-10-13 21:48:30 +00002137APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const {
2138 Overflow = ShAmt.uge(getBitWidth());
2139 if (Overflow)
2140 return APInt(BitWidth, 0);
2141
2142 Overflow = ShAmt.ugt(countLeadingZeros());
2143
2144 return *this << ShAmt;
2145}
2146
Chris Lattner79bdd882010-10-13 23:46:33 +00002147
2148
2149
Benjamin Kramer92d89982010-07-14 22:38:02 +00002150void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00002151 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002152 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002153 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002154 radix == 36) &&
2155 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002156
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002157 StringRef::iterator p = str.begin();
2158 size_t slen = str.size();
2159 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002160 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002161 p++;
2162 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00002163 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002164 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00002165 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002166 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2167 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002168 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2169 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00002170
2171 // Allocate memory
2172 if (!isSingleWord())
2173 pVal = getClearedMemory(getNumWords());
2174
2175 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00002176 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00002177
2178 // Set up an APInt for the digit to add outside the loop so we don't
2179 // constantly construct/destruct it.
2180 APInt apdigit(getBitWidth(), 0);
2181 APInt apradix(getBitWidth(), radix);
2182
2183 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002184 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00002185 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00002186 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00002187
Reid Spencera93c9812007-05-16 19:18:22 +00002188 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002189 if (slen > 1) {
2190 if (shift)
2191 *this <<= shift;
2192 else
2193 *this *= apradix;
2194 }
Reid Spencer1ba83352007-02-21 03:55:44 +00002195
2196 // Add in the digit we just interpreted
Reid Spencer632ebdf2007-02-24 20:19:37 +00002197 if (apdigit.isSingleWord())
2198 apdigit.VAL = digit;
2199 else
2200 apdigit.pVal[0] = digit;
Reid Spencer1ba83352007-02-21 03:55:44 +00002201 *this += apdigit;
Reid Spencer100502d2007-02-17 03:16:00 +00002202 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002203 // If its negative, put it in two's complement form
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00002204 if (isNeg) {
Jakub Staszak773be0c2013-03-20 23:56:19 +00002205 --(*this);
Jay Foad25a5e4c2010-12-01 08:53:58 +00002206 this->flipAllBits();
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002207 }
Reid Spencer100502d2007-02-17 03:16:00 +00002208}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002209
Chris Lattner17f71652008-08-17 07:19:36 +00002210void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002211 bool Signed, bool formatAsCLiteral) const {
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002212 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002213 Radix == 36) &&
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002214 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopher820256b2009-08-21 04:06:45 +00002215
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002216 const char *Prefix = "";
2217 if (formatAsCLiteral) {
2218 switch (Radix) {
2219 case 2:
2220 // Binary literals are a non-standard extension added in gcc 4.3:
2221 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2222 Prefix = "0b";
2223 break;
2224 case 8:
2225 Prefix = "0";
2226 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002227 case 10:
2228 break; // No prefix
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002229 case 16:
2230 Prefix = "0x";
2231 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002232 default:
2233 llvm_unreachable("Invalid radix!");
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002234 }
2235 }
2236
Chris Lattner17f71652008-08-17 07:19:36 +00002237 // First, check for a zero value and just short circuit the logic below.
2238 if (*this == 0) {
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002239 while (*Prefix) {
2240 Str.push_back(*Prefix);
2241 ++Prefix;
2242 };
Chris Lattner17f71652008-08-17 07:19:36 +00002243 Str.push_back('0');
2244 return;
2245 }
Eric Christopher820256b2009-08-21 04:06:45 +00002246
Douglas Gregor663c0682011-09-14 15:54:46 +00002247 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopher820256b2009-08-21 04:06:45 +00002248
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002249 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002250 char Buffer[65];
2251 char *BufPtr = Buffer+65;
Eric Christopher820256b2009-08-21 04:06:45 +00002252
Chris Lattner17f71652008-08-17 07:19:36 +00002253 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002254 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002255 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002256 } else {
2257 int64_t I = getSExtValue();
2258 if (I >= 0) {
2259 N = I;
2260 } else {
2261 Str.push_back('-');
2262 N = -(uint64_t)I;
2263 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002264 }
Eric Christopher820256b2009-08-21 04:06:45 +00002265
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002266 while (*Prefix) {
2267 Str.push_back(*Prefix);
2268 ++Prefix;
2269 };
2270
Chris Lattner17f71652008-08-17 07:19:36 +00002271 while (N) {
2272 *--BufPtr = Digits[N % Radix];
2273 N /= Radix;
2274 }
2275 Str.append(BufPtr, Buffer+65);
2276 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002277 }
2278
Chris Lattner17f71652008-08-17 07:19:36 +00002279 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002280
Chris Lattner17f71652008-08-17 07:19:36 +00002281 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002282 // They want to print the signed version and it is a negative value
2283 // Flip the bits and add one to turn it into the equivalent positive
2284 // value and put a '-' in the result.
Jay Foad25a5e4c2010-12-01 08:53:58 +00002285 Tmp.flipAllBits();
Jakub Staszak773be0c2013-03-20 23:56:19 +00002286 ++Tmp;
Chris Lattner17f71652008-08-17 07:19:36 +00002287 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002288 }
Eric Christopher820256b2009-08-21 04:06:45 +00002289
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002290 while (*Prefix) {
2291 Str.push_back(*Prefix);
2292 ++Prefix;
2293 };
2294
Chris Lattner17f71652008-08-17 07:19:36 +00002295 // We insert the digits backward, then reverse them to get the right order.
2296 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002297
2298 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2299 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattner17f71652008-08-17 07:19:36 +00002300 // equaly. We just shift until the value is zero.
Douglas Gregor663c0682011-09-14 15:54:46 +00002301 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattner17f71652008-08-17 07:19:36 +00002302 // Just shift tmp right for each digit width until it becomes zero
2303 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2304 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002305
Chris Lattner17f71652008-08-17 07:19:36 +00002306 while (Tmp != 0) {
2307 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2308 Str.push_back(Digits[Digit]);
2309 Tmp = Tmp.lshr(ShiftAmt);
2310 }
2311 } else {
Douglas Gregor663c0682011-09-14 15:54:46 +00002312 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattner17f71652008-08-17 07:19:36 +00002313 while (Tmp != 0) {
2314 APInt APdigit(1, 0);
2315 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopher820256b2009-08-21 04:06:45 +00002316 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattner17f71652008-08-17 07:19:36 +00002317 &APdigit);
Chris Lattner77527f52009-01-21 18:09:24 +00002318 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner17f71652008-08-17 07:19:36 +00002319 assert(Digit < Radix && "divide failed");
2320 Str.push_back(Digits[Digit]);
2321 Tmp = tmp2;
2322 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002323 }
Eric Christopher820256b2009-08-21 04:06:45 +00002324
Chris Lattner17f71652008-08-17 07:19:36 +00002325 // Reverse the digits before returning.
2326 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002327}
2328
Pawel Bylica6eeeac72015-04-06 13:31:39 +00002329/// Returns the APInt as a std::string. Note that this is an inefficient method.
2330/// It is better to pass in a SmallVector/SmallString to the methods above.
Chris Lattner17f71652008-08-17 07:19:36 +00002331std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2332 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002333 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002334 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002335}
Chris Lattner6b695682007-08-16 15:56:55 +00002336
Matthias Braun8c209aa2017-01-28 02:02:38 +00002337#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +00002338LLVM_DUMP_METHOD void APInt::dump() const {
Chris Lattner17f71652008-08-17 07:19:36 +00002339 SmallString<40> S, U;
2340 this->toStringUnsigned(U);
2341 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002342 dbgs() << "APInt(" << BitWidth << "b, "
Davide Italiano5a473d22017-01-31 21:26:18 +00002343 << U << "u " << S << "s)\n";
Chris Lattner17f71652008-08-17 07:19:36 +00002344}
Matthias Braun8c209aa2017-01-28 02:02:38 +00002345#endif
Chris Lattner17f71652008-08-17 07:19:36 +00002346
Chris Lattner0c19df42008-08-23 22:23:09 +00002347void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002348 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002349 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Yaron Keren92e1b622015-03-18 10:17:07 +00002350 OS << S;
Chris Lattner17f71652008-08-17 07:19:36 +00002351}
2352
Chris Lattner6b695682007-08-16 15:56:55 +00002353// This implements a variety of operations on a representation of
2354// arbitrary precision, two's-complement, bignum integer values.
2355
Chris Lattner96cffa62009-08-23 23:11:28 +00002356// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2357// and unrestricting assumption.
Benjamin Kramer7000ca32014-10-12 17:56:40 +00002358static_assert(integerPartWidth % 2 == 0, "Part width must be divisible by 2!");
Chris Lattner6b695682007-08-16 15:56:55 +00002359
2360/* Some handy functions local to this file. */
Chris Lattner6b695682007-08-16 15:56:55 +00002361
Craig Topper76f42462017-03-28 05:32:53 +00002362/* Returns the integer part with the least significant BITS set.
2363 BITS cannot be zero. */
Craig Topper6a8518082017-03-28 05:32:55 +00002364static inline integerPart lowBitMask(unsigned bits) {
Craig Topper76f42462017-03-28 05:32:53 +00002365 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002366
Craig Topper76f42462017-03-28 05:32:53 +00002367 return ~(integerPart) 0 >> (integerPartWidth - bits);
2368}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002369
Craig Topper76f42462017-03-28 05:32:53 +00002370/* Returns the value of the lower half of PART. */
Craig Topper6a8518082017-03-28 05:32:55 +00002371static inline integerPart lowHalf(integerPart part) {
Craig Topper76f42462017-03-28 05:32:53 +00002372 return part & lowBitMask(integerPartWidth / 2);
2373}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002374
Craig Topper76f42462017-03-28 05:32:53 +00002375/* Returns the value of the upper half of PART. */
Craig Topper6a8518082017-03-28 05:32:55 +00002376static inline integerPart highHalf(integerPart part) {
Craig Topper76f42462017-03-28 05:32:53 +00002377 return part >> (integerPartWidth / 2);
2378}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002379
Craig Topper76f42462017-03-28 05:32:53 +00002380/* Returns the bit number of the most significant set bit of a part.
2381 If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002382static unsigned partMSB(integerPart value) {
Craig Topper76f42462017-03-28 05:32:53 +00002383 return findLastSet(value, ZB_Max);
2384}
Chris Lattner6b695682007-08-16 15:56:55 +00002385
Craig Topper76f42462017-03-28 05:32:53 +00002386/* Returns the bit number of the least significant set bit of a
2387 part. If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002388static unsigned partLSB(integerPart value) {
Craig Topper76f42462017-03-28 05:32:53 +00002389 return findFirstSet(value, ZB_Max);
Alexander Kornienkof00654e2015-06-23 09:49:53 +00002390}
Chris Lattner6b695682007-08-16 15:56:55 +00002391
2392/* Sets the least significant part of a bignum to the input value, and
2393 zeroes out higher parts. */
Craig Topper6a8518082017-03-28 05:32:55 +00002394void APInt::tcSet(integerPart *dst, integerPart part, unsigned parts) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002395 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002396
Chris Lattner6b695682007-08-16 15:56:55 +00002397 dst[0] = part;
Craig Topperb0038162017-03-28 05:32:52 +00002398 for (unsigned i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002399 dst[i] = 0;
2400}
2401
2402/* Assign one bignum to another. */
Craig Topper6a8518082017-03-28 05:32:55 +00002403void APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002404 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002405 dst[i] = src[i];
2406}
2407
2408/* Returns true if a bignum is zero, false otherwise. */
Craig Topper6a8518082017-03-28 05:32:55 +00002409bool APInt::tcIsZero(const integerPart *src, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002410 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002411 if (src[i])
2412 return false;
2413
2414 return true;
2415}
2416
2417/* Extract the given bit of a bignum; returns 0 or 1. */
Craig Topper6a8518082017-03-28 05:32:55 +00002418int APInt::tcExtractBit(const integerPart *parts, unsigned bit) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002419 return (parts[bit / integerPartWidth] &
2420 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002421}
2422
John McCalldcb9a7a2010-02-28 02:51:25 +00002423/* Set the given bit of a bignum. */
Craig Topper6a8518082017-03-28 05:32:55 +00002424void APInt::tcSetBit(integerPart *parts, unsigned bit) {
Chris Lattner6b695682007-08-16 15:56:55 +00002425 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2426}
2427
John McCalldcb9a7a2010-02-28 02:51:25 +00002428/* Clears the given bit of a bignum. */
Craig Topper6a8518082017-03-28 05:32:55 +00002429void APInt::tcClearBit(integerPart *parts, unsigned bit) {
John McCalldcb9a7a2010-02-28 02:51:25 +00002430 parts[bit / integerPartWidth] &=
2431 ~((integerPart) 1 << (bit % integerPartWidth));
2432}
2433
Neil Boothc8b650a2007-10-06 00:43:45 +00002434/* Returns the bit number of the least significant set bit of a
2435 number. If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002436unsigned APInt::tcLSB(const integerPart *parts, unsigned n) {
Craig Topperb0038162017-03-28 05:32:52 +00002437 for (unsigned i = 0; i < n; i++) {
2438 if (parts[i] != 0) {
2439 unsigned lsb = partLSB(parts[i]);
Chris Lattner6b695682007-08-16 15:56:55 +00002440
Craig Topperb0038162017-03-28 05:32:52 +00002441 return lsb + i * integerPartWidth;
2442 }
Chris Lattner6b695682007-08-16 15:56:55 +00002443 }
2444
2445 return -1U;
2446}
2447
Neil Boothc8b650a2007-10-06 00:43:45 +00002448/* Returns the bit number of the most significant set bit of a number.
2449 If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002450unsigned APInt::tcMSB(const integerPart *parts, unsigned n) {
Chris Lattner6b695682007-08-16 15:56:55 +00002451 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002452 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002453
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002454 if (parts[n] != 0) {
Craig Topperb0038162017-03-28 05:32:52 +00002455 unsigned msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002456
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002457 return msb + n * integerPartWidth;
2458 }
Chris Lattner6b695682007-08-16 15:56:55 +00002459 } while (n);
2460
2461 return -1U;
2462}
2463
Neil Boothb6182162007-10-08 13:47:12 +00002464/* Copy the bit vector of width srcBITS from SRC, starting at bit
2465 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2466 the least significant bit of DST. All high bits above srcBITS in
2467 DST are zero-filled. */
2468void
Craig Topper6a8518082017-03-28 05:32:55 +00002469APInt::tcExtract(integerPart *dst, unsigned dstCount, const integerPart *src,
2470 unsigned srcBits, unsigned srcLSB) {
Craig Topperb0038162017-03-28 05:32:52 +00002471 unsigned dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002472 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002473
Craig Topperb0038162017-03-28 05:32:52 +00002474 unsigned firstSrcPart = srcLSB / integerPartWidth;
Neil Boothb6182162007-10-08 13:47:12 +00002475 tcAssign (dst, src + firstSrcPart, dstParts);
2476
Craig Topperb0038162017-03-28 05:32:52 +00002477 unsigned shift = srcLSB % integerPartWidth;
Neil Boothb6182162007-10-08 13:47:12 +00002478 tcShiftRight (dst, dstParts, shift);
2479
2480 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2481 in DST. If this is less that srcBits, append the rest, else
2482 clear the high bits. */
Craig Topperb0038162017-03-28 05:32:52 +00002483 unsigned n = dstParts * integerPartWidth - shift;
Neil Boothb6182162007-10-08 13:47:12 +00002484 if (n < srcBits) {
2485 integerPart mask = lowBitMask (srcBits - n);
2486 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2487 << n % integerPartWidth);
2488 } else if (n > srcBits) {
Neil Booth7e74b172007-10-12 15:31:31 +00002489 if (srcBits % integerPartWidth)
2490 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Boothb6182162007-10-08 13:47:12 +00002491 }
2492
2493 /* Clear high parts. */
2494 while (dstParts < dstCount)
2495 dst[dstParts++] = 0;
2496}
2497
Chris Lattner6b695682007-08-16 15:56:55 +00002498/* DST += RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002499integerPart APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2500 integerPart c, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002501 assert(c <= 1);
2502
Craig Topperb0038162017-03-28 05:32:52 +00002503 for (unsigned i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002504 integerPart l;
2505
2506 l = dst[i];
2507 if (c) {
2508 dst[i] += rhs[i] + 1;
2509 c = (dst[i] <= l);
2510 } else {
2511 dst[i] += rhs[i];
2512 c = (dst[i] < l);
2513 }
2514 }
2515
2516 return c;
2517}
2518
2519/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002520integerPart APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2521 integerPart c, unsigned parts)
Chris Lattner6b695682007-08-16 15:56:55 +00002522{
Chris Lattner6b695682007-08-16 15:56:55 +00002523 assert(c <= 1);
2524
Craig Topperb0038162017-03-28 05:32:52 +00002525 for (unsigned i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002526 integerPart l;
2527
2528 l = dst[i];
2529 if (c) {
2530 dst[i] -= rhs[i] + 1;
2531 c = (dst[i] >= l);
2532 } else {
2533 dst[i] -= rhs[i];
2534 c = (dst[i] > l);
2535 }
2536 }
2537
2538 return c;
2539}
2540
2541/* Negate a bignum in-place. */
Craig Topper6a8518082017-03-28 05:32:55 +00002542void APInt::tcNegate(integerPart *dst, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002543 tcComplement(dst, parts);
2544 tcIncrement(dst, parts);
2545}
2546
Neil Boothc8b650a2007-10-06 00:43:45 +00002547/* DST += SRC * MULTIPLIER + CARRY if add is true
2548 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002549
2550 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2551 they must start at the same point, i.e. DST == SRC.
2552
2553 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2554 returned. Otherwise DST is filled with the least significant
2555 DSTPARTS parts of the result, and if all of the omitted higher
2556 parts were zero return zero, otherwise overflow occurred and
2557 return one. */
Craig Topper6a8518082017-03-28 05:32:55 +00002558int APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2559 integerPart multiplier, integerPart carry,
2560 unsigned srcParts, unsigned dstParts,
2561 bool add) {
Chris Lattner6b695682007-08-16 15:56:55 +00002562 /* Otherwise our writes of DST kill our later reads of SRC. */
2563 assert(dst <= src || dst >= src + srcParts);
2564 assert(dstParts <= srcParts + 1);
2565
2566 /* N loops; minimum of dstParts and srcParts. */
Craig Topperb0038162017-03-28 05:32:52 +00002567 unsigned n = dstParts < srcParts ? dstParts: srcParts;
Chris Lattner6b695682007-08-16 15:56:55 +00002568
Craig Topperb0038162017-03-28 05:32:52 +00002569 unsigned i;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002570 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002571 integerPart low, mid, high, srcPart;
2572
2573 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2574
2575 This cannot overflow, because
2576
2577 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2578
2579 which is less than n^2. */
2580
2581 srcPart = src[i];
2582
Craig Topper6a8518082017-03-28 05:32:55 +00002583 if (multiplier == 0 || srcPart == 0) {
Chris Lattner6b695682007-08-16 15:56:55 +00002584 low = carry;
2585 high = 0;
2586 } else {
2587 low = lowHalf(srcPart) * lowHalf(multiplier);
2588 high = highHalf(srcPart) * highHalf(multiplier);
2589
2590 mid = lowHalf(srcPart) * highHalf(multiplier);
2591 high += highHalf(mid);
2592 mid <<= integerPartWidth / 2;
2593 if (low + mid < low)
2594 high++;
2595 low += mid;
2596
2597 mid = highHalf(srcPart) * lowHalf(multiplier);
2598 high += highHalf(mid);
2599 mid <<= integerPartWidth / 2;
2600 if (low + mid < low)
2601 high++;
2602 low += mid;
2603
2604 /* Now add carry. */
2605 if (low + carry < low)
2606 high++;
2607 low += carry;
2608 }
2609
2610 if (add) {
2611 /* And now DST[i], and store the new low part there. */
2612 if (low + dst[i] < low)
2613 high++;
2614 dst[i] += low;
2615 } else
2616 dst[i] = low;
2617
2618 carry = high;
2619 }
2620
2621 if (i < dstParts) {
2622 /* Full multiplication, there is no overflow. */
2623 assert(i + 1 == dstParts);
2624 dst[i] = carry;
2625 return 0;
2626 } else {
2627 /* We overflowed if there is carry. */
2628 if (carry)
2629 return 1;
2630
2631 /* We would overflow if any significant unwritten parts would be
2632 non-zero. This is true if any remaining src parts are non-zero
2633 and the multiplier is non-zero. */
2634 if (multiplier)
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002635 for (; i < srcParts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002636 if (src[i])
2637 return 1;
2638
2639 /* We fitted in the narrow destination. */
2640 return 0;
2641 }
2642}
2643
2644/* DST = LHS * RHS, where DST has the same width as the operands and
2645 is filled with the least significant parts of the result. Returns
2646 one if overflow occurred, otherwise zero. DST must be disjoint
2647 from both operands. */
Craig Topper6a8518082017-03-28 05:32:55 +00002648int APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2649 const integerPart *rhs, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002650 assert(dst != lhs && dst != rhs);
2651
Craig Topperb0038162017-03-28 05:32:52 +00002652 int overflow = 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002653 tcSet(dst, 0, parts);
2654
Craig Topperb0038162017-03-28 05:32:52 +00002655 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002656 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2657 parts - i, true);
2658
2659 return overflow;
2660}
2661
Neil Booth0ea72a92007-10-06 00:24:48 +00002662/* DST = LHS * RHS, where DST has width the sum of the widths of the
2663 operands. No overflow occurs. DST must be disjoint from both
2664 operands. Returns the number of parts required to hold the
2665 result. */
Craig Topper6a8518082017-03-28 05:32:55 +00002666unsigned APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
2667 const integerPart *rhs, unsigned lhsParts,
2668 unsigned rhsParts) {
Neil Booth0ea72a92007-10-06 00:24:48 +00002669 /* Put the narrower number on the LHS for less loops below. */
2670 if (lhsParts > rhsParts) {
2671 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2672 } else {
Neil Booth0ea72a92007-10-06 00:24:48 +00002673 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002674
Neil Booth0ea72a92007-10-06 00:24:48 +00002675 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002676
Craig Topperb0038162017-03-28 05:32:52 +00002677 for (unsigned i = 0; i < lhsParts; i++)
2678 tcMultiplyPart(&dst[i], rhs, lhs[i], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002679
Craig Topperb0038162017-03-28 05:32:52 +00002680 unsigned n = lhsParts + rhsParts;
Neil Booth0ea72a92007-10-06 00:24:48 +00002681
2682 return n - (dst[n - 1] == 0);
2683 }
Chris Lattner6b695682007-08-16 15:56:55 +00002684}
2685
2686/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2687 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2688 set REMAINDER to the remainder, return zero. i.e.
2689
2690 OLD_LHS = RHS * LHS + REMAINDER
2691
2692 SCRATCH is a bignum of the same size as the operands and result for
2693 use by the routine; its contents need not be initialized and are
2694 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2695*/
Craig Topper6a8518082017-03-28 05:32:55 +00002696int APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2697 integerPart *remainder, integerPart *srhs,
2698 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002699 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2700
Craig Topperb0038162017-03-28 05:32:52 +00002701 unsigned shiftCount = tcMSB(rhs, parts) + 1;
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002702 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002703 return true;
2704
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002705 shiftCount = parts * integerPartWidth - shiftCount;
Craig Topperb0038162017-03-28 05:32:52 +00002706 unsigned n = shiftCount / integerPartWidth;
2707 integerPart mask = (integerPart) 1 << (shiftCount % integerPartWidth);
Chris Lattner6b695682007-08-16 15:56:55 +00002708
2709 tcAssign(srhs, rhs, parts);
2710 tcShiftLeft(srhs, parts, shiftCount);
2711 tcAssign(remainder, lhs, parts);
2712 tcSet(lhs, 0, parts);
2713
2714 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2715 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002716 for (;;) {
Chris Lattner6b695682007-08-16 15:56:55 +00002717 int compare;
2718
2719 compare = tcCompare(remainder, srhs, parts);
2720 if (compare >= 0) {
2721 tcSubtract(remainder, srhs, 0, parts);
2722 lhs[n] |= mask;
2723 }
2724
2725 if (shiftCount == 0)
2726 break;
2727 shiftCount--;
2728 tcShiftRight(srhs, parts, 1);
Richard Trieu7a083812016-02-18 22:09:30 +00002729 if ((mask >>= 1) == 0) {
2730 mask = (integerPart) 1 << (integerPartWidth - 1);
2731 n--;
2732 }
Chris Lattner6b695682007-08-16 15:56:55 +00002733 }
2734
2735 return false;
2736}
2737
2738/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2739 There are no restrictions on COUNT. */
Craig Topper6a8518082017-03-28 05:32:55 +00002740void APInt::tcShiftLeft(integerPart *dst, unsigned parts, unsigned count) {
Neil Boothb6182162007-10-08 13:47:12 +00002741 if (count) {
Neil Boothb6182162007-10-08 13:47:12 +00002742 /* Jump is the inter-part jump; shift is is intra-part shift. */
Craig Topperb0038162017-03-28 05:32:52 +00002743 unsigned jump = count / integerPartWidth;
2744 unsigned shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002745
Neil Boothb6182162007-10-08 13:47:12 +00002746 while (parts > jump) {
2747 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002748
Neil Boothb6182162007-10-08 13:47:12 +00002749 parts--;
Chris Lattner6b695682007-08-16 15:56:55 +00002750
Neil Boothb6182162007-10-08 13:47:12 +00002751 /* dst[i] comes from the two parts src[i - jump] and, if we have
2752 an intra-part shift, src[i - jump - 1]. */
2753 part = dst[parts - jump];
2754 if (shift) {
2755 part <<= shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002756 if (parts >= jump + 1)
2757 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2758 }
2759
Neil Boothb6182162007-10-08 13:47:12 +00002760 dst[parts] = part;
2761 }
Chris Lattner6b695682007-08-16 15:56:55 +00002762
Neil Boothb6182162007-10-08 13:47:12 +00002763 while (parts > 0)
2764 dst[--parts] = 0;
2765 }
Chris Lattner6b695682007-08-16 15:56:55 +00002766}
2767
2768/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2769 zero. There are no restrictions on COUNT. */
Craig Topper6a8518082017-03-28 05:32:55 +00002770void APInt::tcShiftRight(integerPart *dst, unsigned parts, unsigned count) {
Neil Boothb6182162007-10-08 13:47:12 +00002771 if (count) {
Neil Boothb6182162007-10-08 13:47:12 +00002772 /* Jump is the inter-part jump; shift is is intra-part shift. */
Craig Topperb0038162017-03-28 05:32:52 +00002773 unsigned jump = count / integerPartWidth;
2774 unsigned shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002775
Neil Boothb6182162007-10-08 13:47:12 +00002776 /* Perform the shift. This leaves the most significant COUNT bits
2777 of the result at zero. */
Craig Topperb0038162017-03-28 05:32:52 +00002778 for (unsigned i = 0; i < parts; i++) {
Neil Boothb6182162007-10-08 13:47:12 +00002779 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002780
Neil Boothb6182162007-10-08 13:47:12 +00002781 if (i + jump >= parts) {
2782 part = 0;
2783 } else {
2784 part = dst[i + jump];
2785 if (shift) {
2786 part >>= shift;
2787 if (i + jump + 1 < parts)
2788 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2789 }
Chris Lattner6b695682007-08-16 15:56:55 +00002790 }
Chris Lattner6b695682007-08-16 15:56:55 +00002791
Neil Boothb6182162007-10-08 13:47:12 +00002792 dst[i] = part;
2793 }
Chris Lattner6b695682007-08-16 15:56:55 +00002794 }
2795}
2796
2797/* Bitwise and of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002798void APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002799 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002800 dst[i] &= rhs[i];
2801}
2802
2803/* Bitwise inclusive or of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002804void APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002805 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002806 dst[i] |= rhs[i];
2807}
2808
2809/* Bitwise exclusive or of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002810void APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002811 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002812 dst[i] ^= rhs[i];
2813}
2814
2815/* Complement a bignum in-place. */
Craig Topper6a8518082017-03-28 05:32:55 +00002816void APInt::tcComplement(integerPart *dst, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002817 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002818 dst[i] = ~dst[i];
2819}
2820
2821/* Comparison (unsigned) of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002822int APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2823 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002824 while (parts) {
2825 parts--;
2826 if (lhs[parts] == rhs[parts])
2827 continue;
2828
2829 if (lhs[parts] > rhs[parts])
2830 return 1;
2831 else
2832 return -1;
2833 }
2834
2835 return 0;
2836}
2837
2838/* Increment a bignum in-place, return the carry flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002839integerPart APInt::tcIncrement(integerPart *dst, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002840 unsigned i;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002841 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002842 if (++dst[i] != 0)
2843 break;
2844
2845 return i == parts;
2846}
2847
Michael Gottesman9d406f42013-05-28 19:50:20 +00002848/* Decrement a bignum in-place, return the borrow flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002849integerPart APInt::tcDecrement(integerPart *dst, unsigned parts) {
Craig Topper592b1342017-03-28 05:32:48 +00002850 for (unsigned i = 0; i < parts; i++) {
Michael Gottesman9d406f42013-05-28 19:50:20 +00002851 // If the current word is non-zero, then the decrement has no effect on the
2852 // higher-order words of the integer and no borrow can occur. Exit early.
2853 if (dst[i]--)
2854 return 0;
2855 }
2856 // If every word was zero, then there is a borrow.
2857 return 1;
2858}
2859
2860
Chris Lattner6b695682007-08-16 15:56:55 +00002861/* Set the least significant BITS bits of a bignum, clear the
2862 rest. */
Craig Topper6a8518082017-03-28 05:32:55 +00002863void APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned parts,
2864 unsigned bits) {
Craig Topperb0038162017-03-28 05:32:52 +00002865 unsigned i = 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002866 while (bits > integerPartWidth) {
2867 dst[i++] = ~(integerPart) 0;
2868 bits -= integerPartWidth;
2869 }
2870
2871 if (bits)
2872 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2873
2874 while (i < parts)
2875 dst[i++] = 0;
2876}