blob: f2f5cca946f3706314a97f8c005aa26c90ce5b44 [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"
Krzysztof Parzyszek90f32492018-08-02 19:13:35 +000019#include "llvm/ADT/Optional.h"
Chris Lattner17f71652008-08-17 07:19:36 +000020#include "llvm/ADT/SmallString.h"
Chandler Carruth71bd7d12012-03-04 12:02:57 +000021#include "llvm/ADT/StringRef.h"
JF Bastienc4986ce2018-09-08 03:55:25 +000022#include "llvm/ADT/bit.h"
Nico Weber432a3882018-04-30 14:59:11 +000023#include "llvm/Config/llvm-config.h"
Reid Spencera5e0d202007-02-24 03:58:46 +000024#include "llvm/Support/Debug.h"
Torok Edwin56d06592009-07-11 20:10:48 +000025#include "llvm/Support/ErrorHandling.h"
Zhou Shengdac63782007-02-06 03:00:16 +000026#include "llvm/Support/MathExtras.h"
Chris Lattner0c19df42008-08-23 22:23:09 +000027#include "llvm/Support/raw_ostream.h"
Vassil Vassilev2ec8b152016-09-14 08:55:18 +000028#include <climits>
Chris Lattner17f71652008-08-17 07:19:36 +000029#include <cmath>
Zhou Shengdac63782007-02-06 03:00:16 +000030#include <cstdlib>
Chandler Carruthed0881b2012-12-03 16:50:05 +000031#include <cstring>
Zhou Shengdac63782007-02-06 03:00:16 +000032using namespace llvm;
33
Chandler Carruth64648262014-04-22 03:07:47 +000034#define DEBUG_TYPE "apint"
35
Reid Spencera41e93b2007-02-25 19:32:03 +000036/// A utility function for allocating memory, checking for allocation failures,
37/// and ensuring the contents are zeroed.
Chris Lattner77527f52009-01-21 18:09:24 +000038inline static uint64_t* getClearedMemory(unsigned numWords) {
Fangrui Songc244a152018-03-23 17:26:12 +000039 uint64_t *result = new uint64_t[numWords];
Reid Spencera856b6e2007-02-18 18:38:44 +000040 memset(result, 0, numWords * sizeof(uint64_t));
41 return result;
Zhou Sheng94b623a2007-02-06 06:04:53 +000042}
43
Eric Christopher820256b2009-08-21 04:06:45 +000044/// A utility function for allocating memory and checking for allocation
Reid Spencera41e93b2007-02-25 19:32:03 +000045/// failure. The content is not zeroed.
Chris Lattner77527f52009-01-21 18:09:24 +000046inline static uint64_t* getMemory(unsigned numWords) {
Fangrui Songc244a152018-03-23 17:26:12 +000047 return new uint64_t[numWords];
Reid Spencera856b6e2007-02-18 18:38:44 +000048}
49
Erick Tryzelaardadb15712009-08-21 03:15:28 +000050/// A utility function that converts a character to a digit.
51inline static unsigned getDigit(char cdigit, uint8_t radix) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000052 unsigned r;
53
Douglas Gregor663c0682011-09-14 15:54:46 +000054 if (radix == 16 || radix == 36) {
Erick Tryzelaar60964092009-08-21 06:48:37 +000055 r = cdigit - '0';
56 if (r <= 9)
57 return r;
58
59 r = cdigit - 'A';
Douglas Gregorc98ac852011-09-20 18:33:29 +000060 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000061 return r + 10;
62
63 r = cdigit - 'a';
Douglas Gregorc98ac852011-09-20 18:33:29 +000064 if (r <= radix - 11U)
Erick Tryzelaar60964092009-08-21 06:48:37 +000065 return r + 10;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +000066
Douglas Gregore4e20f42011-09-20 18:11:52 +000067 radix = 10;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000068 }
69
Erick Tryzelaar60964092009-08-21 06:48:37 +000070 r = cdigit - '0';
71 if (r < radix)
72 return r;
73
74 return -1U;
Erick Tryzelaardadb15712009-08-21 03:15:28 +000075}
76
77
Pawel Bylica68304012016-06-27 08:31:48 +000078void APInt::initSlowCase(uint64_t val, bool isSigned) {
Craig Topperb339c6d2017-05-03 15:46:24 +000079 U.pVal = getClearedMemory(getNumWords());
80 U.pVal[0] = val;
Eric Christopher820256b2009-08-21 04:06:45 +000081 if (isSigned && int64_t(val) < 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +000082 for (unsigned i = 1; i < getNumWords(); ++i)
Simon Pilgrim8f465052018-08-16 11:08:23 +000083 U.pVal[i] = WORDTYPE_MAX;
Craig Topperf78a6f02017-03-01 21:06:18 +000084 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +000085}
86
Chris Lattnerd57b7602008-10-11 22:07:19 +000087void APInt::initSlowCase(const APInt& that) {
Craig Topperb339c6d2017-05-03 15:46:24 +000088 U.pVal = getMemory(getNumWords());
89 memcpy(U.pVal, that.U.pVal, getNumWords() * APINT_WORD_SIZE);
Chris Lattnerd57b7602008-10-11 22:07:19 +000090}
91
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000092void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +000093 assert(BitWidth && "Bitwidth too small");
Jeffrey Yasskin7a162882011-07-18 21:45:40 +000094 assert(bigVal.data() && "Null pointer detected!");
Zhou Shengdac63782007-02-06 03:00:16 +000095 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +000096 U.VAL = bigVal[0];
Zhou Shengdac63782007-02-06 03:00:16 +000097 else {
Reid Spencerdf6cf5a2007-02-24 10:01:42 +000098 // Get memory, cleared to 0
Craig Topperb339c6d2017-05-03 15:46:24 +000099 U.pVal = getClearedMemory(getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000100 // Calculate the number of words to copy
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000101 unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000102 // Copy the words from bigVal to pVal
Craig Topperb339c6d2017-05-03 15:46:24 +0000103 memcpy(U.pVal, bigVal.data(), words * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000104 }
Reid Spencerdf6cf5a2007-02-24 10:01:42 +0000105 // Make sure unused high bits are cleared
106 clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000107}
108
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000109APInt::APInt(unsigned numBits, ArrayRef<uint64_t> bigVal)
Craig Topper0085ffb2017-03-20 01:29:52 +0000110 : BitWidth(numBits) {
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000111 initFromArray(bigVal);
112}
113
114APInt::APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[])
Craig Topper0085ffb2017-03-20 01:29:52 +0000115 : BitWidth(numBits) {
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000116 initFromArray(makeArrayRef(bigVal, numWords));
117}
118
Benjamin Kramer92d89982010-07-14 22:38:02 +0000119APInt::APInt(unsigned numbits, StringRef Str, uint8_t radix)
Craig Topperb339c6d2017-05-03 15:46:24 +0000120 : BitWidth(numbits) {
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000121 assert(BitWidth && "Bitwidth too small");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000122 fromString(numbits, Str, radix);
Zhou Sheng3e8022d2007-02-07 06:14:53 +0000123}
124
Craig Toppera92fd0b2017-05-12 01:46:01 +0000125void APInt::reallocate(unsigned NewBitWidth) {
126 // If the number of words is the same we can just change the width and stop.
127 if (getNumWords() == getNumWords(NewBitWidth)) {
128 BitWidth = NewBitWidth;
129 return;
130 }
131
132 // If we have an allocation, delete it.
133 if (!isSingleWord())
134 delete [] U.pVal;
135
136 // Update BitWidth.
137 BitWidth = NewBitWidth;
138
139 // If we are supposed to have an allocation, create it.
140 if (!isSingleWord())
141 U.pVal = getMemory(getNumWords());
142}
143
Craig Topperc67fe572017-04-19 17:01:58 +0000144void APInt::AssignSlowCase(const APInt& RHS) {
Reid Spencer7c16cd22007-02-26 23:38:21 +0000145 // Don't do anything for X = X
146 if (this == &RHS)
Craig Topperc67fe572017-04-19 17:01:58 +0000147 return;
Reid Spencer7c16cd22007-02-26 23:38:21 +0000148
Craig Toppera92fd0b2017-05-12 01:46:01 +0000149 // Adjust the bit width and handle allocations as necessary.
150 reallocate(RHS.getBitWidth());
Reid Spencer7c16cd22007-02-26 23:38:21 +0000151
Craig Toppera92fd0b2017-05-12 01:46:01 +0000152 // Copy the data.
153 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000154 U.VAL = RHS.U.VAL;
Craig Toppera92fd0b2017-05-12 01:46:01 +0000155 else
156 memcpy(U.pVal, RHS.U.pVal, getNumWords() * APINT_WORD_SIZE);
Zhou Shengdac63782007-02-06 03:00:16 +0000157}
158
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000159/// This method 'profiles' an APInt for use with FoldingSet.
Ted Kremenek5c75d542008-01-19 04:23:33 +0000160void APInt::Profile(FoldingSetNodeID& ID) const {
Ted Kremenek901540f2008-02-19 20:50:41 +0000161 ID.AddInteger(BitWidth);
Eric Christopher820256b2009-08-21 04:06:45 +0000162
Ted Kremenek5c75d542008-01-19 04:23:33 +0000163 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000164 ID.AddInteger(U.VAL);
Ted Kremenek5c75d542008-01-19 04:23:33 +0000165 return;
166 }
167
Chris Lattner77527f52009-01-21 18:09:24 +0000168 unsigned NumWords = getNumWords();
Ted Kremenek5c75d542008-01-19 04:23:33 +0000169 for (unsigned i = 0; i < NumWords; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000170 ID.AddInteger(U.pVal[i]);
Ted Kremenek5c75d542008-01-19 04:23:33 +0000171}
172
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000173/// Prefix increment operator. Increments the APInt by one.
Zhou Shengdac63782007-02-06 03:00:16 +0000174APInt& APInt::operator++() {
Eric Christopher820256b2009-08-21 04:06:45 +0000175 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000176 ++U.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000177 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000178 tcIncrement(U.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000179 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000180}
181
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000182/// Prefix decrement operator. Decrements the APInt by one.
Zhou Shengdac63782007-02-06 03:00:16 +0000183APInt& APInt::operator--() {
Eric Christopher820256b2009-08-21 04:06:45 +0000184 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000185 --U.VAL;
Zhou Shengdac63782007-02-06 03:00:16 +0000186 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000187 tcDecrement(U.pVal, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000188 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000189}
190
Reid Spencera41e93b2007-02-25 19:32:03 +0000191/// Adds the RHS APint to this APInt.
192/// @returns this, after addition of RHS.
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000193/// Addition assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000194APInt& APInt::operator+=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000195 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000196 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000197 U.VAL += RHS.U.VAL;
Craig Topper15e484a2017-04-02 06:59:43 +0000198 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000199 tcAdd(U.pVal, RHS.U.pVal, 0, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000200 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000201}
202
Pete Cooperfea21392016-07-22 20:55:46 +0000203APInt& APInt::operator+=(uint64_t RHS) {
204 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000205 U.VAL += RHS;
Pete Cooperfea21392016-07-22 20:55:46 +0000206 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000207 tcAddPart(U.pVal, RHS, getNumWords());
Pete Cooperfea21392016-07-22 20:55:46 +0000208 return clearUnusedBits();
209}
210
Reid Spencera41e93b2007-02-25 19:32:03 +0000211/// Subtracts the RHS APInt from this APInt
212/// @returns this, after subtraction
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000213/// Subtraction assignment operator.
Zhou Shengdac63782007-02-06 03:00:16 +0000214APInt& APInt::operator-=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000215 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Eric Christopher820256b2009-08-21 04:06:45 +0000216 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000217 U.VAL -= RHS.U.VAL;
Reid Spencer7a6a8d52007-02-20 23:40:25 +0000218 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000219 tcSubtract(U.pVal, RHS.U.pVal, 0, getNumWords());
Reid Spencera41e93b2007-02-25 19:32:03 +0000220 return clearUnusedBits();
Zhou Shengdac63782007-02-06 03:00:16 +0000221}
222
Pete Cooperfea21392016-07-22 20:55:46 +0000223APInt& APInt::operator-=(uint64_t RHS) {
224 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000225 U.VAL -= RHS;
Pete Cooperfea21392016-07-22 20:55:46 +0000226 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000227 tcSubtractPart(U.pVal, RHS, getNumWords());
Pete Cooperfea21392016-07-22 20:55:46 +0000228 return clearUnusedBits();
229}
230
Craig Topper93c68e12017-05-04 17:00:41 +0000231APInt APInt::operator*(const APInt& RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +0000232 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Craig Topper93c68e12017-05-04 17:00:41 +0000233 if (isSingleWord())
234 return APInt(BitWidth, U.VAL * RHS.U.VAL);
Reid Spencer58a6a432007-02-21 08:21:52 +0000235
Craig Topper93c68e12017-05-04 17:00:41 +0000236 APInt Result(getMemory(getNumWords()), getBitWidth());
Reid Spencer58a6a432007-02-21 08:21:52 +0000237
Craig Topper93c68e12017-05-04 17:00:41 +0000238 tcMultiply(Result.U.pVal, U.pVal, RHS.U.pVal, getNumWords());
Reid Spencer58a6a432007-02-21 08:21:52 +0000239
Craig Topper93c68e12017-05-04 17:00:41 +0000240 Result.clearUnusedBits();
241 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000242}
243
Craig Topperc67fe572017-04-19 17:01:58 +0000244void APInt::AndAssignSlowCase(const APInt& RHS) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000245 tcAnd(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000246}
247
Craig Topperc67fe572017-04-19 17:01:58 +0000248void APInt::OrAssignSlowCase(const APInt& RHS) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000249 tcOr(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000250}
251
Craig Topperc67fe572017-04-19 17:01:58 +0000252void APInt::XorAssignSlowCase(const APInt& RHS) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000253 tcXor(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000254}
255
Craig Topper93c68e12017-05-04 17:00:41 +0000256APInt& APInt::operator*=(const APInt& RHS) {
Reid Spencera32372d12007-02-17 00:18:01 +0000257 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Craig Topper93c68e12017-05-04 17:00:41 +0000258 *this = *this * RHS;
259 return *this;
Zhou Shengdac63782007-02-06 03:00:16 +0000260}
261
Craig Toppera51941f2017-05-08 04:55:09 +0000262APInt& APInt::operator*=(uint64_t RHS) {
263 if (isSingleWord()) {
264 U.VAL *= RHS;
265 } else {
266 unsigned NumWords = getNumWords();
267 tcMultiplyPart(U.pVal, U.pVal, RHS, 0, NumWords, NumWords, false);
268 }
269 return clearUnusedBits();
270}
271
Chris Lattner1ac3e252008-08-20 17:02:31 +0000272bool APInt::EqualSlowCase(const APInt& RHS) const {
Craig Topperb339c6d2017-05-03 15:46:24 +0000273 return std::equal(U.pVal, U.pVal + getNumWords(), RHS.U.pVal);
Zhou Shengdac63782007-02-06 03:00:16 +0000274}
275
Craig Topper1dc8fc82017-04-21 16:13:15 +0000276int APInt::compare(const APInt& RHS) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000277 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
278 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000279 return U.VAL < RHS.U.VAL ? -1 : U.VAL > RHS.U.VAL;
Reid Spencera41e93b2007-02-25 19:32:03 +0000280
Craig Topperb339c6d2017-05-03 15:46:24 +0000281 return tcCompare(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000282}
283
Craig Topper1dc8fc82017-04-21 16:13:15 +0000284int APInt::compareSigned(const APInt& RHS) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000285 assert(BitWidth == RHS.BitWidth && "Bit widths must be same for comparison");
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000286 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000287 int64_t lhsSext = SignExtend64(U.VAL, BitWidth);
288 int64_t rhsSext = SignExtend64(RHS.U.VAL, BitWidth);
Craig Topper1dc8fc82017-04-21 16:13:15 +0000289 return lhsSext < rhsSext ? -1 : lhsSext > rhsSext;
Reid Spencer1d072122007-02-16 22:36:51 +0000290 }
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000291
Reid Spencer54abdcf2007-02-27 18:23:40 +0000292 bool lhsNeg = isNegative();
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000293 bool rhsNeg = RHS.isNegative();
Reid Spencera41e93b2007-02-25 19:32:03 +0000294
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000295 // If the sign bits don't match, then (LHS < RHS) if LHS is negative
296 if (lhsNeg != rhsNeg)
Craig Topper1dc8fc82017-04-21 16:13:15 +0000297 return lhsNeg ? -1 : 1;
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000298
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000299 // Otherwise we can just use an unsigned comparison, because even negative
Pete Cooperd6e6bf12016-05-26 17:40:07 +0000300 // numbers compare correctly this way if both have the same signed-ness.
Craig Topperb339c6d2017-05-03 15:46:24 +0000301 return tcCompare(U.pVal, RHS.U.pVal, getNumWords());
Zhou Shengdac63782007-02-06 03:00:16 +0000302}
303
Craig Topperbafdd032017-03-07 01:56:01 +0000304void APInt::setBitsSlowCase(unsigned loBit, unsigned hiBit) {
305 unsigned loWord = whichWord(loBit);
306 unsigned hiWord = whichWord(hiBit);
Simon Pilgrimaed35222017-02-24 10:15:29 +0000307
Simon Pilgrim0099beb2017-03-09 13:57:04 +0000308 // Create an initial mask for the low word with zeros below loBit.
Simon Pilgrim8f465052018-08-16 11:08:23 +0000309 uint64_t loMask = WORDTYPE_MAX << whichBit(loBit);
Simon Pilgrimaed35222017-02-24 10:15:29 +0000310
Craig Topperbafdd032017-03-07 01:56:01 +0000311 // If hiBit is not aligned, we need a high mask.
312 unsigned hiShiftAmt = whichBit(hiBit);
313 if (hiShiftAmt != 0) {
314 // Create a high mask with zeros above hiBit.
Simon Pilgrim8f465052018-08-16 11:08:23 +0000315 uint64_t hiMask = WORDTYPE_MAX >> (APINT_BITS_PER_WORD - hiShiftAmt);
Craig Topperbafdd032017-03-07 01:56:01 +0000316 // If loWord and hiWord are equal, then we combine the masks. Otherwise,
317 // set the bits in hiWord.
318 if (hiWord == loWord)
319 loMask &= hiMask;
320 else
Craig Topperb339c6d2017-05-03 15:46:24 +0000321 U.pVal[hiWord] |= hiMask;
Simon Pilgrimaed35222017-02-24 10:15:29 +0000322 }
Craig Topperbafdd032017-03-07 01:56:01 +0000323 // Apply the mask to the low word.
Craig Topperb339c6d2017-05-03 15:46:24 +0000324 U.pVal[loWord] |= loMask;
Craig Topperbafdd032017-03-07 01:56:01 +0000325
326 // Fill any words between loWord and hiWord with all ones.
327 for (unsigned word = loWord + 1; word < hiWord; ++word)
Simon Pilgrim8f465052018-08-16 11:08:23 +0000328 U.pVal[word] = WORDTYPE_MAX;
Simon Pilgrimaed35222017-02-24 10:15:29 +0000329}
330
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000331/// Toggle every bit to its opposite value.
Craig Topperafc9e352017-03-27 17:10:21 +0000332void APInt::flipAllBitsSlowCase() {
Craig Topperb339c6d2017-05-03 15:46:24 +0000333 tcComplement(U.pVal, getNumWords());
Craig Topperafc9e352017-03-27 17:10:21 +0000334 clearUnusedBits();
335}
Zhou Shengdac63782007-02-06 03:00:16 +0000336
Eric Christopher820256b2009-08-21 04:06:45 +0000337/// Toggle a given bit to its opposite value whose position is given
Zhou Shengdac63782007-02-06 03:00:16 +0000338/// as "bitPosition".
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000339/// Toggles a given bit to its opposite value.
Jay Foad25a5e4c2010-12-01 08:53:58 +0000340void APInt::flipBit(unsigned bitPosition) {
Reid Spencer1d072122007-02-16 22:36:51 +0000341 assert(bitPosition < BitWidth && "Out of the bit-width range!");
Jay Foad25a5e4c2010-12-01 08:53:58 +0000342 if ((*this)[bitPosition]) clearBit(bitPosition);
343 else setBit(bitPosition);
Zhou Shengdac63782007-02-06 03:00:16 +0000344}
345
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000346void APInt::insertBits(const APInt &subBits, unsigned bitPosition) {
347 unsigned subBitWidth = subBits.getBitWidth();
348 assert(0 < subBitWidth && (subBitWidth + bitPosition) <= BitWidth &&
349 "Illegal bit insertion");
350
351 // Insertion is a direct copy.
352 if (subBitWidth == BitWidth) {
353 *this = subBits;
354 return;
355 }
356
357 // Single word result can be done as a direct bitmask.
358 if (isSingleWord()) {
Simon Pilgrim8f465052018-08-16 11:08:23 +0000359 uint64_t mask = WORDTYPE_MAX >> (APINT_BITS_PER_WORD - subBitWidth);
Craig Topperb339c6d2017-05-03 15:46:24 +0000360 U.VAL &= ~(mask << bitPosition);
361 U.VAL |= (subBits.U.VAL << bitPosition);
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000362 return;
363 }
364
365 unsigned loBit = whichBit(bitPosition);
366 unsigned loWord = whichWord(bitPosition);
367 unsigned hi1Word = whichWord(bitPosition + subBitWidth - 1);
368
369 // Insertion within a single word can be done as a direct bitmask.
370 if (loWord == hi1Word) {
Simon Pilgrim8f465052018-08-16 11:08:23 +0000371 uint64_t mask = WORDTYPE_MAX >> (APINT_BITS_PER_WORD - subBitWidth);
Craig Topperb339c6d2017-05-03 15:46:24 +0000372 U.pVal[loWord] &= ~(mask << loBit);
373 U.pVal[loWord] |= (subBits.U.VAL << loBit);
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000374 return;
375 }
376
377 // Insert on word boundaries.
378 if (loBit == 0) {
379 // Direct copy whole words.
380 unsigned numWholeSubWords = subBitWidth / APINT_BITS_PER_WORD;
Craig Topperb339c6d2017-05-03 15:46:24 +0000381 memcpy(U.pVal + loWord, subBits.getRawData(),
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000382 numWholeSubWords * APINT_WORD_SIZE);
383
384 // Mask+insert remaining bits.
385 unsigned remainingBits = subBitWidth % APINT_BITS_PER_WORD;
386 if (remainingBits != 0) {
Simon Pilgrim8f465052018-08-16 11:08:23 +0000387 uint64_t mask = WORDTYPE_MAX >> (APINT_BITS_PER_WORD - remainingBits);
Craig Topperb339c6d2017-05-03 15:46:24 +0000388 U.pVal[hi1Word] &= ~mask;
389 U.pVal[hi1Word] |= subBits.getWord(subBitWidth - 1);
Simon Pilgrimb02667c2017-03-10 13:44:32 +0000390 }
391 return;
392 }
393
394 // General case - set/clear individual bits in dst based on src.
395 // TODO - there is scope for optimization here, but at the moment this code
396 // path is barely used so prefer readability over performance.
397 for (unsigned i = 0; i != subBitWidth; ++i) {
398 if (subBits[i])
399 setBit(bitPosition + i);
400 else
401 clearBit(bitPosition + i);
402 }
403}
404
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000405APInt APInt::extractBits(unsigned numBits, unsigned bitPosition) const {
406 assert(numBits > 0 && "Can't extract zero bits");
407 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
408 "Illegal bit extraction");
409
410 if (isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000411 return APInt(numBits, U.VAL >> bitPosition);
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000412
413 unsigned loBit = whichBit(bitPosition);
414 unsigned loWord = whichWord(bitPosition);
415 unsigned hiWord = whichWord(bitPosition + numBits - 1);
416
417 // Single word result extracting bits from a single word source.
418 if (loWord == hiWord)
Craig Topperb339c6d2017-05-03 15:46:24 +0000419 return APInt(numBits, U.pVal[loWord] >> loBit);
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000420
421 // Extracting bits that start on a source word boundary can be done
422 // as a fast memory copy.
423 if (loBit == 0)
Craig Topperb339c6d2017-05-03 15:46:24 +0000424 return APInt(numBits, makeArrayRef(U.pVal + loWord, 1 + hiWord - loWord));
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000425
426 // General case - shift + copy source words directly into place.
427 APInt Result(numBits, 0);
428 unsigned NumSrcWords = getNumWords();
429 unsigned NumDstWords = Result.getNumWords();
430
Tim Shen89337752018-02-16 01:44:36 +0000431 uint64_t *DestPtr = Result.isSingleWord() ? &Result.U.VAL : Result.U.pVal;
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000432 for (unsigned word = 0; word < NumDstWords; ++word) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000433 uint64_t w0 = U.pVal[loWord + word];
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000434 uint64_t w1 =
Craig Topperb339c6d2017-05-03 15:46:24 +0000435 (loWord + word + 1) < NumSrcWords ? U.pVal[loWord + word + 1] : 0;
Tim Shen89337752018-02-16 01:44:36 +0000436 DestPtr[word] = (w0 >> loBit) | (w1 << (APINT_BITS_PER_WORD - loBit));
Simon Pilgrim0f5fb5f2017-02-25 20:01:58 +0000437 }
438
439 return Result.clearUnusedBits();
440}
441
Benjamin Kramer92d89982010-07-14 22:38:02 +0000442unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000443 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000444 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +0000445 radix == 36) &&
446 "Radix should be 2, 8, 10, 16, or 36!");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +0000447
448 size_t slen = str.size();
Reid Spencer9329e7b2007-04-13 19:19:07 +0000449
Eric Christopher43a1dec2009-08-21 04:10:31 +0000450 // Each computation below needs to know if it's negative.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000451 StringRef::iterator p = str.begin();
Eric Christopher43a1dec2009-08-21 04:10:31 +0000452 unsigned isNegative = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000453 if (*p == '-' || *p == '+') {
454 p++;
Reid Spencer9329e7b2007-04-13 19:19:07 +0000455 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +0000456 assert(slen && "String is only a sign, needs a value.");
Reid Spencer9329e7b2007-04-13 19:19:07 +0000457 }
Eric Christopher43a1dec2009-08-21 04:10:31 +0000458
Reid Spencer9329e7b2007-04-13 19:19:07 +0000459 // For radixes of power-of-two values, the bits required is accurately and
460 // easily computed
461 if (radix == 2)
462 return slen + isNegative;
463 if (radix == 8)
464 return slen * 3 + isNegative;
465 if (radix == 16)
466 return slen * 4 + isNegative;
467
Douglas Gregor663c0682011-09-14 15:54:46 +0000468 // FIXME: base 36
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000469
Reid Spencer9329e7b2007-04-13 19:19:07 +0000470 // This is grossly inefficient but accurate. We could probably do something
471 // with a computation of roughly slen*64/20 and then adjust by the value of
472 // the first few digits. But, I'm not sure how accurate that could be.
473
474 // Compute a sufficient number of bits that is always large enough but might
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000475 // be too large. This avoids the assertion in the constructor. This
476 // calculation doesn't work appropriately for the numbers 0-9, so just use 4
477 // bits in that case.
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +0000478 unsigned sufficient
Douglas Gregor663c0682011-09-14 15:54:46 +0000479 = radix == 10? (slen == 1 ? 4 : slen * 64/18)
480 : (slen == 1 ? 7 : slen * 16/3);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000481
482 // Convert to the actual binary value.
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +0000483 APInt tmp(sufficient, StringRef(p, slen), radix);
Reid Spencer9329e7b2007-04-13 19:19:07 +0000484
Erick Tryzelaardadb15712009-08-21 03:15:28 +0000485 // Compute how many bits are required. If the log is infinite, assume we need
486 // just bit.
487 unsigned log = tmp.logBase2();
488 if (log == (unsigned)-1) {
489 return isNegative + 1;
490 } else {
491 return isNegative + log + 1;
492 }
Reid Spencer9329e7b2007-04-13 19:19:07 +0000493}
494
Chandler Carruth71bd7d12012-03-04 12:02:57 +0000495hash_code llvm::hash_value(const APInt &Arg) {
496 if (Arg.isSingleWord())
Craig Topperb339c6d2017-05-03 15:46:24 +0000497 return hash_combine(Arg.U.VAL);
Reid Spencerb2bc9852007-02-26 21:02:27 +0000498
Craig Topperb339c6d2017-05-03 15:46:24 +0000499 return hash_combine_range(Arg.U.pVal, Arg.U.pVal + Arg.getNumWords());
Reid Spencerb2bc9852007-02-26 21:02:27 +0000500}
501
Benjamin Kramerb4b51502015-03-25 16:49:59 +0000502bool APInt::isSplat(unsigned SplatSizeInBits) const {
503 assert(getBitWidth() % SplatSizeInBits == 0 &&
504 "SplatSizeInBits must divide width!");
505 // We can check that all parts of an integer are equal by making use of a
506 // little trick: rotate and check if it's still the same value.
507 return *this == rotl(SplatSizeInBits);
508}
509
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000510/// This function returns the high "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000511APInt APInt::getHiBits(unsigned numBits) const {
Craig Toppere7e35602017-03-31 18:48:14 +0000512 return this->lshr(BitWidth - numBits);
Zhou Shengdac63782007-02-06 03:00:16 +0000513}
514
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000515/// This function returns the low "numBits" bits of this APInt.
Chris Lattner77527f52009-01-21 18:09:24 +0000516APInt APInt::getLoBits(unsigned numBits) const {
Craig Toppere7e35602017-03-31 18:48:14 +0000517 APInt Result(getLowBitsSet(BitWidth, numBits));
518 Result &= *this;
519 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000520}
521
Craig Topper9881bd92017-05-02 06:32:27 +0000522/// Return a value containing V broadcasted over NewLen bits.
523APInt APInt::getSplat(unsigned NewLen, const APInt &V) {
524 assert(NewLen >= V.getBitWidth() && "Can't splat to smaller bit width!");
525
526 APInt Val = V.zextOrSelf(NewLen);
527 for (unsigned I = V.getBitWidth(); I < NewLen; I <<= 1)
528 Val |= Val << I;
529
530 return Val;
531}
532
Chris Lattner77527f52009-01-21 18:09:24 +0000533unsigned APInt::countLeadingZerosSlowCase() const {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000534 unsigned Count = 0;
535 for (int i = getNumWords()-1; i >= 0; --i) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000536 uint64_t V = U.pVal[i];
Matthias Brauna6be4e82016-02-15 20:06:22 +0000537 if (V == 0)
Chris Lattner1ac3e252008-08-20 17:02:31 +0000538 Count += APINT_BITS_PER_WORD;
539 else {
Matthias Brauna6be4e82016-02-15 20:06:22 +0000540 Count += llvm::countLeadingZeros(V);
Chris Lattner1ac3e252008-08-20 17:02:31 +0000541 break;
Reid Spencer74cf82e2007-02-21 00:29:48 +0000542 }
Zhou Shengdac63782007-02-06 03:00:16 +0000543 }
Matthias Brauna6be4e82016-02-15 20:06:22 +0000544 // Adjust for unused bits in the most significant word (they are zero).
545 unsigned Mod = BitWidth % APINT_BITS_PER_WORD;
546 Count -= Mod > 0 ? APINT_BITS_PER_WORD - Mod : 0;
John McCalldf951bd2010-02-03 03:42:44 +0000547 return Count;
Zhou Shengdac63782007-02-06 03:00:16 +0000548}
549
Craig Topper40516522017-06-23 20:28:45 +0000550unsigned APInt::countLeadingOnesSlowCase() const {
Chris Lattner77527f52009-01-21 18:09:24 +0000551 unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD;
Torok Edwinec39eb82009-01-27 18:06:03 +0000552 unsigned shift;
553 if (!highWordBits) {
554 highWordBits = APINT_BITS_PER_WORD;
555 shift = 0;
556 } else {
557 shift = APINT_BITS_PER_WORD - highWordBits;
558 }
Reid Spencer31acef52007-02-27 21:59:26 +0000559 int i = getNumWords() - 1;
Craig Topperb339c6d2017-05-03 15:46:24 +0000560 unsigned Count = llvm::countLeadingOnes(U.pVal[i] << shift);
Reid Spencer31acef52007-02-27 21:59:26 +0000561 if (Count == highWordBits) {
562 for (i--; i >= 0; --i) {
Simon Pilgrim8f465052018-08-16 11:08:23 +0000563 if (U.pVal[i] == WORDTYPE_MAX)
Reid Spencer31acef52007-02-27 21:59:26 +0000564 Count += APINT_BITS_PER_WORD;
565 else {
Craig Topperb339c6d2017-05-03 15:46:24 +0000566 Count += llvm::countLeadingOnes(U.pVal[i]);
Reid Spencer31acef52007-02-27 21:59:26 +0000567 break;
568 }
569 }
570 }
571 return Count;
572}
573
Craig Topper40516522017-06-23 20:28:45 +0000574unsigned APInt::countTrailingZerosSlowCase() const {
Chris Lattner77527f52009-01-21 18:09:24 +0000575 unsigned Count = 0;
576 unsigned i = 0;
Craig Topperb339c6d2017-05-03 15:46:24 +0000577 for (; i < getNumWords() && U.pVal[i] == 0; ++i)
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000578 Count += APINT_BITS_PER_WORD;
579 if (i < getNumWords())
Craig Topperb339c6d2017-05-03 15:46:24 +0000580 Count += llvm::countTrailingZeros(U.pVal[i]);
Chris Lattnerc2c4c742007-11-23 22:36:25 +0000581 return std::min(Count, BitWidth);
Zhou Shengdac63782007-02-06 03:00:16 +0000582}
583
Chris Lattner77527f52009-01-21 18:09:24 +0000584unsigned APInt::countTrailingOnesSlowCase() const {
585 unsigned Count = 0;
586 unsigned i = 0;
Simon Pilgrim8f465052018-08-16 11:08:23 +0000587 for (; i < getNumWords() && U.pVal[i] == WORDTYPE_MAX; ++i)
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000588 Count += APINT_BITS_PER_WORD;
589 if (i < getNumWords())
Craig Topperb339c6d2017-05-03 15:46:24 +0000590 Count += llvm::countTrailingOnes(U.pVal[i]);
Craig Topper3a29e3b82017-04-22 19:59:11 +0000591 assert(Count <= BitWidth);
592 return Count;
Dan Gohman8b4fa9d2008-02-13 21:11:05 +0000593}
594
Chris Lattner77527f52009-01-21 18:09:24 +0000595unsigned APInt::countPopulationSlowCase() const {
596 unsigned Count = 0;
597 for (unsigned i = 0; i < getNumWords(); ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000598 Count += llvm::countPopulation(U.pVal[i]);
Zhou Shengdac63782007-02-06 03:00:16 +0000599 return Count;
600}
601
Craig Topperbaa392e2017-04-20 02:11:27 +0000602bool APInt::intersectsSlowCase(const APInt &RHS) const {
603 for (unsigned i = 0, e = getNumWords(); i != e; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000604 if ((U.pVal[i] & RHS.U.pVal[i]) != 0)
Craig Topperbaa392e2017-04-20 02:11:27 +0000605 return true;
606
607 return false;
608}
609
Craig Toppera8129a12017-04-20 16:17:13 +0000610bool APInt::isSubsetOfSlowCase(const APInt &RHS) const {
611 for (unsigned i = 0, e = getNumWords(); i != e; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000612 if ((U.pVal[i] & ~RHS.U.pVal[i]) != 0)
Craig Toppera8129a12017-04-20 16:17:13 +0000613 return false;
614
615 return true;
616}
617
Reid Spencer1d072122007-02-16 22:36:51 +0000618APInt APInt::byteSwap() const {
619 assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
620 if (BitWidth == 16)
Craig Topperb339c6d2017-05-03 15:46:24 +0000621 return APInt(BitWidth, ByteSwap_16(uint16_t(U.VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000622 if (BitWidth == 32)
Craig Topperb339c6d2017-05-03 15:46:24 +0000623 return APInt(BitWidth, ByteSwap_32(unsigned(U.VAL)));
Richard Smith4f9a8082011-11-23 21:33:37 +0000624 if (BitWidth == 48) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000625 unsigned Tmp1 = unsigned(U.VAL >> 16);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000626 Tmp1 = ByteSwap_32(Tmp1);
Craig Topperb339c6d2017-05-03 15:46:24 +0000627 uint16_t Tmp2 = uint16_t(U.VAL);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000628 Tmp2 = ByteSwap_16(Tmp2);
Jeff Cohene06855e2007-03-20 20:42:36 +0000629 return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1);
Zhou Shengcfa2ac02007-02-15 06:36:31 +0000630 }
Richard Smith4f9a8082011-11-23 21:33:37 +0000631 if (BitWidth == 64)
Craig Topperb339c6d2017-05-03 15:46:24 +0000632 return APInt(BitWidth, ByteSwap_64(U.VAL));
Richard Smith4f9a8082011-11-23 21:33:37 +0000633
634 APInt Result(getNumWords() * APINT_BITS_PER_WORD, 0);
635 for (unsigned I = 0, N = getNumWords(); I != N; ++I)
Craig Topperb339c6d2017-05-03 15:46:24 +0000636 Result.U.pVal[I] = ByteSwap_64(U.pVal[N - I - 1]);
Richard Smith4f9a8082011-11-23 21:33:37 +0000637 if (Result.BitWidth != BitWidth) {
Richard Smith55bd3752017-04-13 20:29:59 +0000638 Result.lshrInPlace(Result.BitWidth - BitWidth);
Richard Smith4f9a8082011-11-23 21:33:37 +0000639 Result.BitWidth = BitWidth;
640 }
641 return Result;
Zhou Shengdac63782007-02-06 03:00:16 +0000642}
643
Matt Arsenault155dda92016-03-21 15:00:35 +0000644APInt APInt::reverseBits() const {
645 switch (BitWidth) {
646 case 64:
Craig Topperb339c6d2017-05-03 15:46:24 +0000647 return APInt(BitWidth, llvm::reverseBits<uint64_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000648 case 32:
Craig Topperb339c6d2017-05-03 15:46:24 +0000649 return APInt(BitWidth, llvm::reverseBits<uint32_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000650 case 16:
Craig Topperb339c6d2017-05-03 15:46:24 +0000651 return APInt(BitWidth, llvm::reverseBits<uint16_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000652 case 8:
Craig Topperb339c6d2017-05-03 15:46:24 +0000653 return APInt(BitWidth, llvm::reverseBits<uint8_t>(U.VAL));
Matt Arsenault155dda92016-03-21 15:00:35 +0000654 default:
655 break;
656 }
657
658 APInt Val(*this);
Craig Topper9eaef072017-04-18 05:02:21 +0000659 APInt Reversed(BitWidth, 0);
660 unsigned S = BitWidth;
Matt Arsenault155dda92016-03-21 15:00:35 +0000661
Craig Topper9eaef072017-04-18 05:02:21 +0000662 for (; Val != 0; Val.lshrInPlace(1)) {
Matt Arsenault155dda92016-03-21 15:00:35 +0000663 Reversed <<= 1;
Craig Topper9eaef072017-04-18 05:02:21 +0000664 Reversed |= Val[0];
Matt Arsenault155dda92016-03-21 15:00:35 +0000665 --S;
666 }
667
668 Reversed <<= S;
669 return Reversed;
670}
671
Craig Topper278ebd22017-04-01 20:30:57 +0000672APInt llvm::APIntOps::GreatestCommonDivisor(APInt A, APInt B) {
Richard Smith55bd3752017-04-13 20:29:59 +0000673 // Fast-path a common case.
674 if (A == B) return A;
675
676 // Corner cases: if either operand is zero, the other is the gcd.
677 if (!A) return B;
678 if (!B) return A;
679
680 // Count common powers of 2 and remove all other powers of 2.
681 unsigned Pow2;
682 {
683 unsigned Pow2_A = A.countTrailingZeros();
684 unsigned Pow2_B = B.countTrailingZeros();
685 if (Pow2_A > Pow2_B) {
686 A.lshrInPlace(Pow2_A - Pow2_B);
687 Pow2 = Pow2_B;
688 } else if (Pow2_B > Pow2_A) {
689 B.lshrInPlace(Pow2_B - Pow2_A);
690 Pow2 = Pow2_A;
691 } else {
692 Pow2 = Pow2_A;
693 }
Zhou Shengdac63782007-02-06 03:00:16 +0000694 }
Richard Smith55bd3752017-04-13 20:29:59 +0000695
696 // Both operands are odd multiples of 2^Pow_2:
697 //
698 // gcd(a, b) = gcd(|a - b| / 2^i, min(a, b))
699 //
700 // This is a modified version of Stein's algorithm, taking advantage of
701 // efficient countTrailingZeros().
702 while (A != B) {
703 if (A.ugt(B)) {
704 A -= B;
705 A.lshrInPlace(A.countTrailingZeros() - Pow2);
706 } else {
707 B -= A;
708 B.lshrInPlace(B.countTrailingZeros() - Pow2);
709 }
710 }
711
Zhou Shengdac63782007-02-06 03:00:16 +0000712 return A;
713}
Chris Lattner28cbd1d2007-02-06 05:38:37 +0000714
Chris Lattner77527f52009-01-21 18:09:24 +0000715APInt llvm::APIntOps::RoundDoubleToAPInt(double Double, unsigned width) {
JF Bastienc4986ce2018-09-08 03:55:25 +0000716 uint64_t I = bit_cast<uint64_t>(Double);
Reid Spencer974551a2007-02-27 01:28:10 +0000717
718 // Get the sign bit from the highest order bit
JF Bastienc4986ce2018-09-08 03:55:25 +0000719 bool isNeg = I >> 63;
Reid Spencer974551a2007-02-27 01:28:10 +0000720
721 // Get the 11-bit exponent and adjust for the 1023 bit bias
JF Bastienc4986ce2018-09-08 03:55:25 +0000722 int64_t exp = ((I >> 52) & 0x7ff) - 1023;
Reid Spencer974551a2007-02-27 01:28:10 +0000723
724 // If the exponent is negative, the value is < 0 so just return 0.
Zhou Shengd707d632007-02-12 20:02:55 +0000725 if (exp < 0)
Reid Spencer66d0d572007-02-28 01:30:08 +0000726 return APInt(width, 0u);
Reid Spencer974551a2007-02-27 01:28:10 +0000727
728 // Extract the mantissa by clearing the top 12 bits (sign + exponent).
JF Bastienc4986ce2018-09-08 03:55:25 +0000729 uint64_t mantissa = (I & (~0ULL >> 12)) | 1ULL << 52;
Reid Spencer974551a2007-02-27 01:28:10 +0000730
731 // If the exponent doesn't shift all bits out of the mantissa
Zhou Shengd707d632007-02-12 20:02:55 +0000732 if (exp < 52)
Eric Christopher820256b2009-08-21 04:06:45 +0000733 return isNeg ? -APInt(width, mantissa >> (52 - exp)) :
Reid Spencer54abdcf2007-02-27 18:23:40 +0000734 APInt(width, mantissa >> (52 - exp));
735
736 // If the client didn't provide enough bits for us to shift the mantissa into
737 // then the result is undefined, just return 0
738 if (width <= exp - 52)
739 return APInt(width, 0);
Reid Spencer974551a2007-02-27 01:28:10 +0000740
741 // Otherwise, we have to shift the mantissa bits up to the right location
Reid Spencer54abdcf2007-02-27 18:23:40 +0000742 APInt Tmp(width, mantissa);
Craig Topper24e71012017-04-28 03:36:24 +0000743 Tmp <<= (unsigned)exp - 52;
Zhou Shengd707d632007-02-12 20:02:55 +0000744 return isNeg ? -Tmp : Tmp;
745}
746
Pawel Bylica6eeeac72015-04-06 13:31:39 +0000747/// This function converts this APInt to a double.
Zhou Shengd707d632007-02-12 20:02:55 +0000748/// The layout for double is as following (IEEE Standard 754):
749/// --------------------------------------
750/// | Sign Exponent Fraction Bias |
751/// |-------------------------------------- |
752/// | 1[63] 11[62-52] 52[51-00] 1023 |
Eric Christopher820256b2009-08-21 04:06:45 +0000753/// --------------------------------------
Reid Spencer1d072122007-02-16 22:36:51 +0000754double APInt::roundToDouble(bool isSigned) const {
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000755
756 // Handle the simple case where the value is contained in one uint64_t.
Dale Johannesen54be7852009-08-12 18:04:11 +0000757 // It is wrong to optimize getWord(0) to VAL; there might be more than one word.
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000758 if (isSingleWord() || getActiveBits() <= APINT_BITS_PER_WORD) {
759 if (isSigned) {
David Majnemer03992262016-06-24 21:15:36 +0000760 int64_t sext = SignExtend64(getWord(0), BitWidth);
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000761 return double(sext);
762 } else
Dale Johannesen34c08bb2009-08-12 17:42:34 +0000763 return double(getWord(0));
Reid Spencerbe4ddf62007-02-18 20:09:41 +0000764 }
765
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000766 // Determine if the value is negative.
Reid Spencer1d072122007-02-16 22:36:51 +0000767 bool isNeg = isSigned ? (*this)[BitWidth-1] : false;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000768
769 // Construct the absolute value if we're negative.
Zhou Shengd707d632007-02-12 20:02:55 +0000770 APInt Tmp(isNeg ? -(*this) : (*this));
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000771
772 // Figure out how many bits we're using.
Chris Lattner77527f52009-01-21 18:09:24 +0000773 unsigned n = Tmp.getActiveBits();
Zhou Shengd707d632007-02-12 20:02:55 +0000774
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000775 // The exponent (without bias normalization) is just the number of bits
776 // we are using. Note that the sign bit is gone since we constructed the
777 // absolute value.
778 uint64_t exp = n;
Zhou Shengd707d632007-02-12 20:02:55 +0000779
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000780 // Return infinity for exponent overflow
781 if (exp > 1023) {
782 if (!isSigned || !isNeg)
Jeff Cohene06855e2007-03-20 20:42:36 +0000783 return std::numeric_limits<double>::infinity();
Eric Christopher820256b2009-08-21 04:06:45 +0000784 else
Jeff Cohene06855e2007-03-20 20:42:36 +0000785 return -std::numeric_limits<double>::infinity();
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000786 }
787 exp += 1023; // Increment for 1023 bias
788
789 // Number of bits in mantissa is 52. To obtain the mantissa value, we must
790 // extract the high 52 bits from the correct words in pVal.
Zhou Shengd707d632007-02-12 20:02:55 +0000791 uint64_t mantissa;
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000792 unsigned hiWord = whichWord(n-1);
793 if (hiWord == 0) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000794 mantissa = Tmp.U.pVal[0];
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000795 if (n > 52)
796 mantissa >>= n - 52; // shift down, we want the top 52 bits.
797 } else {
798 assert(hiWord > 0 && "huh?");
Craig Topperb339c6d2017-05-03 15:46:24 +0000799 uint64_t hibits = Tmp.U.pVal[hiWord] << (52 - n % APINT_BITS_PER_WORD);
800 uint64_t lobits = Tmp.U.pVal[hiWord-1] >> (11 + n % APINT_BITS_PER_WORD);
Reid Spencerfb77b2b2007-02-20 08:51:03 +0000801 mantissa = hibits | lobits;
802 }
803
Zhou Shengd707d632007-02-12 20:02:55 +0000804 // The leading bit of mantissa is implicit, so get rid of it.
Reid Spencerfbd48a52007-02-18 00:44:22 +0000805 uint64_t sign = isNeg ? (1ULL << (APINT_BITS_PER_WORD - 1)) : 0;
JF Bastienc4986ce2018-09-08 03:55:25 +0000806 uint64_t I = sign | (exp << 52) | mantissa;
807 return bit_cast<double>(I);
Zhou Shengd707d632007-02-12 20:02:55 +0000808}
809
Reid Spencer1d072122007-02-16 22:36:51 +0000810// Truncate to new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000811APInt APInt::trunc(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000812 assert(width < BitWidth && "Invalid APInt Truncate request");
Chris Lattner1ac3e252008-08-20 17:02:31 +0000813 assert(width && "Can't truncate to 0 bits");
Jay Foad583abbc2010-12-07 08:25:19 +0000814
815 if (width <= APINT_BITS_PER_WORD)
816 return APInt(width, getRawData()[0]);
817
818 APInt Result(getMemory(getNumWords(width)), width);
819
820 // Copy full words.
821 unsigned i;
822 for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
Craig Topperb339c6d2017-05-03 15:46:24 +0000823 Result.U.pVal[i] = U.pVal[i];
Jay Foad583abbc2010-12-07 08:25:19 +0000824
825 // Truncate and copy any partial word.
826 unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
827 if (bits != 0)
Craig Topperb339c6d2017-05-03 15:46:24 +0000828 Result.U.pVal[i] = U.pVal[i] << bits >> bits;
Jay Foad583abbc2010-12-07 08:25:19 +0000829
830 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000831}
832
833// Sign extend to a new width.
Craig Topper1dec2812017-04-24 17:37:10 +0000834APInt APInt::sext(unsigned Width) const {
835 assert(Width > BitWidth && "Invalid APInt SignExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +0000836
Craig Topper1dec2812017-04-24 17:37:10 +0000837 if (Width <= APINT_BITS_PER_WORD)
Craig Topperb339c6d2017-05-03 15:46:24 +0000838 return APInt(Width, SignExtend64(U.VAL, BitWidth));
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000839
Craig Topper1dec2812017-04-24 17:37:10 +0000840 APInt Result(getMemory(getNumWords(Width)), Width);
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000841
Craig Topper1dec2812017-04-24 17:37:10 +0000842 // Copy words.
Craig Topperb339c6d2017-05-03 15:46:24 +0000843 std::memcpy(Result.U.pVal, getRawData(), getNumWords() * APINT_WORD_SIZE);
Reid Spencerb6b5cc32007-02-25 23:44:53 +0000844
Craig Topper1dec2812017-04-24 17:37:10 +0000845 // Sign extend the last word since there may be unused bits in the input.
Craig Topperb339c6d2017-05-03 15:46:24 +0000846 Result.U.pVal[getNumWords() - 1] =
847 SignExtend64(Result.U.pVal[getNumWords() - 1],
Craig Topper1dec2812017-04-24 17:37:10 +0000848 ((BitWidth - 1) % APINT_BITS_PER_WORD) + 1);
Jay Foad583abbc2010-12-07 08:25:19 +0000849
Craig Topper1dec2812017-04-24 17:37:10 +0000850 // Fill with sign bits.
Craig Topperb339c6d2017-05-03 15:46:24 +0000851 std::memset(Result.U.pVal + getNumWords(), isNegative() ? -1 : 0,
Craig Topper1dec2812017-04-24 17:37:10 +0000852 (Result.getNumWords() - getNumWords()) * APINT_WORD_SIZE);
853 Result.clearUnusedBits();
Jay Foad583abbc2010-12-07 08:25:19 +0000854 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000855}
856
857// Zero extend to a new width.
Jay Foad583abbc2010-12-07 08:25:19 +0000858APInt APInt::zext(unsigned width) const {
Reid Spencer1d072122007-02-16 22:36:51 +0000859 assert(width > BitWidth && "Invalid APInt ZeroExtend request");
Jay Foad583abbc2010-12-07 08:25:19 +0000860
861 if (width <= APINT_BITS_PER_WORD)
Craig Topperb339c6d2017-05-03 15:46:24 +0000862 return APInt(width, U.VAL);
Jay Foad583abbc2010-12-07 08:25:19 +0000863
864 APInt Result(getMemory(getNumWords(width)), width);
865
866 // Copy words.
Craig Topperb339c6d2017-05-03 15:46:24 +0000867 std::memcpy(Result.U.pVal, getRawData(), getNumWords() * APINT_WORD_SIZE);
Jay Foad583abbc2010-12-07 08:25:19 +0000868
869 // Zero remaining words.
Craig Topperb339c6d2017-05-03 15:46:24 +0000870 std::memset(Result.U.pVal + getNumWords(), 0,
Craig Topper1dec2812017-04-24 17:37:10 +0000871 (Result.getNumWords() - getNumWords()) * APINT_WORD_SIZE);
Jay Foad583abbc2010-12-07 08:25:19 +0000872
873 return Result;
Reid Spencer1d072122007-02-16 22:36:51 +0000874}
875
Jay Foad583abbc2010-12-07 08:25:19 +0000876APInt APInt::zextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +0000877 if (BitWidth < width)
878 return zext(width);
879 if (BitWidth > width)
880 return trunc(width);
881 return *this;
882}
883
Jay Foad583abbc2010-12-07 08:25:19 +0000884APInt APInt::sextOrTrunc(unsigned width) const {
Reid Spencer742d1702007-03-01 17:15:32 +0000885 if (BitWidth < width)
886 return sext(width);
887 if (BitWidth > width)
888 return trunc(width);
889 return *this;
890}
891
Rafael Espindolabb893fe2012-01-27 23:33:07 +0000892APInt APInt::zextOrSelf(unsigned width) const {
893 if (BitWidth < width)
894 return zext(width);
895 return *this;
896}
897
898APInt APInt::sextOrSelf(unsigned width) const {
899 if (BitWidth < width)
900 return sext(width);
901 return *this;
902}
903
Zhou Shenge93db8f2007-02-09 07:48:24 +0000904/// Arithmetic right-shift this APInt by shiftAmt.
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000905/// Arithmetic right-shift function.
Craig Topper8b373262017-04-24 17:18:47 +0000906void APInt::ashrInPlace(const APInt &shiftAmt) {
907 ashrInPlace((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +0000908}
909
910/// Arithmetic right-shift this APInt by shiftAmt.
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000911/// Arithmetic right-shift function.
Craig Topper8b373262017-04-24 17:18:47 +0000912void APInt::ashrSlowCase(unsigned ShiftAmt) {
913 // Don't bother performing a no-op shift.
914 if (!ShiftAmt)
915 return;
Reid Spencer1825dd02007-03-02 22:39:11 +0000916
Craig Topper8b373262017-04-24 17:18:47 +0000917 // Save the original sign bit for later.
918 bool Negative = isNegative();
Reid Spencer522ca7c2007-02-25 01:56:07 +0000919
Hiroshi Inoue9ff23802018-04-09 04:37:53 +0000920 // WordShift is the inter-part shift; BitShift is intra-part shift.
Craig Topper8b373262017-04-24 17:18:47 +0000921 unsigned WordShift = ShiftAmt / APINT_BITS_PER_WORD;
922 unsigned BitShift = ShiftAmt % APINT_BITS_PER_WORD;
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000923
Craig Topper8b373262017-04-24 17:18:47 +0000924 unsigned WordsToMove = getNumWords() - WordShift;
925 if (WordsToMove != 0) {
926 // Sign extend the last word to fill in the unused bits.
Craig Topperb339c6d2017-05-03 15:46:24 +0000927 U.pVal[getNumWords() - 1] = SignExtend64(
928 U.pVal[getNumWords() - 1], ((BitWidth - 1) % APINT_BITS_PER_WORD) + 1);
Renato Golincc4a9122017-04-23 12:02:07 +0000929
Craig Topper8b373262017-04-24 17:18:47 +0000930 // Fastpath for moving by whole words.
931 if (BitShift == 0) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000932 std::memmove(U.pVal, U.pVal + WordShift, WordsToMove * APINT_WORD_SIZE);
Craig Topper8b373262017-04-24 17:18:47 +0000933 } else {
934 // Move the words containing significant bits.
935 for (unsigned i = 0; i != WordsToMove - 1; ++i)
Craig Topperb339c6d2017-05-03 15:46:24 +0000936 U.pVal[i] = (U.pVal[i + WordShift] >> BitShift) |
937 (U.pVal[i + WordShift + 1] << (APINT_BITS_PER_WORD - BitShift));
Renato Golincc4a9122017-04-23 12:02:07 +0000938
Craig Topper8b373262017-04-24 17:18:47 +0000939 // Handle the last word which has no high bits to copy.
Craig Topperb339c6d2017-05-03 15:46:24 +0000940 U.pVal[WordsToMove - 1] = U.pVal[WordShift + WordsToMove - 1] >> BitShift;
Craig Topper8b373262017-04-24 17:18:47 +0000941 // Sign extend one more time.
Craig Topperb339c6d2017-05-03 15:46:24 +0000942 U.pVal[WordsToMove - 1] =
943 SignExtend64(U.pVal[WordsToMove - 1], APINT_BITS_PER_WORD - BitShift);
Chris Lattnerdad2d092007-05-03 18:15:36 +0000944 }
Reid Spenceraa8dcfe2007-02-26 07:44:38 +0000945 }
946
Craig Topper8b373262017-04-24 17:18:47 +0000947 // Fill in the remainder based on the original sign.
Craig Topperb339c6d2017-05-03 15:46:24 +0000948 std::memset(U.pVal + WordsToMove, Negative ? -1 : 0,
Craig Topper8b373262017-04-24 17:18:47 +0000949 WordShift * APINT_WORD_SIZE);
950 clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000951}
952
Zhou Shenge93db8f2007-02-09 07:48:24 +0000953/// Logical right-shift this APInt by shiftAmt.
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000954/// Logical right-shift function.
Craig Topperfc947bc2017-04-18 17:14:21 +0000955void APInt::lshrInPlace(const APInt &shiftAmt) {
956 lshrInPlace((unsigned)shiftAmt.getLimitedValue(BitWidth));
Dan Gohman105c1d42008-02-29 01:40:47 +0000957}
958
959/// Logical right-shift this APInt by shiftAmt.
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000960/// Logical right-shift function.
Craig Topperae8bd672017-04-18 19:13:27 +0000961void APInt::lshrSlowCase(unsigned ShiftAmt) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000962 tcShiftRight(U.pVal, getNumWords(), ShiftAmt);
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000963}
964
Zhou Shenge93db8f2007-02-09 07:48:24 +0000965/// Left-shift this APInt by shiftAmt.
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000966/// Left-shift function.
Craig Topper24e71012017-04-28 03:36:24 +0000967APInt &APInt::operator<<=(const APInt &shiftAmt) {
Nick Lewycky030c4502009-01-19 17:42:33 +0000968 // It's undefined behavior in C to shift by BitWidth or greater.
Craig Topper24e71012017-04-28 03:36:24 +0000969 *this <<= (unsigned)shiftAmt.getLimitedValue(BitWidth);
970 return *this;
Dan Gohman105c1d42008-02-29 01:40:47 +0000971}
972
Craig Toppera8a4f0d2017-04-18 04:39:48 +0000973void APInt::shlSlowCase(unsigned ShiftAmt) {
Craig Topperb339c6d2017-05-03 15:46:24 +0000974 tcShiftLeft(U.pVal, getNumWords(), ShiftAmt);
Craig Toppera8a4f0d2017-04-18 04:39:48 +0000975 clearUnusedBits();
Zhou Shengfbf61ea2007-02-08 14:35:19 +0000976}
977
Joey Gouly51c0ae52017-02-07 11:58:22 +0000978// Calculate the rotate amount modulo the bit width.
979static unsigned rotateModulo(unsigned BitWidth, const APInt &rotateAmt) {
980 unsigned rotBitWidth = rotateAmt.getBitWidth();
981 APInt rot = rotateAmt;
982 if (rotBitWidth < BitWidth) {
983 // Extend the rotate APInt, so that the urem doesn't divide by 0.
984 // e.g. APInt(1, 32) would give APInt(1, 0).
985 rot = rotateAmt.zext(BitWidth);
986 }
987 rot = rot.urem(APInt(rot.getBitWidth(), BitWidth));
988 return rot.getLimitedValue(BitWidth);
989}
990
Dan Gohman105c1d42008-02-29 01:40:47 +0000991APInt APInt::rotl(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +0000992 return rotl(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +0000993}
994
Chris Lattner77527f52009-01-21 18:09:24 +0000995APInt APInt::rotl(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +0000996 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +0000997 if (rotateAmt == 0)
998 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +0000999 return shl(rotateAmt) | lshr(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001000}
1001
Dan Gohman105c1d42008-02-29 01:40:47 +00001002APInt APInt::rotr(const APInt &rotateAmt) const {
Joey Gouly51c0ae52017-02-07 11:58:22 +00001003 return rotr(rotateModulo(BitWidth, rotateAmt));
Dan Gohman105c1d42008-02-29 01:40:47 +00001004}
1005
Chris Lattner77527f52009-01-21 18:09:24 +00001006APInt APInt::rotr(unsigned rotateAmt) const {
Eli Friedman2aae94f2011-12-22 03:15:35 +00001007 rotateAmt %= BitWidth;
Reid Spencer98ed7db2007-05-14 00:15:28 +00001008 if (rotateAmt == 0)
1009 return *this;
Eli Friedman2aae94f2011-12-22 03:15:35 +00001010 return lshr(rotateAmt) | shl(BitWidth - rotateAmt);
Reid Spencer4c50b522007-05-13 23:44:59 +00001011}
Reid Spencerd99feaf2007-03-01 05:39:56 +00001012
1013// Square Root - this method computes and returns the square root of "this".
1014// Three mechanisms are used for computation. For small values (<= 5 bits),
1015// a table lookup is done. This gets some performance for common cases. For
1016// values using less than 52 bits, the value is converted to double and then
1017// the libc sqrt function is called. The result is rounded and then converted
1018// back to a uint64_t which is then used to construct the result. Finally,
Eric Christopher820256b2009-08-21 04:06:45 +00001019// the Babylonian method for computing square roots is used.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001020APInt APInt::sqrt() const {
1021
1022 // Determine the magnitude of the value.
Chris Lattner77527f52009-01-21 18:09:24 +00001023 unsigned magnitude = getActiveBits();
Reid Spencerd99feaf2007-03-01 05:39:56 +00001024
1025 // Use a fast table for some small values. This also gets rid of some
1026 // rounding errors in libc sqrt for small values.
1027 if (magnitude <= 5) {
Reid Spencer2f6ad4d2007-03-01 17:47:31 +00001028 static const uint8_t results[32] = {
Reid Spencerc8841d22007-03-01 06:23:32 +00001029 /* 0 */ 0,
1030 /* 1- 2 */ 1, 1,
Eric Christopher820256b2009-08-21 04:06:45 +00001031 /* 3- 6 */ 2, 2, 2, 2,
Reid Spencerc8841d22007-03-01 06:23:32 +00001032 /* 7-12 */ 3, 3, 3, 3, 3, 3,
1033 /* 13-20 */ 4, 4, 4, 4, 4, 4, 4, 4,
1034 /* 21-30 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1035 /* 31 */ 6
1036 };
Craig Topperb339c6d2017-05-03 15:46:24 +00001037 return APInt(BitWidth, results[ (isSingleWord() ? U.VAL : U.pVal[0]) ]);
Reid Spencerd99feaf2007-03-01 05:39:56 +00001038 }
1039
1040 // If the magnitude of the value fits in less than 52 bits (the precision of
1041 // an IEEE double precision floating point value), then we can use the
1042 // libc sqrt function which will probably use a hardware sqrt computation.
1043 // This should be faster than the algorithm below.
Jeff Cohenb622c112007-03-05 00:00:42 +00001044 if (magnitude < 52) {
Eric Christopher820256b2009-08-21 04:06:45 +00001045 return APInt(BitWidth,
Craig Topperb339c6d2017-05-03 15:46:24 +00001046 uint64_t(::round(::sqrt(double(isSingleWord() ? U.VAL
1047 : U.pVal[0])))));
Jeff Cohenb622c112007-03-05 00:00:42 +00001048 }
Reid Spencerd99feaf2007-03-01 05:39:56 +00001049
1050 // Okay, all the short cuts are exhausted. We must compute it. The following
1051 // is a classical Babylonian method for computing the square root. This code
Sanjay Patel4cb54e02014-09-11 15:41:01 +00001052 // was adapted to APInt from a wikipedia article on such computations.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001053 // See http://www.wikipedia.org/ and go to the page named
Eric Christopher820256b2009-08-21 04:06:45 +00001054 // Calculate_an_integer_square_root.
Chris Lattner77527f52009-01-21 18:09:24 +00001055 unsigned nbits = BitWidth, i = 4;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001056 APInt testy(BitWidth, 16);
1057 APInt x_old(BitWidth, 1);
1058 APInt x_new(BitWidth, 0);
1059 APInt two(BitWidth, 2);
1060
1061 // Select a good starting value using binary logarithms.
Eric Christopher820256b2009-08-21 04:06:45 +00001062 for (;; i += 2, testy = testy.shl(2))
Reid Spencerd99feaf2007-03-01 05:39:56 +00001063 if (i >= nbits || this->ule(testy)) {
1064 x_old = x_old.shl(i / 2);
1065 break;
1066 }
1067
Eric Christopher820256b2009-08-21 04:06:45 +00001068 // Use the Babylonian method to arrive at the integer square root:
Reid Spencerd99feaf2007-03-01 05:39:56 +00001069 for (;;) {
1070 x_new = (this->udiv(x_old) + x_old).udiv(two);
1071 if (x_old.ule(x_new))
1072 break;
1073 x_old = x_new;
1074 }
1075
1076 // Make sure we return the closest approximation
Eric Christopher820256b2009-08-21 04:06:45 +00001077 // NOTE: The rounding calculation below is correct. It will produce an
Reid Spencercf817562007-03-02 04:21:55 +00001078 // off-by-one discrepancy with results from pari/gp. That discrepancy has been
Eric Christopher820256b2009-08-21 04:06:45 +00001079 // determined to be a rounding issue with pari/gp as it begins to use a
Reid Spencercf817562007-03-02 04:21:55 +00001080 // floating point representation after 192 bits. There are no discrepancies
1081 // between this algorithm and pari/gp for bit widths < 192 bits.
Reid Spencerd99feaf2007-03-01 05:39:56 +00001082 APInt square(x_old * x_old);
1083 APInt nextSquare((x_old + 1) * (x_old +1));
1084 if (this->ult(square))
1085 return x_old;
David Blaikie54c94622011-12-01 20:58:30 +00001086 assert(this->ule(nextSquare) && "Error in APInt::sqrt computation");
1087 APInt midpoint((nextSquare - square).udiv(two));
1088 APInt offset(*this - square);
1089 if (offset.ult(midpoint))
1090 return x_old;
Reid Spencerd99feaf2007-03-01 05:39:56 +00001091 return x_old + 1;
1092}
1093
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001094/// Computes the multiplicative inverse of this APInt for a given modulo. The
1095/// iterative extended Euclidean algorithm is used to solve for this value,
1096/// however we simplify it to speed up calculating only the inverse, and take
1097/// advantage of div+rem calculations. We also use some tricks to avoid copying
1098/// (potentially large) APInts around.
1099APInt APInt::multiplicativeInverse(const APInt& modulo) const {
1100 assert(ult(modulo) && "This APInt must be smaller than the modulo");
1101
1102 // Using the properties listed at the following web page (accessed 06/21/08):
1103 // http://www.numbertheory.org/php/euclid.html
1104 // (especially the properties numbered 3, 4 and 9) it can be proved that
1105 // BitWidth bits suffice for all the computations in the algorithm implemented
1106 // below. More precisely, this number of bits suffice if the multiplicative
1107 // inverse exists, but may not suffice for the general extended Euclidean
1108 // algorithm.
1109
1110 APInt r[2] = { modulo, *this };
1111 APInt t[2] = { APInt(BitWidth, 0), APInt(BitWidth, 1) };
1112 APInt q(BitWidth, 0);
Eric Christopher820256b2009-08-21 04:06:45 +00001113
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001114 unsigned i;
1115 for (i = 0; r[i^1] != 0; i ^= 1) {
1116 // An overview of the math without the confusing bit-flipping:
1117 // q = r[i-2] / r[i-1]
1118 // r[i] = r[i-2] % r[i-1]
1119 // t[i] = t[i-2] - t[i-1] * q
1120 udivrem(r[i], r[i^1], q, r[i]);
1121 t[i] -= t[i^1] * q;
1122 }
1123
1124 // If this APInt and the modulo are not coprime, there is no multiplicative
1125 // inverse, so return 0. We check this by looking at the next-to-last
1126 // remainder, which is the gcd(*this,modulo) as calculated by the Euclidean
1127 // algorithm.
1128 if (r[i] != 1)
1129 return APInt(BitWidth, 0);
1130
1131 // The next-to-last t is the multiplicative inverse. However, we are
Craig Topper3fbecad2017-05-11 17:57:43 +00001132 // interested in a positive inverse. Calculate a positive one from a negative
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001133 // one if necessary. A simple addition of the modulo suffices because
Wojciech Matyjewiczf0d21cd2008-07-20 15:55:14 +00001134 // abs(t[i]) is known to be less than *this/2 (see the link above).
Craig Topperdbd62192017-05-11 18:40:53 +00001135 if (t[i].isNegative())
1136 t[i] += modulo;
1137
1138 return std::move(t[i]);
Wojciech Matyjewicz41b744d2008-06-23 19:39:50 +00001139}
1140
Jay Foadfe0c6482009-04-30 10:15:35 +00001141/// Calculate the magic numbers required to implement a signed integer division
1142/// by a constant as a sequence of multiplies, adds and shifts. Requires that
1143/// the divisor not be 0, 1, or -1. Taken from "Hacker's Delight", Henry S.
1144/// Warren, Jr., chapter 10.
1145APInt::ms APInt::magic() const {
1146 const APInt& d = *this;
1147 unsigned p;
1148 APInt ad, anc, delta, q1, r1, q2, r2, t;
Jay Foadfe0c6482009-04-30 10:15:35 +00001149 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
Jay Foadfe0c6482009-04-30 10:15:35 +00001150 struct ms mag;
Eric Christopher820256b2009-08-21 04:06:45 +00001151
Jay Foadfe0c6482009-04-30 10:15:35 +00001152 ad = d.abs();
1153 t = signedMin + (d.lshr(d.getBitWidth() - 1));
1154 anc = t - 1 - t.urem(ad); // absolute value of nc
1155 p = d.getBitWidth() - 1; // initialize p
1156 q1 = signedMin.udiv(anc); // initialize q1 = 2p/abs(nc)
1157 r1 = signedMin - q1*anc; // initialize r1 = rem(2p,abs(nc))
1158 q2 = signedMin.udiv(ad); // initialize q2 = 2p/abs(d)
1159 r2 = signedMin - q2*ad; // initialize r2 = rem(2p,abs(d))
1160 do {
1161 p = p + 1;
1162 q1 = q1<<1; // update q1 = 2p/abs(nc)
1163 r1 = r1<<1; // update r1 = rem(2p/abs(nc))
1164 if (r1.uge(anc)) { // must be unsigned comparison
1165 q1 = q1 + 1;
1166 r1 = r1 - anc;
1167 }
1168 q2 = q2<<1; // update q2 = 2p/abs(d)
1169 r2 = r2<<1; // update r2 = rem(2p/abs(d))
1170 if (r2.uge(ad)) { // must be unsigned comparison
1171 q2 = q2 + 1;
1172 r2 = r2 - ad;
1173 }
1174 delta = ad - r2;
Cameron Zwarich8731d0c2011-02-21 00:22:02 +00001175 } while (q1.ult(delta) || (q1 == delta && r1 == 0));
Eric Christopher820256b2009-08-21 04:06:45 +00001176
Jay Foadfe0c6482009-04-30 10:15:35 +00001177 mag.m = q2 + 1;
1178 if (d.isNegative()) mag.m = -mag.m; // resulting magic number
1179 mag.s = p - d.getBitWidth(); // resulting shift
1180 return mag;
1181}
1182
1183/// Calculate the magic numbers required to implement an unsigned integer
1184/// division by a constant as a sequence of multiplies, adds and shifts.
1185/// Requires that the divisor not be 0. Taken from "Hacker's Delight", Henry
1186/// S. Warren, Jr., chapter 10.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001187/// LeadingZeros can be used to simplify the calculation if the upper bits
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001188/// of the divided value are known zero.
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001189APInt::mu APInt::magicu(unsigned LeadingZeros) const {
Jay Foadfe0c6482009-04-30 10:15:35 +00001190 const APInt& d = *this;
1191 unsigned p;
1192 APInt nc, delta, q1, r1, q2, r2;
1193 struct mu magu;
1194 magu.a = 0; // initialize "add" indicator
Benjamin Kramer09a51ba2011-03-17 20:39:06 +00001195 APInt allOnes = APInt::getAllOnesValue(d.getBitWidth()).lshr(LeadingZeros);
Jay Foadfe0c6482009-04-30 10:15:35 +00001196 APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
1197 APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
1198
Benjamin Kramer3aab6a82012-07-11 18:31:59 +00001199 nc = allOnes - (allOnes - d).urem(d);
Jay Foadfe0c6482009-04-30 10:15:35 +00001200 p = d.getBitWidth() - 1; // initialize p
1201 q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
1202 r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
1203 q2 = signedMax.udiv(d); // initialize q2 = (2p-1)/d
1204 r2 = signedMax - q2*d; // initialize r2 = rem((2p-1),d)
1205 do {
1206 p = p + 1;
1207 if (r1.uge(nc - r1)) {
1208 q1 = q1 + q1 + 1; // update q1
1209 r1 = r1 + r1 - nc; // update r1
1210 }
1211 else {
1212 q1 = q1+q1; // update q1
1213 r1 = r1+r1; // update r1
1214 }
1215 if ((r2 + 1).uge(d - r2)) {
1216 if (q2.uge(signedMax)) magu.a = 1;
1217 q2 = q2+q2 + 1; // update q2
1218 r2 = r2+r2 + 1 - d; // update r2
1219 }
1220 else {
1221 if (q2.uge(signedMin)) magu.a = 1;
1222 q2 = q2+q2; // update q2
1223 r2 = r2+r2 + 1; // update r2
1224 }
1225 delta = d - 1 - r2;
1226 } while (p < d.getBitWidth()*2 &&
1227 (q1.ult(delta) || (q1 == delta && r1 == 0)));
1228 magu.m = q2 + 1; // resulting magic number
1229 magu.s = p - d.getBitWidth(); // resulting shift
1230 return magu;
1231}
1232
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001233/// Implementation of Knuth's Algorithm D (Division of nonnegative integers)
1234/// from "Art of Computer Programming, Volume 2", section 4.3.1, p. 272. The
1235/// variables here have the same names as in the algorithm. Comments explain
1236/// the algorithm and any deviation from it.
Craig Topper6271bc72017-05-10 18:15:20 +00001237static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r,
Chris Lattner77527f52009-01-21 18:09:24 +00001238 unsigned m, unsigned n) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001239 assert(u && "Must provide dividend");
1240 assert(v && "Must provide divisor");
1241 assert(q && "Must provide quotient");
Yaron Keren39fc5a62015-03-26 19:45:19 +00001242 assert(u != v && u != q && v != q && "Must use different memory");
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001243 assert(n>1 && "n must be > 1");
1244
Yaron Keren39fc5a62015-03-26 19:45:19 +00001245 // b denotes the base of the number system. In our case b is 2^32.
George Burgess IV381fc0e2016-08-25 01:05:08 +00001246 const uint64_t b = uint64_t(1) << 32;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001247
Craig Topper03106bb2017-11-24 20:29:04 +00001248// The DEBUG macros here tend to be spam in the debug output if you're not
1249// debugging this code. Disable them unless KNUTH_DEBUG is defined.
Tim Northoverb3766452018-08-06 11:43:11 +00001250#ifdef KNUTH_DEBUG
1251#define DEBUG_KNUTH(X) LLVM_DEBUG(X)
1252#else
1253#define DEBUG_KNUTH(X) do {} while(false)
Craig Topper03106bb2017-11-24 20:29:04 +00001254#endif
1255
Tim Northoverb3766452018-08-06 11:43:11 +00001256 DEBUG_KNUTH(dbgs() << "KnuthDiv: m=" << m << " n=" << n << '\n');
1257 DEBUG_KNUTH(dbgs() << "KnuthDiv: original:");
1258 DEBUG_KNUTH(for (int i = m + n; i >= 0; i--) dbgs() << " " << u[i]);
1259 DEBUG_KNUTH(dbgs() << " by");
1260 DEBUG_KNUTH(for (int i = n; i > 0; i--) dbgs() << " " << v[i - 1]);
1261 DEBUG_KNUTH(dbgs() << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001262 // D1. [Normalize.] Set d = b / (v[n-1] + 1) and multiply all the digits of
1263 // u and v by d. Note that we have taken Knuth's advice here to use a power
1264 // of 2 value for d such that d * v[n-1] >= b/2 (b is the base). A power of
1265 // 2 allows us to shift instead of multiply and it is easy to determine the
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001266 // shift amount from the leading zeros. We are basically normalizing the u
1267 // and v so that its high bits are shifted to the top of v's range without
1268 // overflow. Note that this can require an extra word in u so that u must
1269 // be of length m+n+1.
Michael J. Spencerdf1ecbd72013-05-24 22:23:49 +00001270 unsigned shift = countLeadingZeros(v[n-1]);
Craig Topper6271bc72017-05-10 18:15:20 +00001271 uint32_t v_carry = 0;
1272 uint32_t u_carry = 0;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001273 if (shift) {
Chris Lattner77527f52009-01-21 18:09:24 +00001274 for (unsigned i = 0; i < m+n; ++i) {
Craig Topper6271bc72017-05-10 18:15:20 +00001275 uint32_t u_tmp = u[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001276 u[i] = (u[i] << shift) | u_carry;
1277 u_carry = u_tmp;
Reid Spencer100502d2007-02-17 03:16:00 +00001278 }
Chris Lattner77527f52009-01-21 18:09:24 +00001279 for (unsigned i = 0; i < n; ++i) {
Craig Topper6271bc72017-05-10 18:15:20 +00001280 uint32_t v_tmp = v[i] >> (32 - shift);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001281 v[i] = (v[i] << shift) | v_carry;
1282 v_carry = v_tmp;
1283 }
1284 }
1285 u[m+n] = u_carry;
Yaron Keren39fc5a62015-03-26 19:45:19 +00001286
Tim Northoverb3766452018-08-06 11:43:11 +00001287 DEBUG_KNUTH(dbgs() << "KnuthDiv: normal:");
1288 DEBUG_KNUTH(for (int i = m + n; i >= 0; i--) dbgs() << " " << u[i]);
1289 DEBUG_KNUTH(dbgs() << " by");
1290 DEBUG_KNUTH(for (int i = n; i > 0; i--) dbgs() << " " << v[i - 1]);
1291 DEBUG_KNUTH(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001292
1293 // D2. [Initialize j.] Set j to m. This is the loop counter over the places.
1294 int j = m;
1295 do {
Tim Northoverb3766452018-08-06 11:43:11 +00001296 DEBUG_KNUTH(dbgs() << "KnuthDiv: quotient digit #" << j << '\n');
Eric Christopher820256b2009-08-21 04:06:45 +00001297 // D3. [Calculate q'.].
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001298 // Set qp = (u[j+n]*b + u[j+n-1]) / v[n-1]. (qp=qprime=q')
1299 // Set rp = (u[j+n]*b + u[j+n-1]) % v[n-1]. (rp=rprime=r')
1300 // 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 +00001301 // 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 +00001302 // on v[n-2] determines at high speed most of the cases in which the trial
Eric Christopher820256b2009-08-21 04:06:45 +00001303 // value qp is one too large, and it eliminates all cases where qp is two
1304 // too large.
Craig Topper2c9a7062017-05-13 07:14:17 +00001305 uint64_t dividend = Make_64(u[j+n], u[j+n-1]);
Tim Northoverb3766452018-08-06 11:43:11 +00001306 DEBUG_KNUTH(dbgs() << "KnuthDiv: dividend == " << dividend << '\n');
Reid Spencercb292e42007-02-23 01:57:13 +00001307 uint64_t qp = dividend / v[n-1];
1308 uint64_t rp = dividend % v[n-1];
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001309 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1310 qp--;
1311 rp += v[n-1];
Reid Spencerdf6cf5a2007-02-24 10:01:42 +00001312 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
Reid Spencera5e0d202007-02-24 03:58:46 +00001313 qp--;
Reid Spencercb292e42007-02-23 01:57:13 +00001314 }
Tim Northoverb3766452018-08-06 11:43:11 +00001315 DEBUG_KNUTH(dbgs() << "KnuthDiv: qp == " << qp << ", rp == " << rp << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001316
Reid Spencercb292e42007-02-23 01:57:13 +00001317 // D4. [Multiply and subtract.] Replace (u[j+n]u[j+n-1]...u[j]) with
1318 // (u[j+n]u[j+n-1]..u[j]) - qp * (v[n-1]...v[1]v[0]). This computation
1319 // consists of a simple multiplication by a one-place number, combined with
Eric Christopher820256b2009-08-21 04:06:45 +00001320 // a subtraction.
Yaron Keren39fc5a62015-03-26 19:45:19 +00001321 // The digits (u[j+n]...u[j]) should be kept positive; if the result of
1322 // this step is actually negative, (u[j+n]...u[j]) should be left as the
1323 // true value plus b**(n+1), namely as the b's complement of
1324 // the true value, and a "borrow" to the left should be remembered.
Pawel Bylica86ac4472015-04-24 07:38:39 +00001325 int64_t borrow = 0;
Chris Lattner77527f52009-01-21 18:09:24 +00001326 for (unsigned i = 0; i < n; ++i) {
Pawel Bylica86ac4472015-04-24 07:38:39 +00001327 uint64_t p = uint64_t(qp) * uint64_t(v[i]);
Craig Topper2c9a7062017-05-13 07:14:17 +00001328 int64_t subres = int64_t(u[j+i]) - borrow - Lo_32(p);
1329 u[j+i] = Lo_32(subres);
1330 borrow = Hi_32(p) - Hi_32(subres);
Tim Northoverb3766452018-08-06 11:43:11 +00001331 DEBUG_KNUTH(dbgs() << "KnuthDiv: u[j+i] = " << u[j + i]
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001332 << ", borrow = " << borrow << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001333 }
Pawel Bylica86ac4472015-04-24 07:38:39 +00001334 bool isNeg = u[j+n] < borrow;
Craig Topper2c9a7062017-05-13 07:14:17 +00001335 u[j+n] -= Lo_32(borrow);
Pawel Bylica86ac4472015-04-24 07:38:39 +00001336
Tim Northoverb3766452018-08-06 11:43:11 +00001337 DEBUG_KNUTH(dbgs() << "KnuthDiv: after subtraction:");
1338 DEBUG_KNUTH(for (int i = m + n; i >= 0; i--) dbgs() << " " << u[i]);
1339 DEBUG_KNUTH(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001340
Eric Christopher820256b2009-08-21 04:06:45 +00001341 // D5. [Test remainder.] Set q[j] = qp. If the result of step D4 was
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001342 // negative, go to step D6; otherwise go on to step D7.
Craig Topper2c9a7062017-05-13 07:14:17 +00001343 q[j] = Lo_32(qp);
Reid Spenceraa8dcfe2007-02-26 07:44:38 +00001344 if (isNeg) {
Eric Christopher820256b2009-08-21 04:06:45 +00001345 // D6. [Add back]. The probability that this step is necessary is very
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001346 // small, on the order of only 2/b. Make sure that test data accounts for
Eric Christopher820256b2009-08-21 04:06:45 +00001347 // this possibility. Decrease q[j] by 1
Reid Spencercb292e42007-02-23 01:57:13 +00001348 q[j]--;
Eric Christopher820256b2009-08-21 04:06:45 +00001349 // and add (0v[n-1]...v[1]v[0]) to (u[j+n]u[j+n-1]...u[j+1]u[j]).
1350 // A carry will occur to the left of u[j+n], and it should be ignored
Reid Spencercb292e42007-02-23 01:57:13 +00001351 // since it cancels with the borrow that occurred in D4.
1352 bool carry = false;
Chris Lattner77527f52009-01-21 18:09:24 +00001353 for (unsigned i = 0; i < n; i++) {
Craig Topper6271bc72017-05-10 18:15:20 +00001354 uint32_t limit = std::min(u[j+i],v[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001355 u[j+i] += v[i] + carry;
Reid Spencera5e0d202007-02-24 03:58:46 +00001356 carry = u[j+i] < limit || (carry && u[j+i] == limit);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001357 }
Reid Spencera5e0d202007-02-24 03:58:46 +00001358 u[j+n] += carry;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001359 }
Tim Northoverb3766452018-08-06 11:43:11 +00001360 DEBUG_KNUTH(dbgs() << "KnuthDiv: after correction:");
1361 DEBUG_KNUTH(for (int i = m + n; i >= 0; i--) dbgs() << " " << u[i]);
1362 DEBUG_KNUTH(dbgs() << "\nKnuthDiv: digit result = " << q[j] << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001363
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001364 // D7. [Loop on j.] Decrease j by one. Now if j >= 0, go back to D3.
Reid Spencercb292e42007-02-23 01:57:13 +00001365 } while (--j >= 0);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001366
Tim Northoverb3766452018-08-06 11:43:11 +00001367 DEBUG_KNUTH(dbgs() << "KnuthDiv: quotient:");
1368 DEBUG_KNUTH(for (int i = m; i >= 0; i--) dbgs() << " " << q[i]);
1369 DEBUG_KNUTH(dbgs() << '\n');
Reid Spencera5e0d202007-02-24 03:58:46 +00001370
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001371 // D8. [Unnormalize]. Now q[...] is the desired quotient, and the desired
1372 // remainder may be obtained by dividing u[...] by d. If r is non-null we
1373 // compute the remainder (urem uses this).
1374 if (r) {
1375 // The value d is expressed by the "shift" value above since we avoided
1376 // multiplication by d by using a shift left. So, all we have to do is
Simon Pilgrim0099beb2017-03-09 13:57:04 +00001377 // shift right here.
Reid Spencer468ad9112007-02-24 20:38:01 +00001378 if (shift) {
Craig Topper6271bc72017-05-10 18:15:20 +00001379 uint32_t carry = 0;
Tim Northoverb3766452018-08-06 11:43:11 +00001380 DEBUG_KNUTH(dbgs() << "KnuthDiv: remainder:");
Reid Spencer468ad9112007-02-24 20:38:01 +00001381 for (int i = n-1; i >= 0; i--) {
1382 r[i] = (u[i] >> shift) | carry;
1383 carry = u[i] << (32 - shift);
Tim Northoverb3766452018-08-06 11:43:11 +00001384 DEBUG_KNUTH(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001385 }
1386 } else {
1387 for (int i = n-1; i >= 0; i--) {
1388 r[i] = u[i];
Tim Northoverb3766452018-08-06 11:43:11 +00001389 DEBUG_KNUTH(dbgs() << " " << r[i]);
Reid Spencer468ad9112007-02-24 20:38:01 +00001390 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001391 }
Tim Northoverb3766452018-08-06 11:43:11 +00001392 DEBUG_KNUTH(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001393 }
Tim Northoverb3766452018-08-06 11:43:11 +00001394 DEBUG_KNUTH(dbgs() << '\n');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001395}
1396
Craig Topper8885f932017-05-19 16:43:54 +00001397void APInt::divide(const WordType *LHS, unsigned lhsWords, const WordType *RHS,
1398 unsigned rhsWords, WordType *Quotient, WordType *Remainder) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001399 assert(lhsWords >= rhsWords && "Fractional result");
1400
Eric Christopher820256b2009-08-21 04:06:45 +00001401 // First, compose the values into an array of 32-bit words instead of
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001402 // 64-bit words. This is a necessity of both the "short division" algorithm
Dan Gohman4a618822010-02-10 16:03:48 +00001403 // and the Knuth "classical algorithm" which requires there to be native
Eric Christopher820256b2009-08-21 04:06:45 +00001404 // operations for +, -, and * on an m bit value with an m*2 bit result. We
1405 // can't use 64-bit operands here because we don't have native results of
1406 // 128-bits. Furthermore, casting the 64-bit values to 32-bit values won't
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001407 // work on large-endian machines.
Chris Lattner77527f52009-01-21 18:09:24 +00001408 unsigned n = rhsWords * 2;
1409 unsigned m = (lhsWords * 2) - n;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001410
1411 // Allocate space for the temporary values we need either on the stack, if
1412 // it will fit, or on the heap if it won't.
Craig Topper6271bc72017-05-10 18:15:20 +00001413 uint32_t SPACE[128];
1414 uint32_t *U = nullptr;
1415 uint32_t *V = nullptr;
1416 uint32_t *Q = nullptr;
1417 uint32_t *R = nullptr;
Reid Spencer522ca7c2007-02-25 01:56:07 +00001418 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1419 U = &SPACE[0];
1420 V = &SPACE[m+n+1];
1421 Q = &SPACE[(m+n+1) + n];
1422 if (Remainder)
1423 R = &SPACE[(m+n+1) + n + (m+n)];
1424 } else {
Craig Topper6271bc72017-05-10 18:15:20 +00001425 U = new uint32_t[m + n + 1];
1426 V = new uint32_t[n];
1427 Q = new uint32_t[m+n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001428 if (Remainder)
Craig Topper6271bc72017-05-10 18:15:20 +00001429 R = new uint32_t[n];
Reid Spencer522ca7c2007-02-25 01:56:07 +00001430 }
1431
1432 // Initialize the dividend
Craig Topper6271bc72017-05-10 18:15:20 +00001433 memset(U, 0, (m+n+1)*sizeof(uint32_t));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001434 for (unsigned i = 0; i < lhsWords; ++i) {
Craig Topper8885f932017-05-19 16:43:54 +00001435 uint64_t tmp = LHS[i];
Craig Topper6271bc72017-05-10 18:15:20 +00001436 U[i * 2] = Lo_32(tmp);
1437 U[i * 2 + 1] = Hi_32(tmp);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001438 }
1439 U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
1440
Reid Spencer522ca7c2007-02-25 01:56:07 +00001441 // Initialize the divisor
Craig Topper6271bc72017-05-10 18:15:20 +00001442 memset(V, 0, (n)*sizeof(uint32_t));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001443 for (unsigned i = 0; i < rhsWords; ++i) {
Craig Topper8885f932017-05-19 16:43:54 +00001444 uint64_t tmp = RHS[i];
Craig Topper6271bc72017-05-10 18:15:20 +00001445 V[i * 2] = Lo_32(tmp);
1446 V[i * 2 + 1] = Hi_32(tmp);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001447 }
1448
Reid Spencer522ca7c2007-02-25 01:56:07 +00001449 // initialize the quotient and remainder
Craig Topper6271bc72017-05-10 18:15:20 +00001450 memset(Q, 0, (m+n) * sizeof(uint32_t));
Reid Spencer522ca7c2007-02-25 01:56:07 +00001451 if (Remainder)
Craig Topper6271bc72017-05-10 18:15:20 +00001452 memset(R, 0, n * sizeof(uint32_t));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001453
Eric Christopher820256b2009-08-21 04:06:45 +00001454 // Now, adjust m and n for the Knuth division. n is the number of words in
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001455 // the divisor. m is the number of words by which the dividend exceeds the
Eric Christopher820256b2009-08-21 04:06:45 +00001456 // divisor (i.e. m+n is the length of the dividend). These sizes must not
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001457 // contain any zero words or the Knuth algorithm fails.
1458 for (unsigned i = n; i > 0 && V[i-1] == 0; i--) {
1459 n--;
1460 m++;
1461 }
1462 for (unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1463 m--;
1464
1465 // If we're left with only a single word for the divisor, Knuth doesn't work
1466 // so we implement the short division algorithm here. This is much simpler
1467 // and faster because we are certain that we can divide a 64-bit quantity
1468 // by a 32-bit quantity at hardware speed and short division is simply a
1469 // series of such operations. This is just like doing short division but we
1470 // are using base 2^32 instead of base 10.
1471 assert(n != 0 && "Divide by zero?");
1472 if (n == 1) {
Craig Topper6271bc72017-05-10 18:15:20 +00001473 uint32_t divisor = V[0];
1474 uint32_t remainder = 0;
Craig Topper6a1d0202017-05-15 22:01:03 +00001475 for (int i = m; i >= 0; i--) {
Craig Topper6271bc72017-05-10 18:15:20 +00001476 uint64_t partial_dividend = Make_64(remainder, U[i]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001477 if (partial_dividend == 0) {
1478 Q[i] = 0;
1479 remainder = 0;
1480 } else if (partial_dividend < divisor) {
1481 Q[i] = 0;
Craig Topper6271bc72017-05-10 18:15:20 +00001482 remainder = Lo_32(partial_dividend);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001483 } else if (partial_dividend == divisor) {
1484 Q[i] = 1;
1485 remainder = 0;
1486 } else {
Craig Topper6271bc72017-05-10 18:15:20 +00001487 Q[i] = Lo_32(partial_dividend / divisor);
1488 remainder = Lo_32(partial_dividend - (Q[i] * divisor));
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001489 }
1490 }
1491 if (R)
1492 R[0] = remainder;
1493 } else {
1494 // Now we're ready to invoke the Knuth classical divide algorithm. In this
1495 // case n > 1.
1496 KnuthDiv(U, V, Q, R, m, n);
1497 }
1498
1499 // If the caller wants the quotient
1500 if (Quotient) {
Craig Topper8885f932017-05-19 16:43:54 +00001501 for (unsigned i = 0; i < lhsWords; ++i)
1502 Quotient[i] = Make_64(Q[i*2+1], Q[i*2]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001503 }
1504
1505 // If the caller wants the remainder
1506 if (Remainder) {
Craig Topper8885f932017-05-19 16:43:54 +00001507 for (unsigned i = 0; i < rhsWords; ++i)
1508 Remainder[i] = Make_64(R[i*2+1], R[i*2]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001509 }
1510
1511 // Clean up the memory we allocated.
Reid Spencer522ca7c2007-02-25 01:56:07 +00001512 if (U != &SPACE[0]) {
1513 delete [] U;
1514 delete [] V;
1515 delete [] Q;
1516 delete [] R;
1517 }
Reid Spencer100502d2007-02-17 03:16:00 +00001518}
1519
Craig Topper8885f932017-05-19 16:43:54 +00001520APInt APInt::udiv(const APInt &RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001521 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001522
1523 // First, deal with the easy case
1524 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +00001525 assert(RHS.U.VAL != 0 && "Divide by zero?");
1526 return APInt(BitWidth, U.VAL / RHS.U.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001527 }
Reid Spencer39867762007-02-17 02:07:07 +00001528
Reid Spencer39867762007-02-17 02:07:07 +00001529 // Get some facts about the LHS and RHS number of bits and words
Craig Topper62de0392017-05-10 07:50:15 +00001530 unsigned lhsWords = getNumWords(getActiveBits());
Craig Topperb1a71ca2017-05-12 21:45:50 +00001531 unsigned rhsBits = RHS.getActiveBits();
1532 unsigned rhsWords = getNumWords(rhsBits);
1533 assert(rhsWords && "Divided by zero???");
Reid Spencer39867762007-02-17 02:07:07 +00001534
1535 // Deal with some degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001536 if (!lhsWords)
Reid Spencer58a6a432007-02-21 08:21:52 +00001537 // 0 / X ===> 0
Eric Christopher820256b2009-08-21 04:06:45 +00001538 return APInt(BitWidth, 0);
Craig Topperb1a71ca2017-05-12 21:45:50 +00001539 if (rhsBits == 1)
1540 // X / 1 ===> X
1541 return *this;
Craig Topper24ae6952017-05-08 23:49:49 +00001542 if (lhsWords < rhsWords || this->ult(RHS))
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001543 // X / Y ===> 0, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001544 return APInt(BitWidth, 0);
Craig Topper24ae6952017-05-08 23:49:49 +00001545 if (*this == RHS)
Reid Spencer58a6a432007-02-21 08:21:52 +00001546 // X / X ===> 1
1547 return APInt(BitWidth, 1);
Craig Topper06da0812017-05-12 18:18:57 +00001548 if (lhsWords == 1) // rhsWords is 1 if lhsWords is 1.
Reid Spencer39867762007-02-17 02:07:07 +00001549 // All high words are zero, just use native divide
Craig Topperb339c6d2017-05-03 15:46:24 +00001550 return APInt(BitWidth, this->U.pVal[0] / RHS.U.pVal[0]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001551
1552 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Craig Topper8885f932017-05-19 16:43:54 +00001553 APInt Quotient(BitWidth, 0); // to hold result.
1554 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.pVal, nullptr);
1555 return Quotient;
1556}
1557
1558APInt APInt::udiv(uint64_t RHS) const {
1559 assert(RHS != 0 && "Divide by zero?");
1560
1561 // First, deal with the easy case
1562 if (isSingleWord())
1563 return APInt(BitWidth, U.VAL / RHS);
1564
1565 // Get some facts about the LHS words.
1566 unsigned lhsWords = getNumWords(getActiveBits());
1567
1568 // Deal with some degenerate cases
1569 if (!lhsWords)
1570 // 0 / X ===> 0
1571 return APInt(BitWidth, 0);
1572 if (RHS == 1)
1573 // X / 1 ===> X
1574 return *this;
1575 if (this->ult(RHS))
1576 // X / Y ===> 0, iff X < Y
1577 return APInt(BitWidth, 0);
1578 if (*this == RHS)
1579 // X / X ===> 1
1580 return APInt(BitWidth, 1);
1581 if (lhsWords == 1) // rhsWords is 1 if lhsWords is 1.
1582 // All high words are zero, just use native divide
1583 return APInt(BitWidth, this->U.pVal[0] / RHS);
1584
1585 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1586 APInt Quotient(BitWidth, 0); // to hold result.
1587 divide(U.pVal, lhsWords, &RHS, 1, Quotient.U.pVal, nullptr);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001588 return Quotient;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001589}
1590
Jakub Staszak6605c602013-02-20 00:17:42 +00001591APInt APInt::sdiv(const APInt &RHS) const {
1592 if (isNegative()) {
1593 if (RHS.isNegative())
1594 return (-(*this)).udiv(-RHS);
1595 return -((-(*this)).udiv(RHS));
1596 }
1597 if (RHS.isNegative())
1598 return -(this->udiv(-RHS));
1599 return this->udiv(RHS);
1600}
1601
Craig Topper8885f932017-05-19 16:43:54 +00001602APInt APInt::sdiv(int64_t RHS) const {
1603 if (isNegative()) {
1604 if (RHS < 0)
1605 return (-(*this)).udiv(-RHS);
1606 return -((-(*this)).udiv(RHS));
1607 }
1608 if (RHS < 0)
1609 return -(this->udiv(-RHS));
1610 return this->udiv(RHS);
1611}
1612
1613APInt APInt::urem(const APInt &RHS) const {
Reid Spencera32372d12007-02-17 00:18:01 +00001614 assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
Reid Spencer39867762007-02-17 02:07:07 +00001615 if (isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +00001616 assert(RHS.U.VAL != 0 && "Remainder by zero?");
1617 return APInt(BitWidth, U.VAL % RHS.U.VAL);
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001618 }
Reid Spencer39867762007-02-17 02:07:07 +00001619
Reid Spencer58a6a432007-02-21 08:21:52 +00001620 // Get some facts about the LHS
Craig Topper62de0392017-05-10 07:50:15 +00001621 unsigned lhsWords = getNumWords(getActiveBits());
Reid Spencer39867762007-02-17 02:07:07 +00001622
1623 // Get some facts about the RHS
Craig Topperb1a71ca2017-05-12 21:45:50 +00001624 unsigned rhsBits = RHS.getActiveBits();
1625 unsigned rhsWords = getNumWords(rhsBits);
Reid Spencer39867762007-02-17 02:07:07 +00001626 assert(rhsWords && "Performing remainder operation by zero ???");
1627
Reid Spencer39867762007-02-17 02:07:07 +00001628 // Check the degenerate cases
Craig Topper24ae6952017-05-08 23:49:49 +00001629 if (lhsWords == 0)
Reid Spencer58a6a432007-02-21 08:21:52 +00001630 // 0 % Y ===> 0
1631 return APInt(BitWidth, 0);
Craig Topperb1a71ca2017-05-12 21:45:50 +00001632 if (rhsBits == 1)
1633 // X % 1 ===> 0
1634 return APInt(BitWidth, 0);
Craig Topper24ae6952017-05-08 23:49:49 +00001635 if (lhsWords < rhsWords || this->ult(RHS))
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +00001636 // X % Y ===> X, iff X < Y
Reid Spencer58a6a432007-02-21 08:21:52 +00001637 return *this;
Craig Topper24ae6952017-05-08 23:49:49 +00001638 if (*this == RHS)
Reid Spencer39867762007-02-17 02:07:07 +00001639 // X % X == 0;
Reid Spencer58a6a432007-02-21 08:21:52 +00001640 return APInt(BitWidth, 0);
Craig Topper24ae6952017-05-08 23:49:49 +00001641 if (lhsWords == 1)
Reid Spencer39867762007-02-17 02:07:07 +00001642 // All high words are zero, just use native remainder
Craig Topperb339c6d2017-05-03 15:46:24 +00001643 return APInt(BitWidth, U.pVal[0] % RHS.U.pVal[0]);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001644
Reid Spencer4c50b522007-05-13 23:44:59 +00001645 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
Craig Topper8885f932017-05-19 16:43:54 +00001646 APInt Remainder(BitWidth, 0);
1647 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords, nullptr, Remainder.U.pVal);
1648 return Remainder;
1649}
1650
1651uint64_t APInt::urem(uint64_t RHS) const {
1652 assert(RHS != 0 && "Remainder by zero?");
1653
1654 if (isSingleWord())
1655 return U.VAL % RHS;
1656
1657 // Get some facts about the LHS
1658 unsigned lhsWords = getNumWords(getActiveBits());
1659
1660 // Check the degenerate cases
1661 if (lhsWords == 0)
1662 // 0 % Y ===> 0
1663 return 0;
1664 if (RHS == 1)
1665 // X % 1 ===> 0
1666 return 0;
1667 if (this->ult(RHS))
1668 // X % Y ===> X, iff X < Y
1669 return getZExtValue();
1670 if (*this == RHS)
1671 // X % X == 0;
1672 return 0;
1673 if (lhsWords == 1)
1674 // All high words are zero, just use native remainder
1675 return U.pVal[0] % RHS;
1676
1677 // We have to compute it the hard way. Invoke the Knuth divide algorithm.
1678 uint64_t Remainder;
1679 divide(U.pVal, lhsWords, &RHS, 1, nullptr, &Remainder);
Reid Spencerfb77b2b2007-02-20 08:51:03 +00001680 return Remainder;
Zhou Shengfbf61ea2007-02-08 14:35:19 +00001681}
Reid Spencer100502d2007-02-17 03:16:00 +00001682
Jakub Staszak6605c602013-02-20 00:17:42 +00001683APInt APInt::srem(const APInt &RHS) const {
1684 if (isNegative()) {
1685 if (RHS.isNegative())
1686 return -((-(*this)).urem(-RHS));
1687 return -((-(*this)).urem(RHS));
1688 }
1689 if (RHS.isNegative())
1690 return this->urem(-RHS);
1691 return this->urem(RHS);
1692}
1693
Craig Topper8885f932017-05-19 16:43:54 +00001694int64_t APInt::srem(int64_t RHS) const {
1695 if (isNegative()) {
1696 if (RHS < 0)
1697 return -((-(*this)).urem(-RHS));
1698 return -((-(*this)).urem(RHS));
1699 }
1700 if (RHS < 0)
1701 return this->urem(-RHS);
1702 return this->urem(RHS);
1703}
1704
Eric Christopher820256b2009-08-21 04:06:45 +00001705void APInt::udivrem(const APInt &LHS, const APInt &RHS,
Reid Spencer4c50b522007-05-13 23:44:59 +00001706 APInt &Quotient, APInt &Remainder) {
David Majnemer7f039202014-12-14 09:41:56 +00001707 assert(LHS.BitWidth == RHS.BitWidth && "Bit widths must be the same");
Craig Topper2579c7c2017-05-12 21:45:44 +00001708 unsigned BitWidth = LHS.BitWidth;
David Majnemer7f039202014-12-14 09:41:56 +00001709
1710 // First, deal with the easy case
1711 if (LHS.isSingleWord()) {
Craig Topperb339c6d2017-05-03 15:46:24 +00001712 assert(RHS.U.VAL != 0 && "Divide by zero?");
1713 uint64_t QuotVal = LHS.U.VAL / RHS.U.VAL;
1714 uint64_t RemVal = LHS.U.VAL % RHS.U.VAL;
Craig Topper2579c7c2017-05-12 21:45:44 +00001715 Quotient = APInt(BitWidth, QuotVal);
1716 Remainder = APInt(BitWidth, RemVal);
David Majnemer7f039202014-12-14 09:41:56 +00001717 return;
1718 }
1719
Reid Spencer4c50b522007-05-13 23:44:59 +00001720 // Get some size facts about the dividend and divisor
Craig Topper62de0392017-05-10 07:50:15 +00001721 unsigned lhsWords = getNumWords(LHS.getActiveBits());
Craig Topperb1a71ca2017-05-12 21:45:50 +00001722 unsigned rhsBits = RHS.getActiveBits();
1723 unsigned rhsWords = getNumWords(rhsBits);
Craig Topper4bdd6212017-05-12 18:19:01 +00001724 assert(rhsWords && "Performing divrem operation by zero ???");
Reid Spencer4c50b522007-05-13 23:44:59 +00001725
1726 // Check the degenerate cases
Eric Christopher820256b2009-08-21 04:06:45 +00001727 if (lhsWords == 0) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001728 Quotient = APInt(BitWidth, 0); // 0 / Y ===> 0
1729 Remainder = APInt(BitWidth, 0); // 0 % Y ===> 0
Reid Spencer4c50b522007-05-13 23:44:59 +00001730 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001731 }
1732
Craig Topperb1a71ca2017-05-12 21:45:50 +00001733 if (rhsBits == 1) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001734 Quotient = LHS; // X / 1 ===> X
1735 Remainder = APInt(BitWidth, 0); // X % 1 ===> 0
Craig Topperb1a71ca2017-05-12 21:45:50 +00001736 }
1737
Eric Christopher820256b2009-08-21 04:06:45 +00001738 if (lhsWords < rhsWords || LHS.ult(RHS)) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001739 Remainder = LHS; // X % Y ===> X, iff X < Y
1740 Quotient = APInt(BitWidth, 0); // X / Y ===> 0, iff X < Y
Reid Spencer4c50b522007-05-13 23:44:59 +00001741 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001742 }
1743
Reid Spencer4c50b522007-05-13 23:44:59 +00001744 if (LHS == RHS) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001745 Quotient = APInt(BitWidth, 1); // X / X ===> 1
1746 Remainder = APInt(BitWidth, 0); // X % X ===> 0;
Reid Spencer4c50b522007-05-13 23:44:59 +00001747 return;
Eric Christopher820256b2009-08-21 04:06:45 +00001748 }
1749
Craig Topper8885f932017-05-19 16:43:54 +00001750 // Make sure there is enough space to hold the results.
1751 // NOTE: This assumes that reallocate won't affect any bits if it doesn't
1752 // change the size. This is necessary if Quotient or Remainder is aliased
1753 // with LHS or RHS.
1754 Quotient.reallocate(BitWidth);
1755 Remainder.reallocate(BitWidth);
1756
Craig Topper06da0812017-05-12 18:18:57 +00001757 if (lhsWords == 1) { // rhsWords is 1 if lhsWords is 1.
Reid Spencer4c50b522007-05-13 23:44:59 +00001758 // There is only one word to consider so use the native versions.
Craig Topper93eabae2017-05-10 18:15:14 +00001759 uint64_t lhsValue = LHS.U.pVal[0];
1760 uint64_t rhsValue = RHS.U.pVal[0];
Craig Topper87694032017-05-12 07:21:09 +00001761 Quotient = lhsValue / rhsValue;
1762 Remainder = lhsValue % rhsValue;
Reid Spencer4c50b522007-05-13 23:44:59 +00001763 return;
1764 }
1765
1766 // Okay, lets do it the long way
Craig Topper8885f932017-05-19 16:43:54 +00001767 divide(LHS.U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.pVal,
1768 Remainder.U.pVal);
1769 // Clear the rest of the Quotient and Remainder.
1770 std::memset(Quotient.U.pVal + lhsWords, 0,
1771 (getNumWords(BitWidth) - lhsWords) * APINT_WORD_SIZE);
1772 std::memset(Remainder.U.pVal + rhsWords, 0,
1773 (getNumWords(BitWidth) - rhsWords) * APINT_WORD_SIZE);
1774}
1775
1776void APInt::udivrem(const APInt &LHS, uint64_t RHS, APInt &Quotient,
1777 uint64_t &Remainder) {
1778 assert(RHS != 0 && "Divide by zero?");
1779 unsigned BitWidth = LHS.BitWidth;
1780
1781 // First, deal with the easy case
1782 if (LHS.isSingleWord()) {
1783 uint64_t QuotVal = LHS.U.VAL / RHS;
1784 Remainder = LHS.U.VAL % RHS;
1785 Quotient = APInt(BitWidth, QuotVal);
1786 return;
1787 }
1788
1789 // Get some size facts about the dividend and divisor
1790 unsigned lhsWords = getNumWords(LHS.getActiveBits());
1791
1792 // Check the degenerate cases
1793 if (lhsWords == 0) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001794 Quotient = APInt(BitWidth, 0); // 0 / Y ===> 0
1795 Remainder = 0; // 0 % Y ===> 0
Craig Topper8885f932017-05-19 16:43:54 +00001796 return;
1797 }
1798
1799 if (RHS == 1) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001800 Quotient = LHS; // X / 1 ===> X
1801 Remainder = 0; // X % 1 ===> 0
1802 return;
Craig Topper8885f932017-05-19 16:43:54 +00001803 }
1804
1805 if (LHS.ult(RHS)) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001806 Remainder = LHS.getZExtValue(); // X % Y ===> X, iff X < Y
1807 Quotient = APInt(BitWidth, 0); // X / Y ===> 0, iff X < Y
Craig Topper8885f932017-05-19 16:43:54 +00001808 return;
1809 }
1810
1811 if (LHS == RHS) {
Krzysztof Parzyszek55a0dce2018-07-19 18:07:56 +00001812 Quotient = APInt(BitWidth, 1); // X / X ===> 1
1813 Remainder = 0; // X % X ===> 0;
Craig Topper8885f932017-05-19 16:43:54 +00001814 return;
1815 }
1816
1817 // Make sure there is enough space to hold the results.
1818 // NOTE: This assumes that reallocate won't affect any bits if it doesn't
1819 // change the size. This is necessary if Quotient is aliased with LHS.
1820 Quotient.reallocate(BitWidth);
1821
1822 if (lhsWords == 1) { // rhsWords is 1 if lhsWords is 1.
1823 // There is only one word to consider so use the native versions.
1824 uint64_t lhsValue = LHS.U.pVal[0];
1825 Quotient = lhsValue / RHS;
1826 Remainder = lhsValue % RHS;
1827 return;
1828 }
1829
1830 // Okay, lets do it the long way
1831 divide(LHS.U.pVal, lhsWords, &RHS, 1, Quotient.U.pVal, &Remainder);
1832 // Clear the rest of the Quotient.
1833 std::memset(Quotient.U.pVal + lhsWords, 0,
1834 (getNumWords(BitWidth) - lhsWords) * APINT_WORD_SIZE);
Reid Spencer4c50b522007-05-13 23:44:59 +00001835}
1836
Jakub Staszak6605c602013-02-20 00:17:42 +00001837void APInt::sdivrem(const APInt &LHS, const APInt &RHS,
1838 APInt &Quotient, APInt &Remainder) {
1839 if (LHS.isNegative()) {
1840 if (RHS.isNegative())
1841 APInt::udivrem(-LHS, -RHS, Quotient, Remainder);
1842 else {
1843 APInt::udivrem(-LHS, RHS, Quotient, Remainder);
Craig Topperb3c1f562017-05-11 07:02:04 +00001844 Quotient.negate();
Jakub Staszak6605c602013-02-20 00:17:42 +00001845 }
Craig Topperb3c1f562017-05-11 07:02:04 +00001846 Remainder.negate();
Jakub Staszak6605c602013-02-20 00:17:42 +00001847 } else if (RHS.isNegative()) {
1848 APInt::udivrem(LHS, -RHS, Quotient, Remainder);
Craig Topperb3c1f562017-05-11 07:02:04 +00001849 Quotient.negate();
Jakub Staszak6605c602013-02-20 00:17:42 +00001850 } else {
1851 APInt::udivrem(LHS, RHS, Quotient, Remainder);
1852 }
1853}
1854
Craig Topper8885f932017-05-19 16:43:54 +00001855void APInt::sdivrem(const APInt &LHS, int64_t RHS,
1856 APInt &Quotient, int64_t &Remainder) {
1857 uint64_t R = Remainder;
1858 if (LHS.isNegative()) {
1859 if (RHS < 0)
1860 APInt::udivrem(-LHS, -RHS, Quotient, R);
1861 else {
1862 APInt::udivrem(-LHS, RHS, Quotient, R);
1863 Quotient.negate();
1864 }
1865 R = -R;
1866 } else if (RHS < 0) {
1867 APInt::udivrem(LHS, -RHS, Quotient, R);
1868 Quotient.negate();
1869 } else {
1870 APInt::udivrem(LHS, RHS, Quotient, R);
1871 }
1872 Remainder = R;
1873}
1874
Chris Lattner2c819b02010-10-13 23:54:10 +00001875APInt APInt::sadd_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001876 APInt Res = *this+RHS;
1877 Overflow = isNonNegative() == RHS.isNonNegative() &&
1878 Res.isNonNegative() != isNonNegative();
1879 return Res;
1880}
1881
Chris Lattner698661c2010-10-14 00:05:07 +00001882APInt APInt::uadd_ov(const APInt &RHS, bool &Overflow) const {
1883 APInt Res = *this+RHS;
1884 Overflow = Res.ult(RHS);
1885 return Res;
1886}
1887
Chris Lattner2c819b02010-10-13 23:54:10 +00001888APInt APInt::ssub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001889 APInt Res = *this - RHS;
1890 Overflow = isNonNegative() != RHS.isNonNegative() &&
1891 Res.isNonNegative() != isNonNegative();
1892 return Res;
1893}
1894
Chris Lattner698661c2010-10-14 00:05:07 +00001895APInt APInt::usub_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattnerb9681ad2010-10-14 00:30:00 +00001896 APInt Res = *this-RHS;
1897 Overflow = Res.ugt(*this);
Chris Lattner698661c2010-10-14 00:05:07 +00001898 return Res;
1899}
1900
Chris Lattner2c819b02010-10-13 23:54:10 +00001901APInt APInt::sdiv_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001902 // MININT/-1 --> overflow.
1903 Overflow = isMinSignedValue() && RHS.isAllOnesValue();
1904 return sdiv(RHS);
1905}
1906
Chris Lattner2c819b02010-10-13 23:54:10 +00001907APInt APInt::smul_ov(const APInt &RHS, bool &Overflow) const {
Chris Lattner79bdd882010-10-13 23:46:33 +00001908 APInt Res = *this * RHS;
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00001909
Chris Lattner79bdd882010-10-13 23:46:33 +00001910 if (*this != 0 && RHS != 0)
1911 Overflow = Res.sdiv(RHS) != *this || Res.sdiv(*this) != RHS;
1912 else
1913 Overflow = false;
1914 return Res;
1915}
1916
Frits van Bommel0bb2ad22011-03-27 14:26:13 +00001917APInt APInt::umul_ov(const APInt &RHS, bool &Overflow) const {
1918 APInt Res = *this * RHS;
1919
1920 if (*this != 0 && RHS != 0)
1921 Overflow = Res.udiv(RHS) != *this || Res.udiv(*this) != RHS;
1922 else
1923 Overflow = false;
1924 return Res;
1925}
1926
David Majnemera2521382014-10-13 21:48:30 +00001927APInt APInt::sshl_ov(const APInt &ShAmt, bool &Overflow) const {
1928 Overflow = ShAmt.uge(getBitWidth());
Chris Lattner79bdd882010-10-13 23:46:33 +00001929 if (Overflow)
David Majnemera2521382014-10-13 21:48:30 +00001930 return APInt(BitWidth, 0);
Chris Lattner79bdd882010-10-13 23:46:33 +00001931
1932 if (isNonNegative()) // Don't allow sign change.
David Majnemera2521382014-10-13 21:48:30 +00001933 Overflow = ShAmt.uge(countLeadingZeros());
Chris Lattner79bdd882010-10-13 23:46:33 +00001934 else
David Majnemera2521382014-10-13 21:48:30 +00001935 Overflow = ShAmt.uge(countLeadingOnes());
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00001936
Chris Lattner79bdd882010-10-13 23:46:33 +00001937 return *this << ShAmt;
1938}
1939
David Majnemera2521382014-10-13 21:48:30 +00001940APInt APInt::ushl_ov(const APInt &ShAmt, bool &Overflow) const {
1941 Overflow = ShAmt.uge(getBitWidth());
1942 if (Overflow)
1943 return APInt(BitWidth, 0);
1944
1945 Overflow = ShAmt.ugt(countLeadingZeros());
1946
1947 return *this << ShAmt;
1948}
1949
Chris Lattner79bdd882010-10-13 23:46:33 +00001950
1951
1952
Benjamin Kramer92d89982010-07-14 22:38:02 +00001953void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
Reid Spencer1ba83352007-02-21 03:55:44 +00001954 // Check our assumptions here
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00001955 assert(!str.empty() && "Invalid string length");
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00001956 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00001957 radix == 36) &&
1958 "Radix should be 2, 8, 10, 16, or 36!");
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00001959
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001960 StringRef::iterator p = str.begin();
1961 size_t slen = str.size();
1962 bool isNeg = *p == '-';
Erick Tryzelaar1264bcb2009-08-21 03:15:14 +00001963 if (*p == '-' || *p == '+') {
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001964 p++;
1965 slen--;
Eric Christopher43a1dec2009-08-21 04:10:31 +00001966 assert(slen && "String is only a sign, needs a value.");
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001967 }
Chris Lattnerdad2d092007-05-03 18:15:36 +00001968 assert((slen <= numbits || radix != 2) && "Insufficient bit width");
Chris Lattnerb869a0a2009-04-25 18:34:04 +00001969 assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
1970 assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
Dan Gohmanb452d4e2010-03-24 19:38:02 +00001971 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
1972 "Insufficient bit width");
Reid Spencer1ba83352007-02-21 03:55:44 +00001973
Craig Topperb339c6d2017-05-03 15:46:24 +00001974 // Allocate memory if needed
1975 if (isSingleWord())
1976 U.VAL = 0;
1977 else
1978 U.pVal = getClearedMemory(getNumWords());
Reid Spencer1ba83352007-02-21 03:55:44 +00001979
1980 // Figure out if we can shift instead of multiply
Chris Lattner77527f52009-01-21 18:09:24 +00001981 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
Reid Spencer1ba83352007-02-21 03:55:44 +00001982
Reid Spencer1ba83352007-02-21 03:55:44 +00001983 // Enter digit traversal loop
Daniel Dunbar3a1efd112009-08-13 02:33:34 +00001984 for (StringRef::iterator e = str.end(); p != e; ++p) {
Erick Tryzelaardadb15712009-08-21 03:15:28 +00001985 unsigned digit = getDigit(*p, radix);
Erick Tryzelaar60964092009-08-21 06:48:37 +00001986 assert(digit < radix && "Invalid character in digit string");
Reid Spencer1ba83352007-02-21 03:55:44 +00001987
Reid Spencera93c9812007-05-16 19:18:22 +00001988 // Shift or multiply the value by the radix
Chris Lattnerb869a0a2009-04-25 18:34:04 +00001989 if (slen > 1) {
1990 if (shift)
1991 *this <<= shift;
1992 else
Craig Topperf15bec52017-05-08 04:55:12 +00001993 *this *= radix;
Chris Lattnerb869a0a2009-04-25 18:34:04 +00001994 }
Reid Spencer1ba83352007-02-21 03:55:44 +00001995
1996 // Add in the digit we just interpreted
Craig Topperb7d8faa2017-04-02 06:59:38 +00001997 *this += digit;
Reid Spencer100502d2007-02-17 03:16:00 +00001998 }
Reid Spencerb6b5cc32007-02-25 23:44:53 +00001999 // If its negative, put it in two's complement form
Craig Topperef0114c2017-05-10 20:01:38 +00002000 if (isNeg)
2001 this->negate();
Reid Spencer100502d2007-02-17 03:16:00 +00002002}
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002003
Chris Lattner17f71652008-08-17 07:19:36 +00002004void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002005 bool Signed, bool formatAsCLiteral) const {
Simon Pilgrim4c0ea9d2017-02-23 16:07:04 +00002006 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
Douglas Gregor663c0682011-09-14 15:54:46 +00002007 Radix == 36) &&
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002008 "Radix should be 2, 8, 10, 16, or 36!");
Eric Christopher820256b2009-08-21 04:06:45 +00002009
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002010 const char *Prefix = "";
2011 if (formatAsCLiteral) {
2012 switch (Radix) {
2013 case 2:
2014 // Binary literals are a non-standard extension added in gcc 4.3:
2015 // http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Binary-constants.html
2016 Prefix = "0b";
2017 break;
2018 case 8:
2019 Prefix = "0";
2020 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002021 case 10:
2022 break; // No prefix
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002023 case 16:
2024 Prefix = "0x";
2025 break;
Dylan Noblesmith1c419ff2011-12-16 20:36:31 +00002026 default:
2027 llvm_unreachable("Invalid radix!");
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002028 }
2029 }
2030
Chris Lattner17f71652008-08-17 07:19:36 +00002031 // First, check for a zero value and just short circuit the logic below.
2032 if (*this == 0) {
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002033 while (*Prefix) {
2034 Str.push_back(*Prefix);
2035 ++Prefix;
2036 };
Chris Lattner17f71652008-08-17 07:19:36 +00002037 Str.push_back('0');
2038 return;
2039 }
Eric Christopher820256b2009-08-21 04:06:45 +00002040
Douglas Gregor663c0682011-09-14 15:54:46 +00002041 static const char Digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Eric Christopher820256b2009-08-21 04:06:45 +00002042
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002043 if (isSingleWord()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002044 char Buffer[65];
Craig Toppere6a23182017-05-24 07:00:55 +00002045 char *BufPtr = std::end(Buffer);
Eric Christopher820256b2009-08-21 04:06:45 +00002046
Chris Lattner17f71652008-08-17 07:19:36 +00002047 uint64_t N;
Chris Lattnerb91c9032010-08-18 00:33:47 +00002048 if (!Signed) {
Chris Lattner17f71652008-08-17 07:19:36 +00002049 N = getZExtValue();
Chris Lattnerb91c9032010-08-18 00:33:47 +00002050 } else {
2051 int64_t I = getSExtValue();
2052 if (I >= 0) {
2053 N = I;
2054 } else {
2055 Str.push_back('-');
2056 N = -(uint64_t)I;
2057 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002058 }
Eric Christopher820256b2009-08-21 04:06:45 +00002059
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002060 while (*Prefix) {
2061 Str.push_back(*Prefix);
2062 ++Prefix;
2063 };
2064
Chris Lattner17f71652008-08-17 07:19:36 +00002065 while (N) {
2066 *--BufPtr = Digits[N % Radix];
2067 N /= Radix;
2068 }
Craig Toppere6a23182017-05-24 07:00:55 +00002069 Str.append(BufPtr, std::end(Buffer));
Chris Lattner17f71652008-08-17 07:19:36 +00002070 return;
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002071 }
2072
Chris Lattner17f71652008-08-17 07:19:36 +00002073 APInt Tmp(*this);
Eric Christopher820256b2009-08-21 04:06:45 +00002074
Chris Lattner17f71652008-08-17 07:19:36 +00002075 if (Signed && isNegative()) {
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002076 // They want to print the signed version and it is a negative value
2077 // Flip the bits and add one to turn it into the equivalent positive
2078 // value and put a '-' in the result.
Craig Topperef0114c2017-05-10 20:01:38 +00002079 Tmp.negate();
Chris Lattner17f71652008-08-17 07:19:36 +00002080 Str.push_back('-');
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002081 }
Eric Christopher820256b2009-08-21 04:06:45 +00002082
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002083 while (*Prefix) {
2084 Str.push_back(*Prefix);
2085 ++Prefix;
2086 };
2087
Chris Lattner17f71652008-08-17 07:19:36 +00002088 // We insert the digits backward, then reverse them to get the right order.
2089 unsigned StartDig = Str.size();
Eric Christopher820256b2009-08-21 04:06:45 +00002090
2091 // For the 2, 8 and 16 bit cases, we can just shift instead of divide
2092 // because the number of bits per digit (1, 3 and 4 respectively) divides
Craig Topperd7ed50d2017-04-02 06:59:36 +00002093 // equally. We just shift until the value is zero.
Douglas Gregor663c0682011-09-14 15:54:46 +00002094 if (Radix == 2 || Radix == 8 || Radix == 16) {
Chris Lattner17f71652008-08-17 07:19:36 +00002095 // Just shift tmp right for each digit width until it becomes zero
2096 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2097 unsigned MaskAmt = Radix - 1;
Eric Christopher820256b2009-08-21 04:06:45 +00002098
Craig Topperecb97da2017-05-10 18:15:24 +00002099 while (Tmp.getBoolValue()) {
Chris Lattner17f71652008-08-17 07:19:36 +00002100 unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
2101 Str.push_back(Digits[Digit]);
Craig Topperfc947bc2017-04-18 17:14:21 +00002102 Tmp.lshrInPlace(ShiftAmt);
Chris Lattner17f71652008-08-17 07:19:36 +00002103 }
2104 } else {
Craig Topperecb97da2017-05-10 18:15:24 +00002105 while (Tmp.getBoolValue()) {
Craig Topper8885f932017-05-19 16:43:54 +00002106 uint64_t Digit;
2107 udivrem(Tmp, Radix, Tmp, Digit);
Chris Lattner17f71652008-08-17 07:19:36 +00002108 assert(Digit < Radix && "divide failed");
2109 Str.push_back(Digits[Digit]);
Chris Lattner17f71652008-08-17 07:19:36 +00002110 }
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002111 }
Eric Christopher820256b2009-08-21 04:06:45 +00002112
Chris Lattner17f71652008-08-17 07:19:36 +00002113 // Reverse the digits before returning.
2114 std::reverse(Str.begin()+StartDig, Str.end());
Reid Spencerfb77b2b2007-02-20 08:51:03 +00002115}
2116
Pawel Bylica6eeeac72015-04-06 13:31:39 +00002117/// Returns the APInt as a std::string. Note that this is an inefficient method.
2118/// It is better to pass in a SmallVector/SmallString to the methods above.
Chris Lattner17f71652008-08-17 07:19:36 +00002119std::string APInt::toString(unsigned Radix = 10, bool Signed = true) const {
2120 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002121 toString(S, Radix, Signed, /* formatAsCLiteral = */false);
Daniel Dunbar8b0b1152009-08-19 20:07:03 +00002122 return S.str();
Reid Spencer1ba83352007-02-21 03:55:44 +00002123}
Chris Lattner6b695682007-08-16 15:56:55 +00002124
Aaron Ballman615eb472017-10-15 14:32:27 +00002125#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +00002126LLVM_DUMP_METHOD void APInt::dump() const {
Chris Lattner17f71652008-08-17 07:19:36 +00002127 SmallString<40> S, U;
2128 this->toStringUnsigned(U);
2129 this->toStringSigned(S);
David Greenef32fcb42010-01-05 01:28:52 +00002130 dbgs() << "APInt(" << BitWidth << "b, "
Davide Italiano5a473d22017-01-31 21:26:18 +00002131 << U << "u " << S << "s)\n";
Chris Lattner17f71652008-08-17 07:19:36 +00002132}
Matthias Braun8c209aa2017-01-28 02:02:38 +00002133#endif
Chris Lattner17f71652008-08-17 07:19:36 +00002134
Chris Lattner0c19df42008-08-23 22:23:09 +00002135void APInt::print(raw_ostream &OS, bool isSigned) const {
Chris Lattner17f71652008-08-17 07:19:36 +00002136 SmallString<40> S;
Ted Kremenekb05f02e2011-06-15 00:51:55 +00002137 this->toString(S, 10, isSigned, /* formatAsCLiteral = */false);
Yaron Keren92e1b622015-03-18 10:17:07 +00002138 OS << S;
Chris Lattner17f71652008-08-17 07:19:36 +00002139}
2140
Chris Lattner6b695682007-08-16 15:56:55 +00002141// This implements a variety of operations on a representation of
2142// arbitrary precision, two's-complement, bignum integer values.
2143
Chris Lattner96cffa62009-08-23 23:11:28 +00002144// Assumed by lowHalf, highHalf, partMSB and partLSB. A fairly safe
2145// and unrestricting assumption.
Craig Topper55229b72017-04-02 19:17:22 +00002146static_assert(APInt::APINT_BITS_PER_WORD % 2 == 0,
2147 "Part width must be divisible by 2!");
Chris Lattner6b695682007-08-16 15:56:55 +00002148
2149/* Some handy functions local to this file. */
Chris Lattner6b695682007-08-16 15:56:55 +00002150
Craig Topper76f42462017-03-28 05:32:53 +00002151/* Returns the integer part with the least significant BITS set.
2152 BITS cannot be zero. */
Craig Topper55229b72017-04-02 19:17:22 +00002153static inline APInt::WordType lowBitMask(unsigned bits) {
2154 assert(bits != 0 && bits <= APInt::APINT_BITS_PER_WORD);
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002155
Craig Topper55229b72017-04-02 19:17:22 +00002156 return ~(APInt::WordType) 0 >> (APInt::APINT_BITS_PER_WORD - bits);
Craig Topper76f42462017-03-28 05:32:53 +00002157}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002158
Craig Topper76f42462017-03-28 05:32:53 +00002159/* Returns the value of the lower half of PART. */
Craig Topper55229b72017-04-02 19:17:22 +00002160static inline APInt::WordType lowHalf(APInt::WordType part) {
2161 return part & lowBitMask(APInt::APINT_BITS_PER_WORD / 2);
Craig Topper76f42462017-03-28 05:32:53 +00002162}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002163
Craig Topper76f42462017-03-28 05:32:53 +00002164/* Returns the value of the upper half of PART. */
Craig Topper55229b72017-04-02 19:17:22 +00002165static inline APInt::WordType highHalf(APInt::WordType part) {
2166 return part >> (APInt::APINT_BITS_PER_WORD / 2);
Craig Topper76f42462017-03-28 05:32:53 +00002167}
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002168
Craig Topper76f42462017-03-28 05:32:53 +00002169/* Returns the bit number of the most significant set bit of a part.
2170 If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002171static unsigned partMSB(APInt::WordType value) {
Craig Topper76f42462017-03-28 05:32:53 +00002172 return findLastSet(value, ZB_Max);
2173}
Chris Lattner6b695682007-08-16 15:56:55 +00002174
Craig Topper76f42462017-03-28 05:32:53 +00002175/* Returns the bit number of the least significant set bit of a
2176 part. If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002177static unsigned partLSB(APInt::WordType value) {
Craig Topper76f42462017-03-28 05:32:53 +00002178 return findFirstSet(value, ZB_Max);
Alexander Kornienkof00654e2015-06-23 09:49:53 +00002179}
Chris Lattner6b695682007-08-16 15:56:55 +00002180
2181/* Sets the least significant part of a bignum to the input value, and
2182 zeroes out higher parts. */
Craig Topper55229b72017-04-02 19:17:22 +00002183void APInt::tcSet(WordType *dst, WordType part, unsigned parts) {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002184 assert(parts > 0);
Neil Boothb6182162007-10-08 13:47:12 +00002185
Chris Lattner6b695682007-08-16 15:56:55 +00002186 dst[0] = part;
Craig Topperb0038162017-03-28 05:32:52 +00002187 for (unsigned i = 1; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002188 dst[i] = 0;
2189}
2190
2191/* Assign one bignum to another. */
Craig Topper55229b72017-04-02 19:17:22 +00002192void APInt::tcAssign(WordType *dst, const WordType *src, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002193 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002194 dst[i] = src[i];
2195}
2196
2197/* Returns true if a bignum is zero, false otherwise. */
Craig Topper55229b72017-04-02 19:17:22 +00002198bool APInt::tcIsZero(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 if (src[i])
2201 return false;
2202
2203 return true;
2204}
2205
2206/* Extract the given bit of a bignum; returns 0 or 1. */
Craig Topper55229b72017-04-02 19:17:22 +00002207int APInt::tcExtractBit(const WordType *parts, unsigned bit) {
Craig Topper00b47ee2017-04-02 19:35:18 +00002208 return (parts[whichWord(bit)] & maskBit(bit)) != 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002209}
2210
John McCalldcb9a7a2010-02-28 02:51:25 +00002211/* Set the given bit of a bignum. */
Craig Topper55229b72017-04-02 19:17:22 +00002212void APInt::tcSetBit(WordType *parts, unsigned bit) {
Craig Topper00b47ee2017-04-02 19:35:18 +00002213 parts[whichWord(bit)] |= maskBit(bit);
Chris Lattner6b695682007-08-16 15:56:55 +00002214}
2215
John McCalldcb9a7a2010-02-28 02:51:25 +00002216/* Clears the given bit of a bignum. */
Craig Topper55229b72017-04-02 19:17:22 +00002217void APInt::tcClearBit(WordType *parts, unsigned bit) {
Craig Topper00b47ee2017-04-02 19:35:18 +00002218 parts[whichWord(bit)] &= ~maskBit(bit);
John McCalldcb9a7a2010-02-28 02:51:25 +00002219}
2220
Neil Boothc8b650a2007-10-06 00:43:45 +00002221/* Returns the bit number of the least significant set bit of a
2222 number. If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002223unsigned APInt::tcLSB(const WordType *parts, unsigned n) {
Craig Topperb0038162017-03-28 05:32:52 +00002224 for (unsigned i = 0; i < n; i++) {
2225 if (parts[i] != 0) {
2226 unsigned lsb = partLSB(parts[i]);
Chris Lattner6b695682007-08-16 15:56:55 +00002227
Craig Topper55229b72017-04-02 19:17:22 +00002228 return lsb + i * APINT_BITS_PER_WORD;
Craig Topperb0038162017-03-28 05:32:52 +00002229 }
Chris Lattner6b695682007-08-16 15:56:55 +00002230 }
2231
2232 return -1U;
2233}
2234
Neil Boothc8b650a2007-10-06 00:43:45 +00002235/* Returns the bit number of the most significant set bit of a number.
2236 If the input number has no bits set -1U is returned. */
Craig Topper55229b72017-04-02 19:17:22 +00002237unsigned APInt::tcMSB(const WordType *parts, unsigned n) {
Chris Lattner6b695682007-08-16 15:56:55 +00002238 do {
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002239 --n;
Chris Lattner6b695682007-08-16 15:56:55 +00002240
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002241 if (parts[n] != 0) {
Craig Topperb0038162017-03-28 05:32:52 +00002242 unsigned msb = partMSB(parts[n]);
Chris Lattner6b695682007-08-16 15:56:55 +00002243
Craig Topper55229b72017-04-02 19:17:22 +00002244 return msb + n * APINT_BITS_PER_WORD;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002245 }
Chris Lattner6b695682007-08-16 15:56:55 +00002246 } while (n);
2247
2248 return -1U;
2249}
2250
Neil Boothb6182162007-10-08 13:47:12 +00002251/* Copy the bit vector of width srcBITS from SRC, starting at bit
2252 srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB becomes
2253 the least significant bit of DST. All high bits above srcBITS in
2254 DST are zero-filled. */
2255void
Craig Topper55229b72017-04-02 19:17:22 +00002256APInt::tcExtract(WordType *dst, unsigned dstCount, const WordType *src,
Craig Topper6a8518082017-03-28 05:32:55 +00002257 unsigned srcBits, unsigned srcLSB) {
Craig Topper55229b72017-04-02 19:17:22 +00002258 unsigned dstParts = (srcBits + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD;
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002259 assert(dstParts <= dstCount);
Neil Boothb6182162007-10-08 13:47:12 +00002260
Craig Topper55229b72017-04-02 19:17:22 +00002261 unsigned firstSrcPart = srcLSB / APINT_BITS_PER_WORD;
Neil Boothb6182162007-10-08 13:47:12 +00002262 tcAssign (dst, src + firstSrcPart, dstParts);
2263
Craig Topper55229b72017-04-02 19:17:22 +00002264 unsigned shift = srcLSB % APINT_BITS_PER_WORD;
Neil Boothb6182162007-10-08 13:47:12 +00002265 tcShiftRight (dst, dstParts, shift);
2266
Craig Topper55229b72017-04-02 19:17:22 +00002267 /* We now have (dstParts * APINT_BITS_PER_WORD - shift) bits from SRC
Neil Boothb6182162007-10-08 13:47:12 +00002268 in DST. If this is less that srcBits, append the rest, else
2269 clear the high bits. */
Craig Topper55229b72017-04-02 19:17:22 +00002270 unsigned n = dstParts * APINT_BITS_PER_WORD - shift;
Neil Boothb6182162007-10-08 13:47:12 +00002271 if (n < srcBits) {
Craig Topper55229b72017-04-02 19:17:22 +00002272 WordType mask = lowBitMask (srcBits - n);
Neil Boothb6182162007-10-08 13:47:12 +00002273 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
Craig Topper55229b72017-04-02 19:17:22 +00002274 << n % APINT_BITS_PER_WORD);
Neil Boothb6182162007-10-08 13:47:12 +00002275 } else if (n > srcBits) {
Craig Topper55229b72017-04-02 19:17:22 +00002276 if (srcBits % APINT_BITS_PER_WORD)
2277 dst[dstParts - 1] &= lowBitMask (srcBits % APINT_BITS_PER_WORD);
Neil Boothb6182162007-10-08 13:47:12 +00002278 }
2279
2280 /* Clear high parts. */
2281 while (dstParts < dstCount)
2282 dst[dstParts++] = 0;
2283}
2284
Chris Lattner6b695682007-08-16 15:56:55 +00002285/* DST += RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper55229b72017-04-02 19:17:22 +00002286APInt::WordType APInt::tcAdd(WordType *dst, const WordType *rhs,
2287 WordType c, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002288 assert(c <= 1);
2289
Craig Topperb0038162017-03-28 05:32:52 +00002290 for (unsigned i = 0; i < parts; i++) {
Craig Topper55229b72017-04-02 19:17:22 +00002291 WordType l = dst[i];
Chris Lattner6b695682007-08-16 15:56:55 +00002292 if (c) {
2293 dst[i] += rhs[i] + 1;
2294 c = (dst[i] <= l);
2295 } else {
2296 dst[i] += rhs[i];
2297 c = (dst[i] < l);
2298 }
2299 }
2300
2301 return c;
2302}
2303
Craig Topper92fc4772017-04-13 04:36:06 +00002304/// This function adds a single "word" integer, src, to the multiple
2305/// "word" integer array, dst[]. dst[] is modified to reflect the addition and
2306/// 1 is returned if there is a carry out, otherwise 0 is returned.
2307/// @returns the carry of the addition.
2308APInt::WordType APInt::tcAddPart(WordType *dst, WordType src,
2309 unsigned parts) {
2310 for (unsigned i = 0; i < parts; ++i) {
2311 dst[i] += src;
2312 if (dst[i] >= src)
2313 return 0; // No need to carry so exit early.
2314 src = 1; // Carry one to next digit.
2315 }
2316
2317 return 1;
2318}
2319
Chris Lattner6b695682007-08-16 15:56:55 +00002320/* DST -= RHS + C where C is zero or one. Returns the carry flag. */
Craig Topper55229b72017-04-02 19:17:22 +00002321APInt::WordType APInt::tcSubtract(WordType *dst, const WordType *rhs,
2322 WordType c, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002323 assert(c <= 1);
2324
Craig Topperb0038162017-03-28 05:32:52 +00002325 for (unsigned i = 0; i < parts; i++) {
Craig Topper55229b72017-04-02 19:17:22 +00002326 WordType l = dst[i];
Chris Lattner6b695682007-08-16 15:56:55 +00002327 if (c) {
2328 dst[i] -= rhs[i] + 1;
2329 c = (dst[i] >= l);
2330 } else {
2331 dst[i] -= rhs[i];
2332 c = (dst[i] > l);
2333 }
2334 }
2335
2336 return c;
2337}
2338
Craig Topper92fc4772017-04-13 04:36:06 +00002339/// This function subtracts a single "word" (64-bit word), src, from
2340/// the multi-word integer array, dst[], propagating the borrowed 1 value until
2341/// no further borrowing is needed or it runs out of "words" in dst. The result
2342/// is 1 if "borrowing" exhausted the digits in dst, or 0 if dst was not
2343/// exhausted. In other words, if src > dst then this function returns 1,
2344/// otherwise 0.
2345/// @returns the borrow out of the subtraction
2346APInt::WordType APInt::tcSubtractPart(WordType *dst, WordType src,
2347 unsigned parts) {
2348 for (unsigned i = 0; i < parts; ++i) {
2349 WordType Dst = dst[i];
2350 dst[i] -= src;
2351 if (src <= Dst)
2352 return 0; // No need to borrow so exit early.
2353 src = 1; // We have to "borrow 1" from next "word"
2354 }
2355
2356 return 1;
2357}
2358
Chris Lattner6b695682007-08-16 15:56:55 +00002359/* Negate a bignum in-place. */
Craig Topper55229b72017-04-02 19:17:22 +00002360void APInt::tcNegate(WordType *dst, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002361 tcComplement(dst, parts);
2362 tcIncrement(dst, parts);
2363}
2364
Neil Boothc8b650a2007-10-06 00:43:45 +00002365/* DST += SRC * MULTIPLIER + CARRY if add is true
2366 DST = SRC * MULTIPLIER + CARRY if add is false
Chris Lattner6b695682007-08-16 15:56:55 +00002367
2368 Requires 0 <= DSTPARTS <= SRCPARTS + 1. If DST overlaps SRC
2369 they must start at the same point, i.e. DST == SRC.
2370
2371 If DSTPARTS == SRCPARTS + 1 no overflow occurs and zero is
2372 returned. Otherwise DST is filled with the least significant
2373 DSTPARTS parts of the result, and if all of the omitted higher
2374 parts were zero return zero, otherwise overflow occurred and
2375 return one. */
Craig Topper55229b72017-04-02 19:17:22 +00002376int APInt::tcMultiplyPart(WordType *dst, const WordType *src,
2377 WordType multiplier, WordType carry,
Craig Topper6a8518082017-03-28 05:32:55 +00002378 unsigned srcParts, unsigned dstParts,
2379 bool add) {
Chris Lattner6b695682007-08-16 15:56:55 +00002380 /* Otherwise our writes of DST kill our later reads of SRC. */
2381 assert(dst <= src || dst >= src + srcParts);
2382 assert(dstParts <= srcParts + 1);
2383
2384 /* N loops; minimum of dstParts and srcParts. */
Craig Topper0cbab7c2017-05-08 06:34:39 +00002385 unsigned n = std::min(dstParts, srcParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002386
Craig Topperc96a84d2017-05-08 06:34:41 +00002387 for (unsigned i = 0; i < n; i++) {
Craig Topper55229b72017-04-02 19:17:22 +00002388 WordType low, mid, high, srcPart;
Chris Lattner6b695682007-08-16 15:56:55 +00002389
2390 /* [ LOW, HIGH ] = MULTIPLIER * SRC[i] + DST[i] + CARRY.
2391
2392 This cannot overflow, because
2393
2394 (n - 1) * (n - 1) + 2 (n - 1) = (n - 1) * (n + 1)
2395
2396 which is less than n^2. */
2397
2398 srcPart = src[i];
2399
Craig Topper6a8518082017-03-28 05:32:55 +00002400 if (multiplier == 0 || srcPart == 0) {
Chris Lattner6b695682007-08-16 15:56:55 +00002401 low = carry;
2402 high = 0;
2403 } else {
2404 low = lowHalf(srcPart) * lowHalf(multiplier);
2405 high = highHalf(srcPart) * highHalf(multiplier);
2406
2407 mid = lowHalf(srcPart) * highHalf(multiplier);
2408 high += highHalf(mid);
Craig Topper55229b72017-04-02 19:17:22 +00002409 mid <<= APINT_BITS_PER_WORD / 2;
Chris Lattner6b695682007-08-16 15:56:55 +00002410 if (low + mid < low)
2411 high++;
2412 low += mid;
2413
2414 mid = highHalf(srcPart) * lowHalf(multiplier);
2415 high += highHalf(mid);
Craig Topper55229b72017-04-02 19:17:22 +00002416 mid <<= APINT_BITS_PER_WORD / 2;
Chris Lattner6b695682007-08-16 15:56:55 +00002417 if (low + mid < low)
2418 high++;
2419 low += mid;
2420
2421 /* Now add carry. */
2422 if (low + carry < low)
2423 high++;
2424 low += carry;
2425 }
2426
2427 if (add) {
2428 /* And now DST[i], and store the new low part there. */
2429 if (low + dst[i] < low)
2430 high++;
2431 dst[i] += low;
2432 } else
2433 dst[i] = low;
2434
2435 carry = high;
2436 }
2437
Craig Topperc96a84d2017-05-08 06:34:41 +00002438 if (srcParts < dstParts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002439 /* Full multiplication, there is no overflow. */
Craig Topperc96a84d2017-05-08 06:34:41 +00002440 assert(srcParts + 1 == dstParts);
2441 dst[srcParts] = carry;
Chris Lattner6b695682007-08-16 15:56:55 +00002442 return 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002443 }
Craig Toppera6c142a2017-05-08 06:34:36 +00002444
2445 /* We overflowed if there is carry. */
2446 if (carry)
2447 return 1;
2448
2449 /* We would overflow if any significant unwritten parts would be
2450 non-zero. This is true if any remaining src parts are non-zero
2451 and the multiplier is non-zero. */
2452 if (multiplier)
Craig Topperc96a84d2017-05-08 06:34:41 +00002453 for (unsigned i = dstParts; i < srcParts; i++)
Craig Toppera6c142a2017-05-08 06:34:36 +00002454 if (src[i])
2455 return 1;
2456
2457 /* We fitted in the narrow destination. */
2458 return 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002459}
2460
2461/* DST = LHS * RHS, where DST has the same width as the operands and
2462 is filled with the least significant parts of the result. Returns
2463 one if overflow occurred, otherwise zero. DST must be disjoint
2464 from both operands. */
Craig Topper55229b72017-04-02 19:17:22 +00002465int APInt::tcMultiply(WordType *dst, const WordType *lhs,
2466 const WordType *rhs, unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002467 assert(dst != lhs && dst != rhs);
2468
Craig Topperb0038162017-03-28 05:32:52 +00002469 int overflow = 0;
Chris Lattner6b695682007-08-16 15:56:55 +00002470 tcSet(dst, 0, parts);
2471
Craig Topperb0038162017-03-28 05:32:52 +00002472 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002473 overflow |= tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts,
2474 parts - i, true);
2475
2476 return overflow;
2477}
2478
Craig Topper0acb6652017-05-09 16:47:33 +00002479/// DST = LHS * RHS, where DST has width the sum of the widths of the
2480/// operands. No overflow occurs. DST must be disjoint from both operands.
2481void APInt::tcFullMultiply(WordType *dst, const WordType *lhs,
2482 const WordType *rhs, unsigned lhsParts,
2483 unsigned rhsParts) {
Neil Booth0ea72a92007-10-06 00:24:48 +00002484 /* Put the narrower number on the LHS for less loops below. */
Craig Toppera6c142a2017-05-08 06:34:36 +00002485 if (lhsParts > rhsParts)
Neil Booth0ea72a92007-10-06 00:24:48 +00002486 return tcFullMultiply (dst, rhs, lhs, rhsParts, lhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002487
Craig Toppera6c142a2017-05-08 06:34:36 +00002488 assert(dst != lhs && dst != rhs);
Chris Lattner6b695682007-08-16 15:56:55 +00002489
Craig Toppera6c142a2017-05-08 06:34:36 +00002490 tcSet(dst, 0, rhsParts);
Chris Lattner6b695682007-08-16 15:56:55 +00002491
Craig Toppera6c142a2017-05-08 06:34:36 +00002492 for (unsigned i = 0; i < lhsParts; i++)
2493 tcMultiplyPart(&dst[i], rhs, lhs[i], 0, rhsParts, rhsParts + 1, true);
Chris Lattner6b695682007-08-16 15:56:55 +00002494}
2495
2496/* If RHS is zero LHS and REMAINDER are left unchanged, return one.
2497 Otherwise set LHS to LHS / RHS with the fractional part discarded,
2498 set REMAINDER to the remainder, return zero. i.e.
2499
2500 OLD_LHS = RHS * LHS + REMAINDER
2501
2502 SCRATCH is a bignum of the same size as the operands and result for
2503 use by the routine; its contents need not be initialized and are
2504 destroyed. LHS, REMAINDER and SCRATCH must be distinct.
2505*/
Craig Topper55229b72017-04-02 19:17:22 +00002506int APInt::tcDivide(WordType *lhs, const WordType *rhs,
2507 WordType *remainder, WordType *srhs,
Craig Topper6a8518082017-03-28 05:32:55 +00002508 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002509 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2510
Craig Topperb0038162017-03-28 05:32:52 +00002511 unsigned shiftCount = tcMSB(rhs, parts) + 1;
Chris Lattnerfe02c1f2007-08-20 22:49:32 +00002512 if (shiftCount == 0)
Chris Lattner6b695682007-08-16 15:56:55 +00002513 return true;
2514
Craig Topper55229b72017-04-02 19:17:22 +00002515 shiftCount = parts * APINT_BITS_PER_WORD - shiftCount;
2516 unsigned n = shiftCount / APINT_BITS_PER_WORD;
2517 WordType mask = (WordType) 1 << (shiftCount % APINT_BITS_PER_WORD);
Chris Lattner6b695682007-08-16 15:56:55 +00002518
2519 tcAssign(srhs, rhs, parts);
2520 tcShiftLeft(srhs, parts, shiftCount);
2521 tcAssign(remainder, lhs, parts);
2522 tcSet(lhs, 0, parts);
2523
2524 /* Loop, subtracting SRHS if REMAINDER is greater and adding that to
2525 the total. */
Dan Gohmanb452d4e2010-03-24 19:38:02 +00002526 for (;;) {
Craig Toppera584af52017-05-10 07:50:17 +00002527 int compare = tcCompare(remainder, srhs, parts);
2528 if (compare >= 0) {
2529 tcSubtract(remainder, srhs, 0, parts);
2530 lhs[n] |= mask;
2531 }
Chris Lattner6b695682007-08-16 15:56:55 +00002532
Craig Toppera584af52017-05-10 07:50:17 +00002533 if (shiftCount == 0)
2534 break;
2535 shiftCount--;
2536 tcShiftRight(srhs, parts, 1);
2537 if ((mask >>= 1) == 0) {
2538 mask = (WordType) 1 << (APINT_BITS_PER_WORD - 1);
2539 n--;
2540 }
Chris Lattner6b695682007-08-16 15:56:55 +00002541 }
2542
2543 return false;
2544}
2545
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002546/// Shift a bignum left Cound bits in-place. Shifted in bits are zero. There are
2547/// no restrictions on Count.
2548void APInt::tcShiftLeft(WordType *Dst, unsigned Words, unsigned Count) {
2549 // Don't bother performing a no-op shift.
2550 if (!Count)
2551 return;
Chris Lattner6b695682007-08-16 15:56:55 +00002552
Craig Topperc6b05682017-04-24 17:00:22 +00002553 // WordShift is the inter-part shift; BitShift is the intra-part shift.
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002554 unsigned WordShift = std::min(Count / APINT_BITS_PER_WORD, Words);
2555 unsigned BitShift = Count % APINT_BITS_PER_WORD;
Chris Lattner6b695682007-08-16 15:56:55 +00002556
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002557 // Fastpath for moving by whole words.
2558 if (BitShift == 0) {
2559 std::memmove(Dst + WordShift, Dst, (Words - WordShift) * APINT_WORD_SIZE);
2560 } else {
2561 while (Words-- > WordShift) {
2562 Dst[Words] = Dst[Words - WordShift] << BitShift;
2563 if (Words > WordShift)
2564 Dst[Words] |=
2565 Dst[Words - WordShift - 1] >> (APINT_BITS_PER_WORD - BitShift);
Neil Boothb6182162007-10-08 13:47:12 +00002566 }
Neil Boothb6182162007-10-08 13:47:12 +00002567 }
Craig Toppera8a4f0d2017-04-18 04:39:48 +00002568
2569 // Fill in the remainder with 0s.
2570 std::memset(Dst, 0, WordShift * APINT_WORD_SIZE);
Chris Lattner6b695682007-08-16 15:56:55 +00002571}
2572
Craig Topper9575d8f2017-04-17 21:43:43 +00002573/// Shift a bignum right Count bits in-place. Shifted in bits are zero. There
2574/// are no restrictions on Count.
2575void APInt::tcShiftRight(WordType *Dst, unsigned Words, unsigned Count) {
2576 // Don't bother performing a no-op shift.
2577 if (!Count)
2578 return;
Chris Lattner6b695682007-08-16 15:56:55 +00002579
Craig Topperc6b05682017-04-24 17:00:22 +00002580 // WordShift is the inter-part shift; BitShift is the intra-part shift.
Craig Topper9575d8f2017-04-17 21:43:43 +00002581 unsigned WordShift = std::min(Count / APINT_BITS_PER_WORD, Words);
2582 unsigned BitShift = Count % APINT_BITS_PER_WORD;
Chris Lattner6b695682007-08-16 15:56:55 +00002583
Craig Topper9575d8f2017-04-17 21:43:43 +00002584 unsigned WordsToMove = Words - WordShift;
2585 // Fastpath for moving by whole words.
2586 if (BitShift == 0) {
2587 std::memmove(Dst, Dst + WordShift, WordsToMove * APINT_WORD_SIZE);
2588 } else {
2589 for (unsigned i = 0; i != WordsToMove; ++i) {
2590 Dst[i] = Dst[i + WordShift] >> BitShift;
2591 if (i + 1 != WordsToMove)
2592 Dst[i] |= Dst[i + WordShift + 1] << (APINT_BITS_PER_WORD - BitShift);
Neil Boothb6182162007-10-08 13:47:12 +00002593 }
Chris Lattner6b695682007-08-16 15:56:55 +00002594 }
Craig Topper9575d8f2017-04-17 21:43:43 +00002595
2596 // Fill in the remainder with 0s.
2597 std::memset(Dst + WordsToMove, 0, WordShift * APINT_WORD_SIZE);
Chris Lattner6b695682007-08-16 15:56:55 +00002598}
2599
2600/* Bitwise and of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002601void APInt::tcAnd(WordType *dst, const WordType *rhs, unsigned parts) {
Craig Topperb0038162017-03-28 05:32:52 +00002602 for (unsigned i = 0; i < parts; i++)
Chris Lattner6b695682007-08-16 15:56:55 +00002603 dst[i] &= rhs[i];
2604}
2605
2606/* Bitwise inclusive or of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002607void APInt::tcOr(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 exclusive or of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002613void APInt::tcXor(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/* Complement a bignum in-place. */
Craig Topper55229b72017-04-02 19:17:22 +00002619void APInt::tcComplement(WordType *dst, 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] = ~dst[i];
2622}
2623
2624/* Comparison (unsigned) of two bignums. */
Craig Topper55229b72017-04-02 19:17:22 +00002625int APInt::tcCompare(const WordType *lhs, const WordType *rhs,
Craig Topper6a8518082017-03-28 05:32:55 +00002626 unsigned parts) {
Chris Lattner6b695682007-08-16 15:56:55 +00002627 while (parts) {
Craig Topper99cfe4f2017-04-01 21:50:06 +00002628 parts--;
Craig Topper1dc8fc82017-04-21 16:13:15 +00002629 if (lhs[parts] != rhs[parts])
2630 return (lhs[parts] > rhs[parts]) ? 1 : -1;
Craig Topper99cfe4f2017-04-01 21:50:06 +00002631 }
Chris Lattner6b695682007-08-16 15:56:55 +00002632
2633 return 0;
2634}
2635
Chris Lattner6b695682007-08-16 15:56:55 +00002636/* Set the least significant BITS bits of a bignum, clear the
2637 rest. */
Craig Topper55229b72017-04-02 19:17:22 +00002638void APInt::tcSetLeastSignificantBits(WordType *dst, unsigned parts,
Craig Topper6a8518082017-03-28 05:32:55 +00002639 unsigned bits) {
Craig Topperb0038162017-03-28 05:32:52 +00002640 unsigned i = 0;
Craig Topper55229b72017-04-02 19:17:22 +00002641 while (bits > APINT_BITS_PER_WORD) {
2642 dst[i++] = ~(WordType) 0;
2643 bits -= APINT_BITS_PER_WORD;
Chris Lattner6b695682007-08-16 15:56:55 +00002644 }
2645
2646 if (bits)
Craig Topper55229b72017-04-02 19:17:22 +00002647 dst[i++] = ~(WordType) 0 >> (APINT_BITS_PER_WORD - bits);
Chris Lattner6b695682007-08-16 15:56:55 +00002648
2649 while (i < parts)
2650 dst[i++] = 0;
2651}
Tim Shen802c31c2018-06-25 23:49:20 +00002652
2653APInt llvm::APIntOps::RoundingUDiv(const APInt &A, const APInt &B,
2654 APInt::Rounding RM) {
2655 // Currently udivrem always rounds down.
2656 switch (RM) {
2657 case APInt::Rounding::DOWN:
2658 case APInt::Rounding::TOWARD_ZERO:
2659 return A.udiv(B);
2660 case APInt::Rounding::UP: {
2661 APInt Quo, Rem;
2662 APInt::udivrem(A, B, Quo, Rem);
2663 if (Rem == 0)
2664 return Quo;
2665 return Quo + 1;
2666 }
2667 }
Simon Pilgrim9b3b0fe2018-06-26 09:31:18 +00002668 llvm_unreachable("Unknown APInt::Rounding enum");
Tim Shen802c31c2018-06-25 23:49:20 +00002669}
2670
2671APInt llvm::APIntOps::RoundingSDiv(const APInt &A, const APInt &B,
2672 APInt::Rounding RM) {
2673 switch (RM) {
2674 case APInt::Rounding::DOWN:
2675 case APInt::Rounding::UP: {
2676 APInt Quo, Rem;
2677 APInt::sdivrem(A, B, Quo, Rem);
2678 if (Rem == 0)
2679 return Quo;
2680 // This algorithm deals with arbitrary rounding mode used by sdivrem.
2681 // We want to check whether the non-integer part of the mathematical value
2682 // is negative or not. If the non-integer part is negative, we need to round
2683 // down from Quo; otherwise, if it's positive or 0, we return Quo, as it's
2684 // already rounded down.
2685 if (RM == APInt::Rounding::DOWN) {
2686 if (Rem.isNegative() != B.isNegative())
2687 return Quo - 1;
2688 return Quo;
2689 }
2690 if (Rem.isNegative() != B.isNegative())
2691 return Quo;
2692 return Quo + 1;
2693 }
2694 // Currently sdiv rounds twards zero.
2695 case APInt::Rounding::TOWARD_ZERO:
2696 return A.sdiv(B);
2697 }
Simon Pilgrim9b3b0fe2018-06-26 09:31:18 +00002698 llvm_unreachable("Unknown APInt::Rounding enum");
Tim Shen802c31c2018-06-25 23:49:20 +00002699}
Krzysztof Parzyszek90f32492018-08-02 19:13:35 +00002700
2701Optional<APInt>
2702llvm::APIntOps::SolveQuadraticEquationWrap(APInt A, APInt B, APInt C,
2703 unsigned RangeWidth) {
2704 unsigned CoeffWidth = A.getBitWidth();
2705 assert(CoeffWidth == B.getBitWidth() && CoeffWidth == C.getBitWidth());
2706 assert(RangeWidth <= CoeffWidth &&
2707 "Value range width should be less than coefficient width");
2708 assert(RangeWidth > 1 && "Value range bit width should be > 1");
2709
2710 LLVM_DEBUG(dbgs() << __func__ << ": solving " << A << "x^2 + " << B
2711 << "x + " << C << ", rw:" << RangeWidth << '\n');
2712
2713 // Identify 0 as a (non)solution immediately.
2714 if (C.sextOrTrunc(RangeWidth).isNullValue() ) {
2715 LLVM_DEBUG(dbgs() << __func__ << ": zero solution\n");
2716 return APInt(CoeffWidth, 0);
2717 }
2718
2719 // The result of APInt arithmetic has the same bit width as the operands,
2720 // so it can actually lose high bits. A product of two n-bit integers needs
2721 // 2n-1 bits to represent the full value.
2722 // The operation done below (on quadratic coefficients) that can produce
2723 // the largest value is the evaluation of the equation during bisection,
2724 // which needs 3 times the bitwidth of the coefficient, so the total number
2725 // of required bits is 3n.
2726 //
2727 // The purpose of this extension is to simulate the set Z of all integers,
2728 // where n+1 > n for all n in Z. In Z it makes sense to talk about positive
2729 // and negative numbers (not so much in a modulo arithmetic). The method
2730 // used to solve the equation is based on the standard formula for real
2731 // numbers, and uses the concepts of "positive" and "negative" with their
2732 // usual meanings.
2733 CoeffWidth *= 3;
2734 A = A.sext(CoeffWidth);
2735 B = B.sext(CoeffWidth);
2736 C = C.sext(CoeffWidth);
2737
2738 // Make A > 0 for simplicity. Negate cannot overflow at this point because
2739 // the bit width has increased.
2740 if (A.isNegative()) {
2741 A.negate();
2742 B.negate();
2743 C.negate();
2744 }
2745
2746 // Solving an equation q(x) = 0 with coefficients in modular arithmetic
2747 // is really solving a set of equations q(x) = kR for k = 0, 1, 2, ...,
2748 // and R = 2^BitWidth.
2749 // Since we're trying not only to find exact solutions, but also values
2750 // that "wrap around", such a set will always have a solution, i.e. an x
2751 // that satisfies at least one of the equations, or such that |q(x)|
2752 // exceeds kR, while |q(x-1)| for the same k does not.
2753 //
2754 // We need to find a value k, such that Ax^2 + Bx + C = kR will have a
2755 // positive solution n (in the above sense), and also such that the n
2756 // will be the least among all solutions corresponding to k = 0, 1, ...
2757 // (more precisely, the least element in the set
2758 // { n(k) | k is such that a solution n(k) exists }).
2759 //
2760 // Consider the parabola (over real numbers) that corresponds to the
2761 // quadratic equation. Since A > 0, the arms of the parabola will point
2762 // up. Picking different values of k will shift it up and down by R.
2763 //
2764 // We want to shift the parabola in such a way as to reduce the problem
2765 // of solving q(x) = kR to solving shifted_q(x) = 0.
2766 // (The interesting solutions are the ceilings of the real number
2767 // solutions.)
2768 APInt R = APInt::getOneBitSet(CoeffWidth, RangeWidth);
2769 APInt TwoA = 2 * A;
2770 APInt SqrB = B * B;
2771 bool PickLow;
2772
Krzysztof Parzyszekdfd5fad2018-08-02 19:38:18 +00002773 auto RoundUp = [] (const APInt &V, const APInt &A) -> APInt {
Krzysztof Parzyszek90f32492018-08-02 19:13:35 +00002774 assert(A.isStrictlyPositive());
2775 APInt T = V.abs().urem(A);
2776 if (T.isNullValue())
2777 return V;
2778 return V.isNegative() ? V+T : V+(A-T);
2779 };
2780
2781 // The vertex of the parabola is at -B/2A, but since A > 0, it's negative
2782 // iff B is positive.
2783 if (B.isNonNegative()) {
2784 // If B >= 0, the vertex it at a negative location (or at 0), so in
2785 // order to have a non-negative solution we need to pick k that makes
2786 // C-kR negative. To satisfy all the requirements for the solution
2787 // that we are looking for, it needs to be closest to 0 of all k.
2788 C = C.srem(R);
2789 if (C.isStrictlyPositive())
2790 C -= R;
2791 // Pick the greater solution.
2792 PickLow = false;
2793 } else {
2794 // If B < 0, the vertex is at a positive location. For any solution
2795 // to exist, the discriminant must be non-negative. This means that
2796 // C-kR <= B^2/4A is a necessary condition for k, i.e. there is a
2797 // lower bound on values of k: kR >= C - B^2/4A.
2798 APInt LowkR = C - SqrB.udiv(2*TwoA); // udiv because all values > 0.
2799 // Round LowkR up (towards +inf) to the nearest kR.
2800 LowkR = RoundUp(LowkR, R);
2801
2802 // If there exists k meeting the condition above, and such that
2803 // C-kR > 0, there will be two positive real number solutions of
2804 // q(x) = kR. Out of all such values of k, pick the one that makes
2805 // C-kR closest to 0, (i.e. pick maximum k such that C-kR > 0).
2806 // In other words, find maximum k such that LowkR <= kR < C.
2807 if (C.sgt(LowkR)) {
2808 // If LowkR < C, then such a k is guaranteed to exist because
2809 // LowkR itself is a multiple of R.
2810 C -= -RoundUp(-C, R); // C = C - RoundDown(C, R)
2811 // Pick the smaller solution.
2812 PickLow = true;
2813 } else {
2814 // If C-kR < 0 for all potential k's, it means that one solution
2815 // will be negative, while the other will be positive. The positive
2816 // solution will shift towards 0 if the parabola is moved up.
2817 // Pick the kR closest to the lower bound (i.e. make C-kR closest
2818 // to 0, or in other words, out of all parabolas that have solutions,
2819 // pick the one that is the farthest "up").
2820 // Since LowkR is itself a multiple of R, simply take C-LowkR.
2821 C -= LowkR;
2822 // Pick the greater solution.
2823 PickLow = false;
2824 }
2825 }
2826
2827 LLVM_DEBUG(dbgs() << __func__ << ": updated coefficients " << A << "x^2 + "
2828 << B << "x + " << C << ", rw:" << RangeWidth << '\n');
2829
2830 APInt D = SqrB - 4*A*C;
2831 assert(D.isNonNegative() && "Negative discriminant");
2832 APInt SQ = D.sqrt();
2833
2834 APInt Q = SQ * SQ;
2835 bool InexactSQ = Q != D;
2836 // The calculated SQ may actually be greater than the exact (non-integer)
2837 // value. If that's the case, decremement SQ to get a value that is lower.
2838 if (Q.sgt(D))
2839 SQ -= 1;
2840
2841 APInt X;
2842 APInt Rem;
2843
2844 // SQ is rounded down (i.e SQ * SQ <= D), so the roots may be inexact.
2845 // When using the quadratic formula directly, the calculated low root
2846 // may be greater than the exact one, since we would be subtracting SQ.
2847 // To make sure that the calculated root is not greater than the exact
2848 // one, subtract SQ+1 when calculating the low root (for inexact value
2849 // of SQ).
2850 if (PickLow)
2851 APInt::sdivrem(-B - (SQ+InexactSQ), TwoA, X, Rem);
2852 else
2853 APInt::sdivrem(-B + SQ, TwoA, X, Rem);
2854
2855 // The updated coefficients should be such that the (exact) solution is
2856 // positive. Since APInt division rounds towards 0, the calculated one
2857 // can be 0, but cannot be negative.
2858 assert(X.isNonNegative() && "Solution should be non-negative");
2859
2860 if (!InexactSQ && Rem.isNullValue()) {
2861 LLVM_DEBUG(dbgs() << __func__ << ": solution (root): " << X << '\n');
2862 return X;
2863 }
2864
2865 assert((SQ*SQ).sle(D) && "SQ = |_sqrt(D)_|, so SQ*SQ <= D");
2866 // The exact value of the square root of D should be between SQ and SQ+1.
2867 // This implies that the solution should be between that corresponding to
2868 // SQ (i.e. X) and that corresponding to SQ+1.
2869 //
2870 // The calculated X cannot be greater than the exact (real) solution.
2871 // Actually it must be strictly less than the exact solution, while
2872 // X+1 will be greater than or equal to it.
2873
2874 APInt VX = (A*X + B)*X + C;
2875 APInt VY = VX + TwoA*X + A + B;
2876 bool SignChange = VX.isNegative() != VY.isNegative() ||
2877 VX.isNullValue() != VY.isNullValue();
2878 // If the sign did not change between X and X+1, X is not a valid solution.
2879 // This could happen when the actual (exact) roots don't have an integer
2880 // between them, so they would both be contained between X and X+1.
2881 if (!SignChange) {
2882 LLVM_DEBUG(dbgs() << __func__ << ": no valid solution\n");
2883 return None;
2884 }
2885
2886 X += 1;
2887 LLVM_DEBUG(dbgs() << __func__ << ": solution (wrap): " << X << '\n');
2888 return X;
2889}