LLVM 20.0.0git
|
This class provides support for dynamic arbitrary-precision arithmetic. More...
#include "llvm/ADT/DynamicAPInt.h"
This class provides support for dynamic arbitrary-precision arithmetic.
Unlike APInt, this extends the precision as necessary to prevent overflows and supports operations between objects with differing internal precisions.
This is optimized for small-values by providing fast-paths for the cases when the value stored fits in 64-bits. We annotate all fastpaths by using the LLVM_LIKELY/LLVM_UNLIKELY annotations. Removing these would result in a 1.2x performance slowdown.
We always_inline all operations; removing these results in a 1.5x performance slowdown.
When isLarge returns true, a SlowMPInt is held in the union. If isSmall returns true, the int64_t is held. We don't have a separate field for indicating this, and instead "steal" memory from ValLarge when it is not in use because we know that the memory layout of APInt is such that BitWidth doesn't overlap with ValSmall (see static_assert_layout). Using std::variant instead would lead to significantly worse performance.
Definition at line 44 of file DynamicAPInt.h.
|
inlineexplicit |
Definition at line 112 of file DynamicAPInt.h.
References ValLarge.
|
inline |
Definition at line 116 of file DynamicAPInt.h.
Referenced by divByPositive(), divByPositiveInPlace(), operator%(), operator*(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), operator/(), and operator/=().
|
inline |
Definition at line 117 of file DynamicAPInt.h.
References LLVM_UNLIKELY, and ValLarge.
|
inline |
Definition at line 121 of file DynamicAPInt.h.
References LLVM_UNLIKELY, and ValLarge.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt llvm::DynamicAPInt::divByPositive | ( | const DynamicAPInt & | O | ) | const |
Definition at line 332 of file DynamicAPInt.h.
References assert(), DynamicAPInt(), and LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::divByPositiveInPlace | ( | const DynamicAPInt & | O | ) |
Definition at line 492 of file DynamicAPInt.h.
References assert(), DynamicAPInt(), and LLVM_LIKELY.
void DynamicAPInt::dump | ( | ) | const |
Definition at line 35 of file DynamicAPInt.cpp.
References llvm::dbgs(), and print().
|
inlineexplicit |
Definition at line 139 of file DynamicAPInt.h.
LLVM_ATTRIBUTE_ALWAYS_INLINE bool llvm::DynamicAPInt::operator!= | ( | const DynamicAPInt & | O | ) | const |
Definition at line 256 of file DynamicAPInt.h.
References LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt llvm::DynamicAPInt::operator% | ( | const DynamicAPInt & | O | ) | const |
This operation cannot overflow.
Definition at line 407 of file DynamicAPInt.h.
References DynamicAPInt(), and LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::operator%= | ( | const DynamicAPInt & | O | ) |
Definition at line 503 of file DynamicAPInt.h.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt llvm::DynamicAPInt::operator* | ( | const DynamicAPInt & | O | ) | const |
Definition at line 317 of file DynamicAPInt.h.
References DynamicAPInt(), LLVM_LIKELY, and llvm::MulOverflow().
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::operator*= | ( | const DynamicAPInt & | O | ) |
Definition at line 461 of file DynamicAPInt.h.
References DynamicAPInt(), LLVM_LIKELY, and llvm::MulOverflow().
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt llvm::DynamicAPInt::operator+ | ( | const DynamicAPInt & | O | ) | const |
Definition at line 291 of file DynamicAPInt.h.
References llvm::AddOverflow(), DynamicAPInt(), and LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::operator++ | ( | ) |
Definition at line 506 of file DynamicAPInt.h.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::operator+= | ( | const DynamicAPInt & | O | ) |
Definition at line 427 of file DynamicAPInt.h.
References llvm::AddOverflow(), DynamicAPInt(), and LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt llvm::DynamicAPInt::operator- | ( | ) | const |
Definition at line 414 of file DynamicAPInt.h.
References DynamicAPInt(), and LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt llvm::DynamicAPInt::operator- | ( | const DynamicAPInt & | O | ) | const |
Definition at line 304 of file DynamicAPInt.h.
References DynamicAPInt(), LLVM_LIKELY, and llvm::SubOverflow().
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::operator-- | ( | ) |
Definition at line 509 of file DynamicAPInt.h.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::operator-= | ( | const DynamicAPInt & | O | ) |
Definition at line 444 of file DynamicAPInt.h.
References DynamicAPInt(), LLVM_LIKELY, and llvm::SubOverflow().
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt llvm::DynamicAPInt::operator/ | ( | const DynamicAPInt & | O | ) | const |
Definition at line 341 of file DynamicAPInt.h.
References llvm::divideSignedWouldOverflow(), DynamicAPInt(), LLVM_LIKELY, and LLVM_UNLIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & llvm::DynamicAPInt::operator/= | ( | const DynamicAPInt & | O | ) |
Definition at line 478 of file DynamicAPInt.h.
References llvm::divideSignedWouldOverflow(), DynamicAPInt(), LLVM_LIKELY, and LLVM_UNLIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE bool llvm::DynamicAPInt::operator< | ( | const DynamicAPInt & | O | ) | const |
Definition at line 267 of file DynamicAPInt.h.
References LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE bool llvm::DynamicAPInt::operator<= | ( | const DynamicAPInt & | O | ) | const |
Definition at line 273 of file DynamicAPInt.h.
References LLVM_LIKELY.
|
inline |
Definition at line 127 of file DynamicAPInt.h.
References LLVM_LIKELY.
|
inline |
Definition at line 135 of file DynamicAPInt.h.
References X.
LLVM_ATTRIBUTE_ALWAYS_INLINE bool llvm::DynamicAPInt::operator== | ( | const DynamicAPInt & | O | ) | const |
We define the operations here in the header to facilitate inlining.
Definition at line 250 of file DynamicAPInt.h.
References LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE bool llvm::DynamicAPInt::operator> | ( | const DynamicAPInt & | O | ) | const |
Definition at line 262 of file DynamicAPInt.h.
References LLVM_LIKELY.
LLVM_ATTRIBUTE_ALWAYS_INLINE bool llvm::DynamicAPInt::operator>= | ( | const DynamicAPInt & | O | ) | const |
Definition at line 280 of file DynamicAPInt.h.
References LLVM_LIKELY.
raw_ostream & DynamicAPInt::print | ( | raw_ostream & | OS | ) | const |
void DynamicAPInt::static_assert_layout | ( | ) |
Definition at line 21 of file DynamicAPInt.cpp.
|
friend |
Definition at line 352 of file DynamicAPInt.h.
|
friend |
Definition at line 356 of file DynamicAPInt.h.
|
friend |
Definition at line 367 of file DynamicAPInt.h.
|
friend |
Definition at line 388 of file DynamicAPInt.h.
|
friend |
Redeclarations of friend declaration above to make it discoverable by lookups.
|
friend |
Returns the least common multiple of A and B.
Definition at line 398 of file DynamicAPInt.h.
|
friend |
is always non-negative.
Definition at line 380 of file DynamicAPInt.h.
|
friend |
Definition at line 584 of file DynamicAPInt.h.
|
friend |
Definition at line 614 of file DynamicAPInt.h.
|
friend |
Definition at line 552 of file DynamicAPInt.h.
|
friend |
Definition at line 572 of file DynamicAPInt.h.
|
friend |
Definition at line 532 of file DynamicAPInt.h.
|
friend |
Definition at line 544 of file DynamicAPInt.h.
|
friend |
Definition at line 564 of file DynamicAPInt.h.
|
friend |
Definition at line 524 of file DynamicAPInt.h.
|
friend |
Definition at line 536 of file DynamicAPInt.h.
|
friend |
Definition at line 556 of file DynamicAPInt.h.
|
friend |
Definition at line 516 of file DynamicAPInt.h.
|
friend |
Definition at line 540 of file DynamicAPInt.h.
|
friend |
Definition at line 560 of file DynamicAPInt.h.
|
friend |
Definition at line 520 of file DynamicAPInt.h.
|
friend |
Definition at line 548 of file DynamicAPInt.h.
|
friend |
Definition at line 568 of file DynamicAPInt.h.
|
friend |
Definition at line 528 of file DynamicAPInt.h.
|
friend |
Definition at line 594 of file DynamicAPInt.h.
|
friend |
Definition at line 624 of file DynamicAPInt.h.
|
friend |
Definition at line 599 of file DynamicAPInt.h.
|
friend |
Definition at line 629 of file DynamicAPInt.h.
|
friend |
We provide special implementations of the comparison operators rather than calling through as above, as this would result in a 1.2x slowdown.
Definition at line 579 of file DynamicAPInt.h.
|
friend |
Definition at line 609 of file DynamicAPInt.h.
|
friend |
Definition at line 589 of file DynamicAPInt.h.
|
friend |
Definition at line 619 of file DynamicAPInt.h.
|
friend |
Definition at line 604 of file DynamicAPInt.h.
|
friend |
Definition at line 634 of file DynamicAPInt.h.
detail::SlowDynamicAPInt llvm::DynamicAPInt::ValLarge |
Definition at line 47 of file DynamicAPInt.h.
Referenced by DynamicAPInt(), print(), static_assert_layout(), and ~DynamicAPInt().
int64_t llvm::DynamicAPInt::ValSmall |
Definition at line 46 of file DynamicAPInt.h.
Referenced by print(), and static_assert_layout().