From 85aad9b3972208b0e34ba0241ebb5314118ae05e Mon Sep 17 00:00:00 2001 From: Andrew Mahone Date: Wed, 9 Dec 2009 02:24:45 +0000 Subject: Extend av_log2 in codeclib into a generic for scanning for set bits, which can provide either log2 or leading-zero-count output, and can force mapping 0 input to 0 output if needed (otherwise 0 input produces undefined result). Replace av_log2 in lib/codeclib.h, floor_log2 and wl_min_lzc in libfaad/common.c and common.h, and count_leading_zeros in libalac/alac.c with macros using bs_generic. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23903 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libfaad/common.c | 53 +---------------------------------------- apps/codecs/libfaad/common.h | 4 +--- apps/codecs/libfaad/sbr_hfgen.c | 8 ------- 3 files changed, 2 insertions(+), 63 deletions(-) (limited to 'apps/codecs/libfaad') diff --git a/apps/codecs/libfaad/common.c b/apps/codecs/libfaad/common.c index debc125b3e..e8340d318d 100644 --- a/apps/codecs/libfaad/common.c +++ b/apps/codecs/libfaad/common.c @@ -241,58 +241,7 @@ uint32_t random_int(void) return (__r1 = (t3 >> 1) | t1 ) ^ (__r2 = (t4 + t4) | t2 ); } -uint32_t ones32(uint32_t x) -{ - x -= ((x >> 1) & 0x55555555); - x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); - x = (((x >> 4) + x) & 0x0f0f0f0f); - x += (x >> 8); - x += (x >> 16); - - return (x & 0x0000003f); -} - -uint32_t floor_log2(uint32_t x) -{ -#if 1 - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - - return (ones32(x) - 1); -#else - uint32_t count = 0; - - while (x >>= 1) - count++; - - return count; -#endif -} - -/* returns position of first bit that is not 0 from msb, - * starting count at lsb */ -uint32_t wl_min_lzc(uint32_t x) -{ -#if 1 - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - - return (ones32(x)); -#else - uint32_t count = 0; - - while (x >>= 1) - count++; - - return (count + 1); -#endif -} +#define floor_log2(x) bs_generic(x, BS_LOG2) #ifdef FIXED_POINT diff --git a/apps/codecs/libfaad/common.h b/apps/codecs/libfaad/common.h index ea028b1b8e..fe0d02b228 100644 --- a/apps/codecs/libfaad/common.h +++ b/apps/codecs/libfaad/common.h @@ -399,9 +399,7 @@ typedef real_t complex_t[2]; /* common functions */ uint8_t cpu_has_sse(void); uint32_t random_int(void); -uint32_t ones32(uint32_t x); -uint32_t floor_log2(uint32_t x); -uint32_t wl_min_lzc(uint32_t x); +#define wl_min_lzc(x) bs_generic(x, BS_LOG2|BS_0_0) #ifdef FIXED_POINT #define LOG2_MIN_INF REAL_CONST(-10000) int32_t log2_int(uint32_t val); diff --git a/apps/codecs/libfaad/sbr_hfgen.c b/apps/codecs/libfaad/sbr_hfgen.c index 4991839218..f77bbd052f 100644 --- a/apps/codecs/libfaad/sbr_hfgen.c +++ b/apps/codecs/libfaad/sbr_hfgen.c @@ -222,10 +222,6 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, exp = wl_min_lzc(mask); - /* improves accuracy */ - if (exp > 0) - exp -= 1; - for (j = offset; j < len + offset; j++) { real_t buf_j = ((QMF_RE(buffer[j][bd])+(1<<(exp-1)))>>exp); @@ -292,10 +288,6 @@ static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTS } exp = wl_min_lzc(mask); - - /* improves accuracy */ - if (exp > 0) - exp -= 1; pow2_to_exp = 1<<(exp-1); -- cgit v1.2.3