32#define DEBUG_TYPE "apint"
50 if (radix == 16 || radix == 36) {
74void APInt::initSlowCase(
uint64_t val,
bool isSigned) {
75 if (isSigned && int64_t(val) < 0) {
86void APInt::initSlowCase(
const APInt& that) {
92 assert(bigVal.
data() &&
"Null pointer detected!");
108 initFromArray(bigVal);
112 : BitWidth(numBits) {
113 initFromArray(
ArrayRef(bigVal, numWords));
117 : BitWidth(numbits) {
118 fromString(numbits, Str, radix);
121void APInt::reallocate(
unsigned 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) {
248 WordType *dst = U.pVal, *rhs = RHS.U.pVal;
253void APInt::orAssignSlowCase(
const APInt &
RHS) {
259void APInt::xorAssignSlowCase(
const APInt &
RHS) {
275 tcMultiplyPart(U.pVal, U.pVal, RHS, 0, NumWords, NumWords,
false);
277 return clearUnusedBits();
280bool APInt::equalSlowCase(
const APInt &RHS)
const {
281 return std::equal(U.pVal, U.pVal +
getNumWords(), RHS.U.pVal);
284int APInt::compare(
const APInt&
RHS)
const {
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)
339void APInt::clearBitsSlowCase(
unsigned LoBit,
unsigned HiBit) {
340 unsigned LoWord = whichWord(LoBit);
341 unsigned HiWord = whichWord(HiBit);
347 unsigned HiShiftAmt = whichBit(HiBit);
348 if (HiShiftAmt != 0) {
353 if (HiWord == LoWord)
356 U.pVal[HiWord] &= HiMask;
359 U.pVal[LoWord] &= LoMask;
362 for (
unsigned Word = LoWord + 1;
Word < HiWord; ++
Word)
368 for (
unsigned i = 0; i < parts; i++)
373void APInt::flipAllBitsSlowCase() {
382APInt APInt::concatSlowCase(
const APInt &NewLSB)
const {
393 assert(bitPosition < BitWidth &&
"Out of the bit-width range!");
394 setBitVal(bitPosition, !(*
this)[bitPosition]);
399 assert((subBitWidth + bitPosition) <= BitWidth &&
"Illegal bit insertion");
402 if (subBitWidth == 0)
406 if (subBitWidth == BitWidth) {
414 U.VAL &= ~(
mask << bitPosition);
415 U.VAL |= (subBits.U.
VAL << bitPosition);
419 unsigned loBit = whichBit(bitPosition);
420 unsigned loWord = whichWord(bitPosition);
421 unsigned hi1Word = whichWord(bitPosition + subBitWidth - 1);
424 if (loWord == hi1Word) {
426 U.pVal[loWord] &= ~(
mask << loBit);
427 U.pVal[loWord] |= (subBits.U.
VAL << loBit);
440 if (remainingBits != 0) {
442 U.pVal[hi1Word] &=
~mask;
443 U.pVal[hi1Word] |= subBits.getWord(subBitWidth - 1);
451 for (
unsigned i = 0; i != subBitWidth; ++i)
459 U.VAL &= ~(maskBits << bitPosition);
460 U.VAL |= subBits << bitPosition;
464 unsigned loBit = whichBit(bitPosition);
465 unsigned loWord = whichWord(bitPosition);
466 unsigned hiWord = whichWord(bitPosition + numBits - 1);
467 if (loWord == hiWord) {
468 U.pVal[loWord] &= ~(maskBits << loBit);
469 U.pVal[loWord] |= subBits << loBit;
473 static_assert(8 *
sizeof(
WordType) <= 64,
"This code assumes only two words affected");
474 unsigned wordBits = 8 *
sizeof(
WordType);
475 U.pVal[loWord] &= ~(maskBits << loBit);
476 U.pVal[loWord] |= subBits << loBit;
478 U.pVal[hiWord] &= ~(maskBits >> (wordBits - loBit));
479 U.pVal[hiWord] |= subBits >> (wordBits - loBit);
483 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
484 "Illegal bit extraction");
487 return APInt(numBits, U.VAL >> bitPosition,
false,
490 unsigned loBit = whichBit(bitPosition);
491 unsigned loWord = whichWord(bitPosition);
492 unsigned hiWord = whichWord(bitPosition + numBits - 1);
495 if (loWord == hiWord)
496 return APInt(numBits, U.pVal[loWord] >> loBit,
false,
502 return APInt(numBits,
ArrayRef(U.pVal + loWord, 1 + hiWord - loWord));
505 APInt Result(numBits, 0);
507 unsigned NumDstWords = Result.getNumWords();
509 uint64_t *DestPtr = Result.isSingleWord() ? &Result.U.VAL : Result.U.pVal;
510 for (
unsigned word = 0; word < NumDstWords; ++word) {
511 uint64_t w0 = U.pVal[loWord + word];
513 (loWord + word + 1) < NumSrcWords ? U.pVal[loWord + word + 1] : 0;
517 return Result.clearUnusedBits();
521 unsigned bitPosition)
const {
522 assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
523 "Illegal bit extraction");
524 assert(numBits <= 64 &&
"Illegal bit extraction");
528 return (U.VAL >> bitPosition) & maskBits;
531 "This code assumes only two words affected");
532 unsigned loBit = whichBit(bitPosition);
533 unsigned loWord = whichWord(bitPosition);
534 unsigned hiWord = whichWord(bitPosition + numBits - 1);
535 if (loWord == hiWord)
536 return (U.pVal[loWord] >> loBit) & maskBits;
538 uint64_t retBits = U.pVal[loWord] >> loBit;
545 assert(!Str.empty() &&
"Invalid string length");
546 size_t StrLen = Str.size();
549 unsigned IsNegative =
false;
550 if (Str[0] ==
'-' || Str[0] ==
'+') {
551 IsNegative = Str[0] ==
'-';
553 assert(StrLen &&
"String is only a sign, needs a value.");
559 return StrLen + IsNegative;
561 return StrLen * 3 + IsNegative;
563 return StrLen * 4 + IsNegative;
570 return (StrLen == 1 ? 4 : StrLen * 64 / 18) + IsNegative;
573 return (StrLen == 1 ? 7 : StrLen * 16 / 3) + IsNegative;
583 if (radix == 2 || radix == 8 || radix == 16)
589 size_t slen = str.
size();
594 if (*p ==
'-' || *p ==
'+') {
597 assert(slen &&
"String is only a sign, needs a value.");
608 if (log == (
unsigned)-1) {
632 "SplatSizeInBits must divide width!");
635 return *
this ==
rotl(SplatSizeInBits);
640 return this->
lshr(BitWidth - numBits);
652 assert(NewLen >= V.getBitWidth() &&
"Can't splat to smaller bit width!");
654 APInt Val = V.zext(NewLen);
655 for (
unsigned I = V.getBitWidth();
I < NewLen;
I <<= 1)
661unsigned APInt::countLeadingZerosSlowCase()
const {
678unsigned APInt::countLeadingOnesSlowCase()
const {
689 if (
Count == highWordBits) {
690 for (i--; i >= 0; --i) {
702unsigned APInt::countTrailingZerosSlowCase()
const {
709 return std::min(
Count, BitWidth);
712unsigned APInt::countTrailingOnesSlowCase()
const {
723unsigned APInt::countPopulationSlowCase()
const {
730bool APInt::isPowerOf2SlowCase()
const {
740bool APInt::intersectsSlowCase(
const APInt &
RHS)
const {
742 if ((U.pVal[i] &
RHS.U.pVal[i]) != 0)
748bool APInt::isSubsetOfSlowCase(
const APInt &
RHS)
const {
750 if ((U.pVal[i] & ~
RHS.U.pVal[i]) != 0)
756bool APInt::isInverseOfSlowCase(
const APInt &
RHS)
const {
758 for (
unsigned I = 0;
I !=
Last; ++
I)
764 return (U.pVal[
Last] ^
RHS.U.pVal[
Last]) == TailMask;
768 assert(BitWidth >= 16 && BitWidth % 8 == 0 &&
"Cannot byteswap!");
773 if (BitWidth <= 64) {
775 Tmp1 >>= (64 - BitWidth);
776 return APInt(BitWidth, Tmp1);
782 if (Result.BitWidth != BitWidth) {
783 Result.lshrInPlace(Result.BitWidth - BitWidth);
784 Result.BitWidth = BitWidth;
804 return APInt(BitWidth,
809 APInt Result(BitWidth, 0);
812 if (ExcessBits == 0) {
814 for (
unsigned I = 0;
I < NumWords; ++
I)
820 for (
unsigned I = 0;
I < NumWords - 1; ++
I) {
822 Result.U.pVal[
I] = (PrevRev >> ExcessBits) | (CurrRev << (64 - ExcessBits));
825 Result.U.pVal[NumWords - 1] = PrevRev >> ExcessBits;
831 if (
A ==
B)
return A;
840 unsigned Pow2_A =
A.countr_zero();
841 unsigned Pow2_B =
B.countr_zero();
842 if (Pow2_A > Pow2_B) {
843 A.lshrInPlace(Pow2_A - Pow2_B);
845 }
else if (Pow2_B > Pow2_A) {
846 B.lshrInPlace(Pow2_B - Pow2_A);
862 A.lshrInPlace(
A.countr_zero() - Pow2);
865 B.lshrInPlace(
B.countr_zero() - Pow2);
879 int64_t exp = ((
I >> 52) & 0x7ff) - 1023;
883 return APInt(width, 0u);
886 uint64_t mantissa = (
I & (~0ULL >> 12)) | 1ULL << 52;
890 return isNeg ? -
APInt(width, mantissa >> (52 - exp)) :
891 APInt(width, mantissa >> (52 - exp));
895 if (width <= exp - 52)
896 return APInt(width, 0);
899 APInt Tmp(width, mantissa);
901 return isNeg ? -Tmp : Tmp;
919 return double(getWord(0));
923 bool isNeg = isSigned ? (*this)[BitWidth-1] :
false;
938 if (!isSigned || !
isNeg)
939 return std::numeric_limits<double>::infinity();
941 return -std::numeric_limits<double>::infinity();
948 unsigned hiWord = whichWord(n-1);
950 mantissa = Tmp.U.
pVal[0];
954 assert(hiWord > 0 &&
"huh?");
957 mantissa = hibits | lobits;
962 uint64_t I = sign | (exp << 52) | mantissa;
968 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
974 if (width == BitWidth)
982 Result.U.pVal[i] = U.pVal[i];
987 Result.U.pVal[i] = U.pVal[i] << bits >> bits;
994 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
1005 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
1009 return trunc(width);
1017 assert(width <= BitWidth &&
"Invalid APInt Truncate request");
1021 return trunc(width);
1028 assert(Width >= BitWidth &&
"Invalid APInt SignExtend request");
1033 if (Width == BitWidth)
1049 Result.clearUnusedBits();
1055 assert(width >= BitWidth &&
"Invalid APInt ZeroExtend request");
1058 return APInt(width, U.VAL);
1060 if (width == BitWidth)
1076 if (BitWidth < width)
1078 if (BitWidth > width)
1079 return trunc(width);
1084 if (BitWidth < width)
1086 if (BitWidth > width)
1087 return trunc(width);
1099void APInt::ashrSlowCase(
unsigned ShiftAmt) {
1112 if (WordsToMove != 0) {
1118 if (BitShift == 0) {
1119 std::memmove(U.pVal, U.pVal + WordShift, WordsToMove *
APINT_WORD_SIZE);
1122 for (
unsigned i = 0; i != WordsToMove - 1; ++i)
1123 U.pVal[i] = (U.pVal[i + WordShift] >> BitShift) |
1128 U.pVal[WordsToMove - 1] =
1129 (int64_t)U.pVal[WordShift + WordsToMove - 1] >> BitShift;
1134 std::memset(U.pVal + WordsToMove, Negative ? -1 : 0,
1147void APInt::lshrSlowCase(
unsigned ShiftAmt) {
1159void APInt::shlSlowCase(
unsigned ShiftAmt) {
1169 APInt rot = rotateAmt;
1186 rotateAmt %= BitWidth;
1189 return shl(rotateAmt) |
lshr(BitWidth - rotateAmt);
1199 rotateAmt %= BitWidth;
1202 return lshr(rotateAmt) |
shl(BitWidth - rotateAmt);
1231 return lg +
unsigned((*
this)[lg - 1]);
1248 if (magnitude <= 5) {
1249 static const uint8_t results[32] = {
1254 4, 4, 4, 4, 4, 4, 4, 4,
1255 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1265 if (magnitude < 52) {
1266 return APInt(BitWidth,
1276 unsigned nbits = BitWidth, i = 4;
1277 APInt testy(BitWidth, 16);
1278 APInt x_old(BitWidth, 1);
1279 APInt x_new(BitWidth, 0);
1280 APInt two(BitWidth, 2);
1283 for (;; i += 2, testy = testy.
shl(2))
1284 if (i >= nbits || this->
ule(testy)) {
1285 x_old = x_old.
shl(i / 2);
1291 x_new = (this->
udiv(x_old) + x_old).
udiv(two);
1292 if (x_old.
ule(x_new))
1303 APInt square(x_old * x_old);
1304 APInt nextSquare((x_old + 1) * (x_old +1));
1305 if (this->
ult(square))
1307 assert(this->
ule(nextSquare) &&
"Error in APInt::sqrt computation");
1308 APInt midpoint((nextSquare - square).
udiv(two));
1309 APInt offset(*
this - square);
1310 if (offset.
ult(midpoint))
1318 "multiplicative inverse is only defined for odd numbers!");
1321 APInt Factor = *
this;
1323 while (!(
T = *
this * Factor).
isOne())
1324 Factor *= 2 - std::move(
T);
1333 unsigned m,
unsigned n) {
1334 assert(u &&
"Must provide dividend");
1335 assert(v &&
"Must provide divisor");
1336 assert(q &&
"Must provide quotient");
1337 assert(u != v && u != q && v != q &&
"Must use different memory");
1338 assert(n>1 &&
"n must be > 1");
1346#define DEBUG_KNUTH(X) LLVM_DEBUG(X)
1348#define DEBUG_KNUTH(X) do {} while(false)
1369 for (
unsigned i = 0; i < m+n; ++i) {
1370 uint32_t u_tmp = u[i] >> (32 - shift);
1371 u[i] = (u[i] << shift) | u_carry;
1374 for (
unsigned i = 0; i < n; ++i) {
1375 uint32_t v_tmp = v[i] >> (32 - shift);
1376 v[i] = (v[i] << shift) | v_carry;
1404 if (qp == b || qp*v[n-2] > b*rp + u[j+n-2]) {
1407 if (rp < b && (qp == b || qp*v[n-2] > b*rp + u[j+n-2]))
1410 DEBUG_KNUTH(
dbgs() <<
"KnuthDiv: qp == " << qp <<
", rp == " << rp <<
'\n');
1421 for (
unsigned i = 0; i < n; ++i) {
1423 int64_t subres = int64_t(u[j+i]) - borrow -
Lo_32(p);
1424 u[j+i] =
Lo_32(subres);
1427 <<
", borrow = " << borrow <<
'\n');
1429 bool isNeg = u[j+n] < borrow;
1430 u[j+n] -=
Lo_32(borrow);
1448 for (
unsigned i = 0; i < n; i++) {
1449 uint32_t limit = std::min(u[j+i],v[i]);
1450 u[j+i] += v[i] + carry;
1451 carry = u[j+i] < limit || (carry && u[j+i] == limit);
1476 for (
int i = n-1; i >= 0; i--) {
1477 r[i] = (u[i] >> shift) | carry;
1478 carry = u[i] << (32 - shift);
1482 for (
int i = n-1; i >= 0; i--) {
1492void APInt::divide(
const WordType *
LHS,
unsigned lhsWords,
const WordType *
RHS,
1493 unsigned rhsWords, WordType *Quotient, WordType *Remainder) {
1494 assert(lhsWords >= rhsWords &&
"Fractional result");
1503 unsigned n = rhsWords * 2;
1504 unsigned m = (lhsWords * 2) - n;
1508 uint32_t SPACE[128];
1509 uint32_t *U =
nullptr;
1510 uint32_t *
V =
nullptr;
1511 uint32_t *Q =
nullptr;
1512 uint32_t *
R =
nullptr;
1513 if ((Remainder?4:3)*n+2*m+1 <= 128) {
1516 Q = &SPACE[(m+n+1) + n];
1518 R = &SPACE[(m+n+1) + n + (m+n)];
1520 U =
new uint32_t[m + n + 1];
1521 V =
new uint32_t[n];
1522 Q =
new uint32_t[m+n];
1524 R =
new uint32_t[n];
1528 memset(U, 0, (m+n+1)*
sizeof(uint32_t));
1529 for (
unsigned i = 0; i < lhsWords; ++i) {
1530 uint64_t tmp =
LHS[i];
1531 U[i * 2] =
Lo_32(tmp);
1532 U[i * 2 + 1] =
Hi_32(tmp);
1537 memset(V, 0, (n)*
sizeof(uint32_t));
1538 for (
unsigned i = 0; i < rhsWords; ++i) {
1539 uint64_t tmp =
RHS[i];
1541 V[i * 2 + 1] =
Hi_32(tmp);
1545 memset(Q, 0, (m+n) *
sizeof(uint32_t));
1547 memset(R, 0, n *
sizeof(uint32_t));
1553 for (
unsigned i = n; i > 0 &&
V[i-1] == 0; i--) {
1557 for (
unsigned i = m+n; i > 0 && U[i-1] == 0; i--)
1566 assert(n != 0 &&
"Divide by zero?");
1568 uint32_t divisor =
V[0];
1569 uint32_t remainder = 0;
1570 for (
int i = m; i >= 0; i--) {
1571 uint64_t partial_dividend =
Make_64(remainder, U[i]);
1572 if (partial_dividend == 0) {
1575 }
else if (partial_dividend < divisor) {
1577 remainder =
Lo_32(partial_dividend);
1578 }
else if (partial_dividend == divisor) {
1582 Q[i] =
Lo_32(partial_dividend / divisor);
1583 remainder =
Lo_32(partial_dividend - (Q[i] * divisor));
1596 for (
unsigned i = 0; i < lhsWords; ++i)
1597 Quotient[i] =
Make_64(Q[i*2+1], Q[i*2]);
1602 for (
unsigned i = 0; i < rhsWords; ++i)
1603 Remainder[i] =
Make_64(R[i*2+1], R[i*2]);
1607 if (U != &SPACE[0]) {
1616 assert(BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
1620 assert(RHS.U.VAL != 0 &&
"Divide by zero?");
1621 return APInt(BitWidth, U.VAL / RHS.U.VAL);
1626 unsigned rhsBits = RHS.getActiveBits();
1628 assert(rhsWords &&
"Divided by zero???");
1633 return APInt(BitWidth, 0);
1637 if (lhsWords < rhsWords || this->
ult(RHS))
1639 return APInt(BitWidth, 0);
1642 return APInt(BitWidth, 1);
1645 return APInt(BitWidth, this->U.pVal[0] / RHS.U.pVal[0]);
1648 APInt Quotient(BitWidth, 0);
1649 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.
pVal,
nullptr);
1654 assert(RHS != 0 &&
"Divide by zero?");
1658 return APInt(BitWidth, U.VAL / RHS);
1666 return APInt(BitWidth, 0);
1672 return APInt(BitWidth, 0);
1675 return APInt(BitWidth, 1);
1678 return APInt(BitWidth, this->U.pVal[0] / RHS);
1681 APInt Quotient(BitWidth, 0);
1682 divide(U.pVal, lhsWords, &RHS, 1, Quotient.U.
pVal,
nullptr);
1688 if (RHS.isNegative())
1689 return (-(*
this)).udiv(-RHS);
1690 return -((-(*this)).udiv(RHS));
1692 if (RHS.isNegative())
1693 return -(this->
udiv(-RHS));
1694 return this->
udiv(RHS);
1700 return (-(*
this)).udiv(-RHS);
1701 return -((-(*this)).udiv(RHS));
1704 return -(this->
udiv(-RHS));
1705 return this->
udiv(RHS);
1709 assert(BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
1711 assert(RHS.U.VAL != 0 &&
"Remainder by zero?");
1712 return APInt(BitWidth, U.VAL % RHS.U.VAL);
1719 unsigned rhsBits = RHS.getActiveBits();
1721 assert(rhsWords &&
"Performing remainder operation by zero ???");
1726 return APInt(BitWidth, 0);
1729 return APInt(BitWidth, 0);
1730 if (lhsWords < rhsWords || this->
ult(RHS))
1735 return APInt(BitWidth, 0);
1738 return APInt(BitWidth, U.pVal[0] % RHS.U.pVal[0]);
1739 if (RHS.isPowerOf2()) {
1741 APInt Result(*
this);
1742 Result.clearBits(RHS.logBase2(), BitWidth);
1747 APInt Remainder(BitWidth, 0);
1748 divide(U.pVal, lhsWords, RHS.U.pVal, rhsWords,
nullptr, Remainder.U.
pVal);
1753 assert(RHS != 0 &&
"Remainder by zero?");
1776 return U.pVal[0] % RHS;
1779 return U.pVal[0] & (RHS - 1);
1783 divide(U.pVal, lhsWords, &RHS, 1,
nullptr, &Remainder);
1789 if (RHS.isNegative())
1790 return -((-(*this)).urem(-RHS));
1791 return -((-(*this)).urem(RHS));
1793 if (RHS.isNegative())
1794 return this->
urem(-RHS);
1795 return this->
urem(RHS);
1801 return -((-(*this)).urem(-RHS));
1802 return -((-(*this)).urem(RHS));
1805 return this->
urem(-RHS);
1806 return this->
urem(RHS);
1811 assert(LHS.BitWidth == RHS.BitWidth &&
"Bit widths must be the same");
1812 unsigned BitWidth = LHS.BitWidth;
1815 if (LHS.isSingleWord()) {
1816 assert(RHS.U.VAL != 0 &&
"Divide by zero?");
1817 uint64_t QuotVal = LHS.U.VAL / RHS.U.VAL;
1818 uint64_t RemVal = LHS.U.VAL % RHS.U.VAL;
1819 Quotient =
APInt(BitWidth, QuotVal);
1820 Remainder =
APInt(BitWidth, RemVal);
1825 unsigned lhsWords =
getNumWords(LHS.getActiveBits());
1826 unsigned rhsBits = RHS.getActiveBits();
1828 assert(rhsWords &&
"Performing divrem operation by zero ???");
1831 if (lhsWords == 0) {
1832 Quotient =
APInt(BitWidth, 0);
1833 Remainder =
APInt(BitWidth, 0);
1839 Remainder =
APInt(BitWidth, 0);
1842 if (lhsWords < rhsWords || LHS.ult(RHS)) {
1844 Quotient =
APInt(BitWidth, 0);
1849 Quotient =
APInt(BitWidth, 1);
1850 Remainder =
APInt(BitWidth, 0);
1858 Quotient.reallocate(BitWidth);
1859 Remainder.reallocate(BitWidth);
1861 if (lhsWords == 1) {
1865 Quotient = lhsValue / rhsValue;
1866 Remainder = lhsValue % rhsValue;
1871 divide(LHS.U.pVal, lhsWords, RHS.U.pVal, rhsWords, Quotient.U.
pVal,
1874 std::memset(Quotient.U.
pVal + lhsWords, 0,
1876 std::memset(Remainder.U.
pVal + rhsWords, 0,
1882 assert(RHS != 0 &&
"Divide by zero?");
1883 unsigned BitWidth = LHS.BitWidth;
1886 if (LHS.isSingleWord()) {
1887 uint64_t QuotVal = LHS.U.VAL / RHS;
1888 Remainder = LHS.U.VAL % RHS;
1889 Quotient =
APInt(BitWidth, QuotVal);
1894 unsigned lhsWords =
getNumWords(LHS.getActiveBits());
1897 if (lhsWords == 0) {
1898 Quotient =
APInt(BitWidth, 0);
1910 Remainder = LHS.getZExtValue();
1911 Quotient =
APInt(BitWidth, 0);
1916 Quotient =
APInt(BitWidth, 1);
1924 Quotient.reallocate(BitWidth);
1926 if (lhsWords == 1) {
1929 Quotient = lhsValue / RHS;
1930 Remainder = lhsValue % RHS;
1935 divide(LHS.U.pVal, lhsWords, &RHS, 1, Quotient.U.
pVal, &Remainder);
1937 std::memset(Quotient.U.
pVal + lhsWords, 0,
1943 if (LHS.isNegative()) {
1944 if (RHS.isNegative())
1951 }
else if (RHS.isNegative()) {
1960 APInt &Quotient, int64_t &Remainder) {
1962 if (LHS.isNegative()) {
1970 }
else if (RHS < 0) {
1980 APInt Res = *
this+RHS;
1987 APInt Res = *
this+RHS;
1988 Overflow = Res.
ult(RHS);
1993 APInt Res = *
this - RHS;
2000 APInt Res = *
this-RHS;
2001 Overflow = Res.
ugt(*
this);
2012 APInt Res = *
this * RHS;
2015 Overflow = Res.
sdiv(RHS) != *
this ||
2023 if (
countl_zero() + RHS.countl_zero() + 2 <= BitWidth) {
2046 return APInt(BitWidth, 0);
2053 return *
this << ShAmt;
2063 return APInt(BitWidth, 0);
2067 return *
this << ShAmt;
2072 if ((quotient * RHS != *
this) && (
isNegative() != RHS.isNegative()))
2073 return quotient - 1;
2112 return APInt(BitWidth, 0);
2122 bool ResIsNegative =
isNegative() ^ RHS.isNegative();
2167 assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
2169 "Radix should be 2, 8, 10, 16, or 36!");
2172 size_t slen = str.
size();
2173 bool isNeg = *p ==
'-';
2174 if (*p ==
'-' || *p ==
'+') {
2177 assert(slen &&
"String is only a sign, needs a value.");
2179 assert((slen <= numbits || radix != 2) &&
"Insufficient bit width");
2180 assert(((slen-1)*3 <= numbits || radix != 8) &&
"Insufficient bit width");
2181 assert(((slen-1)*4 <= numbits || radix != 16) &&
"Insufficient bit width");
2182 assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
2183 "Insufficient bit width");
2192 unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
2196 unsigned digit =
getDigit(*p, radix);
2197 assert(digit < radix &&
"Invalid character in digit string");
2216 bool formatAsCLiteral,
bool UpperCase,
2217 bool InsertSeparators)
const {
2218 assert((Radix == 10 || Radix == 8 || Radix == 16 || Radix == 2 ||
2220 "Radix should be 2, 8, 10, 16, or 36!");
2222 const char *Prefix =
"";
2223 if (formatAsCLiteral) {
2244 unsigned Grouping = (Radix == 8 || Radix == 10) ? 3 : 4;
2249 Str.push_back(*Prefix);
2256 static const char BothDigits[] =
"0123456789abcdefghijklmnopqrstuvwxyz"
2257 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
2258 const char *Digits = BothDigits + (UpperCase ? 36 : 0);
2262 char *BufPtr = std::end(Buffer);
2278 Str.push_back(*Prefix);
2284 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2286 *--BufPtr = Digits[
N % Radix];
2290 Str.append(BufPtr, std::end(Buffer));
2305 Str.push_back(*Prefix);
2310 unsigned StartDig = Str.size();
2315 if (Radix == 2 || Radix == 8 || Radix == 16) {
2317 unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
2318 unsigned MaskAmt = Radix - 1;
2323 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2324 Str.push_back(
'\'');
2326 Str.push_back(Digits[Digit]);
2334 udivrem(Tmp, Radix, Tmp, Digit);
2335 assert(Digit < Radix &&
"divide failed");
2336 if (InsertSeparators && Pos % Grouping == 0 && Pos > 0)
2337 Str.push_back(
'\'');
2339 Str.push_back(Digits[Digit]);
2345 std::reverse(Str.begin()+StartDig, Str.end());
2348#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
2353 dbgs() <<
"APInt(" << BitWidth <<
"b, "
2354 << U <<
"u " << S <<
"s)\n";
2360 this->
toString(S, 10, isSigned,
false);
2370 "Part width must be divisible by 2!");
2394 for (
unsigned i = 1; i < parts; i++)
2400 for (
unsigned i = 0; i < parts; i++)
2406 for (
unsigned i = 0; i < parts; i++)
2415 return (parts[whichWord(bit)] & maskBit(bit)) != 0;
2420 parts[whichWord(bit)] |= maskBit(bit);
2425 parts[whichWord(bit)] &= ~maskBit(bit);
2431 for (
unsigned i = 0; i < n; i++) {
2432 if (parts[i] != 0) {
2447 if (parts[n] != 0) {
2448 static_assert(
sizeof(parts[n]) <=
sizeof(
uint64_t));
2464 unsigned srcBits,
unsigned srcLSB) {
2466 assert(dstParts <= dstCount);
2469 tcAssign(dst, src + firstSrcPart, dstParts);
2480 dst[dstParts - 1] |= ((src[firstSrcPart + dstParts] &
mask)
2482 }
else if (n > srcBits) {
2488 while (dstParts < dstCount)
2489 dst[dstParts++] = 0;
2497 for (
unsigned i = 0; i < parts; i++) {
2500 dst[i] += rhs[i] + 1;
2517 for (
unsigned i = 0; i < parts; ++i) {
2532 for (
unsigned i = 0; i < parts; i++) {
2535 dst[i] -= rhs[i] + 1;
2555 for (
unsigned i = 0; i < parts; ++i) {
2583 unsigned srcParts,
unsigned dstParts,
2586 assert(dst <= src || dst >= src + srcParts);
2587 assert(dstParts <= srcParts + 1);
2590 unsigned n = std::min(dstParts, srcParts);
2592 for (
unsigned i = 0; i < n; i++) {
2599 if (multiplier == 0 || srcPart == 0) {
2609 if (low + mid < low)
2616 if (low + mid < low)
2621 if (low + carry < low)
2628 if (low + dst[i] < low)
2638 if (srcParts < dstParts) {
2640 assert(srcParts + 1 == dstParts);
2641 dst[srcParts] = carry;
2653 for (
unsigned i = dstParts; i < srcParts; i++)
2666 const WordType *rhs,
unsigned parts) {
2667 assert(dst != lhs && dst != rhs);
2671 for (
unsigned i = 0; i < parts; i++) {
2675 tcMultiplyPart(&dst[i], lhs, rhs[i], 0, parts, parts - i, i != 0);
2684 const WordType *rhs,
unsigned lhsParts,
2685 unsigned rhsParts) {
2687 if (lhsParts > rhsParts)
2690 assert(dst != lhs && dst != rhs);
2692 for (
unsigned i = 0; i < lhsParts; i++) {
2695 tcMultiplyPart(&dst[i], rhs, lhs[i], 0, rhsParts, rhsParts + 1, i != 0);
2711 assert(lhs != remainder && lhs != srhs && remainder != srhs);
2713 unsigned shiftCount =
tcMSB(rhs, parts) + 1;
2714 if (shiftCount == 0)
2724 tcSet(lhs, 0, parts);
2729 int compare =
tcCompare(remainder, srhs, parts);
2735 if (shiftCount == 0)
2739 if ((
mask >>= 1) == 0) {
2760 if (BitShift == 0) {
2761 std::memmove(Dst + WordShift, Dst, (Words - WordShift) *
APINT_WORD_SIZE);
2763 while (Words-- > WordShift) {
2764 Dst[Words] = Dst[Words - WordShift] << BitShift;
2765 if (Words > WordShift)
2786 unsigned WordsToMove = Words - WordShift;
2788 if (BitShift == 0) {
2791 for (
unsigned i = 0; i != WordsToMove; ++i) {
2792 Dst[i] = Dst[i + WordShift] >> BitShift;
2793 if (i + 1 != WordsToMove)
2807 if (lhs[parts] != rhs[parts])
2808 return (lhs[parts] > rhs[parts]) ? 1 : -1;
2864 unsigned RangeWidth) {
2865 unsigned CoeffWidth =
A.getBitWidth();
2866 assert(CoeffWidth ==
B.getBitWidth() && CoeffWidth ==
C.getBitWidth());
2867 assert(RangeWidth <= CoeffWidth &&
2868 "Value range width should be less than coefficient width");
2869 assert(RangeWidth > 1 &&
"Value range bit width should be > 1");
2872 <<
"x + " <<
C <<
", rw:" << RangeWidth <<
'\n');
2875 if (
C.sextOrTrunc(RangeWidth).isZero()) {
2877 return APInt(CoeffWidth, 0);
2895 A =
A.sext(CoeffWidth);
2896 B =
B.sext(CoeffWidth);
2897 C =
C.sext(CoeffWidth);
2901 if (
A.isNegative()) {
2935 assert(
A.isStrictlyPositive());
2939 return V.isNegative() ? V+
T : V+(
A-
T);
2944 if (
B.isNonNegative()) {
2950 if (
C.isStrictlyPositive())
2961 LowkR = RoundUp(LowkR, R);
2971 C -= -RoundUp(-
C, R);
2988 LLVM_DEBUG(
dbgs() << __func__ <<
": updated coefficients " <<
A <<
"x^2 + "
2989 <<
B <<
"x + " <<
C <<
", rw:" << RangeWidth <<
'\n');
2992 assert(
D.isNonNegative() &&
"Negative discriminant");
2996 bool InexactSQ = Q !=
D;
3019 assert(
X.isNonNegative() &&
"Solution should be non-negative");
3021 if (!InexactSQ && Rem.
isZero()) {
3026 assert((SQ*SQ).sle(
D) &&
"SQ = |_sqrt(D)_|, so SQ*SQ <= D");
3044 return std::nullopt;
3052std::optional<unsigned>
3054 assert(
A.getBitWidth() ==
B.getBitWidth() &&
"Must have the same bitwidth");
3056 return std::nullopt;
3057 return A.getBitWidth() - ((
A ^
B).countl_zero() + 1);
3061 bool MatchAllBits) {
3062 unsigned OldBitWidth =
A.getBitWidth();
3063 assert((((OldBitWidth % NewBitWidth) == 0) ||
3064 ((NewBitWidth % OldBitWidth) == 0)) &&
3065 "One size should be a multiple of the other one. "
3066 "Can't do fractional scaling.");
3069 if (OldBitWidth == NewBitWidth)
3078 if (NewBitWidth > OldBitWidth) {
3080 unsigned Scale = NewBitWidth / OldBitWidth;
3081 for (
unsigned i = 0; i != OldBitWidth; ++i)
3083 NewA.
setBits(i * Scale, (i + 1) * Scale);
3085 unsigned Scale = OldBitWidth / NewBitWidth;
3086 for (
unsigned i = 0; i != NewBitWidth; ++i) {
3088 if (
A.extractBits(Scale, i * Scale).isAllOnes())
3091 if (!
A.extractBits(Scale, i * Scale).isZero())
3103 unsigned StoreBytes) {
3104 assert((IntVal.getBitWidth()+7)/8 >= StoreBytes &&
"Integer too small!");
3110 memcpy(Dst, Src, StoreBytes);
3115 while (StoreBytes >
sizeof(
uint64_t)) {
3118 memcpy(Dst + StoreBytes, Src,
sizeof(
uint64_t));
3122 memcpy(Dst, Src +
sizeof(
uint64_t) - StoreBytes, StoreBytes);
3129 unsigned LoadBytes) {
3130 assert((IntVal.getBitWidth()+7)/8 >= LoadBytes &&
"Integer too small!");
3132 const_cast<uint64_t *
>(IntVal.getRawData()));
3137 memcpy(Dst, Src, LoadBytes);
3143 while (LoadBytes >
sizeof(
uint64_t)) {
3146 memcpy(Dst, Src + LoadBytes,
sizeof(
uint64_t));
3150 memcpy(Dst +
sizeof(
uint64_t) - LoadBytes, Src, LoadBytes);
3156 return (C1 & C2) + (C1 ^ C2).ashr(1);
3161 return (C1 & C2) + (C1 ^ C2).lshr(1);
3166 return (C1 | C2) - (C1 ^ C2).ashr(1);
3171 return (C1 | C2) - (C1 ^ C2).lshr(1);
3195 return C1Ext * C2Ext;
3203 return C1Ext * C2Ext;
3207 assert(
N >= 0 &&
"negative exponents not supported.");
3212 int64_t RemainingExponent =
N;
3213 while (RemainingExponent > 0) {
3214 while (RemainingExponent % 2 == 0) {
3216 RemainingExponent /= 2;
3218 --RemainingExponent;
3225 const APInt &Shift) {
3226 assert(
Hi.getBitWidth() ==
Lo.getBitWidth());
3230 return Hi.shl(ShiftAmt) |
Lo.lshr(
Hi.getBitWidth() - ShiftAmt);
3234 const APInt &Shift) {
3235 assert(
Hi.getBitWidth() ==
Lo.getBitWidth());
3239 return Hi.shl(
Hi.getBitWidth() - ShiftAmt) |
Lo.lshr(ShiftAmt);
3244 assert(BW == RHS.getBitWidth() &&
"Operand mismatch");
3245 APInt Result(BW, 0);
3246 for (
unsigned I :
seq(std::min(RHS.getActiveBits(), BW - LHS.countr_zero())))
3253 assert(LHS.getBitWidth() == RHS.getBitWidth());
3254 return clmul(LHS.reverseBits(), RHS.reverseBits()).reverseBits();
3258 assert(LHS.getBitWidth() == RHS.getBitWidth());
3259 return clmulr(LHS, RHS).lshr(1);
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< 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.
static bool isNeg(Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
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
bool sgt(const APInt &RHS) const
Signed greater than comparison.
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
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.
LLVM_ABI APInt sqrt() const
Compute the square root.
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.
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.
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 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 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 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.
LLVM_ABI APInt GreatestCommonDivisor(APInt A, APInt B)
Compute GCD of two unsigned APInt values.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
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)
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.
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.
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.
FunctionAddr VTableAddr Count
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
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
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.
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
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)
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)