- nextword = le16_to_cpu(*(const le16*)istream->data);
- shift = sizeof(istream->bitbuf) * 8 - 16 - istream->bitsleft;
- istream->bitbuf |= (u32)nextword << shift;
- istream->data += 2;
- istream->bitsleft += 16;
- istream->data_bytes_left -= 2;
-
- /* Help the compiler: If it's known at compile-time that num_bits <= 16,
- * a second word will never be needed. */
- if (!(is_constant(num_bits) && num_bits <= 16) &&
- unlikely(istream->bitsleft < num_bits))
- {
- if (unlikely(istream->data_bytes_left < 2)) {
- istream->bitsleft = num_bits;
- return;
- }
- nextword = le16_to_cpu(*(const le16*)istream->data);
- shift = sizeof(istream->bitbuf) * 8 - 16 - istream->bitsleft;
- istream->bitbuf |= (u32)nextword << shift;
- istream->data += 2;
- istream->bitsleft += 16;
- istream->data_bytes_left -= 2;
+ is->bitbuf |= (u32)le16_to_cpu(*(const le16 *)is->next)
+ << (16 - is->bitsleft);
+ is->next += 2;
+ is->bitsleft += 16;
+
+ if (unlikely(num_bits == 17 && is->bitsleft == 16)) {
+ if (unlikely(is->end - is->next < 2))
+ goto overflow;
+
+ is->bitbuf |= (u32)le16_to_cpu(*(const le16 *)is->next);
+ is->next += 2;
+ is->bitsleft = 32;