diff options
author | Nils Wallménius <nils@rockbox.org> | 2009-12-05 16:47:43 +0000 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2009-12-05 16:47:43 +0000 |
commit | b9d7f98f8c5653c9b5d945655cc64934da596142 (patch) | |
tree | 0a25d85df5377aa053287cdc53af6957ab140adf /apps/codecs/lib/codeclib.h | |
parent | 0651fe572b8fe1eb5457325f81a8c9986e479ef6 (diff) | |
download | rockbox-b9d7f98f8c5653c9b5d945655cc64934da596142.tar.gz rockbox-b9d7f98f8c5653c9b5d945655cc64934da596142.zip |
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
Diffstat (limited to 'apps/codecs/lib/codeclib.h')
-rw-r--r-- | apps/codecs/lib/codeclib.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/apps/codecs/lib/codeclib.h b/apps/codecs/lib/codeclib.h index e7f45d3572..bf7b41775a 100644 --- a/apps/codecs/lib/codeclib.h +++ b/apps/codecs/lib/codeclib.h | |||
@@ -19,6 +19,9 @@ | |||
19 | * | 19 | * |
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | 21 | ||
22 | #ifndef __CODECLIB_H__ | ||
23 | #define __CODECLIB_H__ | ||
24 | |||
22 | #include "config.h" | 25 | #include "config.h" |
23 | #include "codecs.h" | 26 | #include "codecs.h" |
24 | #include <sys/types.h> | 27 | #include <sys/types.h> |
@@ -71,6 +74,37 @@ unsigned udiv32_arm(unsigned a, unsigned b); | |||
71 | #define UDIV32(a, b) (a / b) | 74 | #define UDIV32(a, b) (a / b) |
72 | #endif | 75 | #endif |
73 | 76 | ||
77 | /* TODO figure out if we really need to care about calculating | ||
78 | av_log2(0) */ | ||
79 | #if (defined(CPU_ARM) && (ARM_ARCH > 4)) | ||
80 | static inline unsigned int av_log2(uint32_t v) | ||
81 | { | ||
82 | unsigned int lz = __builtin_clz(v); | ||
83 | return 31 - lz + (lz >> 5); /* make sure av_log2(0) returns 0 */ | ||
84 | } | ||
85 | #else | ||
86 | /* From libavutil/common.h */ | ||
87 | extern const uint8_t ff_log2_tab[256] ICONST_ATTR; | ||
88 | |||
89 | static inline unsigned int av_log2(unsigned int v) | ||
90 | { | ||
91 | int n; | ||
92 | |||
93 | n = 0; | ||
94 | if (v & 0xffff0000) { | ||
95 | v >>= 16; | ||
96 | n += 16; | ||
97 | } | ||
98 | if (v & 0xff00) { | ||
99 | v >>= 8; | ||
100 | n += 8; | ||
101 | } | ||
102 | n += ff_log2_tab[v]; | ||
103 | |||
104 | return n; | ||
105 | } | ||
106 | #endif | ||
107 | |||
74 | /* Various codec helper functions */ | 108 | /* Various codec helper functions */ |
75 | 109 | ||
76 | int codec_init(void); | 110 | int codec_init(void); |
@@ -82,3 +116,5 @@ void __cyg_profile_func_enter(void *this_fn, void *call_site) | |||
82 | void __cyg_profile_func_exit(void *this_fn, void *call_site) | 116 | void __cyg_profile_func_exit(void *this_fn, void *call_site) |
83 | NO_PROF_ATTR ICODE_ATTR; | 117 | NO_PROF_ATTR ICODE_ATTR; |
84 | #endif | 118 | #endif |
119 | |||
120 | #endif /* __CODECLIB_H__ */ | ||