21#include "llvm/Config/llvm-config.h"
32#define DEBUG_TYPE "apint"
50 if (radix == 16 || radix == 36) {
86void APInt::initSlowCase(
const APInt& that) {
92 assert(bigVal.
data() &&
"Null pointer detected!");
108 initFromArray(bigVal);
113 initFromArray(
ArrayRef(bigVal, numWords));
118 fromString(numbits, Str, radix);
121void APInt::reallocate(
unsigned NewBitWidth) {
124 BitWidth = NewBitWidth;
133 BitWidth = NewBitWidth;
140void APInt::assignSlowCase(
const APInt &RHS) {
146 reallocate(
RHS.getBitWidth());
157 ID.AddInteger(BitWidth);
160 ID.AddInteger(U.VAL);
165 for (
unsigned i = 0; i < NumWords; ++i)
166 ID.AddInteger(U.pVal[i]);
173 const unsigned MinimumTrailingZeroes =
Log2(
A);
174 return TrailingZeroes >= MinimumTrailingZeroes;
183 return clearUnusedBits();
192 return clearUnusedBits();
199 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be the same");
204 return clearUnusedBits();
212 return clearUnusedBits();
219 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be the same");
224 return clearUnusedBits();
232 return clearUnusedBits();
236 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be the same");
238 return APInt(BitWidth, U.VAL *
RHS.U.VAL,
false,
243 Result.clearUnusedBits();
247void APInt::andAssignSlowCase(
const APInt &RHS) {
253void APInt::orAssignSlowCase(
const APInt &RHS) {
259void APInt::xorAssignSlowCase(
const APInt &RHS) {
277 return clearUnusedBits();
280bool APInt::equalSlowCase(
const APInt &RHS)
const {
284int APInt::compare(
const APInt& RHS)
const {
285 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be same for comparison");
287 return U.VAL <
RHS.U.VAL ? -1 : U.VAL >
RHS.U.VAL;
292int APInt::compareSigned(
const APInt& RHS)
const {
293 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be same for comparison");
297 return lhsSext < rhsSext ? -1 : lhsSext > rhsSext;
301 bool rhsNeg =
RHS.isNegative();
304 if (lhsNeg != rhsNeg)
305 return lhsNeg ? -1 : 1;
312void APInt::setBitsSlowCase(
unsigned loBit,
unsigned hiBit) {
313 unsigned loWord = whichWord(loBit);
314 unsigned hiWord = whichWord(hiBit);
320 unsigned hiShiftAmt = whichBit(hiBit);
321 if (hiShiftAmt != 0) {
326 if (hiWord == loWord)
329 U.pVal[hiWord] |= hiMask;
332 U.pVal[loWord] |= loMask;
335 for (
unsigned word = loWord + 1; word < hiWord; ++word)
341 for (
unsigned i = 0; i < parts; i++)
346void APInt::flipAllBitsSlowCase() {
355APInt APInt::concatSlowCase(
const APInt &NewLSB)
const {
366 assert(bitPosition < BitWidth &&
"Out of the bit-width range!");
367 setBitVal(bitPosition, !(*
this)[bitPosition]);
372 assert((subBitWidth + bitPosition) <= BitWidth &&
"Illegal bit insertion");
375 if (subBitWidth == 0)
379 if (subBitWidth == BitWidth) {
387 U.VAL &= ~(mask << bitPosition);
388 U.VAL |= (subBits.U.
VAL << bitPosition);
392 unsigned loBit = whichBit(bitPosition);
393 unsigned loWord = whichWord(bitPosition);
394 unsigned hi1Word = whichWord(bitPosition + subBitWidth - 1);
397 if (loWord == hi1Word) {
399 U.pVal[loWord] &= ~(mask << loBit);
400 U.pVal[loWord] |= (subBits.U.
VAL << loBit);
413 if (remainingBits != 0) {
415 U.pVal[hi1Word] &= ~mask;
416 U.pVal[hi1Word] |= subBits.getWord(subBitWidth - 1);
424 for (
unsigned i = 0; i != subBitWidth; ++i)
429 uint64_t maskBits = maskTrailingOnes<uint64_t>(numBits);
432 U.VAL &= ~(maskBits << bitPosition);
433 U.VAL |= subBits << bitPosition;
437 unsigned loBit = whichBit(bitPosition);
438 unsigned loWord = whichWord(bitPosition);
439 unsigned hiWord = whichWord(bitPosition + numBits - 1);
440 if (loWord == hiWord) {
441 U.pVal[loWord] &= ~(maskBits << loBit);
442 U.pVal[loWord] |= subBits << loBit;
446 static_assert(8 *
sizeof(
WordType) <= 64,
"This code assumes only two words affected");
447 unsigned wordBits = 8 *
sizeof(
WordType);
448 U.pVal[loWord] &= ~(maskBits << loBit);
449 U.pVal[loWord] |= subBits << loBit;
451 U.pVal[hiWord] &= ~(maskBits >> (wordBits - loBit));
452 U.pVal[hiWord] |= subBits >> (wordBits - loBit);
456 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
457 "Illegal bit extraction");
460 return APInt(numBits, U.VAL >> bitPosition,
false,
463 unsigned loBit = whichBit(bitPosition);
464 unsigned loWord = whichWord(bitPosition);
465 unsigned hiWord = whichWord(bitPosition + numBits - 1);
468 if (loWord == hiWord)
469 return APInt(numBits, U.pVal[loWord] >> loBit,
false,
475 return APInt(numBits,
ArrayRef(U.pVal + loWord, 1 + hiWord - loWord));
478 APInt Result(numBits, 0);
480 unsigned NumDstWords = Result.getNumWords();
482 uint64_t *DestPtr = Result.isSingleWord() ? &Result.U.VAL : Result.U.pVal;
483 for (
unsigned word = 0; word < NumDstWords; ++word) {
484 uint64_t w0 = U.pVal[loWord + word];
486 (loWord + word + 1) < NumSrcWords ? U.pVal[loWord + word + 1] : 0;
490 return Result.clearUnusedBits();
494 unsigned bitPosition)
const {
495 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
496 "Illegal bit extraction");
497 assert(numBits <= 64 &&
"Illegal bit extraction");
499 uint64_t maskBits = maskTrailingOnes<uint64_t>(numBits);
501 return (U.VAL >> bitPosition) & maskBits;
504 "This code assumes only two words affected");
505 unsigned loBit = whichBit(bitPosition);
506 unsigned loWord = whichWord(bitPosition);
507 unsigned hiWord = whichWord(bitPosition + numBits - 1);
508 if (loWord == hiWord)
509 return (U.pVal[loWord] >> loBit) & maskBits;
511 uint64_t retBits = U.pVal[loWord] >> loBit;
518 assert(!Str.empty() &&
"Invalid string length");
519 size_t StrLen = Str.size();
522 unsigned IsNegative =
false;
523 if (Str[0] ==
'-' || Str[0] ==
'+') {
524 IsNegative = Str[0] ==
'-';
526 assert(StrLen &&
"String is only a sign, needs a value.");
532 return StrLen + IsNegative;
534 return StrLen * 3 + IsNegative;
536 return StrLen * 4 + IsNegative;
543 return (StrLen == 1 ? 4 : StrLen * 64 / 18) + IsNegative;
546 return (StrLen == 1 ? 7 : StrLen * 16 / 3) + IsNegative;
556 if (radix == 2 || radix == 8 || radix == 16)
562 size_t slen = str.
size();
567 if (*p ==
'-' || *p ==
'+') {
570 assert(slen &&
"String is only a sign, needs a value.");
581 if (log == (
unsigned)-1) {
600 return static_cast<unsigned>(
hash_value(Key));
605 "SplatSizeInBits must divide width!");
608 return *
this ==
rotl(SplatSizeInBits);
613 return this->
lshr(BitWidth - numBits);
625 assert(NewLen >= V.getBitWidth() &&
"Can't splat to smaller bit width!");
627 APInt Val = V.zext(NewLen);
628 for (
unsigned I = V.getBitWidth();
I < NewLen;
I <<= 1)
634unsigned APInt::countLeadingZerosSlowCase()
const {
651unsigned APInt::countLeadingOnesSlowCase()
const {
662 if (Count == highWordBits) {
663 for (i--; i >= 0; --i) {
675unsigned APInt::countTrailingZerosSlowCase()
const {
682 return std::min(Count, BitWidth);
685unsigned APInt::countTrailingOnesSlowCase()
const {
692 assert(Count <= BitWidth);
696unsigned APInt::countPopulationSlowCase()
const {
703bool APInt::intersectsSlowCase(
const APInt &RHS)
const {
705 if ((U.pVal[i] &
RHS.U.pVal[i]) != 0)
711bool APInt::isSubsetOfSlowCase(
const APInt &RHS)
const {
713 if ((U.pVal[i] & ~
RHS.U.pVal[i]) != 0)
720 assert(BitWidth >= 16 && BitWidth % 8 == 0 &&
"Cannot byteswap!");
722 return APInt(BitWidth, llvm::byteswap<uint16_t>(U.VAL));
724 return APInt(BitWidth, llvm::byteswap<uint32_t>(U.VAL));
725 if (BitWidth <= 64) {
726 uint64_t Tmp1 = llvm::byteswap<uint64_t>(U.VAL);
727 Tmp1 >>= (64 - BitWidth);
728 return APInt(BitWidth, Tmp1);
733 Result.U.pVal[
I] = llvm::byteswap<uint64_t>(U.pVal[
N -
I - 1]);
734 if (Result.BitWidth != BitWidth) {
735 Result.lshrInPlace(Result.BitWidth - BitWidth);
736 Result.BitWidth = BitWidth;
744 return APInt(BitWidth, llvm::reverseBits<uint64_t>(U.VAL));
746 return APInt(BitWidth, llvm::reverseBits<uint32_t>(U.VAL));
748 return APInt(BitWidth, llvm::reverseBits<uint16_t>(U.VAL));
750 return APInt(BitWidth, llvm::reverseBits<uint8_t>(U.VAL));
758 APInt Reversed(BitWidth, 0);
759 unsigned S = BitWidth;
773 if (
A ==
B)
return A;
782 unsigned Pow2_A =
A.countr_zero();
783 unsigned Pow2_B =
B.countr_zero();
784 if (Pow2_A > Pow2_B) {
785 A.lshrInPlace(Pow2_A - Pow2_B);
787 }
else if (Pow2_B > Pow2_A) {
788 B.lshrInPlace(Pow2_B - Pow2_A);
804 A.lshrInPlace(
A.countr_zero() - Pow2);
807 B.lshrInPlace(
B.countr_zero() - Pow2);
821 int64_t exp = ((
I >> 52) & 0x7ff) - 1023;
825 return APInt(width, 0u);
828 uint64_t mantissa = (
I & (~0ULL >> 12)) | 1ULL << 52;
832 return isNeg ? -
APInt(width, mantissa >> (52 - exp)) :
833 APInt(width, mantissa >> (52 - exp));
837 if (width <= exp - 52)
838 return APInt(width, 0);
841 APInt Tmp(width, mantissa);
843 return isNeg ? -Tmp : Tmp;
862 return double(getWord(0));
882 return std::numeric_limits<double>::infinity();
884 return -std::numeric_limits<double>::infinity();
891 unsigned hiWord = whichWord(n-1);
893 mantissa = Tmp.U.
pVal[0];
897 assert(hiWord > 0 &&
"huh?");
900 mantissa = hibits | lobits;
905 uint64_t I = sign | (exp << 52) | mantissa;
906 return bit_cast<double>(
I);
911 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
917 if (width == BitWidth)
925 Result.U.pVal[i] = U.pVal[i];
930 Result.U.pVal[i] = U.pVal[i] << bits >> bits;
937 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
948 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
960 assert(Width >= BitWidth &&
"Invalid APInt SignExtend request");
965 if (Width == BitWidth)
981 Result.clearUnusedBits();
987 assert(width >= BitWidth &&
"Invalid APInt ZeroExtend request");
990 return APInt(width, U.VAL);
992 if (width == BitWidth)
1008 if (BitWidth < width)
1010 if (BitWidth > width)
1011 return trunc(width);
1016 if (BitWidth < width)
1018 if (BitWidth > width)
1019 return trunc(width);
1031void APInt::ashrSlowCase(
unsigned ShiftAmt) {
1044 if (WordsToMove != 0) {
1050 if (BitShift == 0) {
1051 std::memmove(U.pVal, U.pVal + WordShift, WordsToMove *
APINT_WORD_SIZE);
1054 for (
unsigned i = 0; i != WordsToMove - 1; ++i)
1055 U.pVal[i] = (U.pVal[i + WordShift] >> BitShift) |
1060 U.pVal[WordsToMove - 1] =
1061 (int64_t)U.pVal[WordShift + WordsToMove - 1] >> BitShift;
1066 std::memset(U.pVal + WordsToMove, Negative ? -1 : 0,
1079void APInt::lshrSlowCase(
unsigned ShiftAmt) {
1091void APInt::shlSlowCase(
unsigned ShiftAmt) {
1101 APInt rot = rotateAmt;
1118 rotateAmt %= BitWidth;
1121 return shl(rotateAmt) |
lshr(BitWidth - rotateAmt);
1131 rotateAmt %= BitWidth;
1134 return lshr(rotateAmt) |
shl(BitWidth - rotateAmt);
1163 return lg +
unsigned((*
this)[lg - 1]);
1180 if (magnitude <= 5) {
1181 static const uint8_t results[32] = {
1186 4, 4, 4, 4, 4, 4, 4, 4,
1187 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1197 if (magnitude < 52) {
1198 return APInt(BitWidth,
1208 unsigned nbits = BitWidth, i = 4;
1209 APInt testy(BitWidth, 16);
1210 APInt x_old(BitWidth, 1);
1211 APInt x_new(BitWidth, 0);
1212 APInt two(BitWidth, 2);
1215 for (;; i += 2, testy = testy.
shl(2))
1216 if (i >= nbits || this->
ule(testy)) {
1217 x_old = x_old.
shl(i / 2);
1223 x_new = (this->
udiv(x_old) + x_old).
udiv(two);
1224 if (x_old.
ule(x_new))
1235 APInt square(x_old * x_old);
1236 APInt nextSquare((x_old + 1) * (x_old +1));
1237 if (this->
ult(square))
1239 assert(this->
ule(nextSquare) &&
"Error in APInt::sqrt computation");
1240 APInt midpoint((nextSquare - square).
udiv(two));
1241 APInt offset(*
this - square);
1242 if (offset.
ult(midpoint))
1250 "multiplicative inverse is only defined for odd numbers!");
1253 APInt Factor = *
this;
1255 while (!(
T = *
this * Factor).
isOne())
1256 Factor *= 2 - std::move(
T);
1265 unsigned m,
unsigned n) {
1266 assert(u &&
"Must provide dividend");
1267 assert(v &&
"Must provide divisor");
1268 assert(q &&
"Must provide quotient");
1269 assert(u != v && u != q && v != q &&
"Must use different memory");
1270 assert(n>1 &&
"n must be > 1");
1278#define DEBUG_KNUTH(X) LLVM_DEBUG(X)
1280#define DEBUG_KNUTH(X) do {} while(false)
1301 for (
unsigned i = 0; i < m+n; ++i) {
1302 uint32_t u_tmp = u[i] >> (32 - shift);
1303 u[i] = (u[i] << shift) | u_carry;
1306 for (
unsigned i = 0; i < n; ++i) {
1307 uint32_t v_tmp = v[i] >> (32 - shift);
1308 v[i] = (v[i] << shift) | v_carry;
1336 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1339 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
1342 DEBUG_KNUTH(
dbgs() <<
"KnuthDiv: qp == " << qp <<
", rp == " << rp <<
'\n');
1353 for (
unsigned i = 0; i < n; ++i) {
1355 int64_t subres = int64_t(u[j+i]) - borrow -
Lo_32(p);
1356 u[j+i] =
Lo_32(subres);
1359 <<
", borrow = " << borrow <<
'\n');
1361 bool isNeg = u[j+n] < borrow;
1362 u[j+n] -=
Lo_32(borrow);
1380 for (
unsigned i = 0; i < n; i++) {
1381 uint32_t limit = std::min(u[j+i],v[i]);
1382 u[j+i] += v[i] + carry;
1383 carry = u[j+i] < limit || (carry && u[j+i] == limit);
1408 for (
int i = n-1; i >= 0; i--) {
1409 r[i] = (u[i] >> shift) | carry;
1410 carry = u[i] << (32 - shift);
1414 for (
int i = n-1; i >= 0; i--) {
1424void APInt::divide(
const WordType *LHS,
unsigned lhsWords,
const WordType *RHS,
1425 unsigned rhsWords, WordType *Quotient, WordType *Remainder) {
1426 assert(lhsWords >= rhsWords &&
"Fractional result");
1435 unsigned n = rhsWords * 2;
1436 unsigned m = (lhsWords * 2) - n;
1445 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1448 Q = &SPACE[(m+n+1) + n];
1450 R = &SPACE[(m+n+1) + n + (m+n)];
1460 memset(U, 0, (m+n+1)*
sizeof(
uint32_t));
1461 for (
unsigned i = 0; i < lhsWords; ++i) {
1464 U[i * 2 + 1] =
Hi_32(tmp);
1469 memset(V, 0, (n)*
sizeof(
uint32_t));
1470 for (
unsigned i = 0; i < rhsWords; ++i) {
1473 V[i * 2 + 1] =
Hi_32(tmp);
1477 memset(Q, 0, (m+n) *
sizeof(
uint32_t));
1479 memset(R, 0, n *
sizeof(
uint32_t));
1485 for (
unsigned i = n; i > 0 &&
V[i-1] == 0; i--) {
1489 for (
unsigned i = m+n; i > 0 &&
U[i-1] == 0; i--)
1498 assert(n != 0 &&
"Divide by zero?");
1502 for (
int i = m; i >= 0; i--) {
1504 if (partial_dividend == 0) {
1507 }
else if (partial_dividend < divisor) {
1509 remainder =
Lo_32(partial_dividend);
1510 }
else if (partial_dividend == divisor) {
1514 Q[i] =
Lo_32(partial_dividend / divisor);
1515 remainder =
Lo_32(partial_dividend - (Q[i] * divisor));
1528 for (
unsigned i = 0; i < lhsWords; ++i)
1529 Quotient[i] =
Make_64(Q[i*2+1], Q[i*2]);
1534 for (
unsigned i = 0; i < rhsWords; ++i)
1535 Remainder[i] =
Make_64(R[i*2+1], R[i*2]);
1539 if (U != &SPACE[0]) {
1548 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be the same");
1552 assert(
RHS.U.VAL != 0 &&
"Divide by zero?");
1553 return APInt(BitWidth, U.VAL /
RHS.U.VAL);
1558 unsigned rhsBits =
RHS.getActiveBits();
1560 assert(rhsWords &&
"Divided by zero???");
1565 return APInt(BitWidth, 0);
1569 if (lhsWords < rhsWords || this->
ult(
RHS))
1571 return APInt(BitWidth, 0);
1574 return APInt(BitWidth, 1);
1577 return APInt(BitWidth, this->U.pVal[0] /
RHS.U.pVal[0]);
1580 APInt Quotient(BitWidth, 0);
1581 divide(U.pVal, lhsWords,
RHS.U.pVal, rhsWords, Quotient.U.
pVal,
nullptr);
1590 return APInt(BitWidth, U.VAL /
RHS);
1598 return APInt(BitWidth, 0);
1604 return APInt(BitWidth, 0);
1607 return APInt(BitWidth, 1);
1610 return APInt(BitWidth, this->U.pVal[0] /
RHS);
1613 APInt Quotient(BitWidth, 0);
1614 divide(U.pVal, lhsWords, &
RHS, 1, Quotient.U.
pVal,
nullptr);
1620 if (
RHS.isNegative())
1622 return -((-(*this)).
udiv(
RHS));
1624 if (
RHS.isNegative())
1625 return -(this->
udiv(-RHS));
1626 return this->
udiv(RHS);
1633 return -((-(*this)).
udiv(
RHS));
1636 return -(this->
udiv(-RHS));
1637 return this->
udiv(RHS);
1641 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be the same");
1643 assert(
RHS.U.VAL != 0 &&
"Remainder by zero?");
1644 return APInt(BitWidth, U.VAL %
RHS.U.VAL);
1651 unsigned rhsBits =
RHS.getActiveBits();
1653 assert(rhsWords &&
"Performing remainder operation by zero ???");
1658 return APInt(BitWidth, 0);
1661 return APInt(BitWidth, 0);
1662 if (lhsWords < rhsWords || this->
ult(
RHS))
1667 return APInt(BitWidth, 0);
1670 return APInt(BitWidth, U.pVal[0] %
RHS.U.pVal[0]);
1673 APInt Remainder(BitWidth, 0);
1674 divide(U.pVal, lhsWords,
RHS.U.pVal, rhsWords,
nullptr, Remainder.U.pVal);
1679 assert(
RHS != 0 &&
"Remainder by zero?");
1702 return U.pVal[0] %
RHS;
1706 divide(U.pVal, lhsWords, &
RHS, 1,
nullptr, &Remainder);
1712 if (
RHS.isNegative())
1713 return -((-(*this)).
urem(-
RHS));
1714 return -((-(*this)).
urem(
RHS));
1716 if (
RHS.isNegative())
1717 return this->
urem(-RHS);
1718 return this->
urem(RHS);
1724 return -((-(*this)).
urem(-
RHS));
1725 return -((-(*this)).
urem(
RHS));
1728 return this->
urem(-RHS);
1729 return this->
urem(RHS);
1734 assert(
LHS.BitWidth ==
RHS.BitWidth &&
"Bit widths must be the same");
1735 unsigned BitWidth =
LHS.BitWidth;
1738 if (
LHS.isSingleWord()) {
1739 assert(
RHS.U.VAL != 0 &&
"Divide by zero?");
1749 unsigned rhsBits =
RHS.getActiveBits();
1751 assert(rhsWords &&
"Performing divrem operation by zero ???");
1754 if (lhsWords == 0) {
1765 if (lhsWords < rhsWords ||
LHS.ult(
RHS)) {
1784 if (lhsWords == 1) {
1788 Quotient = lhsValue / rhsValue;
1789 Remainder = lhsValue % rhsValue;
1794 divide(
LHS.U.pVal, lhsWords,
RHS.U.pVal, rhsWords, Quotient.U.
pVal,
1797 std::memset(Quotient.U.
pVal + lhsWords, 0,
1799 std::memset(Remainder.U.
pVal + rhsWords, 0,
1806 unsigned BitWidth =
LHS.BitWidth;
1809 if (
LHS.isSingleWord()) {
1811 Remainder =
LHS.U.VAL %
RHS;
1820 if (lhsWords == 0) {
1833 Remainder =
LHS.getZExtValue();
1849 if (lhsWords == 1) {
1852 Quotient = lhsValue /
RHS;
1853 Remainder = lhsValue %
RHS;
1858 divide(
LHS.U.pVal, lhsWords, &
RHS, 1, Quotient.U.
pVal, &Remainder);
1860 std::memset(Quotient.U.
pVal + lhsWords, 0,
1866 if (
LHS.isNegative()) {
1867 if (
RHS.isNegative())
1874 }
else if (
RHS.isNegative()) {
1883 APInt &Quotient, int64_t &Remainder) {
1885 if (
LHS.isNegative()) {
1893 }
else if (
RHS < 0) {
1924 Overflow = Res.
ugt(*
this);
1938 Overflow = Res.
sdiv(
RHS) != *
this ||
1969 return APInt(BitWidth, 0);
1976 return *
this << ShAmt;
1986 return APInt(BitWidth, 0);
1990 return *
this << ShAmt;
1996 return quotient - 1;
2035 return APInt(BitWidth, 0);
2090 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2092 "Radix should be 2, 8, 10, 16, or 36!");
2095 size_t slen = str.
size();
2096 bool isNeg = *p ==
'-';
2097 if (*p ==
'-' || *p ==
'+') {
2100 assert(slen &&
"String is only a sign, needs a value.");
2102 assert((slen <= numbits || radix != 2) &&
"Insufficient bit width");
2103 assert(((slen-1)*3 <= numbits || radix != 8) &&
"Insufficient bit width");
2104 assert(((slen-1)*4 <= numbits || radix != 16) &&
"Insufficient bit width");
2105 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2106 "Insufficient bit width");
2115 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
2119 unsigned digit =
getDigit(*p, radix);
2120 assert(digit < radix &&
"Invalid character in digit string");
2139 bool formatAsCLiteral,
bool UpperCase,
2140 bool InsertSeparators)
const {
2141 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2143 "Radix should be 2, 8, 10, 16, or 36!");
2145 const char *Prefix =
"";
2146 if (formatAsCLiteral) {
2167 unsigned Grouping = (Radix == 8 || Radix == 10) ? 3 : 4;
2172 Str.push_back(*Prefix);
2179 static const char BothDigits[] =
"0123456789abcdefghijklmnopqrstuvwxyz"
2180 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
2181 const char *Digits = BothDigits + (UpperCase ? 36 : 0);
2185 char *BufPtr = std::end(Buffer);
2201 Str.push_back(*Prefix);
2207 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2209 *--BufPtr = Digits[
N % Radix];
2213 Str.append(BufPtr, std::end(Buffer));
2228 Str.push_back(*Prefix);
2233 unsigned StartDig = Str.size();
2238 if (Radix == 2 || Radix == 8 || Radix == 16) {
2240 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2241 unsigned MaskAmt = Radix - 1;
2246 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2247 Str.push_back(
'\'');
2249 Str.push_back(Digits[Digit]);
2257 udivrem(Tmp, Radix, Tmp, Digit);
2258 assert(Digit < Radix &&
"divide failed");
2259 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2260 Str.push_back(
'\'');
2262 Str.push_back(Digits[Digit]);
2268 std::reverse(Str.begin()+StartDig, Str.end());
2271#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
2276 dbgs() <<
"APInt(" << BitWidth <<
"b, "
2277 << U <<
"u " << S <<
"s)\n";
2293 "Part width must be divisible by 2!");
2317 for (
unsigned i = 1; i < parts; i++)
2323 for (
unsigned i = 0; i < parts; i++)
2329 for (
unsigned i = 0; i < parts; i++)
2338 return (parts[whichWord(bit)] & maskBit(bit)) != 0;
2343 parts[whichWord(bit)] |= maskBit(bit);
2348 parts[whichWord(bit)] &= ~maskBit(bit);
2354 for (
unsigned i = 0; i < n; i++) {
2355 if (parts[i] != 0) {
2370 if (parts[n] != 0) {
2371 static_assert(
sizeof(parts[n]) <=
sizeof(
uint64_t));
2387 unsigned srcBits,
unsigned srcLSB) {
2389 assert(dstParts <= dstCount);
2392 tcAssign(dst, src + firstSrcPart, dstParts);
2403 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] & mask)
2405 }
else if (n > srcBits) {
2411 while (dstParts < dstCount)
2412 dst[dstParts++] = 0;
2420 for (
unsigned i = 0; i < parts; i++) {
2423 dst[i] += rhs[i] + 1;
2440 for (
unsigned i = 0; i < parts; ++i) {
2455 for (
unsigned i = 0; i < parts; i++) {
2458 dst[i] -= rhs[i] + 1;
2478 for (
unsigned i = 0; i < parts; ++i) {
2506 unsigned srcParts,
unsigned dstParts,
2509 assert(dst <= src || dst >= src + srcParts);
2510 assert(dstParts <= srcParts + 1);
2513 unsigned n = std::min(dstParts, srcParts);
2515 for (
unsigned i = 0; i < n; i++) {
2522 if (multiplier == 0 || srcPart == 0) {
2532 if (low + mid < low)
2539 if (low + mid < low)
2544 if (low + carry < low)
2551 if (low + dst[i] < low)
2560 if (srcParts < dstParts) {
2562 assert(srcParts + 1 == dstParts);
2563 dst[srcParts] = carry;
2575 for (
unsigned i = dstParts; i < srcParts; i++)
2588 const WordType *rhs,
unsigned parts) {
2589 assert(dst != lhs && dst != rhs);
2593 for (
unsigned i = 0; i < parts; i++) {
2597 tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts, parts - i, i != 0);
2606 const WordType *rhs,
unsigned lhsParts,
2607 unsigned rhsParts) {
2609 if (lhsParts > rhsParts)
2612 assert(dst != lhs && dst != rhs);
2614 for (
unsigned i = 0; i < lhsParts; i++) {
2617 tcMultiplyPart(&dst[i], rhs, lhs[i], 0, rhsParts, rhsParts + 1, i != 0);
2633 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2635 unsigned shiftCount =
tcMSB(rhs, parts) + 1;
2636 if (shiftCount == 0)
2646 tcSet(lhs, 0, parts);
2651 int compare =
tcCompare(remainder, srhs, parts);
2657 if (shiftCount == 0)
2661 if ((mask >>= 1) == 0) {
2682 if (BitShift == 0) {
2683 std::memmove(Dst + WordShift, Dst, (Words - WordShift) *
APINT_WORD_SIZE);
2685 while (Words-- > WordShift) {
2686 Dst[Words] = Dst[Words - WordShift] << BitShift;
2687 if (Words > WordShift)
2708 unsigned WordsToMove = Words - WordShift;
2710 if (BitShift == 0) {
2713 for (
unsigned i = 0; i != WordsToMove; ++i) {
2714 Dst[i] = Dst[i + WordShift] >> BitShift;
2715 if (i + 1 != WordsToMove)
2729 if (lhs[parts] != rhs[parts])
2730 return (lhs[parts] > rhs[parts]) ? 1 : -1;
2786 unsigned RangeWidth) {
2787 unsigned CoeffWidth =
A.getBitWidth();
2788 assert(CoeffWidth ==
B.getBitWidth() && CoeffWidth ==
C.getBitWidth());
2789 assert(RangeWidth <= CoeffWidth &&
2790 "Value range width should be less than coefficient width");
2791 assert(RangeWidth > 1 &&
"Value range bit width should be > 1");
2794 <<
"x + " <<
C <<
", rw:" << RangeWidth <<
'\n');
2797 if (
C.sextOrTrunc(RangeWidth).isZero()) {
2799 return APInt(CoeffWidth, 0);
2817 A =
A.sext(CoeffWidth);
2818 B =
B.sext(CoeffWidth);
2819 C =
C.sext(CoeffWidth);
2823 if (
A.isNegative()) {
2857 assert(
A.isStrictlyPositive());
2861 return V.isNegative() ? V+
T : V+(
A-
T);
2866 if (
B.isNonNegative()) {
2872 if (
C.isStrictlyPositive())
2883 LowkR = RoundUp(LowkR, R);
2893 C -= -RoundUp(-
C, R);
2910 LLVM_DEBUG(
dbgs() << __func__ <<
": updated coefficients " <<
A <<
"x^2 + "
2911 <<
B <<
"x + " <<
C <<
", rw:" << RangeWidth <<
'\n');
2914 assert(
D.isNonNegative() &&
"Negative discriminant");
2918 bool InexactSQ = Q !=
D;
2941 assert(
X.isNonNegative() &&
"Solution should be non-negative");
2943 if (!InexactSQ && Rem.
isZero()) {
2948 assert((SQ*SQ).sle(
D) &&
"SQ = |_sqrt(D)_|, so SQ*SQ <= D");
2966 return std::nullopt;
2974std::optional<unsigned>
2976 assert(
A.getBitWidth() ==
B.getBitWidth() &&
"Must have the same bitwidth");
2978 return std::nullopt;
2983 bool MatchAllBits) {
2984 unsigned OldBitWidth =
A.getBitWidth();
2985 assert((((OldBitWidth % NewBitWidth) == 0) ||
2986 ((NewBitWidth % OldBitWidth) == 0)) &&
2987 "One size should be a multiple of the other one. "
2988 "Can't do fractional scaling.");
2991 if (OldBitWidth == NewBitWidth)
3000 if (NewBitWidth > OldBitWidth) {
3002 unsigned Scale = NewBitWidth / OldBitWidth;
3003 for (
unsigned i = 0; i != OldBitWidth; ++i)
3005 NewA.
setBits(i * Scale, (i + 1) * Scale);
3007 unsigned Scale = OldBitWidth / NewBitWidth;
3008 for (
unsigned i = 0; i != NewBitWidth; ++i) {
3010 if (
A.extractBits(Scale, i * Scale).isAllOnes())
3013 if (!
A.extractBits(Scale, i * Scale).isZero())
3025 unsigned StoreBytes) {
3026 assert((IntVal.getBitWidth()+7)/8 >= StoreBytes &&
"Integer too small!");
3032 memcpy(Dst, Src, StoreBytes);
3037 while (StoreBytes >
sizeof(
uint64_t)) {
3040 memcpy(Dst + StoreBytes, Src,
sizeof(
uint64_t));
3044 memcpy(Dst, Src +
sizeof(
uint64_t) - StoreBytes, StoreBytes);
3051 unsigned LoadBytes) {
3052 assert((IntVal.getBitWidth()+7)/8 >= LoadBytes &&
"Integer too small!");
3054 const_cast<uint64_t *
>(IntVal.getRawData()));
3059 memcpy(Dst, Src, LoadBytes);
3065 while (LoadBytes >
sizeof(
uint64_t)) {
3068 memcpy(Dst, Src + LoadBytes,
sizeof(
uint64_t));
3072 memcpy(Dst +
sizeof(
uint64_t) - LoadBytes, Src, LoadBytes);
3078 return (C1 & C2) + (C1 ^ C2).ashr(1);
3083 return (C1 & C2) + (C1 ^ C2).lshr(1);
3088 return (C1 | C2) - (C1 ^ C2).ashr(1);
3093 return (C1 | C2) - (C1 ^ C2).lshr(1);
static APInt::WordType lowHalf(APInt::WordType part)
Returns the value of the lower half of PART.
static unsigned rotateModulo(unsigned BitWidth, const APInt &rotateAmt)
static APInt::WordType highHalf(APInt::WordType part)
Returns the value of the upper half of PART.
static void tcComplement(APInt::WordType *dst, unsigned parts)
static unsigned getDigit(char cdigit, uint8_t radix)
A utility function that converts a character to a digit.
static APInt::WordType lowBitMask(unsigned bits)
static uint64_t * getMemory(unsigned numWords)
A utility function for allocating memory and checking for allocation failure.
static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t *r, unsigned m, unsigned n)
Implementation of Knuth's Algorithm D (Division of nonnegative integers) from "Art of Computer Progra...
static uint64_t * getClearedMemory(unsigned numWords)
A utility function for allocating memory, checking for allocation failures, and ensuring the contents...
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_UNLIKELY(EXPR)
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
static bool isNeg(Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static bool isSigned(unsigned int Opcode)
This file defines a hash set that can be used to remove duplication of nodes in a graph.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallString class.
This file implements the C++20 <bit> header.
Class for arbitrary precision integers.
APInt umul_ov(const APInt &RHS, bool &Overflow) const
APInt usub_sat(const APInt &RHS) const
APInt udiv(const APInt &RHS) const
Unsigned division operation.
static void tcSetBit(WordType *, unsigned bit)
Set the given bit of a bignum. Zero-based.
static void tcSet(WordType *, WordType, unsigned)
Sets the least significant part of a bignum to the input value, and zeroes out higher parts.
unsigned nearestLogBase2() const
static void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
static int tcExtractBit(const WordType *, unsigned bit)
Extract the given bit of a bignum; returns 0 or 1. Zero-based.
bool isAligned(Align A) const
Checks if this APInt -interpreted as an address- is aligned to the provided value.
APInt zext(unsigned width) const
Zero extend to a new width.
bool isMinSignedValue() const
Determine if this is the smallest signed value.
uint64_t getZExtValue() const
Get zero extended value.
APInt truncUSat(unsigned width) const
Truncate to new width with unsigned saturation.
uint64_t * pVal
Used to store the >64 bits integer value.
static void sdivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
static WordType tcAdd(WordType *, const WordType *, WordType carry, unsigned)
DST += RHS + CARRY where CARRY is zero or one. Returns the carry flag.
static void tcExtract(WordType *, unsigned dstCount, const WordType *, unsigned srcBits, unsigned srcLSB)
Copy the bit vector of width srcBITS from SRC, starting at bit srcLSB, to DST, of dstCOUNT parts,...
uint64_t extractBitsAsZExtValue(unsigned numBits, unsigned bitPosition) const
APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
unsigned getActiveBits() const
Compute the number of active bits in the value.
static unsigned getSufficientBitsNeeded(StringRef Str, uint8_t Radix)
Get the bits that are sufficient to represent the string value.
APInt trunc(unsigned width) const
Truncate to new width.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
void toStringUnsigned(SmallVectorImpl< char > &Str, unsigned Radix=10) const
Considers the APInt to be unsigned and converts it into a string in the radix given.
APInt sshl_ov(const APInt &Amt, bool &Overflow) const
APInt smul_sat(const APInt &RHS) const
APInt sadd_sat(const APInt &RHS) const
bool sgt(const APInt &RHS) const
Signed greater than comparison.
static int tcCompare(const WordType *, const WordType *, unsigned)
Comparison (unsigned) of two bignums.
APInt & operator++()
Prefix increment operator.
APInt usub_ov(const APInt &RHS, bool &Overflow) const
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
void print(raw_ostream &OS, bool isSigned) const
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
APInt urem(const APInt &RHS) const
Unsigned remainder operation.
static void tcAssign(WordType *, const WordType *, unsigned)
Assign one bignum to another.
static constexpr unsigned APINT_WORD_SIZE
Byte size of a word.
unsigned getBitWidth() const
Return the number of bits in the APInt.
static void tcShiftRight(WordType *, unsigned Words, unsigned Count)
Shift a bignum right Count bits.
static void tcFullMultiply(WordType *, const WordType *, const WordType *, unsigned, unsigned)
DST = LHS * RHS, where DST has width the sum of the widths of the operands.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
APInt sfloordiv_ov(const APInt &RHS, bool &Overflow) const
Signed integer floor division operation.
bool isSingleWord() const
Determine if this APInt just has one word to store value.
unsigned getNumWords() const
Get the number of words.
APInt()
Default constructor that creates an APInt with a 1-bit zero value.
bool isNegative() const
Determine sign of this APInt.
APInt sadd_ov(const APInt &RHS, bool &Overflow) const
APInt & operator<<=(unsigned ShiftAmt)
Left-shift assignment function.
APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
double roundToDouble() const
Converts this unsigned APInt to a double value.
APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
APInt reverseBits() const
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
APInt uadd_ov(const APInt &RHS, bool &Overflow) const
static void tcClearBit(WordType *, unsigned bit)
Clear the given bit of a bignum. Zero-based.
void negate()
Negate this APInt in place.
static WordType tcDecrement(WordType *dst, unsigned parts)
Decrement a bignum in-place. Return the borrow flag.
unsigned countr_zero() const
Count the number of trailing zero bits.
bool isSplat(unsigned SplatSizeInBits) const
Check if the APInt consists of a repeated bit pattern.
APInt & operator-=(const APInt &RHS)
Subtraction assignment operator.
bool isSignedIntN(unsigned N) const
Check if this APInt has an N-bits signed integer value.
APInt sdiv_ov(const APInt &RHS, bool &Overflow) const
APInt operator*(const APInt &RHS) const
Multiplication operator.
static unsigned tcLSB(const WordType *, unsigned n)
Returns the bit number of the least or most significant set bit of a number.
unsigned countl_zero() const
The APInt version of std::countl_zero.
static void tcShiftLeft(WordType *, unsigned Words, unsigned Count)
Shift a bignum left Count bits.
static APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
APInt sshl_sat(const APInt &RHS) const
static constexpr WordType WORDTYPE_MAX
APInt ushl_sat(const APInt &RHS) const
APInt ushl_ov(const APInt &Amt, bool &Overflow) const
static WordType tcSubtractPart(WordType *, WordType, unsigned)
DST -= RHS. Returns the carry flag.
static bool tcIsZero(const WordType *, unsigned)
Returns true if a bignum is zero, false otherwise.
APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
static unsigned tcMSB(const WordType *parts, unsigned n)
Returns the bit number of the most significant set bit of a number.
static int tcDivide(WordType *lhs, const WordType *rhs, WordType *remainder, WordType *scratch, unsigned parts)
If RHS is zero LHS and REMAINDER are left unchanged, return one.
void dump() const
debug method
APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
unsigned countl_one() const
Count the number of leading one bits.
void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
unsigned logBase2() const
static int tcMultiplyPart(WordType *dst, const WordType *src, WordType multiplier, WordType carry, unsigned srcParts, unsigned dstParts, bool add)
DST += SRC * MULTIPLIER + PART if add is true DST = SRC * MULTIPLIER + PART if add is false.
static constexpr unsigned APINT_BITS_PER_WORD
Bits in a word.
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
static int tcMultiply(WordType *, const WordType *, const WordType *, unsigned)
DST = LHS * RHS, where DST has the same width as the operands and is filled with the least significan...
APInt uadd_sat(const APInt &RHS) const
APInt & operator*=(const APInt &RHS)
Multiplication assignment operator.
uint64_t VAL
Used to store the <= 64 bits integer value.
static unsigned getBitsNeeded(StringRef str, uint8_t radix)
Get bits required for string value.
static WordType tcSubtract(WordType *, const WordType *, WordType carry, unsigned)
DST -= RHS + CARRY where CARRY is zero or one. Returns the carry flag.
APInt multiplicativeInverse() const
static void tcNegate(WordType *, unsigned)
Negate a bignum in-place.
bool getBoolValue() const
Convert APInt to a boolean value.
APInt srem(const APInt &RHS) const
Function for signed remainder operation.
APInt smul_ov(const APInt &RHS, bool &Overflow) const
static WordType tcIncrement(WordType *dst, unsigned parts)
Increment a bignum in-place. Return the carry flag.
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
APInt sext(unsigned width) const
Sign extend to a new width.
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
APInt shl(unsigned shiftAmt) const
Left-shift function.
APInt umul_sat(const APInt &RHS) const
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
APInt & operator+=(const APInt &RHS)
Addition assignment operator.
void flipBit(unsigned bitPosition)
Toggles a given bit to its opposite value.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
static WordType tcAddPart(WordType *, WordType, unsigned)
DST += RHS. Returns the carry flag.
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
void Profile(FoldingSetNodeID &id) const
Used to insert APInt objects, or objects that contain APInt objects, into FoldingSets.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
bool isIntN(unsigned N) const
Check if this APInt has an N-bits unsigned integer value.
APInt ssub_ov(const APInt &RHS, bool &Overflow) const
APInt & operator--()
Prefix decrement operator.
bool isOne() const
Determine if this is a value of 1.
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
int64_t getSExtValue() const
Get sign extended value.
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
APInt sqrt() const
Compute the square root.
void setBitVal(unsigned BitPosition, bool BitValue)
Set a given bit to a given value.
APInt ssub_sat(const APInt &RHS) const
void toStringSigned(SmallVectorImpl< char > &Str, unsigned Radix=10) const
Considers the APInt to be signed and converts it into a string in the radix given.
APInt truncSSat(unsigned width) const
Truncate to new width with signed saturation.
void toString(SmallVectorImpl< char > &Str, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false) const
Converts an APInt to a string and append it to Str.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
An opaque object representing a hash code.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::optional< unsigned > GetMostSignificantDifferentBit(const APInt &A, const APInt &B)
Compare two values, and if they are different, return the position of the most significant bit that i...
APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
APInt RoundingUDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A unsign-divided by B, rounded by the given rounding mode.
APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
APInt RoundingSDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A sign-divided by B, rounded by the given rounding mode.
APInt RoundDoubleToAPInt(double Double, unsigned width)
Converts the given double value into a APInt.
APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
std::optional< APInt > SolveQuadraticEquationWrap(APInt A, APInt B, APInt C, unsigned RangeWidth)
Let q(n) = An^2 + Bn + C, and BW = bit width of the value range (e.g.
APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
APInt GreatestCommonDivisor(APInt A, APInt B)
Compute GCD of two unsigned APInt values.
@ C
The default llvm calling convention, compatible with C.
static const bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
hash_code hash_value(const FixedPointSemantics &Val)
int popcount(T Value) noexcept
Count the number of set bits in a value.
void StoreIntToMemory(const APInt &IntVal, uint8_t *Dst, unsigned StoreBytes)
StoreIntToMemory - Fills the StoreBytes bytes of memory starting from Dst with the integer held in In...
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
constexpr uint32_t Hi_32(uint64_t Value)
Return the high 32 bits of a 64 bit value.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
int countl_one(T Value)
Count the number of ones from the most significant bit to the first zero bit.
constexpr uint32_t Lo_32(uint64_t Value)
Return the low 32 bits of a 64 bit value.
@ Mod
The access may modify the value stored in memory.
constexpr unsigned BitWidth
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
unsigned Log2(Align A)
Returns the log2 of the alignment.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
constexpr uint64_t Make_64(uint32_t High, uint32_t Low)
Make a 64-bit integer from a high / low pair of 32-bit integers.
void LoadIntFromMemory(APInt &IntVal, const uint8_t *Src, unsigned LoadBytes)
LoadIntFromMemory - Loads the integer stored in the LoadBytes bytes starting from Src into IntVal,...
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
This struct is a compact representation of a valid (non-zero power of two) alignment.
An information struct used to provide DenseMap with the various necessary components for a given valu...
static uint64_t round(uint64_t Acc, uint64_t Input)