Commit 69837c2f authored by Mathis Rosenhauer's avatar Mathis Rosenhauer Committed by Thomas Jahns

Use gcc intrinsic for BSR. TODO: look into gcc sources for better C version

parent ce2f70dc
......@@ -30,6 +30,16 @@ AC_TYPE_UINT8_T
# Checks for library functions.
AC_CHECK_FUNCS([memset strstr])
AC_MSG_CHECKING(for __builtin_clzl)
AC_TRY_LINK([],[
__builtin_clzl(1);
],[
AC_DEFINE(AEC_HAVE___BUILTIN_CLZL, 1, \
[Define to 1 if you have the '__builtin__clzl' function.])
AC_MSG_RESULT(yes)
],[
AC_MSG_RESULT(no)
])
AC_CONFIG_FILES([Makefile \
src/Makefile \
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment