mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-23 17:24:48 +00:00
Return word_t from read.
This removes the need for a special Read64. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221909 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -311,13 +311,9 @@ public:
|
|||||||
BitsInCurWord = 0;
|
BitsInCurWord = 0;
|
||||||
|
|
||||||
// Skip over any bits that are already consumed.
|
// Skip over any bits that are already consumed.
|
||||||
if (WordBitNo) {
|
if (WordBitNo)
|
||||||
if (sizeof(word_t) > 4)
|
|
||||||
Read64(WordBitNo);
|
|
||||||
else
|
|
||||||
Read(WordBitNo);
|
Read(WordBitNo);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void fillCurWord() {
|
void fillCurWord() {
|
||||||
assert(Size == 0 || NextChar < (unsigned)Size);
|
assert(Size == 0 || NextChar < (unsigned)Size);
|
||||||
@ -341,15 +337,17 @@ public:
|
|||||||
BitsInCurWord = BytesRead * 8;
|
BitsInCurWord = BytesRead * 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Read(unsigned NumBits) {
|
word_t Read(unsigned NumBits) {
|
||||||
assert(NumBits && NumBits <= 32 &&
|
static const unsigned BitsInWord = sizeof(word_t) * 8;
|
||||||
"Cannot return zero or more than 32 bits!");
|
|
||||||
|
assert(NumBits && NumBits <= BitsInWord &&
|
||||||
|
"Cannot return zero or more than BitsInWord bits!");
|
||||||
|
|
||||||
static const unsigned Mask = sizeof(word_t) > 4 ? 0x3f : 0x1f;
|
static const unsigned Mask = sizeof(word_t) > 4 ? 0x3f : 0x1f;
|
||||||
|
|
||||||
// If the field is fully contained by CurWord, return it quickly.
|
// If the field is fully contained by CurWord, return it quickly.
|
||||||
if (BitsInCurWord >= NumBits) {
|
if (BitsInCurWord >= NumBits) {
|
||||||
uint32_t R = uint32_t(CurWord) & (~0U >> (32-NumBits));
|
word_t R = CurWord & (~word_t(0) >> (BitsInWord - NumBits));
|
||||||
|
|
||||||
// Use a mask to avoid undefined behavior.
|
// Use a mask to avoid undefined behavior.
|
||||||
CurWord >>= (NumBits & Mask);
|
CurWord >>= (NumBits & Mask);
|
||||||
@ -358,7 +356,7 @@ public:
|
|||||||
return R;
|
return R;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t R = BitsInCurWord ? uint32_t(CurWord) : 0;
|
word_t R = BitsInCurWord ? CurWord : 0;
|
||||||
unsigned BitsLeft = NumBits - BitsInCurWord;
|
unsigned BitsLeft = NumBits - BitsInCurWord;
|
||||||
|
|
||||||
fillCurWord();
|
fillCurWord();
|
||||||
@ -367,26 +365,18 @@ public:
|
|||||||
if (BitsLeft > BitsInCurWord)
|
if (BitsLeft > BitsInCurWord)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
uint32_t R2 =
|
word_t R2 = CurWord & (~word_t(0) >> (BitsInWord - BitsLeft));
|
||||||
uint32_t(CurWord) & (~word_t(0) >> (sizeof(word_t) * 8 - BitsLeft));
|
|
||||||
|
|
||||||
// Use a mask to avoid undefined behavior.
|
// Use a mask to avoid undefined behavior.
|
||||||
CurWord >>= (BitsLeft & Mask);
|
CurWord >>= (BitsLeft & Mask);
|
||||||
|
|
||||||
BitsInCurWord -= BitsLeft;
|
BitsInCurWord -= BitsLeft;
|
||||||
|
|
||||||
R |= uint32_t(R2 << (NumBits - BitsLeft));
|
R |= R2 << (NumBits - BitsLeft);
|
||||||
|
|
||||||
return R;
|
return R;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t Read64(unsigned NumBits) {
|
|
||||||
if (NumBits <= 32) return Read(NumBits);
|
|
||||||
|
|
||||||
uint64_t V = Read(32);
|
|
||||||
return V | (uint64_t)Read(NumBits-32) << 32;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t ReadVBR(unsigned NumBits) {
|
uint32_t ReadVBR(unsigned NumBits) {
|
||||||
uint32_t Piece = Read(NumBits);
|
uint32_t Piece = Read(NumBits);
|
||||||
if ((Piece & (1U << (NumBits-1))) == 0)
|
if ((Piece & (1U << (NumBits-1))) == 0)
|
||||||
|
Reference in New Issue
Block a user