Use a more canonical way of computing a mask with N trailing 1s. NFC.

llvm-svn: 222137
This commit is contained in:
Rafael Espindola 2014-11-17 15:46:21 +00:00
parent 9dfcaf4854
commit 5bef24d7e3
1 changed files with 3 additions and 5 deletions

View File

@ -338,16 +338,14 @@ public:
}
word_t Read(unsigned NumBits) {
static const unsigned BitsInWord = sizeof(word_t) * 8;
assert(NumBits && NumBits <= BitsInWord &&
assert(NumBits && NumBits <= sizeof(word_t) * 8 &&
"Cannot return zero or more than BitsInWord bits!");
static const unsigned Mask = sizeof(word_t) > 4 ? 0x3f : 0x1f;
// If the field is fully contained by CurWord, return it quickly.
if (BitsInCurWord >= NumBits) {
word_t R = CurWord & (~word_t(0) >> (BitsInWord - NumBits));
word_t R = CurWord & ((word_t(1) << NumBits) - 1);
// Use a mask to avoid undefined behavior.
CurWord >>= (NumBits & Mask);
@ -365,7 +363,7 @@ public:
if (BitsLeft > BitsInCurWord)
return 0;
word_t R2 = CurWord & (~word_t(0) >> (BitsInWord - BitsLeft));
word_t R2 = CurWord & ((word_t(1) << BitsLeft) - 1);
// Use a mask to avoid undefined behavior.
CurWord >>= (BitsLeft & Mask);