From cd22b32450757b5c204bca9add59b177c27cf4e7 Mon Sep 17 00:00:00 2001 From: Nils Wallménius Date: Sun, 6 Dec 2009 02:03:03 +0000 Subject: 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 --- apps/codecs/lib/codeclib.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'apps/codecs/lib') diff --git a/apps/codecs/lib/codeclib.h b/apps/codecs/lib/codeclib.h index f4fe0a9ea0..4f30b306e3 100644 --- a/apps/codecs/lib/codeclib.h +++ b/apps/codecs/lib/codeclib.h @@ -76,12 +76,24 @@ unsigned udiv32_arm(unsigned a, unsigned b); /* TODO figure out if we really need to care about calculating 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) { return v ? 31 - __builtin_clz(v) : 0; } -#else +#endif +#else /* CPU_ARM */ /* From libavutil/common.h */ extern const uint8_t ff_log2_tab[256] ICONST_ATTR; -- cgit v1.2.3