summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorWincent Balin <wincent@rockbox.org>2010-06-04 18:21:47 +0000
committerWincent Balin <wincent@rockbox.org>2010-06-04 18:21:47 +0000
commitd166d61b09e40a010c8a3b98b40b8b075e5af463 (patch)
treec2ebe3e1211fbb6176e9bedb6957cc63a5c2f08a /apps
parent2464eaeba16819017072fd0739bb770e22a92b73 (diff)
downloadrockbox-d166d61b09e40a010c8a3b98b40b8b075e5af463.tar.gz
rockbox-d166d61b09e40a010c8a3b98b40b8b075e5af463.zip
pdbox: Added Coldfire multiplication optimization by Buschel.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26550 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/pdbox/PDa/src/m_fixed.h25
1 files changed, 22 insertions, 3 deletions
diff --git a/apps/plugins/pdbox/PDa/src/m_fixed.h b/apps/plugins/pdbox/PDa/src/m_fixed.h
index 2a89a18b5a..d46299efe6 100644
--- a/apps/plugins/pdbox/PDa/src/m_fixed.h
+++ b/apps/plugins/pdbox/PDa/src/m_fixed.h
@@ -16,7 +16,8 @@ typedef int t_sample;
16 16
17/* fixed point multiplication and division */ 17/* fixed point multiplication and division */
18 18
19#if defined(ROCKBOX) && defined(CPU_ARM) 19#ifdef ROCKBOX
20#if defined(CPU_ARM)
20#define mult(A,B) \ 21#define mult(A,B) \
21 ({ \ 22 ({ \
22 t_fixed lo; \ 23 t_fixed lo; \
@@ -30,10 +31,28 @@ typedef int t_sample;
30 lo; \ 31 lo; \
31 }) 32 })
32#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) ) 33#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) )
33#else /* ROCKBOX && CPU_ARM */ 34#elif defined(CPU_COLDFIRE)
35#define mult(a,b) mult_cf((a),(b))
36static inline t_fixed mult_cf(t_fixed x, t_fixed y)
37{
38 t_fixed t1, t2;
39 asm volatile (
40 "mac.l %[x],%[y],%%acc0 \n" /* multiply */
41 "mulu.l %[y],%[x] \n" /* get low half, avoid emac stall */
42 "movclr.l %%acc0,%[t1] \n" /* get higher half */
43 "asl.l %[shl],%[t1] \n" /* hi <<= 13, plus one free */
44 "lsr.l %[shr],%[x] \n" /* (unsigned)lo >>= 18 */
45 "or.l %[x],%[t1] \n" /* combine result */
46 : [t1]"=&d"(t1), [t2]"=&d"(t2), [x]"+d"(x)
47 : [y]"d"(y), [shl]"d"(31-fix1), [shr]"d"(fix1));
48 return t1;
49}
50#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) )
51#endif /* CPU_... */
52#else /* ROCKBOX */
34#define mult(a,b) (long long)(((long long) (a) * (long long) (b))>>fix1) 53#define mult(a,b) (long long)(((long long) (a) * (long long) (b))>>fix1)
35#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) ) 54#define idiv(a,b) ((((long long) (a) )<<fix1)/(long long) (b) )
36#endif /* ROCKBOX && CPU_ARM */ 55#endif /* ROCKBOX */
37 56
38/* conversion macros */ 57/* conversion macros */
39 58