forked from len0rd/rockbox
slightly faster asm av_log2 for armv6 (currently only Gigabeat S)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23868 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
491e0978ec
commit
cd22b32450
1 changed files with 14 additions and 2 deletions
|
@ -76,12 +76,24 @@ unsigned udiv32_arm(unsigned a, unsigned b);
|
||||||
|
|
||||||
/* TODO figure out if we really need to care about calculating
|
/* TODO figure out if we really need to care about calculating
|
||||||
av_log2(0) */
|
av_log2(0) */
|
||||||
#if (defined(CPU_ARM) && (ARM_ARCH > 4))
|
#ifdef CPU_ARM
|
||||||
|
#if ARM_ARCH > 5
|
||||||
|
static inline unsigned int av_log2(uint32_t v)
|
||||||
|
{
|
||||||
|
unsigned int r;
|
||||||
|
asm volatile("clz %[r], %[v]\n\t" /* count leading zeroes */
|
||||||
|
"rsb %[r], %[r], #31\n\t" /* r = 31 - leading zeroes */
|
||||||
|
"usat %[r], #5, %[r]\n\t" /* unsigned saturate r so -1 -> 0 */
|
||||||
|
:[r] "=r" (r) : [v] "r" (v));
|
||||||
|
return(r);
|
||||||
|
}
|
||||||
|
#elif ARM_ARCH > 4
|
||||||
static inline unsigned int av_log2(uint32_t v)
|
static inline unsigned int av_log2(uint32_t v)
|
||||||
{
|
{
|
||||||
return v ? 31 - __builtin_clz(v) : 0;
|
return v ? 31 - __builtin_clz(v) : 0;
|
||||||
}
|
}
|
||||||
#else
|
#endif
|
||||||
|
#else /* CPU_ARM */
|
||||||
/* From libavutil/common.h */
|
/* From libavutil/common.h */
|
||||||
extern const uint8_t ff_log2_tab[256] ICONST_ATTR;
|
extern const uint8_t ff_log2_tab[256] ICONST_ATTR;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue