diff options
author | Mathis Rosenhauer <rosenhauer@dkrz.de> | 2012-12-07 21:00:17 +0100 |
---|---|---|
committer | Thomas Jahns <jahns@dkrz.de> | 2013-02-19 11:33:02 +0100 |
commit | 69837c2fffa353a9441075f3bf7fc8f227afb2bb (patch) | |
tree | 3ff36d97eedf98658575fd10a92bf818222e7ad3 /src/decode.c | |
parent | ce2f70dc003546873bbbbf667b04ed9df9ff679f (diff) | |
download | libaec-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.c | 10 |
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; } |