summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal Massimino <pascal.massimino@gmail.com>2017-01-17 23:52:37 -0800
committerPascal Massimino <pascal.massimino@gmail.com>2017-01-17 23:52:37 -0800
commita345068abae73446700e250f2ba24ffcfd313d18 (patch)
treecf9d8484b0b7e228484a1261499a0f758bfcee88
parent1dc82a6bba617399b149d856e8b25116628d36cc (diff)
downloadlibwebp-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.h28
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;
}
}