/// This enum is just used to hold a constant we needed for APInt.
enum {
- APINT_BITS_PER_WORD = sizeof(uint64_t) * 8
+ APINT_BITS_PER_WORD = sizeof(uint64_t) * 8,
+ APINT_WORD_SIZE = sizeof(uint64_t)
};
/// Here one word's bitwidth equals to that of uint64_t.
}
/// This method is used internally to clear the to "N" bits that are not used
- /// by the APInt. This is needed after a word is assigned a value to ensure
- /// that those bits are zero'd out.
+ /// by the APInt. This is needed after the most significant word is assigned
+ /// a value to ensure that those bits are zero'd out.
/// @brief Clear high order bits
inline void clearUnusedBits() {
if (isSingleWord())
}
/// @returns the corresponding word for the specified bit position.
- /// This is a constant version.
+ /// @brief Get the word corresponding to a bit position
inline uint64_t getWord(uint32_t bitPosition) const {
return isSingleWord() ? VAL : pVal[whichWord(bitPosition)];
}
- /// @brief Converts a char array into an integer.
+ /// This is used by the constructors that take string arguments.
+ /// @brief Converts a char array into an APInt
void fromString(uint32_t numBits, const char *StrStart, uint32_t slen,
uint8_t radix);
+ /// This is used by the toString method to divide by the radix. It simply
+ /// provides a more convenient form of divide for internal use.
+ /// @brief An internal division function for dividing APInts.
+ static void divide(const APInt LHS, uint32_t lhsWords,
+ const APInt &RHS, uint32_t rhsWords,
+ APInt *Quotient, APInt *Remainder);
+
+#ifndef NDEBUG
+ /// @brief debug method
+ void dump() const;
+#endif
+
public:
- /// @brief Create a new APInt of numBits bit-width, and initialized as val.
+ /// @brief Create a new APInt of numBits width, initialized as val.
APInt(uint32_t numBits, uint64_t val);
- /// @brief Create a new APInt of numBits bit-width, and initialized as
- /// bigVal[].
+ /// Note that numWords can be smaller or larger than the corresponding bit
+ /// width but any extraneous bits will be dropped.
+ /// @brief Create a new APInt of numBits width, initialized as bigVal[].
APInt(uint32_t numBits, uint32_t numWords, uint64_t bigVal[]);
/// @brief Create a new APInt by translating the string represented
/// computations to see how "wide" the value is.
/// @brief Compute the number of active bits in the value
inline uint32_t getActiveBits() const {
- return getNumWords() * APINT_BITS_PER_WORD - countLeadingZeros();
+ return BitWidth - countLeadingZeros();
}
/// @returns a uint64_t value from this APInt. If this APInt contains a single