summaryrefslogtreecommitdiff
path: root/apps/codecs/libFLAC/coldfire.S
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libFLAC/coldfire.S')
-rw-r--r--apps/codecs/libFLAC/coldfire.S244
1 files changed, 0 insertions, 244 deletions
diff --git a/apps/codecs/libFLAC/coldfire.S b/apps/codecs/libFLAC/coldfire.S
deleted file mode 100644
index ad4b417c9e..0000000000
--- a/apps/codecs/libFLAC/coldfire.S
+++ /dev/null
@@ -1,244 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2005 by Thom Johansen
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20/* The following is a first attempt at an assembler optimized version of
21 FLAC__lpc_restore_signal programmed for MCF5249 or any other similar
22 ColdFire V2 core with the EMAC unit.
23 */
24 .text
25 .global FLAC__lpc_restore_signal_mcf5249
26 .align 2
27FLAC__lpc_restore_signal_mcf5249:
28 lea.l (-44, %sp), %sp
29 movem.l %d2-%d7/%a2-%a6, (%sp)
30 move.l (44+4, %sp), %a0 /* residual */
31 move.l (44+8, %sp), %d0 /* data_len */
32 move.l (44+12, %sp), %a1 /* qlp_coef */
33 move.l (44+16, %sp), %d2 /* order */
34 move.l (44+20, %sp), %d1 /* lp_quantization */
35 move.l (44+24, %sp), %a2 /* data */
36 /* the data pointer always lags behind history pointer by 'order' samples.
37 since we have one loop for each order, we can hard code this and free
38 a register by not saving data pointer.
39 */
40 move.l %d2, %d3
41 neg.l %d3
42 lea.l (%a2, %d3.l*4), %a2 /* history */
43 clr.l %d3
44 move.l %d3, %macsr /* we'll need integer mode for this */
45 tst.l %d0
46 jeq .exit /* zero samples to process */
47 moveq.l #8, %d3
48 cmp.l %d3, %d2
49 jgt .default /* order is over 8, jump to default case */
50 lea.l .jumptable, %a4
51 move.l (%a4, %d2.l*4), %a4
52 jmp (%a4)
53 .align 4 /* avoid unaligned fetch */
54.jumptable:
55 .long .exit
56 .long .order1
57 .long .order2
58 .long .order3
59 .long .order4
60 .long .order5
61 .long .order6
62 .long .order7
63 .long .order8
64
65.order8:
66 movem.l (%a1), %d3-%d7/%a3-%a5 /* load lpc coefs */
67 move.l (%a2)+, %a6 /* load first history sample */
68.loop8:
69 mac.l %a6, %a5, (%a2)+, %a6, %acc0
70 mac.l %a6, %a4, (%a2)+, %a6, %acc0
71 mac.l %a6, %a3, (%a2)+, %a6, %acc0
72 mac.l %a6, %d7, (%a2)+, %a6, %acc0
73 mac.l %a6, %d6, (%a2)+, %a6, %acc0
74 mac.l %a6, %d5, (%a2)+, %a6, %acc0
75 mac.l %a6, %d4, (%a2)+, %a6, %acc0
76 mac.l %a6, %d3, (-7*4, %a2), %a6, %acc0 /* load for the next iteration */
77 movclr.l %acc0, %d2 /* get sum */
78 asr.l %d1, %d2 /* shift sum by lp_quantization bits */
79 add.l (%a0)+, %d2 /* add residual and increment residual pointer */
80 move.l %d2, (%a2) /* save result to data */
81 lea.l (-6*4, %a2), %a2 /* history pointer points at second element */
82 subq.l #1, %d0 /* decrement counter */
83 jne .loop8 /* are we done? */
84 jra .exit
85
86.order7:
87 movem.l (%a1), %d3-%d7/%a3-%a4
88 move.l (%a2)+, %a6
89.loop7:
90 mac.l %a6, %a4, (%a2)+, %a6, %acc0
91 mac.l %a6, %a3, (%a2)+, %a6, %acc0
92 mac.l %a6, %d7, (%a2)+, %a6, %acc0
93 mac.l %a6, %d6, (%a2)+, %a6, %acc0
94 mac.l %a6, %d5, (%a2)+, %a6, %acc0
95 mac.l %a6, %d4, (%a2)+, %a6, %acc0
96 mac.l %a6, %d3, (-6*4, %a2), %a6, %acc0
97 movclr.l %acc0, %d2
98 asr.l %d1, %d2
99 add.l (%a0)+, %d2
100 move.l %d2, (%a2)
101 lea.l (-5*4, %a2), %a2
102 subq.l #1, %d0
103 jne .loop7
104 jra .exit
105
106.order6:
107 movem.l (%a1), %d3-%d7/%a3
108 move.l (%a2)+, %a6
109.loop6:
110 mac.l %a6, %a3, (%a2)+, %a6, %acc0
111 mac.l %a6, %d7, (%a2)+, %a6, %acc0
112 mac.l %a6, %d6, (%a2)+, %a6, %acc0
113 mac.l %a6, %d5, (%a2)+, %a6, %acc0
114 mac.l %a6, %d4, (%a2)+, %a6, %acc0
115 mac.l %a6, %d3, (-5*4, %a2), %a6, %acc0
116 movclr.l %acc0, %d2
117 asr.l %d1, %d2
118 add.l (%a0)+, %d2
119 move.l %d2, (%a2)
120 lea.l (-4*4, %a2), %a2
121 subq.l #1, %d0
122 jne .loop6
123 jra .exit
124
125.order5:
126 movem.l (%a1), %d3-%d7
127 move.l (%a2)+, %a6
128.loop5:
129 mac.l %a6, %d7, (%a2)+, %a6, %acc0
130 mac.l %a6, %d6, (%a2)+, %a6, %acc0
131 mac.l %a6, %d5, (%a2)+, %a6, %acc0
132 mac.l %a6, %d4, (%a2)+, %a6, %acc0
133 mac.l %a6, %d3, (-4*4, %a2), %a6, %acc0
134 movclr.l %acc0, %d2
135 asr.l %d1, %d2
136 add.l (%a0)+, %d2
137 move.l %d2, (%a2)
138 lea.l (-3*4, %a2), %a2
139 subq.l #1, %d0
140 jne .loop5
141 jra .exit
142
143.order4:
144 movem.l (%a1), %d3-%d6
145 move.l (%a2)+, %a6
146.loop4:
147 mac.l %a6, %d6, (%a2)+, %a6, %acc0
148 mac.l %a6, %d5, (%a2)+, %a6, %acc0
149 mac.l %a6, %d4, (%a2)+, %a6, %acc0
150 mac.l %a6, %d3, (-3*4, %a2), %a6, %acc0
151 movclr.l %acc0, %d2
152 asr.l %d1, %d2
153 add.l (%a0)+, %d2
154 move.l %d2, (%a2)
155 subq.l #8, %a2
156 subq.l #1, %d0
157 jne .loop4
158 jra .exit
159
160.order3:
161 movem.l (%a1), %d3-%d5
162 move.l (%a2)+, %a6
163.loop3:
164 mac.l %a6, %d5, (%a2)+, %a6, %acc0
165 mac.l %a6, %d4, (%a2)+, %a6, %acc0
166 mac.l %a6, %d3, (-2*4, %a2), %a6, %acc0
167 movclr.l %acc0, %d2
168 asr.l %d1, %d2
169 add.l (%a0)+, %d2
170 move.l %d2, (%a2)
171 subq.l #4, %a2
172 subq.l #1, %d0
173 jne .loop3
174 jra .exit
175
176.order2:
177 movem.l (%a1), %d3-%d4
178 move.l (%a2)+, %a6
179.loop2:
180 mac.l %a6, %d4, (%a2)+, %a6, %acc0
181 mac.l %a6, %d3, %acc0 /* data for next iteration is already loaded */
182 movclr.l %acc0, %d2
183 asr.l %d1, %d2
184 add.l (%a0)+, %d2
185 move.l %d2, (%a2)
186 subq.l #1, %d0
187 jne .loop2
188 jra .exit
189
190.order1:
191 /* no point in using mac here */
192 move.l (%a1), %d3
193.loop1:
194 move.l %d3, %d2
195 muls.l (%a2)+, %d2
196 asr.l %d1, %d2
197 add.l (%a0)+, %d2
198 move.l %d2, (%a2)
199 subq.l #1, %d0
200 jne .loop1
201 jra .exit
202
203.default:
204 /* we do the filtering in an unrolled by 4 loop as far as we can, and then
205 do the rest in an ordinary one by one sample loop.
206 */
207 lea.l (%a1, %d2.l*4), %a3 /* need to start in the other end of coefs */
208 move.l %a2, %a4 /* working copy of history pointer */
209 move.l %d2, %d3
210 lsr.l #2, %d3 /* coefs/4, number of iterations needed in next loop */
211 move.l (%a4)+, %a6 /* preload lpc coef for loop */
212.dloop1:
213 lea.l (-16, %a3), %a3 /* move lpc coef pointer four samples backwards */
214 movem.l (%a3), %d4-%d7 /* load four coefs */
215 mac.l %a6, %d7, (%a4)+, %a6, %acc0
216 mac.l %a6, %d6, (%a4)+, %a6, %acc0
217 mac.l %a6, %d5, (%a4)+, %a6, %acc0
218 mac.l %a6, %d4, (%a4)+, %a6, %acc0
219 subq.l #1, %d3 /* any more unrolled loop operations left? */
220 jne .dloop1
221
222 move.l %d2, %d3
223 moveq.l #3, %d4 /* mask 0x00000003 */
224 and.l %d4, %d3 /* get the remaining samples to be filtered */
225 jeq .dsave /* no remaining samples */
226.dloop2:
227 move.l -(%a3), %d4 /* get lpc coef */
228 mac.l %a6, %d4, (%a4)+, %a6, %acc0
229 subq.l #1, %d3 /* any more iterations left? */
230 jne .dloop2
231.dsave:
232 movclr.l %acc0, %d3 /* get result */
233 asr.l %d1, %d3 /* shift lp_quantization bits right */
234 add.l (%a0)+, %d3 /* add residual */
235 move.l %d3, (-4, %a4) /* history pointer is one sample past data pointer */
236 addq.l #4, %a2 /* increment history pointer */
237 subq.l #1, %d0 /* decrement data_len */
238 jne .default /* are we done? */
239 /* if so, fall through to exit */
240
241.exit:
242 movem.l (%sp), %d2-%d7/%a2-%a6
243 lea.l (44, %sp), %sp
244 rts