summaryrefslogtreecommitdiff
path: root/apps/codecs/Tremor/asm_mcf5249.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/Tremor/asm_mcf5249.h')
-rw-r--r--apps/codecs/Tremor/asm_mcf5249.h44
1 files changed, 21 insertions, 23 deletions
diff --git a/apps/codecs/Tremor/asm_mcf5249.h b/apps/codecs/Tremor/asm_mcf5249.h
index 09c74671bc..933d6bb1fc 100644
--- a/apps/codecs/Tremor/asm_mcf5249.h
+++ b/apps/codecs/Tremor/asm_mcf5249.h
@@ -49,13 +49,12 @@ static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) {
49} 49}
50 50
51static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { 51static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) {
52 ogg_int32_t r;
53 asm volatile ("mac.l %[x], %[y], %%acc0;" // multiply 52 asm volatile ("mac.l %[x], %[y], %%acc0;" // multiply
54 "movclr.l %%acc0, %[r];" // move and clear 53 "movclr.l %%acc0, %[x];" // move and clear
55 : [r] "=r" (r) 54 : [x] "+&r" (x)
56 : [x] "r" (x), [y] "r" (y) 55 : [y] "r" (y)
57 : "cc"); 56 : "cc");
58 return r; 57 return x;
59} 58}
60 59
61 60
@@ -64,11 +63,11 @@ static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) {
64 asm volatile ("mac.l %[x], %[y], %%acc0;" // multiply 63 asm volatile ("mac.l %[x], %[y], %%acc0;" // multiply
65 "movclr.l %%acc0, %[r];" // get higher half 64 "movclr.l %%acc0, %[r];" // get higher half
66 "mulu.l %[y], %[x];" // get lower half 65 "mulu.l %[y], %[x];" // get lower half
67 "asl.l #8, %[r];" // hi << 17 66 "asl.l #8, %[r];" // hi << 17
68 "asl.l #8, %[r];" 67 "asl.l #8, %[r];"
69 "lsr.l #8, %[x];" // (unsigned)lo >> 15 68 "lsr.l #8, %[x];" // (unsigned)lo >> 15
70 "lsr.l #7, %[x];" 69 "lsr.l #7, %[x];"
71 "or.l %[x], %[r];" // or 70 "or.l %[x], %[r];" // or
72 : [r] "=&d" (r), [x] "+d" (x) 71 : [r] "=&d" (r), [x] "+d" (x)
73 : [y] "d" (y) 72 : [y] "d" (y)
74 : "cc"); 73 : "cc");
@@ -81,18 +80,17 @@ void XPROD31(ogg_int32_t a, ogg_int32_t b,
81 ogg_int32_t t, ogg_int32_t v, 80 ogg_int32_t t, ogg_int32_t v,
82 ogg_int32_t *x, ogg_int32_t *y) 81 ogg_int32_t *x, ogg_int32_t *y)
83{ 82{
84 ogg_int32_t r;
85 asm volatile ("mac.l %[a], %[t], %%acc0;" 83 asm volatile ("mac.l %[a], %[t], %%acc0;"
86 "mac.l %[b], %[v], %%acc0;" 84 "mac.l %[b], %[v], %%acc0;"
87 "mac.l %[b], %[t], %%acc1;" 85 "mac.l %[b], %[t], %%acc1;"
88 "msac.l %[a], %[v], %%acc1;" 86 "msac.l %[a], %[v], %%acc1;"
89 "movclr.l %%acc0, %[r];" 87 "movclr.l %%acc0, %[a];"
90 "move.l %[r], (%[x]);" 88 "move.l %[a], (%[x]);"
91 "movclr.l %%acc1, %[r];" 89 "movclr.l %%acc1, %[a];"
92 "move.l %[r], (%[y]);" 90 "move.l %[a], (%[y]);"
93 : [r] "=&r" (r) 91 : [a] "+&r" (a)
94 : [x] "a" (x), [y] "a" (y), 92 : [x] "a" (x), [y] "a" (y),
95 [a] "r" (a), [b] "r" (b), [t] "r" (t), [v] "r" (v) 93 [b] "r" (b), [t] "r" (t), [v] "r" (v)
96 : "cc", "memory"); 94 : "cc", "memory");
97} 95}
98 96
@@ -102,23 +100,23 @@ void XNPROD31(ogg_int32_t a, ogg_int32_t b,
102 ogg_int32_t t, ogg_int32_t v, 100 ogg_int32_t t, ogg_int32_t v,
103 ogg_int32_t *x, ogg_int32_t *y) 101 ogg_int32_t *x, ogg_int32_t *y)
104{ 102{
105 ogg_int32_t r;
106 asm volatile ("mac.l %[a], %[t], %%acc0;" 103 asm volatile ("mac.l %[a], %[t], %%acc0;"
107 "msac.l %[b], %[v], %%acc0;" 104 "msac.l %[b], %[v], %%acc0;"
108 "mac.l %[b], %[t], %%acc1;" 105 "mac.l %[b], %[t], %%acc1;"
109 "mac.l %[a], %[v], %%acc1;" 106 "mac.l %[a], %[v], %%acc1;"
110 "movclr.l %%acc0, %[r];" 107 "movclr.l %%acc0, %[a];"
111 "move.l %[r], (%[x]);" 108 "move.l %[a], (%[x]);"
112 "movclr.l %%acc1, %[r];" 109 "movclr.l %%acc1, %[a];"
113 "move.l %[r], (%[y]);" 110 "move.l %[a], (%[y]);"
114 : [r] "=&r" (r) 111 : [a] "+&r" (a)
115 : [x] "a" (x), [y] "a" (y), 112 : [x] "a" (x), [y] "a" (y),
116 [a] "r" (a), [b] "r" (b), [t] "r" (t), [v] "r" (v) 113 [b] "r" (b), [t] "r" (t), [v] "r" (v)
117 : "cc", "memory"); 114 : "cc", "memory");
118} 115}
119 116
120 117
121/* no faster way of doing this using the MAC? */ 118
119/* is there no better way of doing this using the MAC? */
122#define XPROD32(_a, _b, _t, _v, _x, _y) \ 120#define XPROD32(_a, _b, _t, _v, _x, _y) \
123 { (_x)=MULT32(_a,_t)+MULT32(_b,_v); \ 121 { (_x)=MULT32(_a,_t)+MULT32(_b,_v); \
124 (_y)=MULT32(_b,_t)-MULT32(_a,_v); } 122 (_y)=MULT32(_b,_t)-MULT32(_a,_v); }