Move av_log2 function and asociated table to the codec lib, remove 3 identical implementations, always have LUT in iram (gives a *tiny* speedup on coldfire), make the clz based function return the same value as the non clz based function for 0 input to be safe (slows down flac ~2% on the gigabeat S)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23858 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Nils Wallménius 2009-12-05 16:47:43 +00:00
parent 0651fe572b
commit b9d7f98f8c
7 changed files with 50 additions and 109 deletions

View file

@ -19,6 +19,9 @@
*
****************************************************************************/
#ifndef __CODECLIB_H__
#define __CODECLIB_H__
#include "config.h"
#include "codecs.h"
#include <sys/types.h>
@ -71,6 +74,37 @@ unsigned udiv32_arm(unsigned a, unsigned b);
#define UDIV32(a, b) (a / b)
#endif
/* TODO figure out if we really need to care about calculating
av_log2(0) */
#if (defined(CPU_ARM) && (ARM_ARCH > 4))
static inline unsigned int av_log2(uint32_t v)
{
unsigned int lz = __builtin_clz(v);
return 31 - lz + (lz >> 5); /* make sure av_log2(0) returns 0 */
}
#else
/* From libavutil/common.h */
extern const uint8_t ff_log2_tab[256] ICONST_ATTR;
static inline unsigned int av_log2(unsigned int v)
{
int n;
n = 0;
if (v & 0xffff0000) {
v >>= 16;
n += 16;
}
if (v & 0xff00) {
v >>= 8;
n += 8;
}
n += ff_log2_tab[v];
return n;
}
#endif
/* Various codec helper functions */
int codec_init(void);
@ -82,3 +116,5 @@ void __cyg_profile_func_enter(void *this_fn, void *call_site)
void __cyg_profile_func_exit(void *this_fn, void *call_site)
NO_PROF_ATTR ICODE_ATTR;
#endif
#endif /* __CODECLIB_H__ */