Implement a getBitsNeeded method to determine how many bits are needed to

represent a string in binary form by an APInt.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35968 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer
2007-04-13 19:19:07 +00:00
parent 4beccb897d
commit 57ae4f5f01
2 changed files with 43 additions and 0 deletions

View File

@ -659,6 +659,43 @@ APInt& APInt::flip(uint32_t bitPosition) {
return *this;
}
uint32_t APInt::getBitsNeeded(const char* str, uint32_t slen, uint8_t radix) {
assert(str != 0 && "Invalid value string");
assert(slen > 0 && "Invalid string length");
// Each computation below needs to know if its negative
uint32_t isNegative = str[0] == '-';
if (isNegative) {
slen--;
str++;
}
// For radixes of power-of-two values, the bits required is accurately and
// easily computed
if (radix == 2)
return slen + isNegative;
if (radix == 8)
return slen * 3 + isNegative;
if (radix == 16)
return slen * 4 + isNegative;
// Otherwise it must be radix == 10, the hard case
assert(radix == 10 && "Invalid radix");
// This is grossly inefficient but accurate. We could probably do something
// with a computation of roughly slen*64/20 and then adjust by the value of
// the first few digits. But, I'm not sure how accurate that could be.
// Compute a sufficient number of bits that is always large enough but might
// be too large. This avoids the assertion in the constructor.
uint32_t sufficient = slen*64/18;
// Convert to the actual binary value.
APInt tmp(sufficient, str, slen, radix);
// Compute how many bits are required.
return isNegative + tmp.logBase2();
}
uint64_t APInt::getHashValue() const {
// Put the bit width into the low order bits.
uint64_t hash = BitWidth;