summaryrefslogtreecommitdiff
path: root/src/decode.c
diff options
context:
space:
mode:
authorMathis Rosenhauer <rosenhauer@dkrz.de>2012-12-07 21:00:17 +0100
committerThomas Jahns <jahns@dkrz.de>2013-02-19 11:33:02 +0100
commit69837c2fffa353a9441075f3bf7fc8f227afb2bb (patch)
tree3ff36d97eedf98658575fd10a92bf818222e7ad3 /src/decode.c
parentce2f70dc003546873bbbbf667b04ed9df9ff679f (diff)
downloadlibaec-69837c2fffa353a9441075f3bf7fc8f227afb2bb.tar.gz
libaec-69837c2fffa353a9441075f3bf7fc8f227afb2bb.tar.bz2
libaec-69837c2fffa353a9441075f3bf7fc8f227afb2bb.zip
Use gcc intrinsic for BSR. TODO: look into gcc sources for better C version
Diffstat (limited to 'src/decode.c')
-rw-r--r--src/decode.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/decode.c b/src/decode.c
index 4385036..739c218 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -255,15 +255,21 @@ static inline uint32_t direct_get_fs(struct aec_stream *strm)
uint32_t fs = 0;
struct internal_state *state = strm->state;
- if ((state->acc & ((1ULL << state->bitp) - 1)) == 0)
+ state->acc &= ((1ULL << state->bitp) - 1);
+
+ if (state->acc == 0)
fill_acc(strm);
+#ifdef AEC_HAVE___BUILTIN_CLZL
+ fs = __builtin_clzll(state->acc) - (64 - state->bitp);
+ state->bitp -= fs + 1;
+#else
state->bitp--;
while ((state->acc & (1ULL << state->bitp)) == 0) {
state->bitp--;
fs++;
}
-
+#endif
return fs;
}