diff options
author | Pascal Massimino <pascal.massimino@gmail.com> | 2017-01-17 23:52:37 -0800 |
---|---|---|
committer | Pascal Massimino <pascal.massimino@gmail.com> | 2017-01-17 23:52:37 -0800 |
commit | a345068abae73446700e250f2ba24ffcfd313d18 (patch) | |
tree | cf9d8484b0b7e228484a1261499a0f758bfcee88 | |
parent | 1dc82a6bba617399b149d856e8b25116628d36cc (diff) | |
download | libwebp-a345068abae73446700e250f2ba24ffcfd313d18.tar.gz |
ARM: speed up bitreader by avoiding tables
(and using BitsLog2Floor() from utils.h instead)
9-10% speed-up, apparently
Change-Id: I9acae4a4dceb1ddcc99306f99b722079bb06f6f8
-rw-r--r-- | src/utils/bit_reader_inl.h | 28 |
1 files changed, 8 insertions, 20 deletions
diff --git a/src/utils/bit_reader_inl.h b/src/utils/bit_reader_inl.h index db8aca9a..bb998240 100644 --- a/src/utils/bit_reader_inl.h +++ b/src/utils/bit_reader_inl.h @@ -116,31 +116,19 @@ static WEBP_INLINE int VP8GetBit(VP8BitReader* const br, int prob) { const int pos = br->bits_; const range_t split = (range * prob) >> 8; const range_t value = (range_t)(br->value_ >> pos); -#if defined(__arm__) || defined(_M_ARM) // ARM-specific - const int bit = ((int)(split - value) >> 31) & 1; - if (value > split) { - range -= split + 1; + const int bit = (value > split); + if (bit) { + range -= split; br->value_ -= (bit_t)(split + 1) << pos; } else { - range = split; + range = split + 1; } -#else // faster version on x86 - int bit; // Don't use 'const int bit = (value > split);", it's slower. - if (value > split) { - range -= split + 1; - br->value_ -= (bit_t)(split + 1) << pos; - bit = 1; - } else { - range = split; - bit = 0; - } -#endif - if (range <= (range_t)0x7e) { - const int shift = kVP8Log2Range[range]; - range = kVP8NewRange[range]; + { + const int shift = 7 ^ BitsLog2Floor(range); + range <<= shift; br->bits_ -= shift; } - br->range_ = range; + br->range_ = range - 1; return bit; } } |