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.zip
rockbox-9bc16e491dff45c4eda193895d2d042290d7f079.tar.gz
rockbox-9bc16e491dff45c4eda193895d2d042290d7f079.tar.bz2
rockbox-9bc16e491dff45c4eda193895d2d042290d7f079.tar.xz
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 cd3286b..0db16a8 100644
--- a/apps/codecs/liba52/a52_internal.h
+++ b/apps/codecs/liba52/a52_internal.h
@@ -166,6 +166,36 @@ typedef int16_t quantizer_t;
: [A] "r" ((a)), [B] "r" ((b))); \
t; \
})
+
+#elif defined(CPU_ARM)
+#define MUL(x, y) \
+ ({ int32_t __hi; \
+ uint32_t __lo; \
+ int32_t __result; \
+ asm ("smull %0, %1, %3, %4\n\t" \
+ "movs %2, %1, lsl #2" \
+ : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
+ : "%r" (x), "r" (y) \
+ : "cc"); \
+ __result; \
+ })
+
+
+#define MUL_L(x, y) \
+ ({ int32_t __hi; \
+ uint32_t __lo; \
+ int32_t __result; \
+ asm ("smull %0, %1, %3, %4\n\t" \
+ "movs %0, %0, lsr %5\n\t" \
+ "adc %2, %0, %1, lsl %6" \
+ : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \
+ : "%r" (x), "r" (y), \
+ "M" (26), "M" (32 - 26) \
+ : "cc"); \
+ __result; \
+ })
+
+
#elif 1
#define MUL(a,b) \
({ int32_t _ta=(a), _tb=(b), _tc; \