summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Giacomelli <giac2000@hotmail.com>2008-09-23 00:51:22 +0000
committerMichael Giacomelli <giac2000@hotmail.com>2008-09-23 00:51:22 +0000
commit9bc16e491dff45c4eda193895d2d042290d7f079 (patch)
treea45ec05a361b279ba7d70471d63811c6da415ea9
parent0a1d3653bdd016493189e6cc4e318d2a5cdd77a8 (diff)
downloadrockbox-9bc16e491dff45c4eda193895d2d042290d7f079.tar.gz
rockbox-9bc16e491dff45c4eda193895d2d042290d7f079.zip
Add simple ASMed fixed point multiply functions for ARM to AC3. Gives a 38% speed up on my one sample with a Sansa.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18570 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/liba52/a52_internal.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/apps/codecs/liba52/a52_internal.h b/apps/codecs/liba52/a52_internal.h
index cd3286b17a..0db16a8bcf 100644
--- a/apps/codecs/liba52/a52_internal.h
+++ b/apps/codecs/liba52/a52_internal.h
@@ -166,6 +166,36 @@ typedef int16_t quantizer_t;
166 : [A] "r" ((a)), [B] "r" ((b))); \ 166 : [A] "r" ((a)), [B] "r" ((b))); \
167 t; \ 167 t; \
168}) 168})
169
170#elif defined(CPU_ARM)
171#define MUL(x, y) \
172 ({ int32_t __hi; \
173 uint32_t __lo; \
174 int32_t __result; \
175 asm ("smull %0, %1, %3, %4\n\t" \
176 "movs %2, %1, lsl #2" \
177 : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
178 : "%r" (x), "r" (y) \
179 : "cc"); \
180 __result; \
181 })
182
183
184#define MUL_L(x, y) \
185 ({ int32_t __hi; \
186 uint32_t __lo; \
187 int32_t __result; \
188 asm ("smull %0, %1, %3, %4\n\t" \
189 "movs %0, %0, lsr %5\n\t" \
190 "adc %2, %0, %1, lsl %6" \
191 : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
192 : "%r" (x), "r" (y), \
193 "M" (26), "M" (32 - 26) \
194 : "cc"); \
195 __result; \
196 })
197
198
169#elif 1 199#elif 1
170#define MUL(a,b) \ 200#define MUL(a,b) \
171({ int32_t _ta=(a), _tb=(b), _tc; \ 201({ int32_t _ta=(a), _tb=(b), _tc; \