diff options
Diffstat (limited to 'apps/codecs/Tremor/asm_mcf5249.h')
-rw-r--r-- | apps/codecs/Tremor/asm_mcf5249.h | 44 |
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 | ||
51 | static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { | 51 | static 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); } |