diff options
Diffstat (limited to 'apps/codecs/libFLAC/coldfire.S')
-rw-r--r-- | apps/codecs/libFLAC/coldfire.S | 244 |
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 | ||
27 | FLAC__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 | ||