blob: cc3cedd460cf2346c53790c2add7ac9641a1cb71 [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) {
Fangrui Songc244a152018-03-23 17:26:12 +000036 uint64_t *result = new uint64_t[numWords];
Reid Spencera856b6e2007-02-18 18:38:44 +000037 memset(result, 0, numWords * sizeof(uint64_t));
38 return result;
Zhou Sheng94b623a2007-02-06 06:04:53 +000039}
40
Eric Christopher820256b2009-08-21 04:06:45 +000041/// A utility function for allocating memory and checking for allocation
Reid Spencera41e93b2007-02-25 19:32:03 +000042/// failure. The content is not zeroed.
Chris Lattner77527f52009-01-21 18:09:24 +000043inline static uint64_t* getMemory(unsigned numWords) {
Fangrui Songc244a152018-03-23 17:26:12 +000044 return new uint64_t[numWords];
Reid Spencera856b6e2007-02-18 18:38:44 +000045}
46
Erick Tryzelaardadb15712009-08-21 03:15:28 +000047/// A utility function that converts a character to a digit.
48inline static unsigned getDigit(char cdigit, uint8_t radix) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000049 unsigned r;
50
Douglas Gregor663c0682011-09-14 15:54:46 +000051 if (radix == 16 || radix == 36) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000052 r = cdigit - '0';
53 if (r <= 9)
54 return r;
55
56 r = cdigit - 'A';
Douglas Gregorc98ac852011-09-20 18:33:29 +000057 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000058 return r + 10;
59
60 r = cdigit - 'a';
Douglas Gregorc98ac852011-09-20 18:33:29 +000061 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000062 return r + 10;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +000063
Douglas Gregore4e20f42011-09-20 18:11:52 +000064 radix = 10;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000065 }
66
Erick Tryzelaar60964092009-08-21 06:48:37 +000067 r = cdigit - '0';
68 if (r < radix)
69 return r;
70
71 return -1U;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000072}
73
74
Pawel Bylica68304012016-06-27 08:31:48 +000075void APInt::initSlowCase(uint64_t val, bool isSigned) {
Craig Topperb339c6d2017-05-03 15:46:24 +000076 U.pVal = getClearedMemory(getNumWords());
77 U.pVal[0] = val;
Eric Christopher820256b2009-08-21 04:06:45 +000078 if (isSigned && int64_t(val) < 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +000079 for (unsigned i = 1; i < getNumWords(); ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +000080 U.pVal[i] = WORD_MAX;
Craig Topperf78a6f02017-03-01 21:06:18 +000081 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +000082}
83
Chris Lattnerd57b7602008-10-11 22:07:19 +000084void APInt::initSlowCase(const APInt& that) {
Craig Topperb339c6d2017-05-03 15:46:24 +000085 U.pVal = getMemory(getNumWords());
86 memcpy(U.pVal, that.U.pVal, getNumWords() * APINT_WORD_SIZE);
Chris Lattnerd57b7602008-10-11 22:07:19 +000087}
88
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000089void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +000090 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000091 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengdac63782007-02-06 03:00:16 +000092 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +000093 U.VAL = bigVal[0];
Zhou Shengdac63782007-02-06 03:00:16 +000094 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000095 // Get memory, cleared to 0
Craig Topperb339c6d2017-05-03 15:46:24 +000096 U.pVal = getClearedMemory(getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000097 // Calculate the number of words to copy
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000098 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000099 // Copy the words from bigVal to pVal
Craig Topperb339c6d2017-05-03 15:46:24 +0000100 memcpy(U.pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000101 }
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000102 // Make sure unused high bits are cleared
103 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000104}
105
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000106APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
Craig Topper0085ffb2017-03-20 01:29:52 +0000107 : BitWidth(numBits) {
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000108 initFromArray(bigVal);
109}
110
111APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Craig Topper0085ffb2017-03-20 01:29:52 +0000112 : BitWidth(numBits) {
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000113 initFromArray(makeArrayRef(bigVal, numWords));
114}
115
Benjamin Kramer92d89982010-07-14 22:38:02 +0000116APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Craig Topperb339c6d2017-05-03 15:46:24 +0000117 : BitWidth(numbits) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000118 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000119 fromString(numbits, Str, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000120}
121
Craig Toppera92fd0b2017-05-12 01:46:01 +0000122void APInt::reallocate(unsigned NewBitWidth) {
123 // If the number of words is the same we can just change the width and stop.
124 if (getNumWords() == getNumWords(NewBitWidth)) {
125 BitWidth = NewBitWidth;
126 return;
127 }
128
129 // If we have an allocation, delete it.
130 if (!isSingleWord())
131 delete [] U.pVal;
132
133 // Update BitWidth.
134 BitWidth = NewBitWidth;
135
136 // If we are supposed to have an allocation, create it.
137 if (!isSingleWord())
138 U.pVal = getMemory(getNumWords());
139}
140
Craig Topperc67fe572017-04-19 17:01:58 +0000141void APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000142 // Don't do anything for X = X
143 if (this == &RHS)
Craig Topperc67fe572017-04-19 17:01:58 +0000144 return;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000145
Craig Toppera92fd0b2017-05-12 01:46:01 +0000146 // Adjust the bit width and handle allocations as necessary.
147 reallocate(RHS.getBitWidth());
Reid Spencer7c16cd22007-02-26 23:38:21 +0000148
Craig Toppera92fd0b2017-05-12 01:46:01 +0000149 // Copy the data.
150 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000151 U.VAL = RHS.U.VAL;
Craig Toppera92fd0b2017-05-12 01:46:01 +0000152 else
153 memcpy(U.pVal, RHS.U.pVal, getNumWords() * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000154}
155
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000156/// This method 'profiles' an APInt for use with FoldingSet.
Ted Kremenek5c75d542008-01-19 04:23:33 +0000157void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek901540f2008-02-19 20:50:41 +0000158 ID.AddInteger(BitWidth);
Eric Christopher820256b2009-08-21 04:06:45 +0000159
Ted Kremenek5c75d542008-01-19 04:23:33 +0000160 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000161 ID.AddInteger(U.VAL);
Ted Kremenek5c75d542008-01-19 04:23:33 +0000162 return;
163 }
164
Chris Lattner77527f52009-01-21 18:09:24 +0000165 unsigned NumWords = getNumWords();
Ted Kremenek5c75d542008-01-19 04:23:33 +0000166 for (unsigned i = 0; i < NumWords; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000167 ID.AddInteger(U.pVal[i]);
Ted Kremenek5c75d542008-01-19 04:23:33 +0000168}
169
Zhou Shengdac63782007-02-06 03:00:16 +0000170/// @brief Prefix increment operator. Increments the APInt by one.
171APInt& APInt::operator++() {
Eric Christopher820256b2009-08-21 04:06:45 +0000172 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000173 ++U.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000174 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000175 tcIncrement(U.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000176 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000177}
178
Zhou Shengdac63782007-02-06 03:00:16 +0000179/// @brief Prefix decrement operator. Decrements the APInt by one.
180APInt& APInt::operator--() {
Eric Christopher820256b2009-08-21 04:06:45 +0000181 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000182 --U.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000183 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000184 tcDecrement(U.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000185 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000186}
187
Reid Spencera41e93b2007-02-25 19:32:03 +0000188/// Adds the RHS APint to this APInt.
189/// @returns this, after addition of RHS.
Eric Christopher820256b2009-08-21 04:06:45 +0000190/// @brief Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000191APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000192 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000193 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000194 U.VAL += RHS.U.VAL;
Craig Topper15e484a2017-04-02 06:59:43 +0000195 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000196 tcAdd(U.pVal, RHS.U.pVal, 0, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000197 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000198}
199
Pete Cooperfea21392016-07-22 20:55:46 +0000200APInt& APInt::operator+=(uint64_t RHS) {
201 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000202 U.VAL += RHS;
Pete Cooperfea21392016-07-22 20:55:46 +0000203 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000204 tcAddPart(U.pVal, RHS, getNumWords());
Pete Cooperfea21392016-07-22 20:55:46 +0000205 return clearUnusedBits();
206}
207
Reid Spencera41e93b2007-02-25 19:32:03 +0000208/// Subtracts the RHS APInt from this APInt
209/// @returns this, after subtraction
Eric Christopher820256b2009-08-21 04:06:45 +0000210/// @brief Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000211APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000212 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000213 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000214 U.VAL -= RHS.U.VAL;
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000215 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000216 tcSubtract(U.pVal, RHS.U.pVal, 0, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000217 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000218}
219
Pete Cooperfea21392016-07-22 20:55:46 +0000220APInt& APInt::operator-=(uint64_t RHS) {
221 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000222 U.VAL -= RHS;
Pete Cooperfea21392016-07-22 20:55:46 +0000223 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000224 tcSubtractPart(U.pVal, RHS, getNumWords());
Pete Cooperfea21392016-07-22 20:55:46 +0000225 return clearUnusedBits();
226}
227
Craig Topper93c68e12017-05-04 17:00:41 +0000228APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000229 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Craig Topper93c68e12017-05-04 17:00:41 +0000230 if (isSingleWord())
231 return APInt(BitWidth, U.VAL * RHS.U.VAL);
Reid Spencer58a6a432007-02-21 08:21:52 +0000232
Craig Topper93c68e12017-05-04 17:00:41 +0000233 APInt Result(getMemory(getNumWords()), getBitWidth());
Reid Spencer58a6a432007-02-21 08:21:52 +0000234
Craig Topper93c68e12017-05-04 17:00:41 +0000235 tcMultiply(Result.U.pVal, U.pVal, RHS.U.pVal, getNumWords());
Reid Spencer58a6a432007-02-21 08:21:52 +0000236
Craig Topper93c68e12017-05-04 17:00:41 +0000237 Result.clearUnusedBits();
238 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000239}
240
Craig Topperc67fe572017-04-19 17:01:58 +0000241void APInt::AndAssignSlowCase(const APInt& RHS) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000242 tcAnd(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000243}
244
Craig Topperc67fe572017-04-19 17:01:58 +0000245void APInt::OrAssignSlowCase(const APInt& RHS) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000246 tcOr(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000247}
248
Craig Topperc67fe572017-04-19 17:01:58 +0000249void APInt::XorAssignSlowCase(const APInt& RHS) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000250 tcXor(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000251}
252
Craig Topper93c68e12017-05-04 17:00:41 +0000253APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000254 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Craig Topper93c68e12017-05-04 17:00:41 +0000255 *this = *this * RHS;
256 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000257}
258
Craig Toppera51941f2017-05-08 04:55:09 +0000259APInt& APInt::operator*=(uint64_t RHS) {
260 if (isSingleWord()) {
261 U.VAL *= RHS;
262 } else {
263 unsigned NumWords = getNumWords();
264 tcMultiplyPart(U.pVal, U.pVal, RHS, 0, NumWords, NumWords, false);
265 }
266 return clearUnusedBits();
267}
268
Chris Lattner1ac3e252008-08-20 17:02:31 +0000269bool APInt::EqualSlowCase(const APInt& RHS) const {
Craig Topperb339c6d2017-05-03 15:46:24 +0000270 return std::equal(U.pVal, U.pVal + getNumWords(), RHS.U.pVal);
Zhou Shengdac63782007-02-06 03:00:16 +0000271}
272
Craig Topper1dc8fc82017-04-21 16:13:15 +0000273int APInt::compare(const APInt& RHS) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000274 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
275 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000276 return U.VAL < RHS.U.VAL ? -1 : U.VAL > RHS.U.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000277
Craig Topperb339c6d2017-05-03 15:46:24 +0000278 return tcCompare(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000279}
280
Craig Topper1dc8fc82017-04-21 16:13:15 +0000281int APInt::compareSigned(const APInt& RHS) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000282 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000283 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000284 int64_t lhsSext = SignExtend64(U.VAL, BitWidth);
285 int64_t rhsSext = SignExtend64(RHS.U.VAL, BitWidth);
Craig Topper1dc8fc82017-04-21 16:13:15 +0000286 return lhsSext < rhsSext ? -1 : lhsSext > rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000287 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000288
Reid Spencer54abdcf2007-02-27 18:23:40 +0000289 bool lhsNeg = isNegative();
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000290 bool rhsNeg = RHS.isNegative();
Reid Spencera41e93b2007-02-25 19:32:03 +0000291
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000292 // If the sign bits don't match, then (LHS < RHS) if LHS is negative
293 if (lhsNeg != rhsNeg)
Craig Topper1dc8fc82017-04-21 16:13:15 +0000294 return lhsNeg ? -1 : 1;
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000295
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000296 // Otherwise we can just use an unsigned comparison, because even negative
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000297 // numbers compare correctly this way if both have the same signed-ness.
Craig Topperb339c6d2017-05-03 15:46:24 +0000298 return tcCompare(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000299}
300
Craig Topperbafdd032017-03-07 01:56:01 +0000301void APInt::setBitsSlowCase(unsigned loBit, unsigned hiBit) {
302 unsigned loWord = whichWord(loBit);
303 unsigned hiWord = whichWord(hiBit);
Simon Pilgrimaed35222017-02-24 10:15:29 +0000304
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000305 // Create an initial mask for the low word with zeros below loBit.
Craig Topper5e113742017-04-22 06:31:36 +0000306 uint64_t loMask = WORD_MAX << whichBit(loBit);
Simon Pilgrimaed35222017-02-24 10:15:29 +0000307
Craig Topperbafdd032017-03-07 01:56:01 +0000308 // If hiBit is not aligned, we need a high mask.
309 unsigned hiShiftAmt = whichBit(hiBit);
310 if (hiShiftAmt != 0) {
311 // Create a high mask with zeros above hiBit.
Craig Topper5e113742017-04-22 06:31:36 +0000312 uint64_t hiMask = WORD_MAX >> (APINT_BITS_PER_WORD - hiShiftAmt);
Craig Topperbafdd032017-03-07 01:56:01 +0000313 // If loWord and hiWord are equal, then we combine the masks. Otherwise,
314 // set the bits in hiWord.
315 if (hiWord == loWord)
316 loMask &= hiMask;
317 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000318 U.pVal[hiWord] |= hiMask;
Simon Pilgrimaed35222017-02-24 10:15:29 +0000319 }
Craig Topperbafdd032017-03-07 01:56:01 +0000320 // Apply the mask to the low word.
Craig Topperb339c6d2017-05-03 15:46:24 +0000321 U.pVal[loWord] |= loMask;
Craig Topperbafdd032017-03-07 01:56:01 +0000322
323 // Fill any words between loWord and hiWord with all ones.
324 for (unsigned word = loWord + 1; word < hiWord; ++word)
Craig Topperb339c6d2017-05-03 15:46:24 +0000325 U.pVal[word] = WORD_MAX;
Simon Pilgrimaed35222017-02-24 10:15:29 +0000326}
327
Zhou Shengdac63782007-02-06 03:00:16 +0000328/// @brief Toggle every bit to its opposite value.
Craig Topperafc9e352017-03-27 17:10:21 +0000329void APInt::flipAllBitsSlowCase() {
Craig Topperb339c6d2017-05-03 15:46:24 +0000330 tcComplement(U.pVal, getNumWords());
Craig Topperafc9e352017-03-27 17:10:21 +0000331 clearUnusedBits();
332}
Zhou Shengdac63782007-02-06 03:00:16 +0000333
Eric Christopher820256b2009-08-21 04:06:45 +0000334/// Toggle a given bit to its opposite value whose position is given
Zhou Shengdac63782007-02-06 03:00:16 +0000335/// as "bitPosition".
336/// @brief Toggles a given bit to its opposite value.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000337void APInt::flipBit(unsigned bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000338 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad25a5e4c2010-12-01 08:53:58 +0000339 if ((*this)[bitPosition]) clearBit(bitPosition);
340 else setBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000341}
342
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000343void APInt::insertBits(const APInt &subBits, unsigned bitPosition) {
344 unsigned subBitWidth = subBits.getBitWidth();
345 assert(0 < subBitWidth && (subBitWidth + bitPosition) <= BitWidth &&
346 "Illegal bit insertion");
347
348 // Insertion is a direct copy.
349 if (subBitWidth == BitWidth) {
350 *this = subBits;
351 return;
352 }
353
354 // Single word result can be done as a direct bitmask.
355 if (isSingleWord()) {
Craig Topper5e113742017-04-22 06:31:36 +0000356 uint64_t mask = WORD_MAX >> (APINT_BITS_PER_WORD - subBitWidth);
Craig Topperb339c6d2017-05-03 15:46:24 +0000357 U.VAL &= ~(mask << bitPosition);
358 U.VAL |= (subBits.U.VAL << bitPosition);
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000359 return;
360 }
361
362 unsigned loBit = whichBit(bitPosition);
363 unsigned loWord = whichWord(bitPosition);
364 unsigned hi1Word = whichWord(bitPosition + subBitWidth - 1);
365
366 // Insertion within a single word can be done as a direct bitmask.
367 if (loWord == hi1Word) {
Craig Topper5e113742017-04-22 06:31:36 +0000368 uint64_t mask = WORD_MAX >> (APINT_BITS_PER_WORD - subBitWidth);
Craig Topperb339c6d2017-05-03 15:46:24 +0000369 U.pVal[loWord] &= ~(mask << loBit);
370 U.pVal[loWord] |= (subBits.U.VAL << loBit);
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000371 return;
372 }
373
374 // Insert on word boundaries.
375 if (loBit == 0) {
376 // Direct copy whole words.
377 unsigned numWholeSubWords = subBitWidth / APINT_BITS_PER_WORD;
Craig Topperb339c6d2017-05-03 15:46:24 +0000378 memcpy(U.pVal + loWord, subBits.getRawData(),
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000379 numWholeSubWords * APINT_WORD_SIZE);
380
381 // Mask+insert remaining bits.
382 unsigned remainingBits = subBitWidth % APINT_BITS_PER_WORD;
383 if (remainingBits != 0) {
Craig Topper5e113742017-04-22 06:31:36 +0000384 uint64_t mask = WORD_MAX >> (APINT_BITS_PER_WORD - remainingBits);
Craig Topperb339c6d2017-05-03 15:46:24 +0000385 U.pVal[hi1Word] &= ~mask;
386 U.pVal[hi1Word] |= subBits.getWord(subBitWidth - 1);
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000387 }
388 return;
389 }
390
391 // General case - set/clear individual bits in dst based on src.
392 // TODO - there is scope for optimization here, but at the moment this code
393 // path is barely used so prefer readability over performance.
394 for (unsigned i = 0; i != subBitWidth; ++i) {
395 if (subBits[i])
396 setBit(bitPosition + i);
397 else
398 clearBit(bitPosition + i);
399 }
400}
401
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000402APInt APInt::extractBits(unsigned numBits, unsigned bitPosition) const {
403 assert(numBits > 0 && "Can't extract zero bits");
404 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
405 "Illegal bit extraction");
406
407 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000408 return APInt(numBits, U.VAL >> bitPosition);
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000409
410 unsigned loBit = whichBit(bitPosition);
411 unsigned loWord = whichWord(bitPosition);
412 unsigned hiWord = whichWord(bitPosition + numBits - 1);
413
414 // Single word result extracting bits from a single word source.
415 if (loWord == hiWord)
Craig Topperb339c6d2017-05-03 15:46:24 +0000416 return APInt(numBits, U.pVal[loWord] >> loBit);
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000417
418 // Extracting bits that start on a source word boundary can be done
419 // as a fast memory copy.
420 if (loBit == 0)
Craig Topperb339c6d2017-05-03 15:46:24 +0000421 return APInt(numBits, makeArrayRef(U.pVal + loWord, 1 + hiWord - loWord));
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000422
423 // General case - shift + copy source words directly into place.
424 APInt Result(numBits, 0);
425 unsigned NumSrcWords = getNumWords();
426 unsigned NumDstWords = Result.getNumWords();
427
Tim Shen89337752018-02-16 01:44:36 +0000428 uint64_t *DestPtr = Result.isSingleWord() ? &Result.U.VAL : Result.U.pVal;
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000429 for (unsigned word = 0; word < NumDstWords; ++word) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000430 uint64_t w0 = U.pVal[loWord + word];
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000431 uint64_t w1 =
Craig Topperb339c6d2017-05-03 15:46:24 +0000432 (loWord + word + 1) < NumSrcWords ? U.pVal[loWord + word + 1] : 0;
Tim Shen89337752018-02-16 01:44:36 +0000433 DestPtr[word] = (w0 >> loBit) | (w1 << (APINT_BITS_PER_WORD - loBit));
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000434 }
435
436 return Result.clearUnusedBits();
437}
438
Benjamin Kramer92d89982010-07-14 22:38:02 +0000439unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000440 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000441 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +0000442 radix == 36) &&
443 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000444
445 size_t slen = str.size();
Reid Spencer9329e7b2007-04-13 19:19:07 +0000446
Eric Christopher43a1dec2009-08-21 04:10:31 +0000447 // Each computation below needs to know if it's negative.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000448 StringRef::iterator p = str.begin();
Eric Christopher43a1dec2009-08-21 04:10:31 +0000449 unsigned isNegative = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000450 if (*p == '-' || *p == '+') {
451 p++;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000452 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +0000453 assert(slen && "String is only a sign, needs a value.");
Reid Spencer9329e7b2007-04-13 19:19:07 +0000454 }
Eric Christopher43a1dec2009-08-21 04:10:31 +0000455
Reid Spencer9329e7b2007-04-13 19:19:07 +0000456 // For radixes of power-of-two values, the bits required is accurately and
457 // easily computed
458 if (radix == 2)
459 return slen + isNegative;
460 if (radix == 8)
461 return slen * 3 + isNegative;
462 if (radix == 16)
463 return slen * 4 + isNegative;
464
Douglas Gregor663c0682011-09-14 15:54:46 +0000465 // FIXME: base 36
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000466
Reid Spencer9329e7b2007-04-13 19:19:07 +0000467 // This is grossly inefficient but accurate. We could probably do something
468 // with a computation of roughly slen*64/20 and then adjust by the value of
469 // the first few digits. But, I'm not sure how accurate that could be.
470
471 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000472 // be too large. This avoids the assertion in the constructor. This
473 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
474 // bits in that case.
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000475 unsigned sufficient
Douglas Gregor663c0682011-09-14 15:54:46 +0000476 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
477 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000478
479 // Convert to the actual binary value.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000480 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000481
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000482 // Compute how many bits are required. If the log is infinite, assume we need
483 // just bit.
484 unsigned log = tmp.logBase2();
485 if (log == (unsigned)-1) {
486 return isNegative + 1;
487 } else {
488 return isNegative + log + 1;
489 }
Reid Spencer9329e7b2007-04-13 19:19:07 +0000490}
491
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000492hash_code llvm::hash_value(const APInt &Arg) {
493 if (Arg.isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000494 return hash_combine(Arg.U.VAL);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000495
Craig Topperb339c6d2017-05-03 15:46:24 +0000496 return hash_combine_range(Arg.U.pVal, Arg.U.pVal + Arg.getNumWords());
Reid Spencerb2bc9852007-02-26 21:02:27 +0000497}
498
Benjamin Kramerb4b51502015-03-25 16:49:59 +0000499bool APInt::isSplat(unsigned SplatSizeInBits) const {
500 assert(getBitWidth() % SplatSizeInBits == 0 &&
501 "SplatSizeInBits must divide width!");
502 // We can check that all parts of an integer are equal by making use of a
503 // little trick: rotate and check if it's still the same value.
504 return *this == rotl(SplatSizeInBits);
505}
506
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000507/// This function returns the high "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000508APInt APInt::getHiBits(unsigned numBits) const {
Craig Toppere7e35602017-03-31 18:48:14 +0000509 return this->lshr(BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000510}
511
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000512/// This function returns the low "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000513APInt APInt::getLoBits(unsigned numBits) const {
Craig Toppere7e35602017-03-31 18:48:14 +0000514 APInt Result(getLowBitsSet(BitWidth, numBits));
515 Result &= *this;
516 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000517}
518
Craig Topper9881bd92017-05-02 06:32:27 +0000519/// Return a value containing V broadcasted over NewLen bits.
520APInt APInt::getSplat(unsigned NewLen, const APInt &V) {
521 assert(NewLen >= V.getBitWidth() && "Can't splat to smaller bit width!");
522
523 APInt Val = V.zextOrSelf(NewLen);
524 for (unsigned I = V.getBitWidth(); I < NewLen; I <<= 1)
525 Val |= Val << I;
526
527 return Val;
528}
529
Chris Lattner77527f52009-01-21 18:09:24 +0000530unsigned APInt::countLeadingZerosSlowCase() const {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000531 unsigned Count = 0;
532 for (int i = getNumWords()-1; i >= 0; --i) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000533 uint64_t V = U.pVal[i];
Matthias Brauna6be4e82016-02-15 20:06:22 +0000534 if (V == 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +0000535 Count += APINT_BITS_PER_WORD;
536 else {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000537 Count += llvm::countLeadingZeros(V);
Chris Lattner1ac3e252008-08-20 17:02:31 +0000538 break;
Reid Spencer74cf82e2007-02-21 00:29:48 +0000539 }
Zhou Shengdac63782007-02-06 03:00:16 +0000540 }
Matthias Brauna6be4e82016-02-15 20:06:22 +0000541 // Adjust for unused bits in the most significant word (they are zero).
542 unsigned Mod = BitWidth % APINT_BITS_PER_WORD;
543 Count -= Mod > 0 ? APINT_BITS_PER_WORD - Mod : 0;
John McCalldf951bd2010-02-03 03:42:44 +0000544 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000545}
546
Craig Topper40516522017-06-23 20:28:45 +0000547unsigned APInt::countLeadingOnesSlowCase() const {
Chris Lattner77527f52009-01-21 18:09:24 +0000548 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwinec39eb82009-01-27 18:06:03 +0000549 unsigned shift;
550 if (!highWordBits) {
551 highWordBits = APINT_BITS_PER_WORD;
552 shift = 0;
553 } else {
554 shift = APINT_BITS_PER_WORD - highWordBits;
555 }
Reid Spencer31acef52007-02-27 21:59:26 +0000556 int i = getNumWords() - 1;
Craig Topperb339c6d2017-05-03 15:46:24 +0000557 unsigned Count = llvm::countLeadingOnes(U.pVal[i] << shift);
Reid Spencer31acef52007-02-27 21:59:26 +0000558 if (Count == highWordBits) {
559 for (i--; i >= 0; --i) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000560 if (U.pVal[i] == WORD_MAX)
Reid Spencer31acef52007-02-27 21:59:26 +0000561 Count += APINT_BITS_PER_WORD;
562 else {
Craig Topperb339c6d2017-05-03 15:46:24 +0000563 Count += llvm::countLeadingOnes(U.pVal[i]);
Reid Spencer31acef52007-02-27 21:59:26 +0000564 break;
565 }
566 }
567 }
568 return Count;
569}
570
Craig Topper40516522017-06-23 20:28:45 +0000571unsigned APInt::countTrailingZerosSlowCase() const {
Chris Lattner77527f52009-01-21 18:09:24 +0000572 unsigned Count = 0;
573 unsigned i = 0;
Craig Topperb339c6d2017-05-03 15:46:24 +0000574 for (; i < getNumWords() && U.pVal[i] == 0; ++i)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000575 Count += APINT_BITS_PER_WORD;
576 if (i < getNumWords())
Craig Topperb339c6d2017-05-03 15:46:24 +0000577 Count += llvm::countTrailingZeros(U.pVal[i]);
Chris Lattnerc2c4c742007-11-23 22:36:25 +0000578 return std::min(Count, BitWidth);
Zhou Shengdac63782007-02-06 03:00:16 +0000579}
580
Chris Lattner77527f52009-01-21 18:09:24 +0000581unsigned APInt::countTrailingOnesSlowCase() const {
582 unsigned Count = 0;
583 unsigned i = 0;
Craig Topperb339c6d2017-05-03 15:46:24 +0000584 for (; i < getNumWords() && U.pVal[i] == WORD_MAX; ++i)
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000585 Count += APINT_BITS_PER_WORD;
586 if (i < getNumWords())
Craig Topperb339c6d2017-05-03 15:46:24 +0000587 Count += llvm::countTrailingOnes(U.pVal[i]);
Craig Topper3a29e3b82017-04-22 19:59:11 +0000588 assert(Count <= BitWidth);
589 return Count;
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000590}
591
Chris Lattner77527f52009-01-21 18:09:24 +0000592unsigned APInt::countPopulationSlowCase() const {
593 unsigned Count = 0;
594 for (unsigned i = 0; i < getNumWords(); ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000595 Count += llvm::countPopulation(U.pVal[i]);
Zhou Shengdac63782007-02-06 03:00:16 +0000596 return Count;
597}
598
Craig Topperbaa392e2017-04-20 02:11:27 +0000599bool APInt::intersectsSlowCase(const APInt &RHS) const {
600 for (unsigned i = 0, e = getNumWords(); i != e; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000601 if ((U.pVal[i] & RHS.U.pVal[i]) != 0)
Craig Topperbaa392e2017-04-20 02:11:27 +0000602 return true;
603
604 return false;
605}
606
Craig Toppera8129a12017-04-20 16:17:13 +0000607bool APInt::isSubsetOfSlowCase(const APInt &RHS) const {
608 for (unsigned i = 0, e = getNumWords(); i != e; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000609 if ((U.pVal[i] & ~RHS.U.pVal[i]) != 0)
Craig Toppera8129a12017-04-20 16:17:13 +0000610 return false;
611
612 return true;
613}
614
Reid Spencer1d072122007-02-16 22:36:51 +0000615APInt APInt::byteSwap() const {
616 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
617 if (BitWidth == 16)
Craig Topperb339c6d2017-05-03 15:46:24 +0000618 return APInt(BitWidth, ByteSwap_16(uint16_t(U.VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000619 if (BitWidth == 32)
Craig Topperb339c6d2017-05-03 15:46:24 +0000620 return APInt(BitWidth, ByteSwap_32(unsigned(U.VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000621 if (BitWidth == 48) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000622 unsigned Tmp1 = unsigned(U.VAL >> 16);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000623 Tmp1 = ByteSwap_32(Tmp1);
Craig Topperb339c6d2017-05-03 15:46:24 +0000624 uint16_t Tmp2 = uint16_t(U.VAL);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000625 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohene06855e2007-03-20 20:42:36 +0000626 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000627 }
Richard Smith4f9a8082011-11-23 21:33:37 +0000628 if (BitWidth == 64)
Craig Topperb339c6d2017-05-03 15:46:24 +0000629 return APInt(BitWidth, ByteSwap_64(U.VAL));
Richard Smith4f9a8082011-11-23 21:33:37 +0000630
631 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
632 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
Craig Topperb339c6d2017-05-03 15:46:24 +0000633 Result.U.pVal[I] = ByteSwap_64(U.pVal[N - I - 1]);
Richard Smith4f9a8082011-11-23 21:33:37 +0000634 if (Result.BitWidth != BitWidth) {
Richard Smith55bd3752017-04-13 20:29:59 +0000635 Result.lshrInPlace(Result.BitWidth - BitWidth);
Richard Smith4f9a8082011-11-23 21:33:37 +0000636 Result.BitWidth = BitWidth;
637 }
638 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000639}
640
Matt Arsenault155dda92016-03-21 15:00:35 +0000641APInt APInt::reverseBits() const {
642 switch (BitWidth) {
643 case 64:
Craig Topperb339c6d2017-05-03 15:46:24 +0000644 return APInt(BitWidth, llvm::reverseBits<uint64_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000645 case 32:
Craig Topperb339c6d2017-05-03 15:46:24 +0000646 return APInt(BitWidth, llvm::reverseBits<uint32_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000647 case 16:
Craig Topperb339c6d2017-05-03 15:46:24 +0000648 return APInt(BitWidth, llvm::reverseBits<uint16_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000649 case 8:
Craig Topperb339c6d2017-05-03 15:46:24 +0000650 return APInt(BitWidth, llvm::reverseBits<uint8_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000651 default:
652 break;
653 }
654
655 APInt Val(*this);
Craig Topper9eaef072017-04-18 05:02:21 +0000656 APInt Reversed(BitWidth, 0);
657 unsigned S = BitWidth;
Matt Arsenault155dda92016-03-21 15:00:35 +0000658
Craig Topper9eaef072017-04-18 05:02:21 +0000659 for (; Val != 0; Val.lshrInPlace(1)) {
Matt Arsenault155dda92016-03-21 15:00:35 +0000660 Reversed <<= 1;
Craig Topper9eaef072017-04-18 05:02:21 +0000661 Reversed |= Val[0];
Matt Arsenault155dda92016-03-21 15:00:35 +0000662 --S;
663 }
664
665 Reversed <<= S;
666 return Reversed;
667}
668
Craig Topper278ebd22017-04-01 20:30:57 +0000669APInt llvm::APIntOps::GreatestCommonDivisor(APInt A, APInt B) {
Richard Smith55bd3752017-04-13 20:29:59 +0000670 // Fast-path a common case.
671 if (A == B) return A;
672
673 // Corner cases: if either operand is zero, the other is the gcd.
674 if (!A) return B;
675 if (!B) return A;
676
677 // Count common powers of 2 and remove all other powers of 2.
678 unsigned Pow2;
679 {
680 unsigned Pow2_A = A.countTrailingZeros();
681 unsigned Pow2_B = B.countTrailingZeros();
682 if (Pow2_A > Pow2_B) {
683 A.lshrInPlace(Pow2_A - Pow2_B);
684 Pow2 = Pow2_B;
685 } else if (Pow2_B > Pow2_A) {
686 B.lshrInPlace(Pow2_B - Pow2_A);
687 Pow2 = Pow2_A;
688 } else {
689 Pow2 = Pow2_A;
690 }
Zhou Shengdac63782007-02-06 03:00:16 +0000691 }
Richard Smith55bd3752017-04-13 20:29:59 +0000692
693 // Both operands are odd multiples of 2^Pow_2:
694 //
695 // gcd(a, b) = gcd(|a - b| / 2^i, min(a, b))
696 //
697 // This is a modified version of Stein's algorithm, taking advantage of
698 // efficient countTrailingZeros().
699 while (A != B) {
700 if (A.ugt(B)) {
701 A -= B;
702 A.lshrInPlace(A.countTrailingZeros() - Pow2);
703 } else {
704 B -= A;
705 B.lshrInPlace(B.countTrailingZeros() - Pow2);
706 }
707 }
708
Zhou Shengdac63782007-02-06 03:00:16 +0000709 return A;
710}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000711
Chris Lattner77527f52009-01-21 18:09:24 +0000712APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
Zhou Shengd707d632007-02-12 20:02:55 +0000713 union {
714 double D;
715 uint64_t I;
716 } T;
717 T.D = Double;
Reid Spencer974551a2007-02-27 01:28:10 +0000718
719 // Get the sign bit from the highest order bit
Zhou Shengd707d632007-02-12 20:02:55 +0000720 bool isNeg = T.I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000721
722 // Get the 11-bit exponent and adjust for the 1023 bit bias
Zhou Shengd707d632007-02-12 20:02:55 +0000723 int64_t exp = ((T.I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000724
725 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000726 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000727 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000728
729 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
730 uint64_t mantissa = (T.I & (~0ULL >> 12)) | 1ULL << 52;
731
732 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000733 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000734 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000735 APInt(width, mantissa >> (52 - exp));
736
737 // If the client didn't provide enough bits for us to shift the mantissa into
738 // then the result is undefined, just return 0
739 if (width <= exp - 52)
740 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000741
742 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000743 APInt Tmp(width, mantissa);
Craig Topper24e71012017-04-28 03:36:24 +0000744 Tmp <<= (unsigned)exp - 52;
Zhou Shengd707d632007-02-12 20:02:55 +0000745 return isNeg ? -Tmp : Tmp;
746}
747
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000748/// This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000749/// The layout for double is as following (IEEE Standard 754):
750/// --------------------------------------
751/// | Sign Exponent Fraction Bias |
752/// |-------------------------------------- |
753/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000754/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000755double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000756
757 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000758 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000759 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
760 if (isSigned) {
David Majnemer03992262016-06-24 21:15:36 +0000761 int64_t sext = SignExtend64(getWord(0), BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000762 return double(sext);
763 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000764 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000765 }
766
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000767 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000768 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000769
770 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000771 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000772
773 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000774 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000775
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000776 // The exponent (without bias normalization) is just the number of bits
777 // we are using. Note that the sign bit is gone since we constructed the
778 // absolute value.
779 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000780
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000781 // Return infinity for exponent overflow
782 if (exp > 1023) {
783 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000784 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000785 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000786 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000787 }
788 exp += 1023; // Increment for 1023 bias
789
790 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
791 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000792 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000793 unsigned hiWord = whichWord(n-1);
794 if (hiWord == 0) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000795 mantissa = Tmp.U.pVal[0];
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000796 if (n > 52)
797 mantissa >>= n - 52; // shift down, we want the top 52 bits.
798 } else {
799 assert(hiWord > 0 && "huh?");
Craig Topperb339c6d2017-05-03 15:46:24 +0000800 uint64_t hibits = Tmp.U.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
801 uint64_t lobits = Tmp.U.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000802 mantissa = hibits | lobits;
803 }
804
Zhou Shengd707d632007-02-12 20:02:55 +0000805 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000806 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
Zhou Shengd707d632007-02-12 20:02:55 +0000807 union {
808 double D;
809 uint64_t I;
810 } T;
811 T.I = sign | (exp << 52) | mantissa;
812 return T.D;
813}
814
Reid Spencer1d072122007-02-16 22:36:51 +0000815// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000816APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000817 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +0000818 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +0000819
820 if (width <= APINT_BITS_PER_WORD)
821 return APInt(width, getRawData()[0]);
822
823 APInt Result(getMemory(getNumWords(width)), width);
824
825 // Copy full words.
826 unsigned i;
827 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
Craig Topperb339c6d2017-05-03 15:46:24 +0000828 Result.U.pVal[i] = U.pVal[i];
Jay Foad583abbc2010-12-07 08:25:19 +0000829
830 // Truncate and copy any partial word.
831 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
832 if (bits != 0)
Craig Topperb339c6d2017-05-03 15:46:24 +0000833 Result.U.pVal[i] = U.pVal[i] << bits >> bits;
Jay Foad583abbc2010-12-07 08:25:19 +0000834
835 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000836}
837
838// Sign extend to a new width.
Craig Topper1dec2812017-04-24 17:37:10 +0000839APInt APInt::sext(unsigned Width) const {
840 assert(Width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +0000841
Craig Topper1dec2812017-04-24 17:37:10 +0000842 if (Width <= APINT_BITS_PER_WORD)
Craig Topperb339c6d2017-05-03 15:46:24 +0000843 return APInt(Width, SignExtend64(U.VAL, BitWidth));
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000844
Craig Topper1dec2812017-04-24 17:37:10 +0000845 APInt Result(getMemory(getNumWords(Width)), Width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000846
Craig Topper1dec2812017-04-24 17:37:10 +0000847 // Copy words.
Craig Topperb339c6d2017-05-03 15:46:24 +0000848 std::memcpy(Result.U.pVal, getRawData(), getNumWords() * APINT_WORD_SIZE);
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000849
Craig Topper1dec2812017-04-24 17:37:10 +0000850 // Sign extend the last word since there may be unused bits in the input.
Craig Topperb339c6d2017-05-03 15:46:24 +0000851 Result.U.pVal[getNumWords() - 1] =
852 SignExtend64(Result.U.pVal[getNumWords() - 1],
Craig Topper1dec2812017-04-24 17:37:10 +0000853 ((BitWidth - 1) % APINT_BITS_PER_WORD) + 1);
Jay Foad583abbc2010-12-07 08:25:19 +0000854
Craig Topper1dec2812017-04-24 17:37:10 +0000855 // Fill with sign bits.
Craig Topperb339c6d2017-05-03 15:46:24 +0000856 std::memset(Result.U.pVal + getNumWords(), isNegative() ? -1 : 0,
Craig Topper1dec2812017-04-24 17:37:10 +0000857 (Result.getNumWords() - getNumWords()) * APINT_WORD_SIZE);
858 Result.clearUnusedBits();
Jay Foad583abbc2010-12-07 08:25:19 +0000859 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000860}
861
862// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000863APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000864 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +0000865
866 if (width <= APINT_BITS_PER_WORD)
Craig Topperb339c6d2017-05-03 15:46:24 +0000867 return APInt(width, U.VAL);
Jay Foad583abbc2010-12-07 08:25:19 +0000868
869 APInt Result(getMemory(getNumWords(width)), width);
870
871 // Copy words.
Craig Topperb339c6d2017-05-03 15:46:24 +0000872 std::memcpy(Result.U.pVal, getRawData(), getNumWords() * APINT_WORD_SIZE);
Jay Foad583abbc2010-12-07 08:25:19 +0000873
874 // Zero remaining words.
Craig Topperb339c6d2017-05-03 15:46:24 +0000875 std::memset(Result.U.pVal + getNumWords(), 0,
Craig Topper1dec2812017-04-24 17:37:10 +0000876 (Result.getNumWords() - getNumWords()) * APINT_WORD_SIZE);
Jay Foad583abbc2010-12-07 08:25:19 +0000877
878 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000879}
880
Jay Foad583abbc2010-12-07 08:25:19 +0000881APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +0000882 if (BitWidth < width)
883 return zext(width);
884 if (BitWidth > width)
885 return trunc(width);
886 return *this;
887}
888
Jay Foad583abbc2010-12-07 08:25:19 +0000889APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +0000890 if (BitWidth < width)
891 return sext(width);
892 if (BitWidth > width)
893 return trunc(width);
894 return *this;
895}
896
Rafael Espindolabb893fe2012-01-27 23:33:07 +0000897APInt APInt::zextOrSelf(unsigned width) const {
898 if (BitWidth < width)
899 return zext(width);
900 return *this;
901}
902
903APInt APInt::sextOrSelf(unsigned width) const {
904 if (BitWidth < width)
905 return sext(width);
906 return *this;
907}
908
Zhou Shenge93db8f2007-02-09 07:48:24 +0000909/// Arithmetic right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000910/// @brief Arithmetic right-shift function.
Craig Topper8b373262017-04-24 17:18:47 +0000911void APInt::ashrInPlace(const APInt &shiftAmt) {
912 ashrInPlace((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +0000913}
914
915/// Arithmetic right-shift this APInt by shiftAmt.
916/// @brief Arithmetic right-shift function.
Craig Topper8b373262017-04-24 17:18:47 +0000917void APInt::ashrSlowCase(unsigned ShiftAmt) {
918 // Don't bother performing a no-op shift.
919 if (!ShiftAmt)
920 return;
Reid Spencer1825dd02007-03-02 22:39:11 +0000921
Craig Topper8b373262017-04-24 17:18:47 +0000922 // Save the original sign bit for later.
923 bool Negative = isNegative();
Reid Spencer522ca7c2007-02-25 01:56:07 +0000924
Hiroshi Inoue9ff23802018-04-09 04:37:53 +0000925 // WordShift is the inter-part shift; BitShift is intra-part shift.
Craig Topper8b373262017-04-24 17:18:47 +0000926 unsigned WordShift = ShiftAmt / APINT_BITS_PER_WORD;
927 unsigned BitShift = ShiftAmt % APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000928
Craig Topper8b373262017-04-24 17:18:47 +0000929 unsigned WordsToMove = getNumWords() - WordShift;
930 if (WordsToMove != 0) {
931 // Sign extend the last word to fill in the unused bits.
Craig Topperb339c6d2017-05-03 15:46:24 +0000932 U.pVal[getNumWords() - 1] = SignExtend64(
933 U.pVal[getNumWords() - 1], ((BitWidth - 1) % APINT_BITS_PER_WORD) + 1);
Renato Golincc4a9122017-04-23 12:02:07 +0000934
Craig Topper8b373262017-04-24 17:18:47 +0000935 // Fastpath for moving by whole words.
936 if (BitShift == 0) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000937 std::memmove(U.pVal, U.pVal + WordShift, WordsToMove * APINT_WORD_SIZE);
Craig Topper8b373262017-04-24 17:18:47 +0000938 } else {
939 // Move the words containing significant bits.
940 for (unsigned i = 0; i != WordsToMove - 1; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000941 U.pVal[i] = (U.pVal[i + WordShift] >> BitShift) |
942 (U.pVal[i + WordShift + 1] << (APINT_BITS_PER_WORD - BitShift));
Renato Golincc4a9122017-04-23 12:02:07 +0000943
Craig Topper8b373262017-04-24 17:18:47 +0000944 // Handle the last word which has no high bits to copy.
Craig Topperb339c6d2017-05-03 15:46:24 +0000945 U.pVal[WordsToMove - 1] = U.pVal[WordShift + WordsToMove - 1] >> BitShift;
Craig Topper8b373262017-04-24 17:18:47 +0000946 // Sign extend one more time.
Craig Topperb339c6d2017-05-03 15:46:24 +0000947 U.pVal[WordsToMove - 1] =
948 SignExtend64(U.pVal[WordsToMove - 1], APINT_BITS_PER_WORD - BitShift);
Chris Lattnerdad2d092007-05-03 18:15:36 +0000949 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000950 }
951
Craig Topper8b373262017-04-24 17:18:47 +0000952 // Fill in the remainder based on the original sign.
Craig Topperb339c6d2017-05-03 15:46:24 +0000953 std::memset(U.pVal + WordsToMove, Negative ? -1 : 0,
Craig Topper8b373262017-04-24 17:18:47 +0000954 WordShift * APINT_WORD_SIZE);
955 clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000956}
957
Zhou Shenge93db8f2007-02-09 07:48:24 +0000958/// Logical right-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000959/// @brief Logical right-shift function.
Craig Topperfc947bc2017-04-18 17:14:21 +0000960void APInt::lshrInPlace(const APInt &shiftAmt) {
961 lshrInPlace((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +0000962}
963
964/// Logical right-shift this APInt by shiftAmt.
965/// @brief Logical right-shift function.
Craig Topperae8bd672017-04-18 19:13:27 +0000966void APInt::lshrSlowCase(unsigned ShiftAmt) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000967 tcShiftRight(U.pVal, getNumWords(), ShiftAmt);
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000968}
969
Zhou Shenge93db8f2007-02-09 07:48:24 +0000970/// Left-shift this APInt by shiftAmt.
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000971/// @brief Left-shift function.
Craig Topper24e71012017-04-28 03:36:24 +0000972APInt &APInt::operator<<=(const APInt &shiftAmt) {
Nick Lewycky030c4502009-01-19 17:42:33 +0000973 // It's undefined behavior in C to shift by BitWidth or greater.
Craig Topper24e71012017-04-28 03:36:24 +0000974 *this <<= (unsigned)shiftAmt.getLimitedValue(BitWidth);
975 return *this;
Dan Gohman105c1d42008-02-29 01:40:47 +0000976}
977
Craig Toppera8a4f0d2017-04-18 04:39:48 +0000978void APInt::shlSlowCase(unsigned ShiftAmt) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000979 tcShiftLeft(U.pVal, getNumWords(), ShiftAmt);
Craig Toppera8a4f0d2017-04-18 04:39:48 +0000980 clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000981}
982
Joey Gouly51c0ae52017-02-07 11:58:22 +0000983// Calculate the rotate amount modulo the bit width.
984static unsigned rotateModulo(unsigned BitWidth, const APInt &rotateAmt) {
985 unsigned rotBitWidth = rotateAmt.getBitWidth();
986 APInt rot = rotateAmt;
987 if (rotBitWidth < BitWidth) {
988 // Extend the rotate APInt, so that the urem doesn't divide by 0.
989 // e.g. APInt(1, 32) would give APInt(1, 0).
990 rot = rotateAmt.zext(BitWidth);
991 }
992 rot = rot.urem(APInt(rot.getBitWidth(), BitWidth));
993 return rot.getLimitedValue(BitWidth);
994}
995
Dan Gohman105c1d42008-02-29 01:40:47 +0000996APInt APInt::rotl(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +0000997 return rotl(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +0000998}
999
Chris Lattner77527f52009-01-21 18:09:24 +00001000APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001001 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001002 if (rotateAmt == 0)
1003 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001004 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001005}
1006
Dan Gohman105c1d42008-02-29 01:40:47 +00001007APInt APInt::rotr(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001008 return rotr(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001009}
1010
Chris Lattner77527f52009-01-21 18:09:24 +00001011APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001012 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001013 if (rotateAmt == 0)
1014 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001015 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001016}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001017
1018// Square Root - this method computes and returns the square root of "this".
1019// Three mechanisms are used for computation. For small values (<= 5 bits),
1020// a table lookup is done. This gets some performance for common cases. For
1021// values using less than 52 bits, the value is converted to double and then
1022// the libc sqrt function is called. The result is rounded and then converted
1023// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001024// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001025APInt APInt::sqrt() const {
1026
1027 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001028 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001029
1030 // Use a fast table for some small values. This also gets rid of some
1031 // rounding errors in libc sqrt for small values.
1032 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001033 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001034 /* 0 */ 0,
1035 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001036 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001037 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1038 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1039 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1040 /* 31 */ 6
1041 };
Craig Topperb339c6d2017-05-03 15:46:24 +00001042 return APInt(BitWidth, results[ (isSingleWord() ? U.VAL : U.pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001043 }
1044
1045 // If the magnitude of the value fits in less than 52 bits (the precision of
1046 // an IEEE double precision floating point value), then we can use the
1047 // libc sqrt function which will probably use a hardware sqrt computation.
1048 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001049 if (magnitude < 52) {
Eric Christopher820256b2009-08-21 04:06:45 +00001050 return APInt(BitWidth,
Craig Topperb339c6d2017-05-03 15:46:24 +00001051 uint64_t(::round(::sqrt(double(isSingleWord() ? U.VAL
1052 : U.pVal[0])))));
Jeff Cohenb622c112007-03-05 00:00:42 +00001053 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001054
1055 // Okay, all the short cuts are exhausted. We must compute it. The following
1056 // is a classical Babylonian method for computing the square root. This code
Sanjay Patel4cb54e02014-09-11 15:41:01 +00001057 // was adapted to APInt from a wikipedia article on such computations.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001058 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001059 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001060 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001061 APInt testy(BitWidth, 16);
1062 APInt x_old(BitWidth, 1);
1063 APInt x_new(BitWidth, 0);
1064 APInt two(BitWidth, 2);
1065
1066 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001067 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001068 if (i >= nbits || this->ule(testy)) {
1069 x_old = x_old.shl(i / 2);
1070 break;
1071 }
1072
Eric Christopher820256b2009-08-21 04:06:45 +00001073 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001074 for (;;) {
1075 x_new = (this->udiv(x_old) + x_old).udiv(two);
1076 if (x_old.ule(x_new))
1077 break;
1078 x_old = x_new;
1079 }
1080
1081 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001082 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001083 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001084 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001085 // floating point representation after 192 bits. There are no discrepancies
1086 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001087 APInt square(x_old * x_old);
1088 APInt nextSquare((x_old + 1) * (x_old +1));
1089 if (this->ult(square))
1090 return x_old;
David Blaikie54c94622011-12-01 20:58:30 +00001091 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1092 APInt midpoint((nextSquare - square).udiv(two));
1093 APInt offset(*this - square);
1094 if (offset.ult(midpoint))
1095 return x_old;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001096 return x_old + 1;
1097}
1098
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001099/// Computes the multiplicative inverse of this APInt for a given modulo. The
1100/// iterative extended Euclidean algorithm is used to solve for this value,
1101/// however we simplify it to speed up calculating only the inverse, and take
1102/// advantage of div+rem calculations. We also use some tricks to avoid copying
1103/// (potentially large) APInts around.
1104APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1105 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1106
1107 // Using the properties listed at the following web page (accessed 06/21/08):
1108 // http://www.numbertheory.org/php/euclid.html
1109 // (especially the properties numbered 3, 4 and 9) it can be proved that
1110 // BitWidth bits suffice for all the computations in the algorithm implemented
1111 // below. More precisely, this number of bits suffice if the multiplicative
1112 // inverse exists, but may not suffice for the general extended Euclidean
1113 // algorithm.
1114
1115 APInt r[2] = { modulo, *this };
1116 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1117 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001118
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001119 unsigned i;
1120 for (i = 0; r[i^1] != 0; i ^= 1) {
1121 // An overview of the math without the confusing bit-flipping:
1122 // q = r[i-2] / r[i-1]
1123 // r[i] = r[i-2] % r[i-1]
1124 // t[i] = t[i-2] - t[i-1] * q
1125 udivrem(r[i], r[i^1], q, r[i]);
1126 t[i] -= t[i^1] * q;
1127 }
1128
1129 // If this APInt and the modulo are not coprime, there is no multiplicative
1130 // inverse, so return 0. We check this by looking at the next-to-last
1131 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1132 // algorithm.
1133 if (r[i] != 1)
1134 return APInt(BitWidth, 0);
1135
1136 // The next-to-last t is the multiplicative inverse. However, we are
Craig Topper3fbecad2017-05-11 17:57:43 +00001137 // interested in a positive inverse. Calculate a positive one from a negative
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001138 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001139 // abs(t[i]) is known to be less than *this/2 (see the link above).
Craig Topperdbd62192017-05-11 18:40:53 +00001140 if (t[i].isNegative())
1141 t[i] += modulo;
1142
1143 return std::move(t[i]);
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001144}
1145
Jay Foadfe0c6482009-04-30 10:15:35 +00001146/// Calculate the magic numbers required to implement a signed integer division
1147/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1148/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1149/// Warren, Jr., chapter 10.
1150APInt::ms APInt::magic() const {
1151 const APInt& d = *this;
1152 unsigned p;
1153 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001154 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001155 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001156
Jay Foadfe0c6482009-04-30 10:15:35 +00001157 ad = d.abs();
1158 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1159 anc = t - 1 - t.urem(ad); // absolute value of nc
1160 p = d.getBitWidth() - 1; // initialize p
1161 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1162 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1163 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1164 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1165 do {
1166 p = p + 1;
1167 q1 = q1<<1; // update q1 = 2p/abs(nc)
1168 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1169 if (r1.uge(anc)) { // must be unsigned comparison
1170 q1 = q1 + 1;
1171 r1 = r1 - anc;
1172 }
1173 q2 = q2<<1; // update q2 = 2p/abs(d)
1174 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1175 if (r2.uge(ad)) { // must be unsigned comparison
1176 q2 = q2 + 1;
1177 r2 = r2 - ad;
1178 }
1179 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001180 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001181
Jay Foadfe0c6482009-04-30 10:15:35 +00001182 mag.m = q2 + 1;
1183 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1184 mag.s = p - d.getBitWidth(); // resulting shift
1185 return mag;
1186}
1187
1188/// Calculate the magic numbers required to implement an unsigned integer
1189/// division by a constant as a sequence of multiplies, adds and shifts.
1190/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1191/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001192/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001193/// of the divided value are known zero.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001194APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001195 const APInt& d = *this;
1196 unsigned p;
1197 APInt nc, delta, q1, r1, q2, r2;
1198 struct mu magu;
1199 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001200 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001201 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1202 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1203
Benjamin Kramer3aab6a82012-07-11 18:31:59 +00001204 nc = allOnes - (allOnes - d).urem(d);
Jay Foadfe0c6482009-04-30 10:15:35 +00001205 p = d.getBitWidth() - 1; // initialize p
1206 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1207 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1208 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1209 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1210 do {
1211 p = p + 1;
1212 if (r1.uge(nc - r1)) {
1213 q1 = q1 + q1 + 1; // update q1
1214 r1 = r1 + r1 - nc; // update r1
1215 }
1216 else {
1217 q1 = q1+q1; // update q1
1218 r1 = r1+r1; // update r1
1219 }
1220 if ((r2 + 1).uge(d - r2)) {
1221 if (q2.uge(signedMax)) magu.a = 1;
1222 q2 = q2+q2 + 1; // update q2
1223 r2 = r2+r2 + 1 - d; // update r2
1224 }
1225 else {
1226 if (q2.uge(signedMin)) magu.a = 1;
1227 q2 = q2+q2; // update q2
1228 r2 = r2+r2 + 1; // update r2
1229 }
1230 delta = d - 1 - r2;
1231 } while (p < d.getBitWidth()*2 &&
1232 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1233 magu.m = q2 + 1; // resulting magic number
1234 magu.s = p - d.getBitWidth(); // resulting shift
1235 return magu;
1236}
1237
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001238/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1239/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1240/// variables here have the same names as in the algorithm. Comments explain
1241/// the algorithm and any deviation from it.
Craig Topper6271bc72017-05-10 18:15:20 +00001242static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r,
Chris Lattner77527f52009-01-21 18:09:24 +00001243 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001244 assert(u && "Must provide dividend");
1245 assert(v && "Must provide divisor");
1246 assert(q && "Must provide quotient");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001247 assert(u != v && u != q && v != q && "Must use different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001248 assert(n>1 && "n must be > 1");
1249
Yaron Keren39fc5a62015-03-26 19:45:19 +00001250 // b denotes the base of the number system. In our case b is 2^32.
George Burgess IV381fc0e2016-08-25 01:05:08 +00001251 const uint64_t b = uint64_t(1) << 32;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001252
Craig Topper03106bb2017-11-24 20:29:04 +00001253// The DEBUG macros here tend to be spam in the debug output if you're not
1254// debugging this code. Disable them unless KNUTH_DEBUG is defined.
1255#pragma push_macro("DEBUG")
1256#ifndef KNUTH_DEBUG
1257#undef DEBUG
1258#define DEBUG(X) do {} while (false)
1259#endif
1260
David Greenef32fcb42010-01-05 01:28:52 +00001261 DEBUG(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1262 DEBUG(dbgs() << "KnuthDiv: original:");
1263 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1264 DEBUG(dbgs() << " by");
1265 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1266 DEBUG(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001267 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1268 // u and v by d. Note that we have taken Knuth's advice here to use a power
1269 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1270 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001271 // shift amount from the leading zeros. We are basically normalizing the u
1272 // and v so that its high bits are shifted to the top of v's range without
1273 // overflow. Note that this can require an extra word in u so that u must
1274 // be of length m+n+1.
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +00001275 unsigned shift = countLeadingZeros(v[n-1]);
Craig Topper6271bc72017-05-10 18:15:20 +00001276 uint32_t v_carry = 0;
1277 uint32_t u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001278 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001279 for (unsigned i = 0; i < m+n; ++i) {
Craig Topper6271bc72017-05-10 18:15:20 +00001280 uint32_t u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001281 u[i] = (u[i] << shift) | u_carry;
1282 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001283 }
Chris Lattner77527f52009-01-21 18:09:24 +00001284 for (unsigned i = 0; i < n; ++i) {
Craig Topper6271bc72017-05-10 18:15:20 +00001285 uint32_t v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001286 v[i] = (v[i] << shift) | v_carry;
1287 v_carry = v_tmp;
1288 }
1289 }
1290 u[m+n] = u_carry;
Yaron Keren39fc5a62015-03-26 19:45:19 +00001291
David Greenef32fcb42010-01-05 01:28:52 +00001292 DEBUG(dbgs() << "KnuthDiv: normal:");
1293 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1294 DEBUG(dbgs() << " by");
1295 DEBUG(for (int i = n; i >0; i--) dbgs() << " " << v[i-1]);
1296 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001297
1298 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1299 int j = m;
1300 do {
David Greenef32fcb42010-01-05 01:28:52 +00001301 DEBUG(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001302 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001303 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1304 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1305 // Now test if qp == b or qp*v[n-2] > b*rp + u[j+n-2]; if so, decrease
Craig Topper4b83b4d2017-05-13 00:35:30 +00001306 // qp by 1, increase rp by v[n-1], and repeat this test if rp < b. The test
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001307 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001308 // value qp is one too large, and it eliminates all cases where qp is two
1309 // too large.
Craig Topper2c9a7062017-05-13 07:14:17 +00001310 uint64_t dividend = Make_64(u[j+n], u[j+n-1]);
David Greenef32fcb42010-01-05 01:28:52 +00001311 DEBUG(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001312 uint64_t qp = dividend / v[n-1];
1313 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001314 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1315 qp--;
1316 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001317 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001318 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001319 }
David Greenef32fcb42010-01-05 01:28:52 +00001320 DEBUG(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001321
Reid Spencercb292e42007-02-23 01:57:13 +00001322 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1323 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1324 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001325 // a subtraction.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001326 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1327 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1328 // true value plus b**(n+1), namely as the b's complement of
1329 // the true value, and a "borrow" to the left should be remembered.
Pawel Bylica86ac4472015-04-24 07:38:39 +00001330 int64_t borrow = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001331 for (unsigned i = 0; i < n; ++i) {
Pawel Bylica86ac4472015-04-24 07:38:39 +00001332 uint64_t p = uint64_t(qp) * uint64_t(v[i]);
Craig Topper2c9a7062017-05-13 07:14:17 +00001333 int64_t subres = int64_t(u[j+i]) - borrow - Lo_32(p);
1334 u[j+i] = Lo_32(subres);
1335 borrow = Hi_32(p) - Hi_32(subres);
Pawel Bylica86ac4472015-04-24 07:38:39 +00001336 DEBUG(dbgs() << "KnuthDiv: u[j+i] = " << u[j+i]
Daniel Dunbar763ace92009-07-13 05:27:30 +00001337 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001338 }
Pawel Bylica86ac4472015-04-24 07:38:39 +00001339 bool isNeg = u[j+n] < borrow;
Craig Topper2c9a7062017-05-13 07:14:17 +00001340 u[j+n] -= Lo_32(borrow);
Pawel Bylica86ac4472015-04-24 07:38:39 +00001341
David Greenef32fcb42010-01-05 01:28:52 +00001342 DEBUG(dbgs() << "KnuthDiv: after subtraction:");
1343 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
1344 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001345
Eric Christopher820256b2009-08-21 04:06:45 +00001346 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001347 // negative, go to step D6; otherwise go on to step D7.
Craig Topper2c9a7062017-05-13 07:14:17 +00001348 q[j] = Lo_32(qp);
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001349 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001350 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001351 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001352 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001353 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001354 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1355 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001356 // since it cancels with the borrow that occurred in D4.
1357 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001358 for (unsigned i = 0; i < n; i++) {
Craig Topper6271bc72017-05-10 18:15:20 +00001359 uint32_t limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001360 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001361 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001362 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001363 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001364 }
David Greenef32fcb42010-01-05 01:28:52 +00001365 DEBUG(dbgs() << "KnuthDiv: after correction:");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001366 DEBUG(for (int i = m+n; i >=0; i--) dbgs() << " " << u[i]);
David Greenef32fcb42010-01-05 01:28:52 +00001367 DEBUG(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001368
Reid Spencercb292e42007-02-23 01:57:13 +00001369 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
1370 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001371
David Greenef32fcb42010-01-05 01:28:52 +00001372 DEBUG(dbgs() << "KnuthDiv: quotient:");
1373 DEBUG(for (int i = m; i >=0; i--) dbgs() <<" " << q[i]);
1374 DEBUG(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001375
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001376 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1377 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1378 // compute the remainder (urem uses this).
1379 if (r) {
1380 // The value d is expressed by the "shift" value above since we avoided
1381 // multiplication by d by using a shift left. So, all we have to do is
Simon Pilgrim0099beb2017-03-09 13:57:04 +00001382 // shift right here.
Reid Spencer468ad9112007-02-24 20:38:01 +00001383 if (shift) {
Craig Topper6271bc72017-05-10 18:15:20 +00001384 uint32_t carry = 0;
David Greenef32fcb42010-01-05 01:28:52 +00001385 DEBUG(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001386 for (int i = n-1; i >= 0; i--) {
1387 r[i] = (u[i] >> shift) | carry;
1388 carry = u[i] << (32 - shift);
David Greenef32fcb42010-01-05 01:28:52 +00001389 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001390 }
1391 } else {
1392 for (int i = n-1; i >= 0; i--) {
1393 r[i] = u[i];
David Greenef32fcb42010-01-05 01:28:52 +00001394 DEBUG(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001395 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001396 }
David Greenef32fcb42010-01-05 01:28:52 +00001397 DEBUG(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001398 }
David Greenef32fcb42010-01-05 01:28:52 +00001399 DEBUG(dbgs() << '\n');
Craig Topper03106bb2017-11-24 20:29:04 +00001400
1401#pragma pop_macro("DEBUG")
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001402}
1403
Craig Topper8885f932017-05-19 16:43:54 +00001404void APInt::divide(const WordType *LHS, unsigned lhsWords, const WordType *RHS,
1405 unsigned rhsWords, WordType *Quotient, WordType *Remainder) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001406 assert(lhsWords >= rhsWords && "Fractional result");
1407
Eric Christopher820256b2009-08-21 04:06:45 +00001408 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001409 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001410 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001411 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1412 // can't use 64-bit operands here because we don't have native results of
1413 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001414 // work on large-endian machines.
Chris Lattner77527f52009-01-21 18:09:24 +00001415 unsigned n = rhsWords * 2;
1416 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001417
1418 // Allocate space for the temporary values we need either on the stack, if
1419 // it will fit, or on the heap if it won't.
Craig Topper6271bc72017-05-10 18:15:20 +00001420 uint32_t SPACE[128];
1421 uint32_t *U = nullptr;
1422 uint32_t *V = nullptr;
1423 uint32_t *Q = nullptr;
1424 uint32_t *R = nullptr;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001425 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1426 U = &SPACE[0];
1427 V = &SPACE[m+n+1];
1428 Q = &SPACE[(m+n+1) + n];
1429 if (Remainder)
1430 R = &SPACE[(m+n+1) + n + (m+n)];
1431 } else {
Craig Topper6271bc72017-05-10 18:15:20 +00001432 U = new uint32_t[m + n + 1];
1433 V = new uint32_t[n];
1434 Q = new uint32_t[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001435 if (Remainder)
Craig Topper6271bc72017-05-10 18:15:20 +00001436 R = new uint32_t[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001437 }
1438
1439 // Initialize the dividend
Craig Topper6271bc72017-05-10 18:15:20 +00001440 memset(U, 0, (m+n+1)*sizeof(uint32_t));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001441 for (unsigned i = 0; i < lhsWords; ++i) {
Craig Topper8885f932017-05-19 16:43:54 +00001442 uint64_t tmp = LHS[i];
Craig Topper6271bc72017-05-10 18:15:20 +00001443 U[i * 2] = Lo_32(tmp);
1444 U[i * 2 + 1] = Hi_32(tmp);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001445 }
1446 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1447
Reid Spencer522ca7c2007-02-25 01:56:07 +00001448 // Initialize the divisor
Craig Topper6271bc72017-05-10 18:15:20 +00001449 memset(V, 0, (n)*sizeof(uint32_t));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001450 for (unsigned i = 0; i < rhsWords; ++i) {
Craig Topper8885f932017-05-19 16:43:54 +00001451 uint64_t tmp = RHS[i];
Craig Topper6271bc72017-05-10 18:15:20 +00001452 V[i * 2] = Lo_32(tmp);
1453 V[i * 2 + 1] = Hi_32(tmp);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001454 }
1455
Reid Spencer522ca7c2007-02-25 01:56:07 +00001456 // initialize the quotient and remainder
Craig Topper6271bc72017-05-10 18:15:20 +00001457 memset(Q, 0, (m+n) * sizeof(uint32_t));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001458 if (Remainder)
Craig Topper6271bc72017-05-10 18:15:20 +00001459 memset(R, 0, n * sizeof(uint32_t));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001460
Eric Christopher820256b2009-08-21 04:06:45 +00001461 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001462 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001463 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001464 // contain any zero words or the Knuth algorithm fails.
1465 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1466 n--;
1467 m++;
1468 }
1469 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1470 m--;
1471
1472 // If we're left with only a single word for the divisor, Knuth doesn't work
1473 // so we implement the short division algorithm here. This is much simpler
1474 // and faster because we are certain that we can divide a 64-bit quantity
1475 // by a 32-bit quantity at hardware speed and short division is simply a
1476 // series of such operations. This is just like doing short division but we
1477 // are using base 2^32 instead of base 10.
1478 assert(n != 0 && "Divide by zero?");
1479 if (n == 1) {
Craig Topper6271bc72017-05-10 18:15:20 +00001480 uint32_t divisor = V[0];
1481 uint32_t remainder = 0;
Craig Topper6a1d0202017-05-15 22:01:03 +00001482 for (int i = m; i >= 0; i--) {
Craig Topper6271bc72017-05-10 18:15:20 +00001483 uint64_t partial_dividend = Make_64(remainder, U[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001484 if (partial_dividend == 0) {
1485 Q[i] = 0;
1486 remainder = 0;
1487 } else if (partial_dividend < divisor) {
1488 Q[i] = 0;
Craig Topper6271bc72017-05-10 18:15:20 +00001489 remainder = Lo_32(partial_dividend);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001490 } else if (partial_dividend == divisor) {
1491 Q[i] = 1;
1492 remainder = 0;
1493 } else {
Craig Topper6271bc72017-05-10 18:15:20 +00001494 Q[i] = Lo_32(partial_dividend / divisor);
1495 remainder = Lo_32(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001496 }
1497 }
1498 if (R)
1499 R[0] = remainder;
1500 } else {
1501 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1502 // case n > 1.
1503 KnuthDiv(U, V, Q, R, m, n);
1504 }
1505
1506 // If the caller wants the quotient
1507 if (Quotient) {
Craig Topper8885f932017-05-19 16:43:54 +00001508 for (unsigned i = 0; i < lhsWords; ++i)
1509 Quotient[i] = Make_64(Q[i*2+1], Q[i*2]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001510 }
1511
1512 // If the caller wants the remainder
1513 if (Remainder) {
Craig Topper8885f932017-05-19 16:43:54 +00001514 for (unsigned i = 0; i < rhsWords; ++i)
1515 Remainder[i] = Make_64(R[i*2+1], R[i*2]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001516 }
1517
1518 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001519 if (U != &SPACE[0]) {
1520 delete [] U;
1521 delete [] V;
1522 delete [] Q;
1523 delete [] R;
1524 }
Reid Spencer100502d2007-02-17 03:16:00 +00001525}
1526
Craig Topper8885f932017-05-19 16:43:54 +00001527APInt APInt::udiv(const APInt &RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001528 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001529
1530 // First, deal with the easy case
1531 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +00001532 assert(RHS.U.VAL != 0 && "Divide by zero?");
1533 return APInt(BitWidth, U.VAL / RHS.U.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001534 }
Reid Spencer39867762007-02-17 02:07:07 +00001535
Reid Spencer39867762007-02-17 02:07:07 +00001536 // Get some facts about the LHS and RHS number of bits and words
Craig Topper62de0392017-05-10 07:50:15 +00001537 unsigned lhsWords = getNumWords(getActiveBits());
Craig Topperb1a71ca2017-05-12 21:45:50 +00001538 unsigned rhsBits = RHS.getActiveBits();
1539 unsigned rhsWords = getNumWords(rhsBits);
1540 assert(rhsWords && "Divided by zero???");
Reid Spencer39867762007-02-17 02:07:07 +00001541
1542 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001543 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001544 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001545 return APInt(BitWidth, 0);
Craig Topperb1a71ca2017-05-12 21:45:50 +00001546 if (rhsBits == 1)
1547 // X / 1 ===> X
1548 return *this;
Craig Topper24ae6952017-05-08 23:49:49 +00001549 if (lhsWords < rhsWords || this->ult(RHS))
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001550 // X / Y ===> 0, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001551 return APInt(BitWidth, 0);
Craig Topper24ae6952017-05-08 23:49:49 +00001552 if (*this == RHS)
Reid Spencer58a6a432007-02-21 08:21:52 +00001553 // X / X ===> 1
1554 return APInt(BitWidth, 1);
Craig Topper06da0812017-05-12 18:18:57 +00001555 if (lhsWords == 1) // rhsWords is 1 if lhsWords is 1.
Reid Spencer39867762007-02-17 02:07:07 +00001556 // All high words are zero, just use native divide
Craig Topperb339c6d2017-05-03 15:46:24 +00001557 return APInt(BitWidth, this->U.pVal[0] / RHS.U.pVal[0]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001558
1559 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Craig Topper8885f932017-05-19 16:43:54 +00001560 APInt Quotient(BitWidth, 0); // to hold result.
1561 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.pVal, nullptr);
1562 return Quotient;
1563}
1564
1565APInt APInt::udiv(uint64_t RHS) const {
1566 assert(RHS != 0 && "Divide by zero?");
1567
1568 // First, deal with the easy case
1569 if (isSingleWord())
1570 return APInt(BitWidth, U.VAL / RHS);
1571
1572 // Get some facts about the LHS words.
1573 unsigned lhsWords = getNumWords(getActiveBits());
1574
1575 // Deal with some degenerate cases
1576 if (!lhsWords)
1577 // 0 / X ===> 0
1578 return APInt(BitWidth, 0);
1579 if (RHS == 1)
1580 // X / 1 ===> X
1581 return *this;
1582 if (this->ult(RHS))
1583 // X / Y ===> 0, iff X < Y
1584 return APInt(BitWidth, 0);
1585 if (*this == RHS)
1586 // X / X ===> 1
1587 return APInt(BitWidth, 1);
1588 if (lhsWords == 1) // rhsWords is 1 if lhsWords is 1.
1589 // All high words are zero, just use native divide
1590 return APInt(BitWidth, this->U.pVal[0] / RHS);
1591
1592 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1593 APInt Quotient(BitWidth, 0); // to hold result.
1594 divide(U.pVal, lhsWords, &RHS, 1, Quotient.U.pVal, nullptr);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001595 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001596}
1597
Jakub Staszak6605c602013-02-20 00:17:42 +00001598APInt APInt::sdiv(const APInt &RHS) const {
1599 if (isNegative()) {
1600 if (RHS.isNegative())
1601 return (-(*this)).udiv(-RHS);
1602 return -((-(*this)).udiv(RHS));
1603 }
1604 if (RHS.isNegative())
1605 return -(this->udiv(-RHS));
1606 return this->udiv(RHS);
1607}
1608
Craig Topper8885f932017-05-19 16:43:54 +00001609APInt APInt::sdiv(int64_t RHS) const {
1610 if (isNegative()) {
1611 if (RHS < 0)
1612 return (-(*this)).udiv(-RHS);
1613 return -((-(*this)).udiv(RHS));
1614 }
1615 if (RHS < 0)
1616 return -(this->udiv(-RHS));
1617 return this->udiv(RHS);
1618}
1619
1620APInt APInt::urem(const APInt &RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001621 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001622 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +00001623 assert(RHS.U.VAL != 0 && "Remainder by zero?");
1624 return APInt(BitWidth, U.VAL % RHS.U.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001625 }
Reid Spencer39867762007-02-17 02:07:07 +00001626
Reid Spencer58a6a432007-02-21 08:21:52 +00001627 // Get some facts about the LHS
Craig Topper62de0392017-05-10 07:50:15 +00001628 unsigned lhsWords = getNumWords(getActiveBits());
Reid Spencer39867762007-02-17 02:07:07 +00001629
1630 // Get some facts about the RHS
Craig Topperb1a71ca2017-05-12 21:45:50 +00001631 unsigned rhsBits = RHS.getActiveBits();
1632 unsigned rhsWords = getNumWords(rhsBits);
Reid Spencer39867762007-02-17 02:07:07 +00001633 assert(rhsWords && "Performing remainder operation by zero ???");
1634
Reid Spencer39867762007-02-17 02:07:07 +00001635 // Check the degenerate cases
Craig Topper24ae6952017-05-08 23:49:49 +00001636 if (lhsWords == 0)
Reid Spencer58a6a432007-02-21 08:21:52 +00001637 // 0 % Y ===> 0
1638 return APInt(BitWidth, 0);
Craig Topperb1a71ca2017-05-12 21:45:50 +00001639 if (rhsBits == 1)
1640 // X % 1 ===> 0
1641 return APInt(BitWidth, 0);
Craig Topper24ae6952017-05-08 23:49:49 +00001642 if (lhsWords < rhsWords || this->ult(RHS))
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001643 // X % Y ===> X, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001644 return *this;
Craig Topper24ae6952017-05-08 23:49:49 +00001645 if (*this == RHS)
Reid Spencer39867762007-02-17 02:07:07 +00001646 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001647 return APInt(BitWidth, 0);
Craig Topper24ae6952017-05-08 23:49:49 +00001648 if (lhsWords == 1)
Reid Spencer39867762007-02-17 02:07:07 +00001649 // All high words are zero, just use native remainder
Craig Topperb339c6d2017-05-03 15:46:24 +00001650 return APInt(BitWidth, U.pVal[0] % RHS.U.pVal[0]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001651
Reid Spencer4c50b522007-05-13 23:44:59 +00001652 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Craig Topper8885f932017-05-19 16:43:54 +00001653 APInt Remainder(BitWidth, 0);
1654 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords, nullptr, Remainder.U.pVal);
1655 return Remainder;
1656}
1657
1658uint64_t APInt::urem(uint64_t RHS) const {
1659 assert(RHS != 0 && "Remainder by zero?");
1660
1661 if (isSingleWord())
1662 return U.VAL % RHS;
1663
1664 // Get some facts about the LHS
1665 unsigned lhsWords = getNumWords(getActiveBits());
1666
1667 // Check the degenerate cases
1668 if (lhsWords == 0)
1669 // 0 % Y ===> 0
1670 return 0;
1671 if (RHS == 1)
1672 // X % 1 ===> 0
1673 return 0;
1674 if (this->ult(RHS))
1675 // X % Y ===> X, iff X < Y
1676 return getZExtValue();
1677 if (*this == RHS)
1678 // X % X == 0;
1679 return 0;
1680 if (lhsWords == 1)
1681 // All high words are zero, just use native remainder
1682 return U.pVal[0] % RHS;
1683
1684 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1685 uint64_t Remainder;
1686 divide(U.pVal, lhsWords, &RHS, 1, nullptr, &Remainder);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001687 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001688}
Reid Spencer100502d2007-02-17 03:16:00 +00001689
Jakub Staszak6605c602013-02-20 00:17:42 +00001690APInt APInt::srem(const APInt &RHS) const {
1691 if (isNegative()) {
1692 if (RHS.isNegative())
1693 return -((-(*this)).urem(-RHS));
1694 return -((-(*this)).urem(RHS));
1695 }
1696 if (RHS.isNegative())
1697 return this->urem(-RHS);
1698 return this->urem(RHS);
1699}
1700
Craig Topper8885f932017-05-19 16:43:54 +00001701int64_t APInt::srem(int64_t RHS) const {
1702 if (isNegative()) {
1703 if (RHS < 0)
1704 return -((-(*this)).urem(-RHS));
1705 return -((-(*this)).urem(RHS));
1706 }
1707 if (RHS < 0)
1708 return this->urem(-RHS);
1709 return this->urem(RHS);
1710}
1711
Eric Christopher820256b2009-08-21 04:06:45 +00001712void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00001713 APInt &Quotient, APInt &Remainder) {
David Majnemer7f039202014-12-14 09:41:56 +00001714 assert(LHS.BitWidth == RHS.BitWidth && "Bit widths must be the same");
Craig Topper2579c7c2017-05-12 21:45:44 +00001715 unsigned BitWidth = LHS.BitWidth;
David Majnemer7f039202014-12-14 09:41:56 +00001716
1717 // First, deal with the easy case
1718 if (LHS.isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +00001719 assert(RHS.U.VAL != 0 && "Divide by zero?");
1720 uint64_t QuotVal = LHS.U.VAL / RHS.U.VAL;
1721 uint64_t RemVal = LHS.U.VAL % RHS.U.VAL;
Craig Topper2579c7c2017-05-12 21:45:44 +00001722 Quotient = APInt(BitWidth, QuotVal);
1723 Remainder = APInt(BitWidth, RemVal);
David Majnemer7f039202014-12-14 09:41:56 +00001724 return;
1725 }
1726
Reid Spencer4c50b522007-05-13 23:44:59 +00001727 // Get some size facts about the dividend and divisor
Craig Topper62de0392017-05-10 07:50:15 +00001728 unsigned lhsWords = getNumWords(LHS.getActiveBits());
Craig Topperb1a71ca2017-05-12 21:45:50 +00001729 unsigned rhsBits = RHS.getActiveBits();
1730 unsigned rhsWords = getNumWords(rhsBits);
Craig Topper4bdd6212017-05-12 18:19:01 +00001731 assert(rhsWords && "Performing divrem operation by zero ???");
Reid Spencer4c50b522007-05-13 23:44:59 +00001732
1733 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001734 if (lhsWords == 0) {
Reid Spencer4c50b522007-05-13 23:44:59 +00001735 Quotient = 0; // 0 / Y ===> 0
1736 Remainder = 0; // 0 % Y ===> 0
1737 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001738 }
1739
Craig Topperb1a71ca2017-05-12 21:45:50 +00001740 if (rhsBits == 1) {
1741 Quotient = LHS; // X / 1 ===> X
1742 Remainder = 0; // X % 1 ===> 0
1743 }
1744
Eric Christopher820256b2009-08-21 04:06:45 +00001745 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001746 Remainder = LHS; // X % Y ===> X, iff X < Y
1747 Quotient = 0; // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00001748 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001749 }
1750
Reid Spencer4c50b522007-05-13 23:44:59 +00001751 if (LHS == RHS) {
1752 Quotient = 1; // X / X ===> 1
1753 Remainder = 0; // X % X ===> 0;
1754 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001755 }
1756
Craig Topper8885f932017-05-19 16:43:54 +00001757 // Make sure there is enough space to hold the results.
1758 // NOTE: This assumes that reallocate won't affect any bits if it doesn't
1759 // change the size. This is necessary if Quotient or Remainder is aliased
1760 // with LHS or RHS.
1761 Quotient.reallocate(BitWidth);
1762 Remainder.reallocate(BitWidth);
1763
Craig Topper06da0812017-05-12 18:18:57 +00001764 if (lhsWords == 1) { // rhsWords is 1 if lhsWords is 1.
Reid Spencer4c50b522007-05-13 23:44:59 +00001765 // There is only one word to consider so use the native versions.
Craig Topper93eabae2017-05-10 18:15:14 +00001766 uint64_t lhsValue = LHS.U.pVal[0];
1767 uint64_t rhsValue = RHS.U.pVal[0];
Craig Topper87694032017-05-12 07:21:09 +00001768 Quotient = lhsValue / rhsValue;
1769 Remainder = lhsValue % rhsValue;
Reid Spencer4c50b522007-05-13 23:44:59 +00001770 return;
1771 }
1772
1773 // Okay, lets do it the long way
Craig Topper8885f932017-05-19 16:43:54 +00001774 divide(LHS.U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.pVal,
1775 Remainder.U.pVal);
1776 // Clear the rest of the Quotient and Remainder.
1777 std::memset(Quotient.U.pVal + lhsWords, 0,
1778 (getNumWords(BitWidth) - lhsWords) * APINT_WORD_SIZE);
1779 std::memset(Remainder.U.pVal + rhsWords, 0,
1780 (getNumWords(BitWidth) - rhsWords) * APINT_WORD_SIZE);
1781}
1782
1783void APInt::udivrem(const APInt &LHS, uint64_t RHS, APInt &Quotient,
1784 uint64_t &Remainder) {
1785 assert(RHS != 0 && "Divide by zero?");
1786 unsigned BitWidth = LHS.BitWidth;
1787
1788 // First, deal with the easy case
1789 if (LHS.isSingleWord()) {
1790 uint64_t QuotVal = LHS.U.VAL / RHS;
1791 Remainder = LHS.U.VAL % RHS;
1792 Quotient = APInt(BitWidth, QuotVal);
1793 return;
1794 }
1795
1796 // Get some size facts about the dividend and divisor
1797 unsigned lhsWords = getNumWords(LHS.getActiveBits());
1798
1799 // Check the degenerate cases
1800 if (lhsWords == 0) {
1801 Quotient = 0; // 0 / Y ===> 0
1802 Remainder = 0; // 0 % Y ===> 0
1803 return;
1804 }
1805
1806 if (RHS == 1) {
1807 Quotient = LHS; // X / 1 ===> X
1808 Remainder = 0; // X % 1 ===> 0
1809 }
1810
1811 if (LHS.ult(RHS)) {
1812 Remainder = LHS.getZExtValue(); // X % Y ===> X, iff X < Y
1813 Quotient = 0; // X / Y ===> 0, iff X < Y
1814 return;
1815 }
1816
1817 if (LHS == RHS) {
1818 Quotient = 1; // X / X ===> 1
1819 Remainder = 0; // X % X ===> 0;
1820 return;
1821 }
1822
1823 // Make sure there is enough space to hold the results.
1824 // NOTE: This assumes that reallocate won't affect any bits if it doesn't
1825 // change the size. This is necessary if Quotient is aliased with LHS.
1826 Quotient.reallocate(BitWidth);
1827
1828 if (lhsWords == 1) { // rhsWords is 1 if lhsWords is 1.
1829 // There is only one word to consider so use the native versions.
1830 uint64_t lhsValue = LHS.U.pVal[0];
1831 Quotient = lhsValue / RHS;
1832 Remainder = lhsValue % RHS;
1833 return;
1834 }
1835
1836 // Okay, lets do it the long way
1837 divide(LHS.U.pVal, lhsWords, &RHS, 1, Quotient.U.pVal, &Remainder);
1838 // Clear the rest of the Quotient.
1839 std::memset(Quotient.U.pVal + lhsWords, 0,
1840 (getNumWords(BitWidth) - lhsWords) * APINT_WORD_SIZE);
Reid Spencer4c50b522007-05-13 23:44:59 +00001841}
1842
Jakub Staszak6605c602013-02-20 00:17:42 +00001843void APInt::sdivrem(const APInt &LHS, const APInt &RHS,
1844 APInt &Quotient, APInt &Remainder) {
1845 if (LHS.isNegative()) {
1846 if (RHS.isNegative())
1847 APInt::udivrem(-LHS, -RHS, Quotient, Remainder);
1848 else {
1849 APInt::udivrem(-LHS, RHS, Quotient, Remainder);
Craig Topperb3c1f562017-05-11 07:02:04 +00001850 Quotient.negate();
Jakub Staszak6605c602013-02-20 00:17:42 +00001851 }
Craig Topperb3c1f562017-05-11 07:02:04 +00001852 Remainder.negate();
Jakub Staszak6605c602013-02-20 00:17:42 +00001853 } else if (RHS.isNegative()) {
1854 APInt::udivrem(LHS, -RHS, Quotient, Remainder);
Craig Topperb3c1f562017-05-11 07:02:04 +00001855 Quotient.negate();
Jakub Staszak6605c602013-02-20 00:17:42 +00001856 } else {
1857 APInt::udivrem(LHS, RHS, Quotient, Remainder);
1858 }
1859}
1860
Craig Topper8885f932017-05-19 16:43:54 +00001861void APInt::sdivrem(const APInt &LHS, int64_t RHS,
1862 APInt &Quotient, int64_t &Remainder) {
1863 uint64_t R = Remainder;
1864 if (LHS.isNegative()) {
1865 if (RHS < 0)
1866 APInt::udivrem(-LHS, -RHS, Quotient, R);
1867 else {
1868 APInt::udivrem(-LHS, RHS, Quotient, R);
1869 Quotient.negate();
1870 }
1871 R = -R;
1872 } else if (RHS < 0) {
1873 APInt::udivrem(LHS, -RHS, Quotient, R);
1874 Quotient.negate();
1875 } else {
1876 APInt::udivrem(LHS, RHS, Quotient, R);
1877 }
1878 Remainder = R;
1879}
1880
Chris Lattner2c819b02010-10-13 23:54:10 +00001881APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001882 APInt Res = *this+RHS;
1883 Overflow = isNonNegative() == RHS.isNonNegative() &&
1884 Res.isNonNegative() != isNonNegative();
1885 return Res;
1886}
1887
Chris Lattner698661c2010-10-14 00:05:07 +00001888APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
1889 APInt Res = *this+RHS;
1890 Overflow = Res.ult(RHS);
1891 return Res;
1892}
1893
Chris Lattner2c819b02010-10-13 23:54:10 +00001894APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001895 APInt Res = *this - RHS;
1896 Overflow = isNonNegative() != RHS.isNonNegative() &&
1897 Res.isNonNegative() != isNonNegative();
1898 return Res;
1899}
1900
Chris Lattner698661c2010-10-14 00:05:07 +00001901APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00001902 APInt Res = *this-RHS;
1903 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00001904 return Res;
1905}
1906
Chris Lattner2c819b02010-10-13 23:54:10 +00001907APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001908 // MININT/-1 --> overflow.
1909 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
1910 return sdiv(RHS);
1911}
1912
Chris Lattner2c819b02010-10-13 23:54:10 +00001913APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001914 APInt Res = *this * RHS;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00001915
Chris Lattner79bdd882010-10-13 23:46:33 +00001916 if (*this != 0 && RHS != 0)
1917 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
1918 else
1919 Overflow = false;
1920 return Res;
1921}
1922
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00001923APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
1924 APInt Res = *this * RHS;
1925
1926 if (*this != 0 && RHS != 0)
1927 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
1928 else
1929 Overflow = false;
1930 return Res;
1931}
1932
David Majnemera2521382014-10-13 21:48:30 +00001933APInt APInt::sshl_ov(const APInt &ShAmt, bool &Overflow) const {
1934 Overflow = ShAmt.uge(getBitWidth());
Chris Lattner79bdd882010-10-13 23:46:33 +00001935 if (Overflow)
David Majnemera2521382014-10-13 21:48:30 +00001936 return APInt(BitWidth, 0);
Chris Lattner79bdd882010-10-13 23:46:33 +00001937
1938 if (isNonNegative()) // Don't allow sign change.
David Majnemera2521382014-10-13 21:48:30 +00001939 Overflow = ShAmt.uge(countLeadingZeros());
Chris Lattner79bdd882010-10-13 23:46:33 +00001940 else
David Majnemera2521382014-10-13 21:48:30 +00001941 Overflow = ShAmt.uge(countLeadingOnes());
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00001942
Chris Lattner79bdd882010-10-13 23:46:33 +00001943 return *this << ShAmt;
1944}
1945
David Majnemera2521382014-10-13 21:48:30 +00001946APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const {
1947 Overflow = ShAmt.uge(getBitWidth());
1948 if (Overflow)
1949 return APInt(BitWidth, 0);
1950
1951 Overflow = ShAmt.ugt(countLeadingZeros());
1952
1953 return *this << ShAmt;
1954}
1955
Chris Lattner79bdd882010-10-13 23:46:33 +00001956
1957
1958
Benjamin Kramer92d89982010-07-14 22:38:02 +00001959void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00001960 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00001961 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00001962 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00001963 radix == 36) &&
1964 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00001965
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001966 StringRef::iterator p = str.begin();
1967 size_t slen = str.size();
1968 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00001969 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001970 p++;
1971 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00001972 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001973 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00001974 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00001975 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
1976 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00001977 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
1978 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00001979
Craig Topperb339c6d2017-05-03 15:46:24 +00001980 // Allocate memory if needed
1981 if (isSingleWord())
1982 U.VAL = 0;
1983 else
1984 U.pVal = getClearedMemory(getNumWords());
Reid Spencer1ba83352007-02-21 03:55:44 +00001985
1986 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00001987 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00001988
Reid Spencer1ba83352007-02-21 03:55:44 +00001989 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001990 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00001991 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00001992 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00001993
Reid Spencera93c9812007-05-16 19:18:22 +00001994 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00001995 if (slen > 1) {
1996 if (shift)
1997 *this <<= shift;
1998 else
Craig Topperf15bec52017-05-08 04:55:12 +00001999 *this *= radix;
Chris Lattnerb869a0a2009-04-25 18:34:04 +00002000 }
Reid Spencer1ba83352007-02-21 03:55:44 +00002001
2002 // Add in the digit we just interpreted
Craig Topperb7d8faa2017-04-02 06:59:38 +00002003 *this += digit;
Reid Spencer100502d2007-02-17 03:16:00 +00002004 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00002005 // If its negative, put it in two's complement form
Craig Topperef0114c2017-05-10 20:01:38 +00002006 if (isNeg)
2007 this->negate();
Reid Spencer100502d2007-02-17 03:16:00 +00002008}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002009
Chris Lattner17f71652008-08-17 07:19:36 +00002010void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002011 bool Signed, bool formatAsCLiteral) const {
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002012 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002013 Radix == 36) &&
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002014 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopher820256b2009-08-21 04:06:45 +00002015
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002016 const char *Prefix = "";
2017 if (formatAsCLiteral) {
2018 switch (Radix) {
2019 case 2:
2020 // Binary literals are a non-standard extension added in gcc 4.3:
2021 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2022 Prefix = "0b";
2023 break;
2024 case 8:
2025 Prefix = "0";
2026 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002027 case 10:
2028 break; // No prefix
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002029 case 16:
2030 Prefix = "0x";
2031 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002032 default:
2033 llvm_unreachable("Invalid radix!");
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002034 }
2035 }
2036
Chris Lattner17f71652008-08-17 07:19:36 +00002037 // First, check for a zero value and just short circuit the logic below.
2038 if (*this == 0) {
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002039 while (*Prefix) {
2040 Str.push_back(*Prefix);
2041 ++Prefix;
2042 };
Chris Lattner17f71652008-08-17 07:19:36 +00002043 Str.push_back('0');
2044 return;
2045 }
Eric Christopher820256b2009-08-21 04:06:45 +00002046
Douglas Gregor663c0682011-09-14 15:54:46 +00002047 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopher820256b2009-08-21 04:06:45 +00002048
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002049 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002050 char Buffer[65];
Craig Toppere6a23182017-05-24 07:00:55 +00002051 char *BufPtr = std::end(Buffer);
Eric Christopher820256b2009-08-21 04:06:45 +00002052
Chris Lattner17f71652008-08-17 07:19:36 +00002053 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002054 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002055 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002056 } else {
2057 int64_t I = getSExtValue();
2058 if (I >= 0) {
2059 N = I;
2060 } else {
2061 Str.push_back('-');
2062 N = -(uint64_t)I;
2063 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002064 }
Eric Christopher820256b2009-08-21 04:06:45 +00002065
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002066 while (*Prefix) {
2067 Str.push_back(*Prefix);
2068 ++Prefix;
2069 };
2070
Chris Lattner17f71652008-08-17 07:19:36 +00002071 while (N) {
2072 *--BufPtr = Digits[N % Radix];
2073 N /= Radix;
2074 }
Craig Toppere6a23182017-05-24 07:00:55 +00002075 Str.append(BufPtr, std::end(Buffer));
Chris Lattner17f71652008-08-17 07:19:36 +00002076 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002077 }
2078
Chris Lattner17f71652008-08-17 07:19:36 +00002079 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002080
Chris Lattner17f71652008-08-17 07:19:36 +00002081 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002082 // They want to print the signed version and it is a negative value
2083 // Flip the bits and add one to turn it into the equivalent positive
2084 // value and put a '-' in the result.
Craig Topperef0114c2017-05-10 20:01:38 +00002085 Tmp.negate();
Chris Lattner17f71652008-08-17 07:19:36 +00002086 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002087 }
Eric Christopher820256b2009-08-21 04:06:45 +00002088
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002089 while (*Prefix) {
2090 Str.push_back(*Prefix);
2091 ++Prefix;
2092 };
2093
Chris Lattner17f71652008-08-17 07:19:36 +00002094 // We insert the digits backward, then reverse them to get the right order.
2095 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002096
2097 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2098 // because the number of bits per digit (1, 3 and 4 respectively) divides
Craig Topperd7ed50d2017-04-02 06:59:36 +00002099 // equally. We just shift until the value is zero.
Douglas Gregor663c0682011-09-14 15:54:46 +00002100 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattner17f71652008-08-17 07:19:36 +00002101 // Just shift tmp right for each digit width until it becomes zero
2102 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2103 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002104
Craig Topperecb97da2017-05-10 18:15:24 +00002105 while (Tmp.getBoolValue()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002106 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2107 Str.push_back(Digits[Digit]);
Craig Topperfc947bc2017-04-18 17:14:21 +00002108 Tmp.lshrInPlace(ShiftAmt);
Chris Lattner17f71652008-08-17 07:19:36 +00002109 }
2110 } else {
Craig Topperecb97da2017-05-10 18:15:24 +00002111 while (Tmp.getBoolValue()) {
Craig Topper8885f932017-05-19 16:43:54 +00002112 uint64_t Digit;
2113 udivrem(Tmp, Radix, Tmp, Digit);
Chris Lattner17f71652008-08-17 07:19:36 +00002114 assert(Digit < Radix && "divide failed");
2115 Str.push_back(Digits[Digit]);
Chris Lattner17f71652008-08-17 07:19:36 +00002116 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002117 }
Eric Christopher820256b2009-08-21 04:06:45 +00002118
Chris Lattner17f71652008-08-17 07:19:36 +00002119 // Reverse the digits before returning.
2120 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002121}
2122
Pawel Bylica6eeeac72015-04-06 13:31:39 +00002123/// Returns the APInt as a std::string. Note that this is an inefficient method.
2124/// It is better to pass in a SmallVector/SmallString to the methods above.
Chris Lattner17f71652008-08-17 07:19:36 +00002125std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2126 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002127 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002128 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002129}
Chris Lattner6b695682007-08-16 15:56:55 +00002130
Aaron Ballman615eb472017-10-15 14:32:27 +00002131#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +00002132LLVM_DUMP_METHOD void APInt::dump() const {
Chris Lattner17f71652008-08-17 07:19:36 +00002133 SmallString<40> S, U;
2134 this->toStringUnsigned(U);
2135 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002136 dbgs() << "APInt(" << BitWidth << "b, "
Davide Italiano5a473d22017-01-31 21:26:18 +00002137 << U << "u " << S << "s)\n";
Chris Lattner17f71652008-08-17 07:19:36 +00002138}
Matthias Braun8c209aa2017-01-28 02:02:38 +00002139#endif
Chris Lattner17f71652008-08-17 07:19:36 +00002140
Chris Lattner0c19df42008-08-23 22:23:09 +00002141void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002142 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002143 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Yaron Keren92e1b622015-03-18 10:17:07 +00002144 OS << S;
Chris Lattner17f71652008-08-17 07:19:36 +00002145}
2146
Chris Lattner6b695682007-08-16 15:56:55 +00002147// This implements a variety of operations on a representation of
2148// arbitrary precision, two's-complement, bignum integer values.
2149
Chris Lattner96cffa62009-08-23 23:11:28 +00002150// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2151// and unrestricting assumption.
Craig Topper55229b72017-04-02 19:17:22 +00002152static_assert(APInt::APINT_BITS_PER_WORD % 2 == 0,
2153 "Part width must be divisible by 2!");
Chris Lattner6b695682007-08-16 15:56:55 +00002154
2155/* Some handy functions local to this file. */
Chris Lattner6b695682007-08-16 15:56:55 +00002156
Craig Topper76f42462017-03-28 05:32:53 +00002157/* Returns the integer part with the least significant BITS set.
2158 BITS cannot be zero. */
Craig Topper55229b72017-04-02 19:17:22 +00002159static inline APInt::WordType lowBitMask(unsigned bits) {
2160 assert(bits != 0 && bits <= APInt::APINT_BITS_PER_WORD);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002161
Craig Topper55229b72017-04-02 19:17:22 +00002162 return ~(APInt::WordType) 0 >> (APInt::APINT_BITS_PER_WORD - bits);
Craig Topper76f42462017-03-28 05:32:53 +00002163}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002164
Craig Topper76f42462017-03-28 05:32:53 +00002165/* Returns the value of the lower half of PART. */
Craig Topper55229b72017-04-02 19:17:22 +00002166static inline APInt::WordType lowHalf(APInt::WordType part) {
2167 return part & lowBitMask(APInt::APINT_BITS_PER_WORD / 2);
Craig Topper76f42462017-03-28 05:32:53 +00002168}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002169
Craig Topper76f42462017-03-28 05:32:53 +00002170/* Returns the value of the upper half of PART. */
Craig Topper55229b72017-04-02 19:17:22 +00002171static inline APInt::WordType highHalf(APInt::WordType part) {
2172 return part >> (APInt::APINT_BITS_PER_WORD / 2);
Craig Topper76f42462017-03-28 05:32:53 +00002173}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002174
Craig Topper76f42462017-03-28 05:32:53 +00002175/* Returns the bit number of the most significant set bit of a part.
2176 If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002177static unsigned partMSB(APInt::WordType value) {
Craig Topper76f42462017-03-28 05:32:53 +00002178 return findLastSet(value, ZB_Max);
2179}
Chris Lattner6b695682007-08-16 15:56:55 +00002180
Craig Topper76f42462017-03-28 05:32:53 +00002181/* Returns the bit number of the least significant set bit of a
2182 part. If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002183static unsigned partLSB(APInt::WordType value) {
Craig Topper76f42462017-03-28 05:32:53 +00002184 return findFirstSet(value, ZB_Max);
Alexander Kornienkof00654e2015-06-23 09:49:53 +00002185}
Chris Lattner6b695682007-08-16 15:56:55 +00002186
2187/* Sets the least significant part of a bignum to the input value, and
2188 zeroes out higher parts. */
Craig Topper55229b72017-04-02 19:17:22 +00002189void APInt::tcSet(WordType *dst, WordType part, unsigned parts) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002190 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002191
Chris Lattner6b695682007-08-16 15:56:55 +00002192 dst[0] = part;
Craig Topperb0038162017-03-28 05:32:52 +00002193 for (unsigned i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002194 dst[i] = 0;
2195}
2196
2197/* Assign one bignum to another. */
Craig Topper55229b72017-04-02 19:17:22 +00002198void APInt::tcAssign(WordType *dst, const WordType *src, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002199 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002200 dst[i] = src[i];
2201}
2202
2203/* Returns true if a bignum is zero, false otherwise. */
Craig Topper55229b72017-04-02 19:17:22 +00002204bool APInt::tcIsZero(const WordType *src, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002205 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002206 if (src[i])
2207 return false;
2208
2209 return true;
2210}
2211
2212/* Extract the given bit of a bignum; returns 0 or 1. */
Craig Topper55229b72017-04-02 19:17:22 +00002213int APInt::tcExtractBit(const WordType *parts, unsigned bit) {
Craig Topper00b47ee2017-04-02 19:35:18 +00002214 return (parts[whichWord(bit)] & maskBit(bit)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002215}
2216
John McCalldcb9a7a2010-02-28 02:51:25 +00002217/* Set the given bit of a bignum. */
Craig Topper55229b72017-04-02 19:17:22 +00002218void APInt::tcSetBit(WordType *parts, unsigned bit) {
Craig Topper00b47ee2017-04-02 19:35:18 +00002219 parts[whichWord(bit)] |= maskBit(bit);
Chris Lattner6b695682007-08-16 15:56:55 +00002220}
2221
John McCalldcb9a7a2010-02-28 02:51:25 +00002222/* Clears the given bit of a bignum. */
Craig Topper55229b72017-04-02 19:17:22 +00002223void APInt::tcClearBit(WordType *parts, unsigned bit) {
Craig Topper00b47ee2017-04-02 19:35:18 +00002224 parts[whichWord(bit)] &= ~maskBit(bit);
John McCalldcb9a7a2010-02-28 02:51:25 +00002225}
2226
Neil Boothc8b650a2007-10-06 00:43:45 +00002227/* Returns the bit number of the least significant set bit of a
2228 number. If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002229unsigned APInt::tcLSB(const WordType *parts, unsigned n) {
Craig Topperb0038162017-03-28 05:32:52 +00002230 for (unsigned i = 0; i < n; i++) {
2231 if (parts[i] != 0) {
2232 unsigned lsb = partLSB(parts[i]);
Chris Lattner6b695682007-08-16 15:56:55 +00002233
Craig Topper55229b72017-04-02 19:17:22 +00002234 return lsb + i * APINT_BITS_PER_WORD;
Craig Topperb0038162017-03-28 05:32:52 +00002235 }
Chris Lattner6b695682007-08-16 15:56:55 +00002236 }
2237
2238 return -1U;
2239}
2240
Neil Boothc8b650a2007-10-06 00:43:45 +00002241/* Returns the bit number of the most significant set bit of a number.
2242 If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002243unsigned APInt::tcMSB(const WordType *parts, unsigned n) {
Chris Lattner6b695682007-08-16 15:56:55 +00002244 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002245 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002246
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002247 if (parts[n] != 0) {
Craig Topperb0038162017-03-28 05:32:52 +00002248 unsigned msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002249
Craig Topper55229b72017-04-02 19:17:22 +00002250 return msb + n * APINT_BITS_PER_WORD;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002251 }
Chris Lattner6b695682007-08-16 15:56:55 +00002252 } while (n);
2253
2254 return -1U;
2255}
2256
Neil Boothb6182162007-10-08 13:47:12 +00002257/* Copy the bit vector of width srcBITS from SRC, starting at bit
2258 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2259 the least significant bit of DST. All high bits above srcBITS in
2260 DST are zero-filled. */
2261void
Craig Topper55229b72017-04-02 19:17:22 +00002262APInt::tcExtract(WordType *dst, unsigned dstCount, const WordType *src,
Craig Topper6a8518082017-03-28 05:32:55 +00002263 unsigned srcBits, unsigned srcLSB) {
Craig Topper55229b72017-04-02 19:17:22 +00002264 unsigned dstParts = (srcBits + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002265 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002266
Craig Topper55229b72017-04-02 19:17:22 +00002267 unsigned firstSrcPart = srcLSB / APINT_BITS_PER_WORD;
Neil Boothb6182162007-10-08 13:47:12 +00002268 tcAssign (dst, src + firstSrcPart, dstParts);
2269
Craig Topper55229b72017-04-02 19:17:22 +00002270 unsigned shift = srcLSB % APINT_BITS_PER_WORD;
Neil Boothb6182162007-10-08 13:47:12 +00002271 tcShiftRight (dst, dstParts, shift);
2272
Craig Topper55229b72017-04-02 19:17:22 +00002273 /* We now have (dstParts * APINT_BITS_PER_WORD - shift) bits from SRC
Neil Boothb6182162007-10-08 13:47:12 +00002274 in DST. If this is less that srcBits, append the rest, else
2275 clear the high bits. */
Craig Topper55229b72017-04-02 19:17:22 +00002276 unsigned n = dstParts * APINT_BITS_PER_WORD - shift;
Neil Boothb6182162007-10-08 13:47:12 +00002277 if (n < srcBits) {
Craig Topper55229b72017-04-02 19:17:22 +00002278 WordType mask = lowBitMask (srcBits - n);
Neil Boothb6182162007-10-08 13:47:12 +00002279 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
Craig Topper55229b72017-04-02 19:17:22 +00002280 << n % APINT_BITS_PER_WORD);
Neil Boothb6182162007-10-08 13:47:12 +00002281 } else if (n > srcBits) {
Craig Topper55229b72017-04-02 19:17:22 +00002282 if (srcBits % APINT_BITS_PER_WORD)
2283 dst[dstParts - 1] &= lowBitMask (srcBits % APINT_BITS_PER_WORD);
Neil Boothb6182162007-10-08 13:47:12 +00002284 }
2285
2286 /* Clear high parts. */
2287 while (dstParts < dstCount)
2288 dst[dstParts++] = 0;
2289}
2290
Chris Lattner6b695682007-08-16 15:56:55 +00002291/* DST += RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper55229b72017-04-02 19:17:22 +00002292APInt::WordType APInt::tcAdd(WordType *dst, const WordType *rhs,
2293 WordType c, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002294 assert(c <= 1);
2295
Craig Topperb0038162017-03-28 05:32:52 +00002296 for (unsigned i = 0; i < parts; i++) {
Craig Topper55229b72017-04-02 19:17:22 +00002297 WordType l = dst[i];
Chris Lattner6b695682007-08-16 15:56:55 +00002298 if (c) {
2299 dst[i] += rhs[i] + 1;
2300 c = (dst[i] <= l);
2301 } else {
2302 dst[i] += rhs[i];
2303 c = (dst[i] < l);
2304 }
2305 }
2306
2307 return c;
2308}
2309
Craig Topper92fc4772017-04-13 04:36:06 +00002310/// This function adds a single "word" integer, src, to the multiple
2311/// "word" integer array, dst[]. dst[] is modified to reflect the addition and
2312/// 1 is returned if there is a carry out, otherwise 0 is returned.
2313/// @returns the carry of the addition.
2314APInt::WordType APInt::tcAddPart(WordType *dst, WordType src,
2315 unsigned parts) {
2316 for (unsigned i = 0; i < parts; ++i) {
2317 dst[i] += src;
2318 if (dst[i] >= src)
2319 return 0; // No need to carry so exit early.
2320 src = 1; // Carry one to next digit.
2321 }
2322
2323 return 1;
2324}
2325
Chris Lattner6b695682007-08-16 15:56:55 +00002326/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper55229b72017-04-02 19:17:22 +00002327APInt::WordType APInt::tcSubtract(WordType *dst, const WordType *rhs,
2328 WordType c, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002329 assert(c <= 1);
2330
Craig Topperb0038162017-03-28 05:32:52 +00002331 for (unsigned i = 0; i < parts; i++) {
Craig Topper55229b72017-04-02 19:17:22 +00002332 WordType l = dst[i];
Chris Lattner6b695682007-08-16 15:56:55 +00002333 if (c) {
2334 dst[i] -= rhs[i] + 1;
2335 c = (dst[i] >= l);
2336 } else {
2337 dst[i] -= rhs[i];
2338 c = (dst[i] > l);
2339 }
2340 }
2341
2342 return c;
2343}
2344
Craig Topper92fc4772017-04-13 04:36:06 +00002345/// This function subtracts a single "word" (64-bit word), src, from
2346/// the multi-word integer array, dst[], propagating the borrowed 1 value until
2347/// no further borrowing is needed or it runs out of "words" in dst. The result
2348/// is 1 if "borrowing" exhausted the digits in dst, or 0 if dst was not
2349/// exhausted. In other words, if src > dst then this function returns 1,
2350/// otherwise 0.
2351/// @returns the borrow out of the subtraction
2352APInt::WordType APInt::tcSubtractPart(WordType *dst, WordType src,
2353 unsigned parts) {
2354 for (unsigned i = 0; i < parts; ++i) {
2355 WordType Dst = dst[i];
2356 dst[i] -= src;
2357 if (src <= Dst)
2358 return 0; // No need to borrow so exit early.
2359 src = 1; // We have to "borrow 1" from next "word"
2360 }
2361
2362 return 1;
2363}
2364
Chris Lattner6b695682007-08-16 15:56:55 +00002365/* Negate a bignum in-place. */
Craig Topper55229b72017-04-02 19:17:22 +00002366void APInt::tcNegate(WordType *dst, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002367 tcComplement(dst, parts);
2368 tcIncrement(dst, parts);
2369}
2370
Neil Boothc8b650a2007-10-06 00:43:45 +00002371/* DST += SRC * MULTIPLIER + CARRY if add is true
2372 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002373
2374 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2375 they must start at the same point, i.e. DST == SRC.
2376
2377 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2378 returned. Otherwise DST is filled with the least significant
2379 DSTPARTS parts of the result, and if all of the omitted higher
2380 parts were zero return zero, otherwise overflow occurred and
2381 return one. */
Craig Topper55229b72017-04-02 19:17:22 +00002382int APInt::tcMultiplyPart(WordType *dst, const WordType *src,
2383 WordType multiplier, WordType carry,
Craig Topper6a8518082017-03-28 05:32:55 +00002384 unsigned srcParts, unsigned dstParts,
2385 bool add) {
Chris Lattner6b695682007-08-16 15:56:55 +00002386 /* Otherwise our writes of DST kill our later reads of SRC. */
2387 assert(dst <= src || dst >= src + srcParts);
2388 assert(dstParts <= srcParts + 1);
2389
2390 /* N loops; minimum of dstParts and srcParts. */
Craig Topper0cbab7c2017-05-08 06:34:39 +00002391 unsigned n = std::min(dstParts, srcParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002392
Craig Topperc96a84d2017-05-08 06:34:41 +00002393 for (unsigned i = 0; i < n; i++) {
Craig Topper55229b72017-04-02 19:17:22 +00002394 WordType low, mid, high, srcPart;
Chris Lattner6b695682007-08-16 15:56:55 +00002395
2396 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2397
2398 This cannot overflow, because
2399
2400 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2401
2402 which is less than n^2. */
2403
2404 srcPart = src[i];
2405
Craig Topper6a8518082017-03-28 05:32:55 +00002406 if (multiplier == 0 || srcPart == 0) {
Chris Lattner6b695682007-08-16 15:56:55 +00002407 low = carry;
2408 high = 0;
2409 } else {
2410 low = lowHalf(srcPart) * lowHalf(multiplier);
2411 high = highHalf(srcPart) * highHalf(multiplier);
2412
2413 mid = lowHalf(srcPart) * highHalf(multiplier);
2414 high += highHalf(mid);
Craig Topper55229b72017-04-02 19:17:22 +00002415 mid <<= APINT_BITS_PER_WORD / 2;
Chris Lattner6b695682007-08-16 15:56:55 +00002416 if (low + mid < low)
2417 high++;
2418 low += mid;
2419
2420 mid = highHalf(srcPart) * lowHalf(multiplier);
2421 high += highHalf(mid);
Craig Topper55229b72017-04-02 19:17:22 +00002422 mid <<= APINT_BITS_PER_WORD / 2;
Chris Lattner6b695682007-08-16 15:56:55 +00002423 if (low + mid < low)
2424 high++;
2425 low += mid;
2426
2427 /* Now add carry. */
2428 if (low + carry < low)
2429 high++;
2430 low += carry;
2431 }
2432
2433 if (add) {
2434 /* And now DST[i], and store the new low part there. */
2435 if (low + dst[i] < low)
2436 high++;
2437 dst[i] += low;
2438 } else
2439 dst[i] = low;
2440
2441 carry = high;
2442 }
2443
Craig Topperc96a84d2017-05-08 06:34:41 +00002444 if (srcParts < dstParts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002445 /* Full multiplication, there is no overflow. */
Craig Topperc96a84d2017-05-08 06:34:41 +00002446 assert(srcParts + 1 == dstParts);
2447 dst[srcParts] = carry;
Chris Lattner6b695682007-08-16 15:56:55 +00002448 return 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002449 }
Craig Toppera6c142a2017-05-08 06:34:36 +00002450
2451 /* We overflowed if there is carry. */
2452 if (carry)
2453 return 1;
2454
2455 /* We would overflow if any significant unwritten parts would be
2456 non-zero. This is true if any remaining src parts are non-zero
2457 and the multiplier is non-zero. */
2458 if (multiplier)
Craig Topperc96a84d2017-05-08 06:34:41 +00002459 for (unsigned i = dstParts; i < srcParts; i++)
Craig Toppera6c142a2017-05-08 06:34:36 +00002460 if (src[i])
2461 return 1;
2462
2463 /* We fitted in the narrow destination. */
2464 return 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002465}
2466
2467/* DST = LHS * RHS, where DST has the same width as the operands and
2468 is filled with the least significant parts of the result. Returns
2469 one if overflow occurred, otherwise zero. DST must be disjoint
2470 from both operands. */
Craig Topper55229b72017-04-02 19:17:22 +00002471int APInt::tcMultiply(WordType *dst, const WordType *lhs,
2472 const WordType *rhs, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002473 assert(dst != lhs && dst != rhs);
2474
Craig Topperb0038162017-03-28 05:32:52 +00002475 int overflow = 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002476 tcSet(dst, 0, parts);
2477
Craig Topperb0038162017-03-28 05:32:52 +00002478 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002479 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2480 parts - i, true);
2481
2482 return overflow;
2483}
2484
Craig Topper0acb6652017-05-09 16:47:33 +00002485/// DST = LHS * RHS, where DST has width the sum of the widths of the
2486/// operands. No overflow occurs. DST must be disjoint from both operands.
2487void APInt::tcFullMultiply(WordType *dst, const WordType *lhs,
2488 const WordType *rhs, unsigned lhsParts,
2489 unsigned rhsParts) {
Neil Booth0ea72a92007-10-06 00:24:48 +00002490 /* Put the narrower number on the LHS for less loops below. */
Craig Toppera6c142a2017-05-08 06:34:36 +00002491 if (lhsParts > rhsParts)
Neil Booth0ea72a92007-10-06 00:24:48 +00002492 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002493
Craig Toppera6c142a2017-05-08 06:34:36 +00002494 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002495
Craig Toppera6c142a2017-05-08 06:34:36 +00002496 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002497
Craig Toppera6c142a2017-05-08 06:34:36 +00002498 for (unsigned i = 0; i < lhsParts; i++)
2499 tcMultiplyPart(&dst[i], rhs, lhs[i], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002500}
2501
2502/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2503 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2504 set REMAINDER to the remainder, return zero. i.e.
2505
2506 OLD_LHS = RHS * LHS + REMAINDER
2507
2508 SCRATCH is a bignum of the same size as the operands and result for
2509 use by the routine; its contents need not be initialized and are
2510 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2511*/
Craig Topper55229b72017-04-02 19:17:22 +00002512int APInt::tcDivide(WordType *lhs, const WordType *rhs,
2513 WordType *remainder, WordType *srhs,
Craig Topper6a8518082017-03-28 05:32:55 +00002514 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002515 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2516
Craig Topperb0038162017-03-28 05:32:52 +00002517 unsigned shiftCount = tcMSB(rhs, parts) + 1;
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002518 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002519 return true;
2520
Craig Topper55229b72017-04-02 19:17:22 +00002521 shiftCount = parts * APINT_BITS_PER_WORD - shiftCount;
2522 unsigned n = shiftCount / APINT_BITS_PER_WORD;
2523 WordType mask = (WordType) 1 << (shiftCount % APINT_BITS_PER_WORD);
Chris Lattner6b695682007-08-16 15:56:55 +00002524
2525 tcAssign(srhs, rhs, parts);
2526 tcShiftLeft(srhs, parts, shiftCount);
2527 tcAssign(remainder, lhs, parts);
2528 tcSet(lhs, 0, parts);
2529
2530 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2531 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002532 for (;;) {
Craig Toppera584af52017-05-10 07:50:17 +00002533 int compare = tcCompare(remainder, srhs, parts);
2534 if (compare >= 0) {
2535 tcSubtract(remainder, srhs, 0, parts);
2536 lhs[n] |= mask;
2537 }
Chris Lattner6b695682007-08-16 15:56:55 +00002538
Craig Toppera584af52017-05-10 07:50:17 +00002539 if (shiftCount == 0)
2540 break;
2541 shiftCount--;
2542 tcShiftRight(srhs, parts, 1);
2543 if ((mask >>= 1) == 0) {
2544 mask = (WordType) 1 << (APINT_BITS_PER_WORD - 1);
2545 n--;
2546 }
Chris Lattner6b695682007-08-16 15:56:55 +00002547 }
2548
2549 return false;
2550}
2551
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002552/// Shift a bignum left Cound bits in-place. Shifted in bits are zero. There are
2553/// no restrictions on Count.
2554void APInt::tcShiftLeft(WordType *Dst, unsigned Words, unsigned Count) {
2555 // Don't bother performing a no-op shift.
2556 if (!Count)
2557 return;
Chris Lattner6b695682007-08-16 15:56:55 +00002558
Craig Topperc6b05682017-04-24 17:00:22 +00002559 // WordShift is the inter-part shift; BitShift is the intra-part shift.
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002560 unsigned WordShift = std::min(Count / APINT_BITS_PER_WORD, Words);
2561 unsigned BitShift = Count % APINT_BITS_PER_WORD;
Chris Lattner6b695682007-08-16 15:56:55 +00002562
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002563 // Fastpath for moving by whole words.
2564 if (BitShift == 0) {
2565 std::memmove(Dst + WordShift, Dst, (Words - WordShift) * APINT_WORD_SIZE);
2566 } else {
2567 while (Words-- > WordShift) {
2568 Dst[Words] = Dst[Words - WordShift] << BitShift;
2569 if (Words > WordShift)
2570 Dst[Words] |=
2571 Dst[Words - WordShift - 1] >> (APINT_BITS_PER_WORD - BitShift);
Neil Boothb6182162007-10-08 13:47:12 +00002572 }
Neil Boothb6182162007-10-08 13:47:12 +00002573 }
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002574
2575 // Fill in the remainder with 0s.
2576 std::memset(Dst, 0, WordShift * APINT_WORD_SIZE);
Chris Lattner6b695682007-08-16 15:56:55 +00002577}
2578
Craig Topper9575d8f2017-04-17 21:43:43 +00002579/// Shift a bignum right Count bits in-place. Shifted in bits are zero. There
2580/// are no restrictions on Count.
2581void APInt::tcShiftRight(WordType *Dst, unsigned Words, unsigned Count) {
2582 // Don't bother performing a no-op shift.
2583 if (!Count)
2584 return;
Chris Lattner6b695682007-08-16 15:56:55 +00002585
Craig Topperc6b05682017-04-24 17:00:22 +00002586 // WordShift is the inter-part shift; BitShift is the intra-part shift.
Craig Topper9575d8f2017-04-17 21:43:43 +00002587 unsigned WordShift = std::min(Count / APINT_BITS_PER_WORD, Words);
2588 unsigned BitShift = Count % APINT_BITS_PER_WORD;
Chris Lattner6b695682007-08-16 15:56:55 +00002589
Craig Topper9575d8f2017-04-17 21:43:43 +00002590 unsigned WordsToMove = Words - WordShift;
2591 // Fastpath for moving by whole words.
2592 if (BitShift == 0) {
2593 std::memmove(Dst, Dst + WordShift, WordsToMove * APINT_WORD_SIZE);
2594 } else {
2595 for (unsigned i = 0; i != WordsToMove; ++i) {
2596 Dst[i] = Dst[i + WordShift] >> BitShift;
2597 if (i + 1 != WordsToMove)
2598 Dst[i] |= Dst[i + WordShift + 1] << (APINT_BITS_PER_WORD - BitShift);
Neil Boothb6182162007-10-08 13:47:12 +00002599 }
Chris Lattner6b695682007-08-16 15:56:55 +00002600 }
Craig Topper9575d8f2017-04-17 21:43:43 +00002601
2602 // Fill in the remainder with 0s.
2603 std::memset(Dst + WordsToMove, 0, WordShift * APINT_WORD_SIZE);
Chris Lattner6b695682007-08-16 15:56:55 +00002604}
2605
2606/* Bitwise and of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002607void APInt::tcAnd(WordType *dst, const WordType *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002608 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002609 dst[i] &= rhs[i];
2610}
2611
2612/* Bitwise inclusive or of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002613void APInt::tcOr(WordType *dst, const WordType *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002614 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002615 dst[i] |= rhs[i];
2616}
2617
2618/* Bitwise exclusive or of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002619void APInt::tcXor(WordType *dst, const WordType *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002620 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002621 dst[i] ^= rhs[i];
2622}
2623
2624/* Complement a bignum in-place. */
Craig Topper55229b72017-04-02 19:17:22 +00002625void APInt::tcComplement(WordType *dst, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002626 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002627 dst[i] = ~dst[i];
2628}
2629
2630/* Comparison (unsigned) of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002631int APInt::tcCompare(const WordType *lhs, const WordType *rhs,
Craig Topper6a8518082017-03-28 05:32:55 +00002632 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002633 while (parts) {
Craig Topper99cfe4f2017-04-01 21:50:06 +00002634 parts--;
Craig Topper1dc8fc82017-04-21 16:13:15 +00002635 if (lhs[parts] != rhs[parts])
2636 return (lhs[parts] > rhs[parts]) ? 1 : -1;
Craig Topper99cfe4f2017-04-01 21:50:06 +00002637 }
Chris Lattner6b695682007-08-16 15:56:55 +00002638
2639 return 0;
2640}
2641
Chris Lattner6b695682007-08-16 15:56:55 +00002642/* Set the least significant BITS bits of a bignum, clear the
2643 rest. */
Craig Topper55229b72017-04-02 19:17:22 +00002644void APInt::tcSetLeastSignificantBits(WordType *dst, unsigned parts,
Craig Topper6a8518082017-03-28 05:32:55 +00002645 unsigned bits) {
Craig Topperb0038162017-03-28 05:32:52 +00002646 unsigned i = 0;
Craig Topper55229b72017-04-02 19:17:22 +00002647 while (bits > APINT_BITS_PER_WORD) {
2648 dst[i++] = ~(WordType) 0;
2649 bits -= APINT_BITS_PER_WORD;
Chris Lattner6b695682007-08-16 15:56:55 +00002650 }
2651
2652 if (bits)
Craig Topper55229b72017-04-02 19:17:22 +00002653 dst[i++] = ~(WordType) 0 >> (APINT_BITS_PER_WORD - bits);
Chris Lattner6b695682007-08-16 15:56:55 +00002654
2655 while (i < parts)
2656 dst[i++] = 0;
2657}