33#define DEBUG_TYPE "apint"
51 if (radix == 16 || radix == 36) {
87void APInt::initSlowCase(
const APInt& that) {
93 assert(bigVal.
data() &&
"Null pointer detected!");
109 initFromArray(bigVal);
113 : BitWidth(numbits) {
114 fromString(numbits, Str, radix);
117void APInt::reallocate(
unsigned NewBitWidth) {
136void APInt::assignSlowCase(
const APInt &
RHS) {
142 reallocate(
RHS.getBitWidth());
153 ID.AddInteger(BitWidth);
156 ID.AddInteger(U.VAL);
161 for (
unsigned i = 0; i < NumWords; ++i)
162 ID.AddInteger(U.pVal[i]);
169 const unsigned MinimumTrailingZeroes =
Log2(
A);
170 return TrailingZeroes >= MinimumTrailingZeroes;
179 return clearUnusedBits();
188 return clearUnusedBits();
195 assert(BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
200 return clearUnusedBits();
208 return clearUnusedBits();
215 assert(BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
220 return clearUnusedBits();
228 return clearUnusedBits();
232 assert(BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
234 return APInt(BitWidth, U.VAL * RHS.U.VAL,
false,
239 Result.clearUnusedBits();
243void APInt::andAssignSlowCase(
const APInt &RHS) {
244 WordType *dst = U.pVal, *rhs = RHS.U.pVal;
249void APInt::orAssignSlowCase(
const APInt &
RHS) {
255void APInt::xorAssignSlowCase(
const APInt &
RHS) {
271 tcMultiplyPart(U.pVal, U.pVal, RHS, 0, NumWords, NumWords,
false);
273 return clearUnusedBits();
276bool APInt::equalSlowCase(
const APInt &RHS)
const {
277 return std::equal(U.pVal, U.pVal +
getNumWords(), RHS.U.pVal);
280int APInt::compare(
const APInt&
RHS)
const {
283 return U.VAL <
RHS.U.VAL ? -1 : U.VAL >
RHS.U.VAL;
288int APInt::compareSigned(
const APInt&
RHS)
const {
289 assert(BitWidth ==
RHS.BitWidth &&
"Bit widths must be same for comparison");
293 return lhsSext < rhsSext ? -1 : lhsSext > rhsSext;
297 bool rhsNeg =
RHS.isNegative();
300 if (lhsNeg != rhsNeg)
301 return lhsNeg ? -1 : 1;
308void APInt::setBitsSlowCase(
unsigned loBit,
unsigned hiBit) {
309 unsigned loWord = whichWord(loBit);
310 unsigned hiWord = whichWord(hiBit);
316 unsigned hiShiftAmt = whichBit(hiBit);
317 if (hiShiftAmt != 0) {
322 if (hiWord == loWord)
325 U.pVal[hiWord] |= hiMask;
328 U.pVal[loWord] |= loMask;
331 for (
unsigned word = loWord + 1; word < hiWord; ++word)
335void APInt::clearBitsSlowCase(
unsigned LoBit,
unsigned HiBit) {
336 unsigned LoWord = whichWord(LoBit);
337 unsigned HiWord = whichWord(HiBit);
343 unsigned HiShiftAmt = whichBit(HiBit);
344 if (HiShiftAmt != 0) {
349 if (HiWord == LoWord)
352 U.pVal[HiWord] &= HiMask;
355 U.pVal[LoWord] &= LoMask;
358 for (
unsigned Word = LoWord + 1;
Word < HiWord; ++
Word)
364 for (
unsigned i = 0; i < parts; i++)
369void APInt::flipAllBitsSlowCase() {
378APInt APInt::concatSlowCase(
const APInt &NewLSB)
const {
389 assert(bitPosition < BitWidth &&
"Out of the bit-width range!");
390 setBitVal(bitPosition, !(*
this)[bitPosition]);
395 assert((subBitWidth + bitPosition) <= BitWidth &&
"Illegal bit insertion");
398 if (subBitWidth == 0)
402 if (subBitWidth == BitWidth) {
410 U.VAL &= ~(
mask << bitPosition);
411 U.VAL |= (subBits.U.
VAL << bitPosition);
415 unsigned loBit = whichBit(bitPosition);
416 unsigned loWord = whichWord(bitPosition);
417 unsigned hi1Word = whichWord(bitPosition + subBitWidth - 1);
420 if (loWord == hi1Word) {
422 U.pVal[loWord] &= ~(
mask << loBit);
423 U.pVal[loWord] |= (subBits.U.
VAL << loBit);
436 if (remainingBits != 0) {
438 U.pVal[hi1Word] &=
~mask;
439 U.pVal[hi1Word] |= subBits.getWord(subBitWidth - 1);
447 for (
unsigned i = 0; i != subBitWidth; ++i)
455 U.VAL &= ~(maskBits << bitPosition);
456 U.VAL |= subBits << bitPosition;
460 unsigned loBit = whichBit(bitPosition);
461 unsigned loWord = whichWord(bitPosition);
462 unsigned hiWord = whichWord(bitPosition + numBits - 1);
463 if (loWord == hiWord) {
464 U.pVal[loWord] &= ~(maskBits << loBit);
465 U.pVal[loWord] |= subBits << loBit;
469 static_assert(8 *
sizeof(
WordType) <= 64,
"This code assumes only two words affected");
470 unsigned wordBits = 8 *
sizeof(
WordType);
471 U.pVal[loWord] &= ~(maskBits << loBit);
472 U.pVal[loWord] |= subBits << loBit;
474 U.pVal[hiWord] &= ~(maskBits >> (wordBits - loBit));
475 U.pVal[hiWord] |= subBits >> (wordBits - loBit);
479 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
480 "Illegal bit extraction");
483 return APInt(numBits, U.VAL >> bitPosition,
false,
486 unsigned loBit = whichBit(bitPosition);
487 unsigned loWord = whichWord(bitPosition);
488 unsigned hiWord = whichWord(bitPosition + numBits - 1);
491 if (loWord == hiWord)
492 return APInt(numBits, U.pVal[loWord] >> loBit,
false,
498 return APInt(numBits,
ArrayRef(U.pVal + loWord, 1 + hiWord - loWord));
501 APInt Result(numBits, 0);
503 unsigned NumDstWords = Result.getNumWords();
506 LLVM_LIKELY(Result.isSingleWord()) ? &Result.U.VAL : Result.U.pVal;
507 for (
unsigned word = 0; word < NumDstWords; ++word) {
508 uint64_t w0 = U.pVal[loWord + word];
510 (loWord + word + 1) < NumSrcWords ? U.pVal[loWord + word + 1] : 0;
514 return Result.clearUnusedBits();
518 unsigned bitPosition)
const {
519 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
520 "Illegal bit extraction");
521 assert(numBits <= 64 &&
"Illegal bit extraction");
525 return (U.VAL >> bitPosition) & maskBits;
528 "This code assumes only two words affected");
529 unsigned loBit = whichBit(bitPosition);
530 unsigned loWord = whichWord(bitPosition);
531 unsigned hiWord = whichWord(bitPosition + numBits - 1);
532 if (loWord == hiWord)
533 return (U.pVal[loWord] >> loBit) & maskBits;
535 uint64_t retBits = U.pVal[loWord] >> loBit;
542 assert(!Str.empty() &&
"Invalid string length");
543 size_t StrLen = Str.size();
546 unsigned IsNegative =
false;
547 if (Str[0] ==
'-' || Str[0] ==
'+') {
548 IsNegative = Str[0] ==
'-';
550 assert(StrLen &&
"String is only a sign, needs a value.");
556 return StrLen + IsNegative;
558 return StrLen * 3 + IsNegative;
560 return StrLen * 4 + IsNegative;
567 return (StrLen == 1 ? 4 : StrLen * 64 / 18) + IsNegative;
570 return (StrLen == 1 ? 7 : StrLen * 16 / 3) + IsNegative;
580 if (radix == 2 || radix == 8 || radix == 16)
586 size_t slen = str.
size();
591 if (*p ==
'-' || *p ==
'+') {
594 assert(slen &&
"String is only a sign, needs a value.");
605 if (log == (
unsigned)-1) {
629 "SplatSizeInBits must divide width!");
632 return *
this ==
rotl(SplatSizeInBits);
637 return this->
lshr(BitWidth - numBits);
649 assert(NewLen >= V.getBitWidth() &&
"Can't splat to smaller bit width!");
651 APInt Val = V.zext(NewLen);
652 for (
unsigned I = V.getBitWidth();
I < NewLen;
I <<= 1)
658unsigned APInt::countLeadingZerosSlowCase()
const {
661 uint64_t V = U.pVal[i];
675unsigned APInt::countLeadingOnesSlowCase()
const {
686 if (
Count == highWordBits) {
687 for (i--; i >= 0; --i) {
699unsigned APInt::countTrailingZerosSlowCase()
const {
706 return std::min(
Count, BitWidth);
709unsigned APInt::countTrailingOnesSlowCase()
const {
720unsigned APInt::countPopulationSlowCase()
const {
727bool APInt::isPowerOf2SlowCase()
const {
737bool APInt::intersectsSlowCase(
const APInt &
RHS)
const {
739 if ((U.pVal[i] &
RHS.U.pVal[i]) != 0)
745bool APInt::isSubsetOfSlowCase(
const APInt &
RHS)
const {
747 if ((U.pVal[i] & ~
RHS.U.pVal[i]) != 0)
753bool APInt::isInverseOfSlowCase(
const APInt &
RHS)
const {
755 for (
unsigned I = 0;
I !=
Last; ++
I)
761 return (U.pVal[
Last] ^
RHS.U.pVal[
Last]) == TailMask;
765 assert(BitWidth >= 16 && BitWidth % 8 == 0 &&
"Cannot byteswap!");
770 if (BitWidth <= 64) {
772 Tmp1 >>= (64 - BitWidth);
773 return APInt(BitWidth, Tmp1);
779 if (Result.BitWidth != BitWidth) {
780 Result.lshrInPlace(Result.BitWidth - BitWidth);
781 Result.BitWidth = BitWidth;
801 return APInt(BitWidth,
806 APInt Result(BitWidth, 0);
809 if (ExcessBits == 0) {
811 for (
unsigned I = 0;
I < NumWords; ++
I)
817 for (
unsigned I = 0;
I < NumWords - 1; ++
I) {
819 Result.U.pVal[
I] = (PrevRev >> ExcessBits) | (CurrRev << (64 - ExcessBits));
822 Result.U.pVal[NumWords - 1] = PrevRev >> ExcessBits;
834 if (
A ==
B)
return A;
843 unsigned Pow2_A =
A.countr_zero();
844 unsigned Pow2_B =
B.countr_zero();
845 if (Pow2_A > Pow2_B) {
846 A.lshrInPlace(Pow2_A - Pow2_B);
848 }
else if (Pow2_B > Pow2_A) {
849 B.lshrInPlace(Pow2_B - Pow2_A);
865 A.lshrInPlace(
A.countr_zero() - Pow2);
868 B.lshrInPlace(
B.countr_zero() - Pow2);
882 int64_t
exp = ((
I >> 52) & 0x7ff) - 1023;
886 return APInt(width, 0u);
889 uint64_t mantissa = (
I & (~0ULL >> 12)) | 1ULL << 52;
894 APInt(width, mantissa >> (52 -
exp));
898 if (width <=
exp - 52)
899 return APInt(width, 0);
902 APInt Tmp(width, mantissa);
904 return isNeg ? -Tmp : Tmp;
922 return double(getWord(0));
942 return std::numeric_limits<double>::infinity();
944 return -std::numeric_limits<double>::infinity();
951 unsigned hiWord = whichWord(n-1);
953 mantissa = Tmp.U.
pVal[0];
957 assert(hiWord > 0 &&
"huh?");
960 mantissa = hibits | lobits;
965 uint64_t
I = sign | (
exp << 52) | mantissa;
971 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
977 if (width == BitWidth)
985 Result.U.pVal[i] = U.pVal[i];
990 Result.U.pVal[i] = U.pVal[i] << bits >> bits;
997 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
1001 return trunc(width);
1008 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
1012 return trunc(width);
1020 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
1024 return trunc(width);
1031 assert(Width >= BitWidth &&
"Invalid APInt SignExtend request");
1036 if (Width == BitWidth)
1052 Result.clearUnusedBits();
1058 assert(width >= BitWidth &&
"Invalid APInt ZeroExtend request");
1061 return APInt(width, U.VAL);
1063 if (width == BitWidth)
1079 if (BitWidth < width)
1081 if (BitWidth > width)
1082 return trunc(width);
1087 if (BitWidth < width)
1089 if (BitWidth > width)
1090 return trunc(width);
1102void APInt::ashrSlowCase(
unsigned ShiftAmt) {
1115 if (WordsToMove != 0) {
1121 if (BitShift == 0) {
1122 std::memmove(U.pVal, U.pVal + WordShift, WordsToMove *
APINT_WORD_SIZE);
1125 for (
unsigned i = 0; i != WordsToMove - 1; ++i)
1126 U.pVal[i] = (U.pVal[i + WordShift] >> BitShift) |
1131 U.pVal[WordsToMove - 1] =
1132 (int64_t)U.pVal[WordShift + WordsToMove - 1] >> BitShift;
1137 std::memset(U.pVal + WordsToMove, Negative ? -1 : 0,
1150void APInt::lshrSlowCase(
unsigned ShiftAmt) {
1162void APInt::shlSlowCase(
unsigned ShiftAmt) {
1172 APInt rot = rotateAmt;
1179 return rot.getLimitedValue(
BitWidth);
1189 rotateAmt %= BitWidth;
1192 return shl(rotateAmt) |
lshr(BitWidth - rotateAmt);
1202 rotateAmt %= BitWidth;
1205 return lshr(rotateAmt) |
shl(BitWidth - rotateAmt);
1234 return lg +
unsigned((*
this)[lg - 1]);
1251 if (magnitude <= 5) {
1252 static const uint8_t results[32] = {
1256 3, 3, 3, 3, 3, 3, 3,
1257 4, 4, 4, 4, 4, 4, 4, 4, 4,
1258 5, 5, 5, 5, 5, 5, 5,
1260 return APInt(BitWidth,
1268 if (magnitude < 52) {
1269 return APInt(BitWidth,
1279 unsigned nbits = BitWidth, i = 4;
1280 APInt testy(BitWidth, 16);
1281 APInt x_old(BitWidth, 1);
1282 APInt x_new(BitWidth, 0);
1283 APInt two(BitWidth, 2);
1286 for (;; i += 2, testy = testy.
shl(2))
1287 if (i >= nbits || this->
ule(testy)) {
1288 x_old = x_old.
shl(i / 2);
1294 x_new = (this->
udiv(x_old) + x_old).
udiv(two);
1295 if (x_old.
ule(x_new))
1305 "multiplicative inverse is only defined for odd numbers!");
1308 APInt Factor = *
this;
1310 while (!(
T = *
this * Factor).
isOne())
1311 Factor *= 2 - std::move(
T);
1320 unsigned m,
unsigned n) {
1321 assert(u &&
"Must provide dividend");
1322 assert(v &&
"Must provide divisor");
1323 assert(q &&
"Must provide quotient");
1324 assert(u != v && u != q && v != q &&
"Must use different memory");
1325 assert(n>1 &&
"n must be > 1");
1333#define DEBUG_KNUTH(X) LLVM_DEBUG(X)
1335#define DEBUG_KNUTH(X) do {} while(false)
1356 for (
unsigned i = 0; i < m+n; ++i) {
1357 uint32_t u_tmp = u[i] >> (32 - shift);
1358 u[i] = (u[i] << shift) | u_carry;
1361 for (
unsigned i = 0; i < n; ++i) {
1362 uint32_t v_tmp = v[i] >> (32 - shift);
1363 v[i] = (v[i] << shift) | v_carry;
1391 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1394 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
1397 DEBUG_KNUTH(
dbgs() <<
"KnuthDiv: qp == " << qp <<
", rp == " << rp <<
'\n');
1408 for (
unsigned i = 0; i < n; ++i) {
1410 int64_t subres = int64_t(u[j+i]) - borrow -
Lo_32(p);
1411 u[j+i] =
Lo_32(subres);
1414 <<
", borrow = " << borrow <<
'\n');
1416 bool isNeg = u[j+n] < borrow;
1417 u[j+n] -=
Lo_32(borrow);
1435 for (
unsigned i = 0; i < n; i++) {
1436 uint32_t limit = std::min(u[j+i],v[i]);
1437 u[j+i] += v[i] + carry;
1438 carry = u[j+i] < limit || (carry && u[j+i] == limit);
1463 for (
int i = n-1; i >= 0; i--) {
1464 r[i] = (u[i] >> shift) | carry;
1465 carry = u[i] << (32 - shift);
1469 for (
int i = n-1; i >= 0; i--) {
1479void APInt::divide(
const WordType *
LHS,
unsigned lhsWords,
const WordType *
RHS,
1480 unsigned rhsWords, WordType *Quotient, WordType *Remainder) {
1481 assert(lhsWords >= rhsWords &&
"Fractional result");
1490 unsigned n = rhsWords * 2;
1491 unsigned m = (lhsWords * 2) - n;
1495 uint32_t SPACE[128];
1496 uint32_t *U =
nullptr;
1497 uint32_t *
V =
nullptr;
1498 uint32_t *Q =
nullptr;
1499 uint32_t *
R =
nullptr;
1500 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1503 Q = &SPACE[(m+n+1) + n];
1505 R = &SPACE[(m+n+1) + n + (m+n)];
1507 U =
new uint32_t[m + n + 1];
1508 V =
new uint32_t[n];
1509 Q =
new uint32_t[m+n];
1511 R =
new uint32_t[n];
1515 memset(U, 0, (m+n+1)*
sizeof(uint32_t));
1516 for (
unsigned i = 0; i < lhsWords; ++i) {
1518 U[i * 2] =
Lo_32(tmp);
1519 U[i * 2 + 1] =
Hi_32(tmp);
1524 memset(V, 0, (n)*
sizeof(uint32_t));
1525 for (
unsigned i = 0; i < rhsWords; ++i) {
1528 V[i * 2 + 1] =
Hi_32(tmp);
1532 memset(Q, 0, (m+n) *
sizeof(uint32_t));
1534 memset(R, 0, n *
sizeof(uint32_t));
1540 for (
unsigned i = n; i > 0 &&
V[i-1] == 0; i--) {
1544 for (
unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1553 assert(n != 0 &&
"Divide by zero?");
1555 uint32_t divisor =
V[0];
1556 uint32_t remainder = 0;
1557 for (
int i = m; i >= 0; i--) {
1559 if (partial_dividend == 0) {
1562 }
else if (partial_dividend < divisor) {
1564 remainder =
Lo_32(partial_dividend);
1565 }
else if (partial_dividend == divisor) {
1569 Q[i] =
Lo_32(partial_dividend / divisor);
1570 remainder =
Lo_32(partial_dividend - (Q[i] * divisor));
1583 for (
unsigned i = 0; i < lhsWords; ++i)
1584 Quotient[i] =
Make_64(Q[i*2+1], Q[i*2]);
1589 for (
unsigned i = 0; i < rhsWords; ++i)
1590 Remainder[i] =
Make_64(R[i*2+1], R[i*2]);
1594 if (U != &SPACE[0]) {
1603 assert(BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
1607 assert(RHS.U.VAL != 0 &&
"Divide by zero?");
1608 return APInt(BitWidth, U.VAL / RHS.U.VAL);
1613 unsigned rhsBits = RHS.getActiveBits();
1615 assert(rhsWords &&
"Divided by zero???");
1620 return APInt(BitWidth, 0);
1624 if (lhsWords < rhsWords || this->
ult(RHS))
1626 return APInt(BitWidth, 0);
1629 return APInt(BitWidth, 1);
1632 return APInt(BitWidth, this->U.pVal[0] / RHS.U.pVal[0]);
1635 APInt Quotient(BitWidth, 0);
1636 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.
pVal,
nullptr);
1641 assert(RHS != 0 &&
"Divide by zero?");
1645 return APInt(BitWidth, U.VAL / RHS);
1653 return APInt(BitWidth, 0);
1659 return APInt(BitWidth, 0);
1662 return APInt(BitWidth, 1);
1665 return APInt(BitWidth, this->U.pVal[0] / RHS);
1668 APInt Quotient(BitWidth, 0);
1669 divide(U.pVal, lhsWords, &RHS, 1, Quotient.U.
pVal,
nullptr);
1675 if (RHS.isNegative())
1676 return (-(*
this)).udiv(-RHS);
1677 return -((-(*this)).udiv(RHS));
1679 if (RHS.isNegative())
1680 return -(this->
udiv(-RHS));
1681 return this->
udiv(RHS);
1687 return (-(*
this)).udiv(-RHS);
1688 return -((-(*this)).udiv(RHS));
1691 return -(this->
udiv(-RHS));
1692 return this->
udiv(RHS);
1696 assert(BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
1698 assert(RHS.U.VAL != 0 &&
"Remainder by zero?");
1699 return APInt(BitWidth, U.VAL % RHS.U.VAL);
1706 unsigned rhsBits = RHS.getActiveBits();
1708 assert(rhsWords &&
"Performing remainder operation by zero ???");
1713 return APInt(BitWidth, 0);
1716 return APInt(BitWidth, 0);
1717 if (lhsWords < rhsWords || this->
ult(RHS))
1722 return APInt(BitWidth, 0);
1725 return APInt(BitWidth, U.pVal[0] % RHS.U.pVal[0]);
1726 if (RHS.isPowerOf2()) {
1728 APInt Result(*
this);
1729 Result.clearBits(RHS.logBase2(), BitWidth);
1735 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords,
nullptr, Remainder.U.pVal);
1740 assert(RHS != 0 &&
"Remainder by zero?");
1763 return U.pVal[0] % RHS;
1766 return U.pVal[0] & (RHS - 1);
1770 divide(U.pVal, lhsWords, &RHS, 1,
nullptr, &Remainder);
1776 if (RHS.isNegative())
1777 return -((-(*this)).urem(-RHS));
1778 return -((-(*this)).urem(RHS));
1780 if (RHS.isNegative())
1781 return this->
urem(-RHS);
1782 return this->
urem(RHS);
1788 return -((-(*this)).urem(-RHS));
1789 return -((-(*this)).urem(RHS));
1792 return this->
urem(-RHS);
1793 return this->
urem(RHS);
1798 assert(LHS.BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
1799 unsigned BitWidth = LHS.BitWidth;
1803 assert(RHS.U.VAL != 0 &&
"Divide by zero?");
1804 uint64_t QuotVal = LHS.U.VAL / RHS.U.VAL;
1805 uint64_t RemVal = LHS.U.VAL % RHS.U.VAL;
1806 Quotient =
APInt(BitWidth, QuotVal);
1807 Remainder =
APInt(BitWidth, RemVal);
1812 unsigned lhsWords =
getNumWords(LHS.getActiveBits());
1813 unsigned rhsBits = RHS.getActiveBits();
1815 assert(rhsWords &&
"Performing divrem operation by zero ???");
1818 if (lhsWords == 0) {
1819 Quotient =
APInt(BitWidth, 0);
1820 Remainder =
APInt(BitWidth, 0);
1826 Remainder =
APInt(BitWidth, 0);
1829 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1831 Quotient =
APInt(BitWidth, 0);
1836 Quotient =
APInt(BitWidth, 1);
1837 Remainder =
APInt(BitWidth, 0);
1845 Quotient.reallocate(BitWidth);
1846 Remainder.reallocate(BitWidth);
1848 if (lhsWords == 1) {
1850 uint64_t lhsValue = LHS.U.pVal[0];
1851 uint64_t rhsValue = RHS.U.pVal[0];
1852 Quotient = lhsValue / rhsValue;
1853 Remainder = lhsValue % rhsValue;
1858 divide(LHS.U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.
pVal,
1861 std::memset(Quotient.U.
pVal + lhsWords, 0,
1863 std::memset(Remainder.U.
pVal + rhsWords, 0,
1868 uint64_t &Remainder) {
1869 assert(RHS != 0 &&
"Divide by zero?");
1870 unsigned BitWidth = LHS.BitWidth;
1874 uint64_t QuotVal = LHS.U.VAL / RHS;
1875 Remainder = LHS.U.VAL % RHS;
1876 Quotient =
APInt(BitWidth, QuotVal);
1881 unsigned lhsWords =
getNumWords(LHS.getActiveBits());
1884 if (lhsWords == 0) {
1885 Quotient =
APInt(BitWidth, 0);
1897 Remainder = LHS.getZExtValue();
1898 Quotient =
APInt(BitWidth, 0);
1903 Quotient =
APInt(BitWidth, 1);
1911 Quotient.reallocate(BitWidth);
1913 if (lhsWords == 1) {
1915 uint64_t lhsValue = LHS.U.pVal[0];
1916 Quotient = lhsValue / RHS;
1917 Remainder = lhsValue % RHS;
1922 divide(LHS.U.pVal, lhsWords, &RHS, 1, Quotient.U.
pVal, &Remainder);
1924 std::memset(Quotient.U.
pVal + lhsWords, 0,
1930 if (LHS.isNegative()) {
1931 if (RHS.isNegative())
1938 }
else if (RHS.isNegative()) {
1947 APInt &Quotient, int64_t &Remainder) {
1948 uint64_t R = Remainder;
1949 if (LHS.isNegative()) {
1957 }
else if (RHS < 0) {
1967 APInt Res = *
this+RHS;
1974 APInt Res = *
this+RHS;
1975 Overflow = Res.
ult(RHS);
1980 APInt Res = *
this - RHS;
1987 APInt Res = *
this-RHS;
1988 Overflow = Res.
ugt(*
this);
1999 APInt Res = *
this * RHS;
2002 Overflow = Res.
sdiv(RHS) != *
this ||
2010 if (
countl_zero() + RHS.countl_zero() + 2 <= BitWidth) {
2033 return APInt(BitWidth, 0);
2040 return *
this << ShAmt;
2050 return APInt(BitWidth, 0);
2054 return *
this << ShAmt;
2059 if ((quotient * RHS != *
this) && (
isNegative() != RHS.isNegative()))
2060 return quotient - 1;
2099 return APInt(BitWidth, 0);
2109 bool ResIsNegative =
isNegative() ^ RHS.isNegative();
2154 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2156 "Radix should be 2, 8, 10, 16, or 36!");
2159 size_t slen = str.
size();
2160 bool isNeg = *p ==
'-';
2161 if (*p ==
'-' || *p ==
'+') {
2164 assert(slen &&
"String is only a sign, needs a value.");
2166 assert((slen <= numbits || radix != 2) &&
"Insufficient bit width");
2167 assert(((slen-1)*3 <= numbits || radix != 8) &&
"Insufficient bit width");
2168 assert(((slen-1)*4 <= numbits || radix != 16) &&
"Insufficient bit width");
2169 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2170 "Insufficient bit width");
2179 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
2183 unsigned digit =
getDigit(*p, radix);
2184 assert(digit < radix &&
"Invalid character in digit string");
2203 bool formatAsCLiteral,
bool UpperCase,
2204 bool InsertSeparators)
const {
2205 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2207 "Radix should be 2, 8, 10, 16, or 36!");
2209 const char *Prefix =
"";
2210 if (formatAsCLiteral) {
2231 unsigned Grouping = (Radix == 8 || Radix == 10) ? 3 : 4;
2236 Str.push_back(*Prefix);
2243 static const char BothDigits[] =
"0123456789abcdefghijklmnopqrstuvwxyz"
2244 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
2245 const char *Digits = BothDigits + (UpperCase ? 36 : 0);
2249 char *BufPtr = std::end(Buffer);
2265 Str.push_back(*Prefix);
2271 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2273 *--BufPtr = Digits[
N % Radix];
2277 Str.append(BufPtr, std::end(Buffer));
2292 Str.push_back(*Prefix);
2297 unsigned StartDig = Str.size();
2302 if (Radix == 2 || Radix == 8 || Radix == 16) {
2304 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2305 unsigned MaskAmt = Radix - 1;
2310 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2311 Str.push_back(
'\'');
2313 Str.push_back(Digits[Digit]);
2321 udivrem(Tmp, Radix, Tmp, Digit);
2322 assert(Digit < Radix &&
"divide failed");
2323 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2324 Str.push_back(
'\'');
2326 Str.push_back(Digits[Digit]);
2332 std::reverse(Str.begin()+StartDig, Str.end());
2335#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
2340 dbgs() <<
"APInt(" << BitWidth <<
"b, "
2341 << U <<
"u " << S <<
"s)\n";
2357 "Part width must be divisible by 2!");
2381 for (
unsigned i = 1; i < parts; i++)
2387 for (
unsigned i = 0; i < parts; i++)
2393 for (
unsigned i = 0; i < parts; i++)
2402 return (parts[whichWord(bit)] & maskBit(bit)) != 0;
2407 parts[whichWord(bit)] |= maskBit(bit);
2412 parts[whichWord(bit)] &= ~maskBit(bit);
2418 for (
unsigned i = 0; i < n; i++) {
2419 if (parts[i] != 0) {
2434 if (parts[n] != 0) {
2435 static_assert(
sizeof(parts[n]) <=
sizeof(uint64_t));
2451 unsigned srcBits,
unsigned srcLSB) {
2453 assert(dstParts <= dstCount);
2456 tcAssign(dst, src + firstSrcPart, dstParts);
2467 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] &
mask)
2469 }
else if (n > srcBits) {
2475 while (dstParts < dstCount)
2476 dst[dstParts++] = 0;
2484 for (
unsigned i = 0; i < parts; i++) {
2487 dst[i] += rhs[i] + 1;
2504 for (
unsigned i = 0; i < parts; ++i) {
2519 for (
unsigned i = 0; i < parts; i++) {
2522 dst[i] -= rhs[i] + 1;
2542 for (
unsigned i = 0; i < parts; ++i) {
2570 unsigned srcParts,
unsigned dstParts,
2573 assert(dst <= src || dst >= src + srcParts);
2574 assert(dstParts <= srcParts + 1);
2577 unsigned n = std::min(dstParts, srcParts);
2579 for (
unsigned i = 0; i < n; i++) {
2586 if (multiplier == 0 || srcPart == 0) {
2596 if (low + mid < low)
2603 if (low + mid < low)
2608 if (low + carry < low)
2615 if (low + dst[i] < low)
2625 if (srcParts < dstParts) {
2627 assert(srcParts + 1 == dstParts);
2628 dst[srcParts] = carry;
2640 for (
unsigned i = dstParts; i < srcParts; i++)
2653 const WordType *rhs,
unsigned parts) {
2654 assert(dst != lhs && dst != rhs);
2658 for (
unsigned i = 0; i < parts; i++) {
2662 tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts, parts - i, i != 0);
2671 const WordType *rhs,
unsigned lhsParts,
2672 unsigned rhsParts) {
2674 if (lhsParts > rhsParts)
2677 assert(dst != lhs && dst != rhs);
2679 for (
unsigned i = 0; i < lhsParts; i++) {
2682 tcMultiplyPart(&dst[i], rhs, lhs[i], 0, rhsParts, rhsParts + 1, i != 0);
2698 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2700 unsigned shiftCount =
tcMSB(rhs, parts) + 1;
2701 if (shiftCount == 0)
2711 tcSet(lhs, 0, parts);
2716 int compare =
tcCompare(remainder, srhs, parts);
2722 if (shiftCount == 0)
2726 if ((
mask >>= 1) == 0) {
2747 if (BitShift == 0) {
2748 std::memmove(Dst + WordShift, Dst, (Words - WordShift) *
APINT_WORD_SIZE);
2750 while (Words-- > WordShift) {
2751 Dst[Words] = Dst[Words - WordShift] << BitShift;
2752 if (Words > WordShift)
2773 unsigned WordsToMove = Words - WordShift;
2775 if (BitShift == 0) {
2778 for (
unsigned i = 0; i != WordsToMove; ++i) {
2779 Dst[i] = Dst[i + WordShift] >> BitShift;
2780 if (i + 1 != WordsToMove)
2794 if (lhs[parts] != rhs[parts])
2795 return (lhs[parts] > rhs[parts]) ? 1 : -1;
2851 unsigned RangeWidth) {
2852 unsigned CoeffWidth =
A.getBitWidth();
2853 assert(CoeffWidth ==
B.getBitWidth() && CoeffWidth ==
C.getBitWidth());
2854 assert(RangeWidth <= CoeffWidth &&
2855 "Value range width should be less than coefficient width");
2856 assert(RangeWidth > 1 &&
"Value range bit width should be > 1");
2859 <<
"x + " <<
C <<
", rw:" << RangeWidth <<
'\n');
2862 if (
C.sextOrTrunc(RangeWidth).isZero()) {
2864 return APInt(CoeffWidth, 0);
2882 A =
A.sext(CoeffWidth);
2883 B =
B.sext(CoeffWidth);
2884 C =
C.sext(CoeffWidth);
2888 if (
A.isNegative()) {
2922 assert(
A.isStrictlyPositive());
2926 return V.isNegative() ? V+
T : V+(
A-
T);
2931 if (
B.isNonNegative()) {
2937 if (
C.isStrictlyPositive())
2948 LowkR = RoundUp(LowkR, R);
2958 C -= -RoundUp(-
C, R);
2975 LLVM_DEBUG(
dbgs() << __func__ <<
": updated coefficients " <<
A <<
"x^2 + "
2976 <<
B <<
"x + " <<
C <<
", rw:" << RangeWidth <<
'\n');
2979 assert(
D.isNonNegative() &&
"Negative discriminant");
2980 APInt SQ =
D.sqrtFloor();
2983 bool InexactSQ = Q !=
D;
3002 assert(
X.isNonNegative() &&
"Solution should be non-negative");
3004 if (!InexactSQ && Rem.
isZero()) {
3009 assert((SQ*SQ).sle(
D) &&
"SQ = |_sqrt(D)_|, so SQ*SQ <= D");
3027 return std::nullopt;
3035std::optional<unsigned>
3037 assert(
A.getBitWidth() ==
B.getBitWidth() &&
"Must have the same bitwidth");
3039 return std::nullopt;
3040 return A.getBitWidth() - ((
A ^
B).countl_zero() + 1);
3044 bool MatchAllBits) {
3045 unsigned OldBitWidth =
A.getBitWidth();
3046 assert((((OldBitWidth % NewBitWidth) == 0) ||
3047 ((NewBitWidth % OldBitWidth) == 0)) &&
3048 "One size should be a multiple of the other one. "
3049 "Can't do fractional scaling.");
3052 if (OldBitWidth == NewBitWidth)
3061 if (NewBitWidth > OldBitWidth) {
3063 unsigned Scale = NewBitWidth / OldBitWidth;
3064 for (
unsigned i = 0; i != OldBitWidth; ++i)
3066 NewA.
setBits(i * Scale, (i + 1) * Scale);
3068 unsigned Scale = OldBitWidth / NewBitWidth;
3069 for (
unsigned i = 0; i != NewBitWidth; ++i) {
3071 if (
A.extractBits(Scale, i * Scale).isAllOnes())
3074 if (!
A.extractBits(Scale, i * Scale).isZero())
3086 unsigned StoreBytes) {
3087 assert((IntVal.getBitWidth()+7)/8 >= StoreBytes &&
"Integer too small!");
3093 memcpy(Dst, Src, StoreBytes);
3098 while (StoreBytes >
sizeof(uint64_t)) {
3099 StoreBytes -=
sizeof(uint64_t);
3101 memcpy(Dst + StoreBytes, Src,
sizeof(uint64_t));
3102 Src +=
sizeof(uint64_t);
3105 memcpy(Dst, Src +
sizeof(uint64_t) - StoreBytes, StoreBytes);
3112 unsigned LoadBytes) {
3113 assert((IntVal.getBitWidth()+7)/8 >= LoadBytes &&
"Integer too small!");
3115 const_cast<uint64_t *
>(IntVal.getRawData()));
3120 memcpy(Dst, Src, LoadBytes);
3126 while (LoadBytes >
sizeof(uint64_t)) {
3127 LoadBytes -=
sizeof(uint64_t);
3129 memcpy(Dst, Src + LoadBytes,
sizeof(uint64_t));
3130 Dst +=
sizeof(uint64_t);
3133 memcpy(Dst +
sizeof(uint64_t) - LoadBytes, Src, LoadBytes);
3139 return (C1 & C2) + (C1 ^ C2).ashr(1);
3144 return (C1 & C2) + (C1 ^ C2).lshr(1);
3149 return (C1 | C2) - (C1 ^ C2).ashr(1);
3154 return (C1 | C2) - (C1 ^ C2).lshr(1);
3178 return C1Ext * C2Ext;
3186 return C1Ext * C2Ext;
3190 assert(
N >= 0 &&
"negative exponents not supported.");
3195 int64_t RemainingExponent =
N;
3196 while (RemainingExponent > 0) {
3197 while (RemainingExponent % 2 == 0) {
3199 RemainingExponent /= 2;
3201 --RemainingExponent;
3208 const APInt &Shift) {
3209 assert(
Hi.getBitWidth() ==
Lo.getBitWidth());
3213 return Hi.shl(ShiftAmt) |
Lo.lshr(
Hi.getBitWidth() - ShiftAmt);
3217 const APInt &Shift) {
3218 assert(
Hi.getBitWidth() ==
Lo.getBitWidth());
3222 return Hi.shl(
Hi.getBitWidth() - ShiftAmt) |
Lo.lshr(ShiftAmt);
3227 assert(BW == RHS.getBitWidth() &&
"Operand mismatch");
3228 APInt Result(BW, 0);
3229 for (
unsigned I :
seq(std::min(RHS.getActiveBits(), BW - LHS.countr_zero())))
3236 assert(LHS.getBitWidth() == RHS.getBitWidth());
3237 return clmul(LHS.reverseBits(), RHS.reverseBits()).reverseBits();
3241 assert(LHS.getBitWidth() == RHS.getBitWidth());
3242 return clmulr(LHS, RHS).lshr(1);
3247 assert(BW == Mask.getBitWidth() &&
"Operand mismatch");
3249 for (
unsigned I = 0,
P = 0;
I != BW; ++
I)
3251 Result.setBitVal(
P++, Val[
I]);
3257 assert(BW == Mask.getBitWidth() &&
"Operand mismatch");
3259 for (
unsigned I = 0,
P = 0;
I != BW; ++
I)
3261 Result.setBitVal(
I, Val[
P++]);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 constexpr unsigned long long mask(BlockVerifier::State S)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_UNLIKELY(EXPR)
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
#define LLVM_LIKELY(EXPR)
static bool isNeg(Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
static bool isSigned(unsigned Opcode)
This file defines a hash set that can be used to remove duplication of nodes in a graph.
static uint64_t clearUnusedBits(uint64_t Val, unsigned Size)
Provides some synthesis utilities to produce sequences of values.
This file defines the SmallString class.
This file implements the C++20 <bit> header.
Class for arbitrary precision integers.
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
LLVM_ABI APInt usub_sat(const APInt &RHS) const
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
static LLVM_ABI void tcSetBit(WordType *, unsigned bit)
Set the given bit of a bignum. Zero-based.
static LLVM_ABI void tcSet(WordType *, WordType, unsigned)
Sets the least significant part of a bignum to the input value, and zeroes out higher parts.
LLVM_ABI unsigned nearestLogBase2() const
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
LLVM_ABI APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
static LLVM_ABI int tcExtractBit(const WordType *, unsigned bit)
Extract the given bit of a bignum; returns 0 or 1. Zero-based.
LLVM_ABI bool isAligned(Align A) const
Checks if this APInt -interpreted as an address- is aligned to the provided value.
LLVM_ABI 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.
LLVM_ABI APInt truncUSat(unsigned width) const
Truncate to new width with unsigned saturation.
uint64_t * pVal
Used to store the >64 bits integer value.
static LLVM_ABI void sdivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
static LLVM_ABI WordType tcAdd(WordType *, const WordType *, WordType carry, unsigned)
DST += RHS + CARRY where CARRY is zero or one. Returns the carry flag.
static LLVM_ABI 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,...
LLVM_ABI uint64_t extractBitsAsZExtValue(unsigned numBits, unsigned bitPosition) const
LLVM_ABI APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
unsigned getActiveBits() const
Compute the number of active bits in the value.
static LLVM_ABI unsigned getSufficientBitsNeeded(StringRef Str, uint8_t Radix)
Get the bits that are sufficient to represent the string value.
LLVM_ABI 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.
LLVM_ABI APInt sshl_ov(const APInt &Amt, bool &Overflow) const
LLVM_ABI APInt smul_sat(const APInt &RHS) const
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
static LLVM_ABI int tcCompare(const WordType *, const WordType *, unsigned)
Comparison (unsigned) of two bignums.
LLVM_ABI APInt & operator++()
Prefix increment operator.
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
APInt(unsigned numBits, uint64_t val, bool isSigned=false, bool implicitTrunc=false)
Create a new APInt of numBits width, initialized as val.
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
LLVM_ABI void print(raw_ostream &OS, bool isSigned) const
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
static LLVM_ABI 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 LLVM_ABI void tcShiftRight(WordType *, unsigned Words, unsigned Count)
Shift a bignum right Count bits.
static LLVM_ABI 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.
LLVM_ABI 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.
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
APInt & operator<<=(unsigned ShiftAmt)
Left-shift assignment function.
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
double roundToDouble() const
Converts this unsigned APInt to a double value.
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
LLVM_ABI APInt reverseBits() const
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
static LLVM_ABI 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.
LLVM_ABI bool isSplat(unsigned SplatSizeInBits) const
Check if the APInt consists of a repeated bit pattern.
LLVM_ABI APInt truncSSatU(unsigned width) const
Truncate to new width with signed saturation to unsigned result.
LLVM_ABI APInt & operator-=(const APInt &RHS)
Subtraction assignment operator.
bool isSignedIntN(unsigned N) const
Check if this APInt has an N-bits signed integer value.
LLVM_ABI APInt sdiv_ov(const APInt &RHS, bool &Overflow) const
LLVM_ABI APInt operator*(const APInt &RHS) const
Multiplication operator.
static LLVM_ABI 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 LLVM_ABI void tcShiftLeft(WordType *, unsigned Words, unsigned Count)
Shift a bignum left Count bits.
static LLVM_ABI 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.
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
LLVM_ABI APInt sqrtFloor() const
Compute the floor of the square root of the unsigned value.
static constexpr WordType WORDTYPE_MAX
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
LLVM_ABI APInt ushl_ov(const APInt &Amt, bool &Overflow) const
static LLVM_ABI WordType tcSubtractPart(WordType *, WordType, unsigned)
DST -= RHS. Returns the carry flag.
static LLVM_ABI bool tcIsZero(const WordType *, unsigned)
Returns true if a bignum is zero, false otherwise.
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
static LLVM_ABI unsigned tcMSB(const WordType *parts, unsigned n)
Returns the bit number of the most significant set bit of a number.
static LLVM_ABI 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.
LLVM_DUMP_METHOD void dump() const
debug method
LLVM_ABI APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
unsigned countl_one() const
Count the number of leading one bits.
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
unsigned logBase2() const
static LLVM_ABI 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 LLVM_ABI 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...
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
LLVM_ABI APInt & operator*=(const APInt &RHS)
Multiplication assignment operator.
uint64_t VAL
Used to store the <= 64 bits integer value.
static LLVM_ABI unsigned getBitsNeeded(StringRef str, uint8_t radix)
Get bits required for string value.
static LLVM_ABI WordType tcSubtract(WordType *, const WordType *, WordType carry, unsigned)
DST -= RHS + CARRY where CARRY is zero or one. Returns the carry flag.
LLVM_ABI APInt multiplicativeInverse() const
static LLVM_ABI void tcNegate(WordType *, unsigned)
Negate a bignum in-place.
bool getBoolValue() const
Convert APInt to a boolean value.
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
LLVM_ABI 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.
LLVM_ABI 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.
LLVM_ABI APInt byteSwap() const
LLVM_ABI APInt umul_sat(const APInt &RHS) const
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
LLVM_ABI APInt & operator+=(const APInt &RHS)
Addition assignment operator.
LLVM_ABI 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 LLVM_ABI 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.
LLVM_ABI 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.
LLVM_ABI 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.
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
LLVM_ABI 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.
void setBitVal(unsigned BitPosition, bool BitValue)
Set a given bit to a given value.
LLVM_ABI 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.
LLVM_ABI APInt truncSSat(unsigned width) const
Truncate to new width with signed saturation to signed result.
LLVM_ABI 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.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
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...
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
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.
LLVM_ABI 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...
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
LLVM_ABI APInt RoundingUDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A unsign-divided by B, rounded by the given rounding mode.
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
LLVM_ABI APInt muluExtended(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
LLVM_ABI APInt mulsExtended(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
LLVM_ABI APInt pext(const APInt &Val, const APInt &Mask)
Perform a "compress" operation, also known as pext or bext.
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
LLVM_ABI APInt RoundingSDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A sign-divided by B, rounded by the given rounding mode.
LLVM_ABI APInt clmul(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, also known as XOR multiplication, and return low-bits.
LLVM_ABI APInt pow(const APInt &X, int64_t N)
Compute X^N for N>=0.
LLVM_ABI APInt pdep(const APInt &Val, const APInt &Mask)
Perform an "expand" operation, also known as pdep or bdep.
LLVM_ABI APInt RoundDoubleToAPInt(double Double, unsigned width)
Converts the given double value into a APInt.
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
LLVM_ABI 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.
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
LLVM_ABI APInt GreatestCommonDivisor(APInt A, APInt B, bool IsSigned=false)
Compute GCD of two APInt values.
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
support::ulittle32_t Word
constexpr bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
hash_code hash_value(const FixedPointSemantics &Val)
LLVM_ABI void StoreIntToMemory(const APInt &IntVal, uint8_t *Dst, unsigned StoreBytes)
Fills the StoreBytes bytes of memory starting from Dst with the integer held in IntVal.
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
constexpr T byteswap(T V) noexcept
Reverses the bytes in the given integer value V.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
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.
LLVM_READONLY LLVM_ABI std::optional< APFloat > exp(const APFloat &X, RoundingMode RM=APFloat::rmNearestTiesToEven, APFloat::opStatus *Status=nullptr)
Implement IEEE 754-2019 exp functions.
constexpr uint32_t Hi_32(uint64_t Value)
Return the high 32 bits of a 64 bit value.
LLVM_ABI 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.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Mod
The access may modify the value stored in memory.
To bit_cast(const From &from) noexcept
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
constexpr T reverseBits(T Val)
Reverse the bits in Val.
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 T maskTrailingOnes(unsigned N)
Create a bitmask with the N right-most bits set to 1, and all other bits set to 0.
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.
LLVM_ABI void LoadIntFromMemory(APInt &IntVal, const uint8_t *Src, unsigned LoadBytes)
Loads the integer stored in the LoadBytes bytes starting from Src into IntVal, which is assumed to be...
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...