diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2007-02-26 21:02:27 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2007-02-26 21:02:27 +0000 |
commit | 794f4725b88060fc2e05449af3cd6a572ea46412 (patch) | |
tree | d0898f392f80893854748947e53a8c53570c4cc5 /lib/Support/APInt.cpp | |
parent | 31a81f0190179b19dc72302dfea05cd1c2f0d22e (diff) |
Implement the getHashValue method.
Fix toString use of getValue to use getZExtValue()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34642 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/APInt.cpp')
-rw-r--r-- | lib/Support/APInt.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index 1a2f0e0b94..44aed75549 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -661,6 +661,21 @@ APInt APInt::getNullValue(uint32_t numBits) { return getMinValue(numBits, false); } +uint64_t APInt::getHashValue() const { + // LLVM only supports bit widths up to 2^23 so shift the bitwidth into the + // high range. This makes the hash unique for integer values < 2^41 bits and + // doesn't hurt for larger values. + uint64_t hash = uint64_t(BitWidth) << (APINT_BITS_PER_WORD - 23); + + // Add the sum of the words to the hash. + if (isSingleWord()) + hash += VAL; + else + for (uint32_t i = 0; i < getNumWords(); ++i) + hash += pVal[i]; + return hash; +} + /// HiBits - This function returns the high "numBits" bits of this APInt. APInt APInt::getHiBits(uint32_t numBits) const { return APIntOps::lshr(*this, BitWidth - numBits); @@ -1660,7 +1675,7 @@ std::string APInt::toString(uint8_t radix, bool wantSigned) const { APInt tmp2(tmp.getBitWidth(), 0); divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2, &APdigit); - uint32_t digit = APdigit.getValue(); + uint32_t digit = APdigit.getZExtValue(); assert(digit < radix && "divide failed"); result.insert(insert_at,digits[digit]); tmp = tmp2; |