blob: 8ac881e4c7fec719882e0a856d1c47c223e712c7 [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
Eric Christopher820256b2009-08-21 04:06:45 +0000879APInt llvm::APIntOps::GreatestCommonDivisor(const APInt& API1,
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000880 const APInt& API2) {
Zhou Shengdac63782007-02-06 03:00:16 +0000881 APInt A = API1, B = API2;
882 while (!!B) {
883 APInt T = B;
Reid Spencer1d072122007-02-16 22:36:51 +0000884 B = APIntOps::urem(A, B);
Zhou Shengdac63782007-02-06 03:00:16 +0000885 A = T;
886 }
887 return A;
888}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000889
Chris Lattner77527f52009-01-21 18:09:24 +0000890APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000891 union {
892 double D;
893 uint64_t I;
894 } T;
895 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000896
897 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000898 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000899
900 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000901 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000902
903 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000904 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000905 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000906
907 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
908 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
909
910 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000911 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000912 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000913 APInt(width, mantissa >> (52 - exp));
914
915 // If the client didn't provide enough bits for us to shift the mantissa into
916 // then the result is undefined, just return 0
917 if (width <= exp - 52)
918 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000919
920 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000921 APInt Tmp(width, mantissa);
Chris Lattner77527f52009-01-21 18:09:24 +0000922 Tmp = Tmp.shl((unsigned)exp - 52);
Zhou Shengd707d632007-02-12 20:02:55 +0000923 return isNeg ? -Tmp : Tmp;
924}
925
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000926/// This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000927/// The layout for double is as following (IEEE Standard 754):
928/// --------------------------------------
929/// | Sign Exponent Fraction Bias |
930/// |-------------------------------------- |
931/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000932/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000933double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000934
935 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000936 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000937 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
938 if (isSigned) {
David Majnemer03992262016-06-24 21:15:36 +0000939 int64_t sext = SignExtend64(getWord(0), BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000940 return double(sext);
941 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000942 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000943 }
944
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000945 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000946 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000947
948 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000949 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000950
951 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000952 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000953
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000954 // The exponent (without bias normalization) is just the number of bits
955 // we are using. Note that the sign bit is gone since we constructed the
956 // absolute value.
957 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000958
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000959 // Return infinity for exponent overflow
960 if (exp > 1023) {
961 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000962 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000963 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000964 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000965 }
966 exp += 1023; // Increment for 1023 bias
967
968 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
969 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000970 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000971 unsigned hiWord = whichWord(n-1);
972 if (hiWord == 0) {
973 mantissa = Tmp.pVal[0];
974 if (n > 52)
975 mantissa >>= n - 52; // shift down, we want the top 52 bits.
976 } else {
977 assert(hiWord > 0 && "huh?");
978 uint64_t hibits = Tmp.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
979 uint64_t lobits = Tmp.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
980 mantissa = hibits | lobits;
981 }
982
Zhou Shengd707d632007-02-12 20:02:55 +0000983 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000984 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +0000985 union {
986 double D;
987 uint64_t I;
988 } T;
989 T.I = sign | (exp << 52) | mantissa;
990 return T.D;
991}
992
Reid Spencer1d072122007-02-16 22:36:51 +0000993// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000994APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000995 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +0000996 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +0000997
998 if (width <= APINT_BITS_PER_WORD)
999 return APInt(width, getRawData()[0]);
1000
1001 APInt Result(getMemory(getNumWords(width)), width);
1002
1003 // Copy full words.
1004 unsigned i;
1005 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
1006 Result.pVal[i] = pVal[i];
1007
1008 // Truncate and copy any partial word.
1009 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
1010 if (bits != 0)
1011 Result.pVal[i] = pVal[i] << bits >> bits;
1012
1013 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001014}
1015
1016// Sign extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001017APInt APInt::sext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001018 assert(width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001019
1020 if (width <= APINT_BITS_PER_WORD) {
1021 uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
1022 val = (int64_t)val >> (width - BitWidth);
1023 return APInt(width, val >> (APINT_BITS_PER_WORD - width));
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001024 }
1025
Jay Foad583abbc2010-12-07 08:25:19 +00001026 APInt Result(getMemory(getNumWords(width)), width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001027
Jay Foad583abbc2010-12-07 08:25:19 +00001028 // Copy full words.
1029 unsigned i;
1030 uint64_t word = 0;
1031 for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
1032 word = getRawData()[i];
1033 Result.pVal[i] = word;
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001034 }
1035
Jay Foad583abbc2010-12-07 08:25:19 +00001036 // Read and sign-extend any partial word.
1037 unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
1038 if (bits != 0)
1039 word = (int64_t)getRawData()[i] << bits >> bits;
1040 else
1041 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
1042
1043 // Write remaining full words.
1044 for (; i != width / APINT_BITS_PER_WORD; i++) {
1045 Result.pVal[i] = word;
1046 word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001047 }
Jay Foad583abbc2010-12-07 08:25:19 +00001048
1049 // Write any partial word.
1050 bits = (0 - width) % APINT_BITS_PER_WORD;
1051 if (bits != 0)
1052 Result.pVal[i] = word << bits >> bits;
1053
1054 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001055}
1056
1057// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +00001058APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +00001059 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +00001060
1061 if (width <= APINT_BITS_PER_WORD)
1062 return APInt(width, VAL);
1063
1064 APInt Result(getMemory(getNumWords(width)), width);
1065
1066 // Copy words.
1067 unsigned i;
1068 for (i = 0; i != getNumWords(); i++)
1069 Result.pVal[i] = getRawData()[i];
1070
1071 // Zero remaining words.
1072 memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
1073
1074 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +00001075}
1076
Jay Foad583abbc2010-12-07 08:25:19 +00001077APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001078 if (BitWidth < width)
1079 return zext(width);
1080 if (BitWidth > width)
1081 return trunc(width);
1082 return *this;
1083}
1084
Jay Foad583abbc2010-12-07 08:25:19 +00001085APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +00001086 if (BitWidth < width)
1087 return sext(width);
1088 if (BitWidth > width)
1089 return trunc(width);
1090 return *this;
1091}
1092
Rafael Espindolabb893fe2012-01-27 23:33:07 +00001093APInt APInt::zextOrSelf(unsigned width) const {
1094 if (BitWidth < width)
1095 return zext(width);
1096 return *this;
1097}
1098
1099APInt APInt::sextOrSelf(unsigned width) const {
1100 if (BitWidth < width)
1101 return sext(width);
1102 return *this;
1103}
1104
Zhou Shenge93db8f2007-02-09 07:48:24 +00001105/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001106/// @brief Arithmetic right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001107APInt APInt::ashr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001108 return ashr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001109}
1110
1111/// Arithmetic right-shift this APInt by shiftAmt.
1112/// @brief Arithmetic right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001113APInt APInt::ashr(unsigned shiftAmt) const {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001114 assert(shiftAmt <= BitWidth && "Invalid shift amount");
Reid Spencer1825dd02007-03-02 22:39:11 +00001115 // Handle a degenerate case
1116 if (shiftAmt == 0)
1117 return *this;
1118
1119 // Handle single word shifts with built-in ashr
Reid Spencer522ca7c2007-02-25 01:56:07 +00001120 if (isSingleWord()) {
1121 if (shiftAmt == BitWidth)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001122 return APInt(BitWidth, 0); // undefined
Jonathan Roelofs851b79d2016-08-10 19:50:14 +00001123 return APInt(BitWidth, SignExtend64(VAL, BitWidth) >> shiftAmt);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001124 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001125
Reid Spencer1825dd02007-03-02 22:39:11 +00001126 // If all the bits were shifted out, the result is, technically, undefined.
1127 // We return -1 if it was negative, 0 otherwise. We check this early to avoid
1128 // issues in the algorithm below.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001129 if (shiftAmt == BitWidth) {
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001130 if (isNegative())
Zhou Sheng1247c072008-06-05 13:27:38 +00001131 return APInt(BitWidth, -1ULL, true);
Reid Spencera41e93b2007-02-25 19:32:03 +00001132 else
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001133 return APInt(BitWidth, 0);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001134 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001135
1136 // Create some space for the result.
1137 uint64_t * val = new uint64_t[getNumWords()];
1138
Reid Spencer1825dd02007-03-02 22:39:11 +00001139 // Compute some values needed by the following shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001140 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD; // bits to shift per word
1141 unsigned offset = shiftAmt / APINT_BITS_PER_WORD; // word offset for shift
1142 unsigned breakWord = getNumWords() - 1 - offset; // last word affected
1143 unsigned bitsInWord = whichBit(BitWidth); // how many bits in last word?
Reid Spencer1825dd02007-03-02 22:39:11 +00001144 if (bitsInWord == 0)
1145 bitsInWord = APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001146
1147 // If we are shifting whole words, just move whole words
1148 if (wordShift == 0) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001149 // Move the words containing significant bits
Chris Lattner77527f52009-01-21 18:09:24 +00001150 for (unsigned i = 0; i <= breakWord; ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001151 val[i] = pVal[i+offset]; // move whole word
1152
1153 // Adjust the top significant word for sign bit fill, if negative
1154 if (isNegative())
1155 if (bitsInWord < APINT_BITS_PER_WORD)
1156 val[breakWord] |= ~0ULL << bitsInWord; // set high bits
1157 } else {
Eric Christopher820256b2009-08-21 04:06:45 +00001158 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001159 for (unsigned i = 0; i < breakWord; ++i) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001160 // This combines the shifted corresponding word with the low bits from
1161 // the next word (shifted into this word's high bits).
Eric Christopher820256b2009-08-21 04:06:45 +00001162 val[i] = (pVal[i+offset] >> wordShift) |
Reid Spencer1825dd02007-03-02 22:39:11 +00001163 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
1164 }
1165
1166 // Shift the break word. In this case there are no bits from the next word
1167 // to include in this word.
1168 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1169
Alp Tokercb402912014-01-24 17:20:08 +00001170 // Deal with sign extension in the break word, and possibly the word before
Reid Spencer1825dd02007-03-02 22:39:11 +00001171 // it.
Chris Lattnerdad2d092007-05-03 18:15:36 +00001172 if (isNegative()) {
Reid Spencer1825dd02007-03-02 22:39:11 +00001173 if (wordShift > bitsInWord) {
1174 if (breakWord > 0)
Eric Christopher820256b2009-08-21 04:06:45 +00001175 val[breakWord-1] |=
Reid Spencer1825dd02007-03-02 22:39:11 +00001176 ~0ULL << (APINT_BITS_PER_WORD - (wordShift - bitsInWord));
1177 val[breakWord] |= ~0ULL;
Eric Christopher820256b2009-08-21 04:06:45 +00001178 } else
Reid Spencer1825dd02007-03-02 22:39:11 +00001179 val[breakWord] |= (~0ULL << (bitsInWord - wordShift));
Chris Lattnerdad2d092007-05-03 18:15:36 +00001180 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001181 }
1182
Reid Spencer1825dd02007-03-02 22:39:11 +00001183 // Remaining words are 0 or -1, just assign them.
1184 uint64_t fillValue = (isNegative() ? -1ULL : 0);
Chris Lattner77527f52009-01-21 18:09:24 +00001185 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer1825dd02007-03-02 22:39:11 +00001186 val[i] = fillValue;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001187 APInt Result(val, BitWidth);
1188 Result.clearUnusedBits();
1189 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001190}
1191
Zhou Shenge93db8f2007-02-09 07:48:24 +00001192/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001193/// @brief Logical right-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001194APInt APInt::lshr(const APInt &shiftAmt) const {
Chris Lattner77527f52009-01-21 18:09:24 +00001195 return lshr((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001196}
1197
1198/// Logical right-shift this APInt by shiftAmt.
1199/// @brief Logical right-shift function.
Chris Lattner77527f52009-01-21 18:09:24 +00001200APInt APInt::lshr(unsigned shiftAmt) const {
Chris Lattnerdad2d092007-05-03 18:15:36 +00001201 if (isSingleWord()) {
Ahmed Charles0dca5d82012-02-24 19:06:15 +00001202 if (shiftAmt >= BitWidth)
Reid Spencer522ca7c2007-02-25 01:56:07 +00001203 return APInt(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001204 else
Reid Spencer522ca7c2007-02-25 01:56:07 +00001205 return APInt(BitWidth, this->VAL >> shiftAmt);
Chris Lattnerdad2d092007-05-03 18:15:36 +00001206 }
Reid Spencer522ca7c2007-02-25 01:56:07 +00001207
Reid Spencer44eef162007-02-26 01:19:48 +00001208 // If all the bits were shifted out, the result is 0. This avoids issues
1209 // with shifting by the size of the integer type, which produces undefined
1210 // results. We define these "undefined results" to always be 0.
Chad Rosier3d464d82012-06-08 18:04:52 +00001211 if (shiftAmt >= BitWidth)
Reid Spencer44eef162007-02-26 01:19:48 +00001212 return APInt(BitWidth, 0);
1213
Reid Spencerfffdf102007-05-17 06:26:29 +00001214 // If none of the bits are shifted out, the result is *this. This avoids
Eric Christopher820256b2009-08-21 04:06:45 +00001215 // issues with shifting by the size of the integer type, which produces
Reid Spencerfffdf102007-05-17 06:26:29 +00001216 // undefined results in the code below. This is also an optimization.
1217 if (shiftAmt == 0)
1218 return *this;
1219
Reid Spencer44eef162007-02-26 01:19:48 +00001220 // Create some space for the result.
1221 uint64_t * val = new uint64_t[getNumWords()];
1222
1223 // If we are shifting less than a word, compute the shift with a simple carry
1224 if (shiftAmt < APINT_BITS_PER_WORD) {
Richard Smith4f9a8082011-11-23 21:33:37 +00001225 lshrNear(val, pVal, getNumWords(), shiftAmt);
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001226 APInt Result(val, BitWidth);
1227 Result.clearUnusedBits();
1228 return Result;
Reid Spencera41e93b2007-02-25 19:32:03 +00001229 }
1230
Reid Spencer44eef162007-02-26 01:19:48 +00001231 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001232 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1233 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencer44eef162007-02-26 01:19:48 +00001234
1235 // If we are shifting whole words, just move whole words
1236 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001237 for (unsigned i = 0; i < getNumWords() - offset; ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001238 val[i] = pVal[i+offset];
Chris Lattner77527f52009-01-21 18:09:24 +00001239 for (unsigned i = getNumWords()-offset; i < getNumWords(); i++)
Reid Spencer44eef162007-02-26 01:19:48 +00001240 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001241 APInt Result(val, BitWidth);
1242 Result.clearUnusedBits();
1243 return Result;
Reid Spencer44eef162007-02-26 01:19:48 +00001244 }
1245
Eric Christopher820256b2009-08-21 04:06:45 +00001246 // Shift the low order words
Chris Lattner77527f52009-01-21 18:09:24 +00001247 unsigned breakWord = getNumWords() - offset -1;
1248 for (unsigned i = 0; i < breakWord; ++i)
Reid Spencerd99feaf2007-03-01 05:39:56 +00001249 val[i] = (pVal[i+offset] >> wordShift) |
1250 (pVal[i+offset+1] << (APINT_BITS_PER_WORD - wordShift));
Reid Spencer44eef162007-02-26 01:19:48 +00001251 // Shift the break word.
1252 val[breakWord] = pVal[breakWord+offset] >> wordShift;
1253
1254 // Remaining words are 0
Chris Lattner77527f52009-01-21 18:09:24 +00001255 for (unsigned i = breakWord+1; i < getNumWords(); ++i)
Reid Spencer44eef162007-02-26 01:19:48 +00001256 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001257 APInt Result(val, BitWidth);
1258 Result.clearUnusedBits();
1259 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001260}
1261
Zhou Shenge93db8f2007-02-09 07:48:24 +00001262/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001263/// @brief Left-shift function.
Dan Gohman105c1d42008-02-29 01:40:47 +00001264APInt APInt::shl(const APInt &shiftAmt) const {
Nick Lewycky030c4502009-01-19 17:42:33 +00001265 // It's undefined behavior in C to shift by BitWidth or greater.
Chris Lattner77527f52009-01-21 18:09:24 +00001266 return shl((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +00001267}
1268
Chris Lattner77527f52009-01-21 18:09:24 +00001269APInt APInt::shlSlowCase(unsigned shiftAmt) const {
Reid Spencera5c84d92007-02-25 00:56:44 +00001270 // If all the bits were shifted out, the result is 0. This avoids issues
1271 // with shifting by the size of the integer type, which produces undefined
1272 // results. We define these "undefined results" to always be 0.
1273 if (shiftAmt == BitWidth)
1274 return APInt(BitWidth, 0);
1275
Reid Spencer81ee0202007-05-12 18:01:57 +00001276 // If none of the bits are shifted out, the result is *this. This avoids a
1277 // lshr by the words size in the loop below which can produce incorrect
1278 // results. It also avoids the expensive computation below for a common case.
1279 if (shiftAmt == 0)
1280 return *this;
1281
Reid Spencera5c84d92007-02-25 00:56:44 +00001282 // Create some space for the result.
1283 uint64_t * val = new uint64_t[getNumWords()];
1284
1285 // If we are shifting less than a word, do it the easy way
1286 if (shiftAmt < APINT_BITS_PER_WORD) {
1287 uint64_t carry = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001288 for (unsigned i = 0; i < getNumWords(); i++) {
Reid Spencera5c84d92007-02-25 00:56:44 +00001289 val[i] = pVal[i] << shiftAmt | carry;
1290 carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
1291 }
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001292 APInt Result(val, BitWidth);
1293 Result.clearUnusedBits();
1294 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001295 }
1296
Reid Spencera5c84d92007-02-25 00:56:44 +00001297 // Compute some values needed by the remaining shift algorithms
Chris Lattner77527f52009-01-21 18:09:24 +00001298 unsigned wordShift = shiftAmt % APINT_BITS_PER_WORD;
1299 unsigned offset = shiftAmt / APINT_BITS_PER_WORD;
Reid Spencera5c84d92007-02-25 00:56:44 +00001300
1301 // If we are shifting whole words, just move whole words
1302 if (wordShift == 0) {
Chris Lattner77527f52009-01-21 18:09:24 +00001303 for (unsigned i = 0; i < offset; i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001304 val[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001305 for (unsigned i = offset; i < getNumWords(); i++)
Reid Spencera5c84d92007-02-25 00:56:44 +00001306 val[i] = pVal[i-offset];
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001307 APInt Result(val, BitWidth);
1308 Result.clearUnusedBits();
1309 return Result;
Reid Spencer632ebdf2007-02-24 20:19:37 +00001310 }
Reid Spencera5c84d92007-02-25 00:56:44 +00001311
1312 // Copy whole words from this to Result.
Chris Lattner77527f52009-01-21 18:09:24 +00001313 unsigned i = getNumWords() - 1;
Reid Spencera5c84d92007-02-25 00:56:44 +00001314 for (; i > offset; --i)
1315 val[i] = pVal[i-offset] << wordShift |
1316 pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
Reid Spencerab0e08a2007-02-25 01:08:58 +00001317 val[offset] = pVal[0] << wordShift;
Reid Spencera5c84d92007-02-25 00:56:44 +00001318 for (i = 0; i < offset; ++i)
1319 val[i] = 0;
Benjamin Kramerf9a29752014-10-10 10:18:12 +00001320 APInt Result(val, BitWidth);
1321 Result.clearUnusedBits();
1322 return Result;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001323}
1324
Joey Gouly51c0ae52017-02-07 11:58:22 +00001325// Calculate the rotate amount modulo the bit width.
1326static unsigned rotateModulo(unsigned BitWidth, const APInt &rotateAmt) {
1327 unsigned rotBitWidth = rotateAmt.getBitWidth();
1328 APInt rot = rotateAmt;
1329 if (rotBitWidth < BitWidth) {
1330 // Extend the rotate APInt, so that the urem doesn't divide by 0.
1331 // e.g. APInt(1, 32) would give APInt(1, 0).
1332 rot = rotateAmt.zext(BitWidth);
1333 }
1334 rot = rot.urem(APInt(rot.getBitWidth(), BitWidth));
1335 return rot.getLimitedValue(BitWidth);
1336}
1337
Dan Gohman105c1d42008-02-29 01:40:47 +00001338APInt APInt::rotl(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001339 return rotl(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001340}
1341
Chris Lattner77527f52009-01-21 18:09:24 +00001342APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001343 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001344 if (rotateAmt == 0)
1345 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001346 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001347}
1348
Dan Gohman105c1d42008-02-29 01:40:47 +00001349APInt APInt::rotr(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001350 return rotr(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001351}
1352
Chris Lattner77527f52009-01-21 18:09:24 +00001353APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001354 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001355 if (rotateAmt == 0)
1356 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001357 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001358}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001359
1360// Square Root - this method computes and returns the square root of "this".
1361// Three mechanisms are used for computation. For small values (<= 5 bits),
1362// a table lookup is done. This gets some performance for common cases. For
1363// values using less than 52 bits, the value is converted to double and then
1364// the libc sqrt function is called. The result is rounded and then converted
1365// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001366// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001367APInt APInt::sqrt() const {
1368
1369 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001370 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001371
1372 // Use a fast table for some small values. This also gets rid of some
1373 // rounding errors in libc sqrt for small values.
1374 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001375 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001376 /* 0 */ 0,
1377 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001378 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001379 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1380 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1381 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1382 /* 31 */ 6
1383 };
1384 return APInt(BitWidth, results[ (isSingleWord() ? VAL : pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001385 }
1386
1387 // If the magnitude of the value fits in less than 52 bits (the precision of
1388 // an IEEE double precision floating point value), then we can use the
1389 // libc sqrt function which will probably use a hardware sqrt computation.
1390 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001391 if (magnitude < 52) {
Eric Christopher820256b2009-08-21 04:06:45 +00001392 return APInt(BitWidth,
Reid Spencerd99feaf2007-03-01 05:39:56 +00001393 uint64_t(::round(::sqrt(double(isSingleWord()?VAL:pVal[0])))));
Jeff Cohenb622c112007-03-05 00:00:42 +00001394 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001395
1396 // Okay, all the short cuts are exhausted. We must compute it. The following
1397 // is a classical Babylonian method for computing the square root. This code
Sanjay Patel4cb54e02014-09-11 15:41:01 +00001398 // was adapted to APInt from a wikipedia article on such computations.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001399 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001400 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001401 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001402 APInt testy(BitWidth, 16);
1403 APInt x_old(BitWidth, 1);
1404 APInt x_new(BitWidth, 0);
1405 APInt two(BitWidth, 2);
1406
1407 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001408 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001409 if (i >= nbits || this->ule(testy)) {
1410 x_old = x_old.shl(i / 2);
1411 break;
1412 }
1413
Eric Christopher820256b2009-08-21 04:06:45 +00001414 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001415 for (;;) {
1416 x_new = (this->udiv(x_old) + x_old).udiv(two);
1417 if (x_old.ule(x_new))
1418 break;
1419 x_old = x_new;
1420 }
1421
1422 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001423 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001424 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001425 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001426 // floating point representation after 192 bits. There are no discrepancies
1427 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001428 APInt square(x_old * x_old);
1429 APInt nextSquare((x_old + 1) * (x_old +1));
1430 if (this->ult(square))
1431 return x_old;
David Blaikie54c94622011-12-01 20:58:30 +00001432 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1433 APInt midpoint((nextSquare - square).udiv(two));
1434 APInt offset(*this - square);
1435 if (offset.ult(midpoint))
1436 return x_old;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001437 return x_old + 1;
1438}
1439
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001440/// Computes the multiplicative inverse of this APInt for a given modulo. The
1441/// iterative extended Euclidean algorithm is used to solve for this value,
1442/// however we simplify it to speed up calculating only the inverse, and take
1443/// advantage of div+rem calculations. We also use some tricks to avoid copying
1444/// (potentially large) APInts around.
1445APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1446 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1447
1448 // Using the properties listed at the following web page (accessed 06/21/08):
1449 // http://www.numbertheory.org/php/euclid.html
1450 // (especially the properties numbered 3, 4 and 9) it can be proved that
1451 // BitWidth bits suffice for all the computations in the algorithm implemented
1452 // below. More precisely, this number of bits suffice if the multiplicative
1453 // inverse exists, but may not suffice for the general extended Euclidean
1454 // algorithm.
1455
1456 APInt r[2] = { modulo, *this };
1457 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1458 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001459
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001460 unsigned i;
1461 for (i = 0; r[i^1] != 0; i ^= 1) {
1462 // An overview of the math without the confusing bit-flipping:
1463 // q = r[i-2] / r[i-1]
1464 // r[i] = r[i-2] % r[i-1]
1465 // t[i] = t[i-2] - t[i-1] * q
1466 udivrem(r[i], r[i^1], q, r[i]);
1467 t[i] -= t[i^1] * q;
1468 }
1469
1470 // If this APInt and the modulo are not coprime, there is no multiplicative
1471 // inverse, so return 0. We check this by looking at the next-to-last
1472 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1473 // algorithm.
1474 if (r[i] != 1)
1475 return APInt(BitWidth, 0);
1476
1477 // The next-to-last t is the multiplicative inverse. However, we are
1478 // interested in a positive inverse. Calcuate a positive one from a negative
1479 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001480 // abs(t[i]) is known to be less than *this/2 (see the link above).
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001481 return t[i].isNegative() ? t[i] + modulo : t[i];
1482}
1483
Jay Foadfe0c6482009-04-30 10:15:35 +00001484/// Calculate the magic numbers required to implement a signed integer division
1485/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1486/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1487/// Warren, Jr., chapter 10.
1488APInt::ms APInt::magic() const {
1489 const APInt& d = *this;
1490 unsigned p;
1491 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001492 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001493 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001494
Jay Foadfe0c6482009-04-30 10:15:35 +00001495 ad = d.abs();
1496 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1497 anc = t - 1 - t.urem(ad); // absolute value of nc
1498 p = d.getBitWidth() - 1; // initialize p
1499 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1500 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1501 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1502 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1503 do {
1504 p = p + 1;
1505 q1 = q1<<1; // update q1 = 2p/abs(nc)
1506 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1507 if (r1.uge(anc)) { // must be unsigned comparison
1508 q1 = q1 + 1;
1509 r1 = r1 - anc;
1510 }
1511 q2 = q2<<1; // update q2 = 2p/abs(d)
1512 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1513 if (r2.uge(ad)) { // must be unsigned comparison
1514 q2 = q2 + 1;
1515 r2 = r2 - ad;
1516 }
1517 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001518 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001519
Jay Foadfe0c6482009-04-30 10:15:35 +00001520 mag.m = q2 + 1;
1521 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1522 mag.s = p - d.getBitWidth(); // resulting shift
1523 return mag;
1524}
1525
1526/// Calculate the magic numbers required to implement an unsigned integer
1527/// division by a constant as a sequence of multiplies, adds and shifts.
1528/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1529/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001530/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001531/// of the divided value are known zero.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001532APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001533 const APInt& d = *this;
1534 unsigned p;
1535 APInt nc, delta, q1, r1, q2, r2;
1536 struct mu magu;
1537 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001538 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001539 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1540 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1541
Benjamin Kramer3aab6a82012-07-11 18:31:59 +00001542 nc = allOnes - (allOnes - d).urem(d);
Jay Foadfe0c6482009-04-30 10:15:35 +00001543 p = d.getBitWidth() - 1; // initialize p
1544 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1545 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1546 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1547 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1548 do {
1549 p = p + 1;
1550 if (r1.uge(nc - r1)) {
1551 q1 = q1 + q1 + 1; // update q1
1552 r1 = r1 + r1 - nc; // update r1
1553 }
1554 else {
1555 q1 = q1+q1; // update q1
1556 r1 = r1+r1; // update r1
1557 }
1558 if ((r2 + 1).uge(d - r2)) {
1559 if (q2.uge(signedMax)) magu.a = 1;
1560 q2 = q2+q2 + 1; // update q2
1561 r2 = r2+r2 + 1 - d; // update r2
1562 }
1563 else {
1564 if (q2.uge(signedMin)) magu.a = 1;
1565 q2 = q2+q2; // update q2
1566 r2 = r2+r2 + 1; // update r2
1567 }
1568 delta = d - 1 - r2;
1569 } while (p < d.getBitWidth()*2 &&
1570 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1571 magu.m = q2 + 1; // resulting magic number
1572 magu.s = p - d.getBitWidth(); // resulting shift
1573 return magu;
1574}
1575
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001576/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1577/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1578/// variables here have the same names as in the algorithm. Comments explain
1579/// the algorithm and any deviation from it.
Chris Lattner77527f52009-01-21 18:09:24 +00001580static void KnuthDiv(unsigned *u, unsigned *v, unsigned *q, unsigned* r,
1581 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001582 assert(u && "Must provide dividend");
1583 assert(v && "Must provide divisor");
1584 assert(q && "Must provide quotient");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001585 assert(u != v && u != q && v != q && "Must use different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001586 assert(n>1 && "n must be > 1");
1587
Yaron Keren39fc5a62015-03-26 19:45:19 +00001588 // b denotes the base of the number system. In our case b is 2^32.
George Burgess IV381fc0e2016-08-25 01:05:08 +00001589 const uint64_t b = uint64_t(1) << 32;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001590
David Greenef32fcb42010-01-05 01:28:52 +00001591 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1592 DEBUG(dbgs() << "KnuthDiv: original:");
1593 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1594 DEBUG(dbgs() << " by");
1595 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1596 DEBUG(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001597 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1598 // u and v by d. Note that we have taken Knuth's advice here to use a power
1599 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1600 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001601 // shift amount from the leading zeros. We are basically normalizing the u
1602 // and v so that its high bits are shifted to the top of v's range without
1603 // overflow. Note that this can require an extra word in u so that u must
1604 // be of length m+n+1.
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +00001605 unsigned shift = countLeadingZeros(v[n-1]);
Chris Lattner77527f52009-01-21 18:09:24 +00001606 unsigned v_carry = 0;
1607 unsigned u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001608 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001609 for (unsigned i = 0; i < m+n; ++i) {
1610 unsigned u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001611 u[i] = (u[i] << shift) | u_carry;
1612 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001613 }
Chris Lattner77527f52009-01-21 18:09:24 +00001614 for (unsigned i = 0; i < n; ++i) {
1615 unsigned v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001616 v[i] = (v[i] << shift) | v_carry;
1617 v_carry = v_tmp;
1618 }
1619 }
1620 u[m+n] = u_carry;
Yaron Keren39fc5a62015-03-26 19:45:19 +00001621
David Greenef32fcb42010-01-05 01:28:52 +00001622 DEBUG(dbgs() << "KnuthDiv: normal:");
1623 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1624 DEBUG(dbgs() << " by");
1625 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1626 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001627
1628 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1629 int j = m;
1630 do {
David Greenef32fcb42010-01-05 01:28:52 +00001631 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001632 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001633 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1634 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1635 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
1636 // qp by 1, inrease rp by v[n-1], and repeat this test if rp < b. The test
1637 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001638 // value qp is one too large, and it eliminates all cases where qp is two
1639 // too large.
Reid Spencercb292e42007-02-23 01:57:13 +00001640 uint64_t dividend = ((uint64_t(u[j+n]) << 32) + u[j+n-1]);
David Greenef32fcb42010-01-05 01:28:52 +00001641 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001642 uint64_t qp = dividend / v[n-1];
1643 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001644 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1645 qp--;
1646 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001647 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001648 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001649 }
David Greenef32fcb42010-01-05 01:28:52 +00001650 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001651
Reid Spencercb292e42007-02-23 01:57:13 +00001652 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1653 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1654 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001655 // a subtraction.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001656 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1657 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1658 // true value plus b**(n+1), namely as the b's complement of
1659 // the true value, and a "borrow" to the left should be remembered.
Pawel Bylica86ac4472015-04-24 07:38:39 +00001660 int64_t borrow = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001661 for (unsigned i = 0; i < n; ++i) {
Pawel Bylica86ac4472015-04-24 07:38:39 +00001662 uint64_t p = uint64_t(qp) * uint64_t(v[i]);
1663 int64_t subres = int64_t(u[j+i]) - borrow - (unsigned)p;
1664 u[j+i] = (unsigned)subres;
1665 borrow = (p >> 32) - (subres >> 32);
1666 DEBUG(dbgs() << "KnuthDiv: u[j+i] = " << u[j+i]
Daniel Dunbar763ace92009-07-13 05:27:30 +00001667 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001668 }
Pawel Bylica86ac4472015-04-24 07:38:39 +00001669 bool isNeg = u[j+n] < borrow;
1670 u[j+n] -= (unsigned)borrow;
1671
David Greenef32fcb42010-01-05 01:28:52 +00001672 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1673 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1674 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001675
Eric Christopher820256b2009-08-21 04:06:45 +00001676 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001677 // negative, go to step D6; otherwise go on to step D7.
Chris Lattner77527f52009-01-21 18:09:24 +00001678 q[j] = (unsigned)qp;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001679 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001680 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001681 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001682 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001683 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001684 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1685 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001686 // since it cancels with the borrow that occurred in D4.
1687 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001688 for (unsigned i = 0; i < n; i++) {
1689 unsigned limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001690 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001691 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001692 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001693 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001694 }
David Greenef32fcb42010-01-05 01:28:52 +00001695 DEBUG(dbgs() << "KnuthDiv: after correction:");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001696 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
David Greenef32fcb42010-01-05 01:28:52 +00001697 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001698
Reid Spencercb292e42007-02-23 01:57:13 +00001699 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1700 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001701
David Greenef32fcb42010-01-05 01:28:52 +00001702 DEBUG(dbgs() << "KnuthDiv: quotient:");
1703 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1704 DEBUG(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001705
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001706 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1707 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1708 // compute the remainder (urem uses this).
1709 if (r) {
1710 // The value d is expressed by the "shift" value above since we avoided
1711 // multiplication by d by using a shift left. So, all we have to do is
Simon Pilgrim0099beb2017-03-09 13:57:04 +00001712 // shift right here.
Reid Spencer468ad9112007-02-24 20:38:01 +00001713 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001714 unsigned carry = 0;
David Greenef32fcb42010-01-05 01:28:52 +00001715 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001716 for (int i = n-1; i >= 0; i--) {
1717 r[i] = (u[i] >> shift) | carry;
1718 carry = u[i] << (32 - shift);
David Greenef32fcb42010-01-05 01:28:52 +00001719 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001720 }
1721 } else {
1722 for (int i = n-1; i >= 0; i--) {
1723 r[i] = u[i];
David Greenef32fcb42010-01-05 01:28:52 +00001724 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001725 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001726 }
David Greenef32fcb42010-01-05 01:28:52 +00001727 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001728 }
David Greenef32fcb42010-01-05 01:28:52 +00001729 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001730}
1731
Benjamin Kramerc321e532016-06-08 19:09:22 +00001732void APInt::divide(const APInt &LHS, unsigned lhsWords, const APInt &RHS,
1733 unsigned rhsWords, APInt *Quotient, APInt *Remainder) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001734 assert(lhsWords >= rhsWords && "Fractional result");
1735
Eric Christopher820256b2009-08-21 04:06:45 +00001736 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001737 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001738 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001739 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1740 // can't use 64-bit operands here because we don't have native results of
1741 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001742 // work on large-endian machines.
Dan Gohmancff69532009-04-01 18:45:54 +00001743 uint64_t mask = ~0ull >> (sizeof(unsigned)*CHAR_BIT);
Chris Lattner77527f52009-01-21 18:09:24 +00001744 unsigned n = rhsWords * 2;
1745 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001746
1747 // Allocate space for the temporary values we need either on the stack, if
1748 // it will fit, or on the heap if it won't.
Chris Lattner77527f52009-01-21 18:09:24 +00001749 unsigned SPACE[128];
Craig Topperc10719f2014-04-07 04:17:22 +00001750 unsigned *U = nullptr;
1751 unsigned *V = nullptr;
1752 unsigned *Q = nullptr;
1753 unsigned *R = nullptr;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001754 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1755 U = &SPACE[0];
1756 V = &SPACE[m+n+1];
1757 Q = &SPACE[(m+n+1) + n];
1758 if (Remainder)
1759 R = &SPACE[(m+n+1) + n + (m+n)];
1760 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001761 U = new unsigned[m + n + 1];
1762 V = new unsigned[n];
1763 Q = new unsigned[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001764 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001765 R = new unsigned[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001766 }
1767
1768 // Initialize the dividend
Chris Lattner77527f52009-01-21 18:09:24 +00001769 memset(U, 0, (m+n+1)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001770 for (unsigned i = 0; i < lhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001771 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001772 U[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001773 U[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001774 }
1775 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1776
Reid Spencer522ca7c2007-02-25 01:56:07 +00001777 // Initialize the divisor
Chris Lattner77527f52009-01-21 18:09:24 +00001778 memset(V, 0, (n)*sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001779 for (unsigned i = 0; i < rhsWords; ++i) {
Reid Spencer867b4062007-02-22 00:58:45 +00001780 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal[i]);
Chris Lattner77527f52009-01-21 18:09:24 +00001781 V[i * 2] = (unsigned)(tmp & mask);
Dan Gohmancff69532009-04-01 18:45:54 +00001782 V[i * 2 + 1] = (unsigned)(tmp >> (sizeof(unsigned)*CHAR_BIT));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001783 }
1784
Reid Spencer522ca7c2007-02-25 01:56:07 +00001785 // initialize the quotient and remainder
Chris Lattner77527f52009-01-21 18:09:24 +00001786 memset(Q, 0, (m+n) * sizeof(unsigned));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001787 if (Remainder)
Chris Lattner77527f52009-01-21 18:09:24 +00001788 memset(R, 0, n * sizeof(unsigned));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001789
Eric Christopher820256b2009-08-21 04:06:45 +00001790 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001791 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001792 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001793 // contain any zero words or the Knuth algorithm fails.
1794 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1795 n--;
1796 m++;
1797 }
1798 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1799 m--;
1800
1801 // If we're left with only a single word for the divisor, Knuth doesn't work
1802 // so we implement the short division algorithm here. This is much simpler
1803 // and faster because we are certain that we can divide a 64-bit quantity
1804 // by a 32-bit quantity at hardware speed and short division is simply a
1805 // series of such operations. This is just like doing short division but we
1806 // are using base 2^32 instead of base 10.
1807 assert(n != 0 && "Divide by zero?");
1808 if (n == 1) {
Chris Lattner77527f52009-01-21 18:09:24 +00001809 unsigned divisor = V[0];
1810 unsigned remainder = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001811 for (int i = m+n-1; i >= 0; i--) {
1812 uint64_t partial_dividend = uint64_t(remainder) << 32 | U[i];
1813 if (partial_dividend == 0) {
1814 Q[i] = 0;
1815 remainder = 0;
1816 } else if (partial_dividend < divisor) {
1817 Q[i] = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001818 remainder = (unsigned)partial_dividend;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001819 } else if (partial_dividend == divisor) {
1820 Q[i] = 1;
1821 remainder = 0;
1822 } else {
Chris Lattner77527f52009-01-21 18:09:24 +00001823 Q[i] = (unsigned)(partial_dividend / divisor);
1824 remainder = (unsigned)(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001825 }
1826 }
1827 if (R)
1828 R[0] = remainder;
1829 } else {
1830 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1831 // case n > 1.
1832 KnuthDiv(U, V, Q, R, m, n);
1833 }
1834
1835 // If the caller wants the quotient
1836 if (Quotient) {
1837 // Set up the Quotient value's memory.
1838 if (Quotient->BitWidth != LHS.BitWidth) {
1839 if (Quotient->isSingleWord())
1840 Quotient->VAL = 0;
1841 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001842 delete [] Quotient->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001843 Quotient->BitWidth = LHS.BitWidth;
1844 if (!Quotient->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001845 Quotient->pVal = getClearedMemory(Quotient->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001846 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001847 Quotient->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001848
Eric Christopher820256b2009-08-21 04:06:45 +00001849 // The quotient is in Q. Reconstitute the quotient into Quotient's low
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001850 // order words.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001851 // This case is currently dead as all users of divide() handle trivial cases
1852 // earlier.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001853 if (lhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001854 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001855 uint64_t(Q[0]) | (uint64_t(Q[1]) << (APINT_BITS_PER_WORD / 2));
1856 if (Quotient->isSingleWord())
1857 Quotient->VAL = tmp;
1858 else
1859 Quotient->pVal[0] = tmp;
1860 } else {
1861 assert(!Quotient->isSingleWord() && "Quotient APInt not large enough");
1862 for (unsigned i = 0; i < lhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001863 Quotient->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001864 uint64_t(Q[i*2]) | (uint64_t(Q[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1865 }
1866 }
1867
1868 // If the caller wants the remainder
1869 if (Remainder) {
1870 // Set up the Remainder value's memory.
1871 if (Remainder->BitWidth != RHS.BitWidth) {
1872 if (Remainder->isSingleWord())
1873 Remainder->VAL = 0;
1874 else
Reid Spencer7c16cd22007-02-26 23:38:21 +00001875 delete [] Remainder->pVal;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001876 Remainder->BitWidth = RHS.BitWidth;
1877 if (!Remainder->isSingleWord())
Reid Spencer58a6a432007-02-21 08:21:52 +00001878 Remainder->pVal = getClearedMemory(Remainder->getNumWords());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001879 } else
Jay Foad25a5e4c2010-12-01 08:53:58 +00001880 Remainder->clearAllBits();
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001881
1882 // The remainder is in R. Reconstitute the remainder into Remainder's low
1883 // order words.
1884 if (rhsWords == 1) {
Eric Christopher820256b2009-08-21 04:06:45 +00001885 uint64_t tmp =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001886 uint64_t(R[0]) | (uint64_t(R[1]) << (APINT_BITS_PER_WORD / 2));
1887 if (Remainder->isSingleWord())
1888 Remainder->VAL = tmp;
1889 else
1890 Remainder->pVal[0] = tmp;
1891 } else {
1892 assert(!Remainder->isSingleWord() && "Remainder APInt not large enough");
1893 for (unsigned i = 0; i < rhsWords; ++i)
Eric Christopher820256b2009-08-21 04:06:45 +00001894 Remainder->pVal[i] =
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001895 uint64_t(R[i*2]) | (uint64_t(R[i*2+1]) << (APINT_BITS_PER_WORD / 2));
1896 }
1897 }
1898
1899 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001900 if (U != &SPACE[0]) {
1901 delete [] U;
1902 delete [] V;
1903 delete [] Q;
1904 delete [] R;
1905 }
Reid Spencer100502d2007-02-17 03:16:00 +00001906}
1907
Reid Spencer1d072122007-02-16 22:36:51 +00001908APInt APInt::udiv(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001909 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001910
1911 // First, deal with the easy case
1912 if (isSingleWord()) {
1913 assert(RHS.VAL != 0 && "Divide by zero?");
1914 return APInt(BitWidth, VAL / RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001915 }
Reid Spencer39867762007-02-17 02:07:07 +00001916
Reid Spencer39867762007-02-17 02:07:07 +00001917 // Get some facts about the LHS and RHS number of bits and words
Chris Lattner77527f52009-01-21 18:09:24 +00001918 unsigned rhsBits = RHS.getActiveBits();
1919 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001920 assert(rhsWords && "Divided by zero???");
Chris Lattner77527f52009-01-21 18:09:24 +00001921 unsigned lhsBits = this->getActiveBits();
1922 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001923
1924 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001925 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001926 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001927 return APInt(BitWidth, 0);
Reid Spencer58a6a432007-02-21 08:21:52 +00001928 else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001929 // X / Y ===> 0, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001930 return APInt(BitWidth, 0);
1931 } else if (*this == RHS) {
1932 // X / X ===> 1
1933 return APInt(BitWidth, 1);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001934 } else if (lhsWords == 1 && rhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001935 // All high words are zero, just use native divide
Reid Spencer58a6a432007-02-21 08:21:52 +00001936 return APInt(BitWidth, this->pVal[0] / RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001937 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001938
1939 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1940 APInt Quotient(1,0); // to hold result.
Craig Topperc10719f2014-04-07 04:17:22 +00001941 divide(*this, lhsWords, RHS, rhsWords, &Quotient, nullptr);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001942 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001943}
1944
Jakub Staszak6605c602013-02-20 00:17:42 +00001945APInt APInt::sdiv(const APInt &RHS) const {
1946 if (isNegative()) {
1947 if (RHS.isNegative())
1948 return (-(*this)).udiv(-RHS);
1949 return -((-(*this)).udiv(RHS));
1950 }
1951 if (RHS.isNegative())
1952 return -(this->udiv(-RHS));
1953 return this->udiv(RHS);
1954}
1955
Reid Spencer1d072122007-02-16 22:36:51 +00001956APInt APInt::urem(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001957 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001958 if (isSingleWord()) {
1959 assert(RHS.VAL != 0 && "Remainder by zero?");
1960 return APInt(BitWidth, VAL % RHS.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001961 }
Reid Spencer39867762007-02-17 02:07:07 +00001962
Reid Spencer58a6a432007-02-21 08:21:52 +00001963 // Get some facts about the LHS
Chris Lattner77527f52009-01-21 18:09:24 +00001964 unsigned lhsBits = getActiveBits();
1965 unsigned lhsWords = !lhsBits ? 0 : (whichWord(lhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001966
1967 // Get some facts about the RHS
Chris Lattner77527f52009-01-21 18:09:24 +00001968 unsigned rhsBits = RHS.getActiveBits();
1969 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer39867762007-02-17 02:07:07 +00001970 assert(rhsWords && "Performing remainder operation by zero ???");
1971
Reid Spencer39867762007-02-17 02:07:07 +00001972 // Check the degenerate cases
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001973 if (lhsWords == 0) {
Reid Spencer58a6a432007-02-21 08:21:52 +00001974 // 0 % Y ===> 0
1975 return APInt(BitWidth, 0);
1976 } else if (lhsWords < rhsWords || this->ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001977 // X % Y ===> X, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001978 return *this;
1979 } else if (*this == RHS) {
Reid Spencer39867762007-02-17 02:07:07 +00001980 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001981 return APInt(BitWidth, 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001982 } else if (lhsWords == 1) {
Reid Spencer39867762007-02-17 02:07:07 +00001983 // All high words are zero, just use native remainder
Reid Spencer58a6a432007-02-21 08:21:52 +00001984 return APInt(BitWidth, pVal[0] % RHS.pVal[0]);
Reid Spencer39867762007-02-17 02:07:07 +00001985 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001986
Reid Spencer4c50b522007-05-13 23:44:59 +00001987 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001988 APInt Remainder(1,0);
Craig Topperc10719f2014-04-07 04:17:22 +00001989 divide(*this, lhsWords, RHS, rhsWords, nullptr, &Remainder);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001990 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001991}
Reid Spencer100502d2007-02-17 03:16:00 +00001992
Jakub Staszak6605c602013-02-20 00:17:42 +00001993APInt APInt::srem(const APInt &RHS) const {
1994 if (isNegative()) {
1995 if (RHS.isNegative())
1996 return -((-(*this)).urem(-RHS));
1997 return -((-(*this)).urem(RHS));
1998 }
1999 if (RHS.isNegative())
2000 return this->urem(-RHS);
2001 return this->urem(RHS);
2002}
2003
Eric Christopher820256b2009-08-21 04:06:45 +00002004void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00002005 APInt &Quotient, APInt &Remainder) {
David Majnemer7f039202014-12-14 09:41:56 +00002006 assert(LHS.BitWidth == RHS.BitWidth && "Bit widths must be the same");
2007
2008 // First, deal with the easy case
2009 if (LHS.isSingleWord()) {
2010 assert(RHS.VAL != 0 && "Divide by zero?");
2011 uint64_t QuotVal = LHS.VAL / RHS.VAL;
2012 uint64_t RemVal = LHS.VAL % RHS.VAL;
2013 Quotient = APInt(LHS.BitWidth, QuotVal);
2014 Remainder = APInt(LHS.BitWidth, RemVal);
2015 return;
2016 }
2017
Reid Spencer4c50b522007-05-13 23:44:59 +00002018 // Get some size facts about the dividend and divisor
Chris Lattner77527f52009-01-21 18:09:24 +00002019 unsigned lhsBits = LHS.getActiveBits();
2020 unsigned lhsWords = !lhsBits ? 0 : (APInt::whichWord(lhsBits - 1) + 1);
2021 unsigned rhsBits = RHS.getActiveBits();
2022 unsigned rhsWords = !rhsBits ? 0 : (APInt::whichWord(rhsBits - 1) + 1);
Reid Spencer4c50b522007-05-13 23:44:59 +00002023
2024 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00002025 if (lhsWords == 0) {
Reid Spencer4c50b522007-05-13 23:44:59 +00002026 Quotient = 0; // 0 / Y ===> 0
2027 Remainder = 0; // 0 % Y ===> 0
2028 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002029 }
2030
2031 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00002032 Remainder = LHS; // X % Y ===> X, iff X < Y
2033 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00002034 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002035 }
2036
Reid Spencer4c50b522007-05-13 23:44:59 +00002037 if (LHS == RHS) {
2038 Quotient = 1; // X / X ===> 1
2039 Remainder = 0; // X % X ===> 0;
2040 return;
Eric Christopher820256b2009-08-21 04:06:45 +00002041 }
2042
Reid Spencer4c50b522007-05-13 23:44:59 +00002043 if (lhsWords == 1 && rhsWords == 1) {
2044 // There is only one word to consider so use the native versions.
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00002045 uint64_t lhsValue = LHS.isSingleWord() ? LHS.VAL : LHS.pVal[0];
2046 uint64_t rhsValue = RHS.isSingleWord() ? RHS.VAL : RHS.pVal[0];
2047 Quotient = APInt(LHS.getBitWidth(), lhsValue / rhsValue);
2048 Remainder = APInt(LHS.getBitWidth(), lhsValue % rhsValue);
Reid Spencer4c50b522007-05-13 23:44:59 +00002049 return;
2050 }
2051
2052 // Okay, lets do it the long way
2053 divide(LHS, lhsWords, RHS, rhsWords, &Quotient, &Remainder);
2054}
2055
Jakub Staszak6605c602013-02-20 00:17:42 +00002056void APInt::sdivrem(const APInt &LHS, const APInt &RHS,
2057 APInt &Quotient, APInt &Remainder) {
2058 if (LHS.isNegative()) {
2059 if (RHS.isNegative())
2060 APInt::udivrem(-LHS, -RHS, Quotient, Remainder);
2061 else {
2062 APInt::udivrem(-LHS, RHS, Quotient, Remainder);
2063 Quotient = -Quotient;
2064 }
2065 Remainder = -Remainder;
2066 } else if (RHS.isNegative()) {
2067 APInt::udivrem(LHS, -RHS, Quotient, Remainder);
2068 Quotient = -Quotient;
2069 } else {
2070 APInt::udivrem(LHS, RHS, Quotient, Remainder);
2071 }
2072}
2073
Chris Lattner2c819b02010-10-13 23:54:10 +00002074APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002075 APInt Res = *this+RHS;
2076 Overflow = isNonNegative() == RHS.isNonNegative() &&
2077 Res.isNonNegative() != isNonNegative();
2078 return Res;
2079}
2080
Chris Lattner698661c2010-10-14 00:05:07 +00002081APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
2082 APInt Res = *this+RHS;
2083 Overflow = Res.ult(RHS);
2084 return Res;
2085}
2086
Chris Lattner2c819b02010-10-13 23:54:10 +00002087APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002088 APInt Res = *this - RHS;
2089 Overflow = isNonNegative() != RHS.isNonNegative() &&
2090 Res.isNonNegative() != isNonNegative();
2091 return Res;
2092}
2093
Chris Lattner698661c2010-10-14 00:05:07 +00002094APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00002095 APInt Res = *this-RHS;
2096 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00002097 return Res;
2098}
2099
Chris Lattner2c819b02010-10-13 23:54:10 +00002100APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002101 // MININT/-1 --> overflow.
2102 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
2103 return sdiv(RHS);
2104}
2105
Chris Lattner2c819b02010-10-13 23:54:10 +00002106APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00002107 APInt Res = *this * RHS;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002108
Chris Lattner79bdd882010-10-13 23:46:33 +00002109 if (*this != 0 && RHS != 0)
2110 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
2111 else
2112 Overflow = false;
2113 return Res;
2114}
2115
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00002116APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
2117 APInt Res = *this * RHS;
2118
2119 if (*this != 0 && RHS != 0)
2120 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
2121 else
2122 Overflow = false;
2123 return Res;
2124}
2125
David Majnemera2521382014-10-13 21:48:30 +00002126APInt APInt::sshl_ov(const APInt &ShAmt, bool &Overflow) const {
2127 Overflow = ShAmt.uge(getBitWidth());
Chris Lattner79bdd882010-10-13 23:46:33 +00002128 if (Overflow)
David Majnemera2521382014-10-13 21:48:30 +00002129 return APInt(BitWidth, 0);
Chris Lattner79bdd882010-10-13 23:46:33 +00002130
2131 if (isNonNegative()) // Don't allow sign change.
David Majnemera2521382014-10-13 21:48:30 +00002132 Overflow = ShAmt.uge(countLeadingZeros());
Chris Lattner79bdd882010-10-13 23:46:33 +00002133 else
David Majnemera2521382014-10-13 21:48:30 +00002134 Overflow = ShAmt.uge(countLeadingOnes());
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002135
Chris Lattner79bdd882010-10-13 23:46:33 +00002136 return *this << ShAmt;
2137}
2138
David Majnemera2521382014-10-13 21:48:30 +00002139APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const {
2140 Overflow = ShAmt.uge(getBitWidth());
2141 if (Overflow)
2142 return APInt(BitWidth, 0);
2143
2144 Overflow = ShAmt.ugt(countLeadingZeros());
2145
2146 return *this << ShAmt;
2147}
2148
Chris Lattner79bdd882010-10-13 23:46:33 +00002149
2150
2151
Benjamin Kramer92d89982010-07-14 22:38:02 +00002152void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00002153 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002154 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002155 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002156 radix == 36) &&
2157 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002158
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002159 StringRef::iterator p = str.begin();
2160 size_t slen = str.size();
2161 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00002162 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002163 p++;
2164 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00002165 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002166 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00002167 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002168 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
2169 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002170 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2171 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00002172
2173 // Allocate memory
2174 if (!isSingleWord())
2175 pVal = getClearedMemory(getNumWords());
2176
2177 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00002178 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00002179
2180 // Set up an APInt for the digit to add outside the loop so we don't
2181 // constantly construct/destruct it.
2182 APInt apdigit(getBitWidth(), 0);
2183 APInt apradix(getBitWidth(), radix);
2184
2185 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00002186 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00002187 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00002188 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00002189
Reid Spencera93c9812007-05-16 19:18:22 +00002190 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002191 if (slen > 1) {
2192 if (shift)
2193 *this <<= shift;
2194 else
2195 *this *= apradix;
2196 }
Reid Spencer1ba83352007-02-21 03:55:44 +00002197
2198 // Add in the digit we just interpreted
Reid Spencer632ebdf2007-02-24 20:19:37 +00002199 if (apdigit.isSingleWord())
2200 apdigit.VAL = digit;
2201 else
2202 apdigit.pVal[0] = digit;
Reid Spencer1ba83352007-02-21 03:55:44 +00002203 *this += apdigit;
Reid Spencer100502d2007-02-17 03:16:00 +00002204 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002205 // If its negative, put it in two's complement form
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00002206 if (isNeg) {
Jakub Staszak773be0c2013-03-20 23:56:19 +00002207 --(*this);
Jay Foad25a5e4c2010-12-01 08:53:58 +00002208 this->flipAllBits();
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002209 }
Reid Spencer100502d2007-02-17 03:16:00 +00002210}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002211
Chris Lattner17f71652008-08-17 07:19:36 +00002212void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002213 bool Signed, bool formatAsCLiteral) const {
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002214 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002215 Radix == 36) &&
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002216 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopher820256b2009-08-21 04:06:45 +00002217
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002218 const char *Prefix = "";
2219 if (formatAsCLiteral) {
2220 switch (Radix) {
2221 case 2:
2222 // Binary literals are a non-standard extension added in gcc 4.3:
2223 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2224 Prefix = "0b";
2225 break;
2226 case 8:
2227 Prefix = "0";
2228 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002229 case 10:
2230 break; // No prefix
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002231 case 16:
2232 Prefix = "0x";
2233 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002234 default:
2235 llvm_unreachable("Invalid radix!");
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002236 }
2237 }
2238
Chris Lattner17f71652008-08-17 07:19:36 +00002239 // First, check for a zero value and just short circuit the logic below.
2240 if (*this == 0) {
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002241 while (*Prefix) {
2242 Str.push_back(*Prefix);
2243 ++Prefix;
2244 };
Chris Lattner17f71652008-08-17 07:19:36 +00002245 Str.push_back('0');
2246 return;
2247 }
Eric Christopher820256b2009-08-21 04:06:45 +00002248
Douglas Gregor663c0682011-09-14 15:54:46 +00002249 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopher820256b2009-08-21 04:06:45 +00002250
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002251 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002252 char Buffer[65];
2253 char *BufPtr = Buffer+65;
Eric Christopher820256b2009-08-21 04:06:45 +00002254
Chris Lattner17f71652008-08-17 07:19:36 +00002255 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002256 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002257 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002258 } else {
2259 int64_t I = getSExtValue();
2260 if (I >= 0) {
2261 N = I;
2262 } else {
2263 Str.push_back('-');
2264 N = -(uint64_t)I;
2265 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002266 }
Eric Christopher820256b2009-08-21 04:06:45 +00002267
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002268 while (*Prefix) {
2269 Str.push_back(*Prefix);
2270 ++Prefix;
2271 };
2272
Chris Lattner17f71652008-08-17 07:19:36 +00002273 while (N) {
2274 *--BufPtr = Digits[N % Radix];
2275 N /= Radix;
2276 }
2277 Str.append(BufPtr, Buffer+65);
2278 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002279 }
2280
Chris Lattner17f71652008-08-17 07:19:36 +00002281 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002282
Chris Lattner17f71652008-08-17 07:19:36 +00002283 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002284 // They want to print the signed version and it is a negative value
2285 // Flip the bits and add one to turn it into the equivalent positive
2286 // value and put a '-' in the result.
Jay Foad25a5e4c2010-12-01 08:53:58 +00002287 Tmp.flipAllBits();
Jakub Staszak773be0c2013-03-20 23:56:19 +00002288 ++Tmp;
Chris Lattner17f71652008-08-17 07:19:36 +00002289 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002290 }
Eric Christopher820256b2009-08-21 04:06:45 +00002291
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002292 while (*Prefix) {
2293 Str.push_back(*Prefix);
2294 ++Prefix;
2295 };
2296
Chris Lattner17f71652008-08-17 07:19:36 +00002297 // We insert the digits backward, then reverse them to get the right order.
2298 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002299
2300 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2301 // because the number of bits per digit (1, 3 and 4 respectively) divides
Chris Lattner17f71652008-08-17 07:19:36 +00002302 // equaly. We just shift until the value is zero.
Douglas Gregor663c0682011-09-14 15:54:46 +00002303 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattner17f71652008-08-17 07:19:36 +00002304 // Just shift tmp right for each digit width until it becomes zero
2305 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2306 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002307
Chris Lattner17f71652008-08-17 07:19:36 +00002308 while (Tmp != 0) {
2309 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2310 Str.push_back(Digits[Digit]);
2311 Tmp = Tmp.lshr(ShiftAmt);
2312 }
2313 } else {
Douglas Gregor663c0682011-09-14 15:54:46 +00002314 APInt divisor(Radix == 10? 4 : 8, Radix);
Chris Lattner17f71652008-08-17 07:19:36 +00002315 while (Tmp != 0) {
2316 APInt APdigit(1, 0);
2317 APInt tmp2(Tmp.getBitWidth(), 0);
Eric Christopher820256b2009-08-21 04:06:45 +00002318 divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
Chris Lattner17f71652008-08-17 07:19:36 +00002319 &APdigit);
Chris Lattner77527f52009-01-21 18:09:24 +00002320 unsigned Digit = (unsigned)APdigit.getZExtValue();
Chris Lattner17f71652008-08-17 07:19:36 +00002321 assert(Digit < Radix && "divide failed");
2322 Str.push_back(Digits[Digit]);
2323 Tmp = tmp2;
2324 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002325 }
Eric Christopher820256b2009-08-21 04:06:45 +00002326
Chris Lattner17f71652008-08-17 07:19:36 +00002327 // Reverse the digits before returning.
2328 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002329}
2330
Pawel Bylica6eeeac72015-04-06 13:31:39 +00002331/// Returns the APInt as a std::string. Note that this is an inefficient method.
2332/// It is better to pass in a SmallVector/SmallString to the methods above.
Chris Lattner17f71652008-08-17 07:19:36 +00002333std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2334 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002335 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002336 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002337}
Chris Lattner6b695682007-08-16 15:56:55 +00002338
Matthias Braun8c209aa2017-01-28 02:02:38 +00002339#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +00002340LLVM_DUMP_METHOD void APInt::dump() const {
Chris Lattner17f71652008-08-17 07:19:36 +00002341 SmallString<40> S, U;
2342 this->toStringUnsigned(U);
2343 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002344 dbgs() << "APInt(" << BitWidth << "b, "
Davide Italiano5a473d22017-01-31 21:26:18 +00002345 << U << "u " << S << "s)\n";
Chris Lattner17f71652008-08-17 07:19:36 +00002346}
Matthias Braun8c209aa2017-01-28 02:02:38 +00002347#endif
Chris Lattner17f71652008-08-17 07:19:36 +00002348
Chris Lattner0c19df42008-08-23 22:23:09 +00002349void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002350 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002351 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Yaron Keren92e1b622015-03-18 10:17:07 +00002352 OS << S;
Chris Lattner17f71652008-08-17 07:19:36 +00002353}
2354
Chris Lattner6b695682007-08-16 15:56:55 +00002355// This implements a variety of operations on a representation of
2356// arbitrary precision, two's-complement, bignum integer values.
2357
Chris Lattner96cffa62009-08-23 23:11:28 +00002358// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2359// and unrestricting assumption.
Benjamin Kramer7000ca32014-10-12 17:56:40 +00002360static_assert(integerPartWidth % 2 == 0, "Part width must be divisible by 2!");
Chris Lattner6b695682007-08-16 15:56:55 +00002361
2362/* Some handy functions local to this file. */
Chris Lattner6b695682007-08-16 15:56:55 +00002363
Craig Topper76f42462017-03-28 05:32:53 +00002364/* Returns the integer part with the least significant BITS set.
2365 BITS cannot be zero. */
Craig Topper6a8518082017-03-28 05:32:55 +00002366static inline integerPart lowBitMask(unsigned bits) {
Craig Topper76f42462017-03-28 05:32:53 +00002367 assert(bits != 0 && bits <= integerPartWidth);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002368
Craig Topper76f42462017-03-28 05:32:53 +00002369 return ~(integerPart) 0 >> (integerPartWidth - bits);
2370}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002371
Craig Topper76f42462017-03-28 05:32:53 +00002372/* Returns the value of the lower half of PART. */
Craig Topper6a8518082017-03-28 05:32:55 +00002373static inline integerPart lowHalf(integerPart part) {
Craig Topper76f42462017-03-28 05:32:53 +00002374 return part & lowBitMask(integerPartWidth / 2);
2375}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002376
Craig Topper76f42462017-03-28 05:32:53 +00002377/* Returns the value of the upper half of PART. */
Craig Topper6a8518082017-03-28 05:32:55 +00002378static inline integerPart highHalf(integerPart part) {
Craig Topper76f42462017-03-28 05:32:53 +00002379 return part >> (integerPartWidth / 2);
2380}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002381
Craig Topper76f42462017-03-28 05:32:53 +00002382/* Returns the bit number of the most significant set bit of a part.
2383 If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002384static unsigned partMSB(integerPart value) {
Craig Topper76f42462017-03-28 05:32:53 +00002385 return findLastSet(value, ZB_Max);
2386}
Chris Lattner6b695682007-08-16 15:56:55 +00002387
Craig Topper76f42462017-03-28 05:32:53 +00002388/* Returns the bit number of the least significant set bit of a
2389 part. If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002390static unsigned partLSB(integerPart value) {
Craig Topper76f42462017-03-28 05:32:53 +00002391 return findFirstSet(value, ZB_Max);
Alexander Kornienkof00654e2015-06-23 09:49:53 +00002392}
Chris Lattner6b695682007-08-16 15:56:55 +00002393
2394/* Sets the least significant part of a bignum to the input value, and
2395 zeroes out higher parts. */
Craig Topper6a8518082017-03-28 05:32:55 +00002396void APInt::tcSet(integerPart *dst, integerPart part, unsigned parts) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002397 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002398
Chris Lattner6b695682007-08-16 15:56:55 +00002399 dst[0] = part;
Craig Topperb0038162017-03-28 05:32:52 +00002400 for (unsigned i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002401 dst[i] = 0;
2402}
2403
2404/* Assign one bignum to another. */
Craig Topper6a8518082017-03-28 05:32:55 +00002405void APInt::tcAssign(integerPart *dst, const integerPart *src, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002406 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002407 dst[i] = src[i];
2408}
2409
2410/* Returns true if a bignum is zero, false otherwise. */
Craig Topper6a8518082017-03-28 05:32:55 +00002411bool APInt::tcIsZero(const integerPart *src, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002412 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002413 if (src[i])
2414 return false;
2415
2416 return true;
2417}
2418
2419/* Extract the given bit of a bignum; returns 0 or 1. */
Craig Topper6a8518082017-03-28 05:32:55 +00002420int APInt::tcExtractBit(const integerPart *parts, unsigned bit) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002421 return (parts[bit / integerPartWidth] &
2422 ((integerPart) 1 << bit % integerPartWidth)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002423}
2424
John McCalldcb9a7a2010-02-28 02:51:25 +00002425/* Set the given bit of a bignum. */
Craig Topper6a8518082017-03-28 05:32:55 +00002426void APInt::tcSetBit(integerPart *parts, unsigned bit) {
Chris Lattner6b695682007-08-16 15:56:55 +00002427 parts[bit / integerPartWidth] |= (integerPart) 1 << (bit % integerPartWidth);
2428}
2429
John McCalldcb9a7a2010-02-28 02:51:25 +00002430/* Clears the given bit of a bignum. */
Craig Topper6a8518082017-03-28 05:32:55 +00002431void APInt::tcClearBit(integerPart *parts, unsigned bit) {
John McCalldcb9a7a2010-02-28 02:51:25 +00002432 parts[bit / integerPartWidth] &=
2433 ~((integerPart) 1 << (bit % integerPartWidth));
2434}
2435
Neil Boothc8b650a2007-10-06 00:43:45 +00002436/* Returns the bit number of the least significant set bit of a
2437 number. If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002438unsigned APInt::tcLSB(const integerPart *parts, unsigned n) {
Craig Topperb0038162017-03-28 05:32:52 +00002439 for (unsigned i = 0; i < n; i++) {
2440 if (parts[i] != 0) {
2441 unsigned lsb = partLSB(parts[i]);
Chris Lattner6b695682007-08-16 15:56:55 +00002442
Craig Topperb0038162017-03-28 05:32:52 +00002443 return lsb + i * integerPartWidth;
2444 }
Chris Lattner6b695682007-08-16 15:56:55 +00002445 }
2446
2447 return -1U;
2448}
2449
Neil Boothc8b650a2007-10-06 00:43:45 +00002450/* Returns the bit number of the most significant set bit of a number.
2451 If the input number has no bits set -1U is returned. */
Craig Topper6a8518082017-03-28 05:32:55 +00002452unsigned APInt::tcMSB(const integerPart *parts, unsigned n) {
Chris Lattner6b695682007-08-16 15:56:55 +00002453 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002454 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002455
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002456 if (parts[n] != 0) {
Craig Topperb0038162017-03-28 05:32:52 +00002457 unsigned msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002458
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002459 return msb + n * integerPartWidth;
2460 }
Chris Lattner6b695682007-08-16 15:56:55 +00002461 } while (n);
2462
2463 return -1U;
2464}
2465
Neil Boothb6182162007-10-08 13:47:12 +00002466/* Copy the bit vector of width srcBITS from SRC, starting at bit
2467 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2468 the least significant bit of DST. All high bits above srcBITS in
2469 DST are zero-filled. */
2470void
Craig Topper6a8518082017-03-28 05:32:55 +00002471APInt::tcExtract(integerPart *dst, unsigned dstCount, const integerPart *src,
2472 unsigned srcBits, unsigned srcLSB) {
Craig Topperb0038162017-03-28 05:32:52 +00002473 unsigned dstParts = (srcBits + integerPartWidth - 1) / integerPartWidth;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002474 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002475
Craig Topperb0038162017-03-28 05:32:52 +00002476 unsigned firstSrcPart = srcLSB / integerPartWidth;
Neil Boothb6182162007-10-08 13:47:12 +00002477 tcAssign (dst, src + firstSrcPart, dstParts);
2478
Craig Topperb0038162017-03-28 05:32:52 +00002479 unsigned shift = srcLSB % integerPartWidth;
Neil Boothb6182162007-10-08 13:47:12 +00002480 tcShiftRight (dst, dstParts, shift);
2481
2482 /* We now have (dstParts * integerPartWidth - shift) bits from SRC
2483 in DST. If this is less that srcBits, append the rest, else
2484 clear the high bits. */
Craig Topperb0038162017-03-28 05:32:52 +00002485 unsigned n = dstParts * integerPartWidth - shift;
Neil Boothb6182162007-10-08 13:47:12 +00002486 if (n < srcBits) {
2487 integerPart mask = lowBitMask (srcBits - n);
2488 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2489 << n % integerPartWidth);
2490 } else if (n > srcBits) {
Neil Booth7e74b172007-10-12 15:31:31 +00002491 if (srcBits % integerPartWidth)
2492 dst[dstParts - 1] &= lowBitMask (srcBits % integerPartWidth);
Neil Boothb6182162007-10-08 13:47:12 +00002493 }
2494
2495 /* Clear high parts. */
2496 while (dstParts < dstCount)
2497 dst[dstParts++] = 0;
2498}
2499
Chris Lattner6b695682007-08-16 15:56:55 +00002500/* DST += RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002501integerPart APInt::tcAdd(integerPart *dst, const integerPart *rhs,
2502 integerPart c, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002503 assert(c <= 1);
2504
Craig Topperb0038162017-03-28 05:32:52 +00002505 for (unsigned i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002506 integerPart l;
2507
2508 l = dst[i];
2509 if (c) {
2510 dst[i] += rhs[i] + 1;
2511 c = (dst[i] <= l);
2512 } else {
2513 dst[i] += rhs[i];
2514 c = (dst[i] < l);
2515 }
2516 }
2517
2518 return c;
2519}
2520
2521/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002522integerPart APInt::tcSubtract(integerPart *dst, const integerPart *rhs,
2523 integerPart c, unsigned parts)
Chris Lattner6b695682007-08-16 15:56:55 +00002524{
Chris Lattner6b695682007-08-16 15:56:55 +00002525 assert(c <= 1);
2526
Craig Topperb0038162017-03-28 05:32:52 +00002527 for (unsigned i = 0; i < parts; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002528 integerPart l;
2529
2530 l = dst[i];
2531 if (c) {
2532 dst[i] -= rhs[i] + 1;
2533 c = (dst[i] >= l);
2534 } else {
2535 dst[i] -= rhs[i];
2536 c = (dst[i] > l);
2537 }
2538 }
2539
2540 return c;
2541}
2542
2543/* Negate a bignum in-place. */
Craig Topper6a8518082017-03-28 05:32:55 +00002544void APInt::tcNegate(integerPart *dst, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002545 tcComplement(dst, parts);
2546 tcIncrement(dst, parts);
2547}
2548
Neil Boothc8b650a2007-10-06 00:43:45 +00002549/* DST += SRC * MULTIPLIER + CARRY if add is true
2550 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002551
2552 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2553 they must start at the same point, i.e. DST == SRC.
2554
2555 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2556 returned. Otherwise DST is filled with the least significant
2557 DSTPARTS parts of the result, and if all of the omitted higher
2558 parts were zero return zero, otherwise overflow occurred and
2559 return one. */
Craig Topper6a8518082017-03-28 05:32:55 +00002560int APInt::tcMultiplyPart(integerPart *dst, const integerPart *src,
2561 integerPart multiplier, integerPart carry,
2562 unsigned srcParts, unsigned dstParts,
2563 bool add) {
Chris Lattner6b695682007-08-16 15:56:55 +00002564 /* Otherwise our writes of DST kill our later reads of SRC. */
2565 assert(dst <= src || dst >= src + srcParts);
2566 assert(dstParts <= srcParts + 1);
2567
2568 /* N loops; minimum of dstParts and srcParts. */
Craig Topperb0038162017-03-28 05:32:52 +00002569 unsigned n = dstParts < srcParts ? dstParts: srcParts;
Chris Lattner6b695682007-08-16 15:56:55 +00002570
Craig Topperb0038162017-03-28 05:32:52 +00002571 unsigned i;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002572 for (i = 0; i < n; i++) {
Chris Lattner6b695682007-08-16 15:56:55 +00002573 integerPart low, mid, high, srcPart;
2574
2575 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2576
2577 This cannot overflow, because
2578
2579 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2580
2581 which is less than n^2. */
2582
2583 srcPart = src[i];
2584
Craig Topper6a8518082017-03-28 05:32:55 +00002585 if (multiplier == 0 || srcPart == 0) {
Chris Lattner6b695682007-08-16 15:56:55 +00002586 low = carry;
2587 high = 0;
2588 } else {
2589 low = lowHalf(srcPart) * lowHalf(multiplier);
2590 high = highHalf(srcPart) * highHalf(multiplier);
2591
2592 mid = lowHalf(srcPart) * highHalf(multiplier);
2593 high += highHalf(mid);
2594 mid <<= integerPartWidth / 2;
2595 if (low + mid < low)
2596 high++;
2597 low += mid;
2598
2599 mid = highHalf(srcPart) * lowHalf(multiplier);
2600 high += highHalf(mid);
2601 mid <<= integerPartWidth / 2;
2602 if (low + mid < low)
2603 high++;
2604 low += mid;
2605
2606 /* Now add carry. */
2607 if (low + carry < low)
2608 high++;
2609 low += carry;
2610 }
2611
2612 if (add) {
2613 /* And now DST[i], and store the new low part there. */
2614 if (low + dst[i] < low)
2615 high++;
2616 dst[i] += low;
2617 } else
2618 dst[i] = low;
2619
2620 carry = high;
2621 }
2622
2623 if (i < dstParts) {
2624 /* Full multiplication, there is no overflow. */
2625 assert(i + 1 == dstParts);
2626 dst[i] = carry;
2627 return 0;
2628 } else {
2629 /* We overflowed if there is carry. */
2630 if (carry)
2631 return 1;
2632
2633 /* We would overflow if any significant unwritten parts would be
2634 non-zero. This is true if any remaining src parts are non-zero
2635 and the multiplier is non-zero. */
2636 if (multiplier)
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002637 for (; i < srcParts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002638 if (src[i])
2639 return 1;
2640
2641 /* We fitted in the narrow destination. */
2642 return 0;
2643 }
2644}
2645
2646/* DST = LHS * RHS, where DST has the same width as the operands and
2647 is filled with the least significant parts of the result. Returns
2648 one if overflow occurred, otherwise zero. DST must be disjoint
2649 from both operands. */
Craig Topper6a8518082017-03-28 05:32:55 +00002650int APInt::tcMultiply(integerPart *dst, const integerPart *lhs,
2651 const integerPart *rhs, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002652 assert(dst != lhs && dst != rhs);
2653
Craig Topperb0038162017-03-28 05:32:52 +00002654 int overflow = 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002655 tcSet(dst, 0, parts);
2656
Craig Topperb0038162017-03-28 05:32:52 +00002657 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002658 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2659 parts - i, true);
2660
2661 return overflow;
2662}
2663
Neil Booth0ea72a92007-10-06 00:24:48 +00002664/* DST = LHS * RHS, where DST has width the sum of the widths of the
2665 operands. No overflow occurs. DST must be disjoint from both
2666 operands. Returns the number of parts required to hold the
2667 result. */
Craig Topper6a8518082017-03-28 05:32:55 +00002668unsigned APInt::tcFullMultiply(integerPart *dst, const integerPart *lhs,
2669 const integerPart *rhs, unsigned lhsParts,
2670 unsigned rhsParts) {
Neil Booth0ea72a92007-10-06 00:24:48 +00002671 /* Put the narrower number on the LHS for less loops below. */
2672 if (lhsParts > rhsParts) {
2673 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
2674 } else {
Neil Booth0ea72a92007-10-06 00:24:48 +00002675 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002676
Neil Booth0ea72a92007-10-06 00:24:48 +00002677 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002678
Craig Topperb0038162017-03-28 05:32:52 +00002679 for (unsigned i = 0; i < lhsParts; i++)
2680 tcMultiplyPart(&dst[i], rhs, lhs[i], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002681
Craig Topperb0038162017-03-28 05:32:52 +00002682 unsigned n = lhsParts + rhsParts;
Neil Booth0ea72a92007-10-06 00:24:48 +00002683
2684 return n - (dst[n - 1] == 0);
2685 }
Chris Lattner6b695682007-08-16 15:56:55 +00002686}
2687
2688/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2689 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2690 set REMAINDER to the remainder, return zero. i.e.
2691
2692 OLD_LHS = RHS * LHS + REMAINDER
2693
2694 SCRATCH is a bignum of the same size as the operands and result for
2695 use by the routine; its contents need not be initialized and are
2696 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2697*/
Craig Topper6a8518082017-03-28 05:32:55 +00002698int APInt::tcDivide(integerPart *lhs, const integerPart *rhs,
2699 integerPart *remainder, integerPart *srhs,
2700 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002701 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2702
Craig Topperb0038162017-03-28 05:32:52 +00002703 unsigned shiftCount = tcMSB(rhs, parts) + 1;
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002704 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002705 return true;
2706
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002707 shiftCount = parts * integerPartWidth - shiftCount;
Craig Topperb0038162017-03-28 05:32:52 +00002708 unsigned n = shiftCount / integerPartWidth;
2709 integerPart mask = (integerPart) 1 << (shiftCount % integerPartWidth);
Chris Lattner6b695682007-08-16 15:56:55 +00002710
2711 tcAssign(srhs, rhs, parts);
2712 tcShiftLeft(srhs, parts, shiftCount);
2713 tcAssign(remainder, lhs, parts);
2714 tcSet(lhs, 0, parts);
2715
2716 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2717 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002718 for (;;) {
Chris Lattner6b695682007-08-16 15:56:55 +00002719 int compare;
2720
2721 compare = tcCompare(remainder, srhs, parts);
2722 if (compare >= 0) {
2723 tcSubtract(remainder, srhs, 0, parts);
2724 lhs[n] |= mask;
2725 }
2726
2727 if (shiftCount == 0)
2728 break;
2729 shiftCount--;
2730 tcShiftRight(srhs, parts, 1);
Richard Trieu7a083812016-02-18 22:09:30 +00002731 if ((mask >>= 1) == 0) {
2732 mask = (integerPart) 1 << (integerPartWidth - 1);
2733 n--;
2734 }
Chris Lattner6b695682007-08-16 15:56:55 +00002735 }
2736
2737 return false;
2738}
2739
2740/* Shift a bignum left COUNT bits in-place. Shifted in bits are zero.
2741 There are no restrictions on COUNT. */
Craig Topper6a8518082017-03-28 05:32:55 +00002742void APInt::tcShiftLeft(integerPart *dst, unsigned parts, unsigned count) {
Neil Boothb6182162007-10-08 13:47:12 +00002743 if (count) {
Neil Boothb6182162007-10-08 13:47:12 +00002744 /* Jump is the inter-part jump; shift is is intra-part shift. */
Craig Topperb0038162017-03-28 05:32:52 +00002745 unsigned jump = count / integerPartWidth;
2746 unsigned shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002747
Neil Boothb6182162007-10-08 13:47:12 +00002748 while (parts > jump) {
2749 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002750
Neil Boothb6182162007-10-08 13:47:12 +00002751 parts--;
Chris Lattner6b695682007-08-16 15:56:55 +00002752
Neil Boothb6182162007-10-08 13:47:12 +00002753 /* dst[i] comes from the two parts src[i - jump] and, if we have
2754 an intra-part shift, src[i - jump - 1]. */
2755 part = dst[parts - jump];
2756 if (shift) {
2757 part <<= shift;
Chris Lattner6b695682007-08-16 15:56:55 +00002758 if (parts >= jump + 1)
2759 part |= dst[parts - jump - 1] >> (integerPartWidth - shift);
2760 }
2761
Neil Boothb6182162007-10-08 13:47:12 +00002762 dst[parts] = part;
2763 }
Chris Lattner6b695682007-08-16 15:56:55 +00002764
Neil Boothb6182162007-10-08 13:47:12 +00002765 while (parts > 0)
2766 dst[--parts] = 0;
2767 }
Chris Lattner6b695682007-08-16 15:56:55 +00002768}
2769
2770/* Shift a bignum right COUNT bits in-place. Shifted in bits are
2771 zero. There are no restrictions on COUNT. */
Craig Topper6a8518082017-03-28 05:32:55 +00002772void APInt::tcShiftRight(integerPart *dst, unsigned parts, unsigned count) {
Neil Boothb6182162007-10-08 13:47:12 +00002773 if (count) {
Neil Boothb6182162007-10-08 13:47:12 +00002774 /* Jump is the inter-part jump; shift is is intra-part shift. */
Craig Topperb0038162017-03-28 05:32:52 +00002775 unsigned jump = count / integerPartWidth;
2776 unsigned shift = count % integerPartWidth;
Chris Lattner6b695682007-08-16 15:56:55 +00002777
Neil Boothb6182162007-10-08 13:47:12 +00002778 /* Perform the shift. This leaves the most significant COUNT bits
2779 of the result at zero. */
Craig Topperb0038162017-03-28 05:32:52 +00002780 for (unsigned i = 0; i < parts; i++) {
Neil Boothb6182162007-10-08 13:47:12 +00002781 integerPart part;
Chris Lattner6b695682007-08-16 15:56:55 +00002782
Neil Boothb6182162007-10-08 13:47:12 +00002783 if (i + jump >= parts) {
2784 part = 0;
2785 } else {
2786 part = dst[i + jump];
2787 if (shift) {
2788 part >>= shift;
2789 if (i + jump + 1 < parts)
2790 part |= dst[i + jump + 1] << (integerPartWidth - shift);
2791 }
Chris Lattner6b695682007-08-16 15:56:55 +00002792 }
Chris Lattner6b695682007-08-16 15:56:55 +00002793
Neil Boothb6182162007-10-08 13:47:12 +00002794 dst[i] = part;
2795 }
Chris Lattner6b695682007-08-16 15:56:55 +00002796 }
2797}
2798
2799/* Bitwise and of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002800void APInt::tcAnd(integerPart *dst, const integerPart *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002801 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002802 dst[i] &= rhs[i];
2803}
2804
2805/* Bitwise inclusive or of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002806void APInt::tcOr(integerPart *dst, const integerPart *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002807 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002808 dst[i] |= rhs[i];
2809}
2810
2811/* Bitwise exclusive or of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002812void APInt::tcXor(integerPart *dst, const integerPart *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002813 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002814 dst[i] ^= rhs[i];
2815}
2816
2817/* Complement a bignum in-place. */
Craig Topper6a8518082017-03-28 05:32:55 +00002818void APInt::tcComplement(integerPart *dst, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002819 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002820 dst[i] = ~dst[i];
2821}
2822
2823/* Comparison (unsigned) of two bignums. */
Craig Topper6a8518082017-03-28 05:32:55 +00002824int APInt::tcCompare(const integerPart *lhs, const integerPart *rhs,
2825 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002826 while (parts) {
2827 parts--;
2828 if (lhs[parts] == rhs[parts])
2829 continue;
2830
2831 if (lhs[parts] > rhs[parts])
2832 return 1;
2833 else
2834 return -1;
2835 }
2836
2837 return 0;
2838}
2839
2840/* Increment a bignum in-place, return the carry flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002841integerPart APInt::tcIncrement(integerPart *dst, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002842 unsigned i;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002843 for (i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002844 if (++dst[i] != 0)
2845 break;
2846
2847 return i == parts;
2848}
2849
Michael Gottesman9d406f42013-05-28 19:50:20 +00002850/* Decrement a bignum in-place, return the borrow flag. */
Craig Topper6a8518082017-03-28 05:32:55 +00002851integerPart APInt::tcDecrement(integerPart *dst, unsigned parts) {
Craig Topper592b1342017-03-28 05:32:48 +00002852 for (unsigned i = 0; i < parts; i++) {
Michael Gottesman9d406f42013-05-28 19:50:20 +00002853 // If the current word is non-zero, then the decrement has no effect on the
2854 // higher-order words of the integer and no borrow can occur. Exit early.
2855 if (dst[i]--)
2856 return 0;
2857 }
2858 // If every word was zero, then there is a borrow.
2859 return 1;
2860}
2861
2862
Chris Lattner6b695682007-08-16 15:56:55 +00002863/* Set the least significant BITS bits of a bignum, clear the
2864 rest. */
Craig Topper6a8518082017-03-28 05:32:55 +00002865void APInt::tcSetLeastSignificantBits(integerPart *dst, unsigned parts,
2866 unsigned bits) {
Craig Topperb0038162017-03-28 05:32:52 +00002867 unsigned i = 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002868 while (bits > integerPartWidth) {
2869 dst[i++] = ~(integerPart) 0;
2870 bits -= integerPartWidth;
2871 }
2872
2873 if (bits)
2874 dst[i++] = ~(integerPart) 0 >> (integerPartWidth - bits);
2875
2876 while (i < parts)
2877 dst[i++] = 0;
2878}