summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/libmpeg2/idct_arm.S
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mpegplayer/libmpeg2/idct_arm.S')
-rw-r--r--apps/plugins/mpegplayer/libmpeg2/idct_arm.S443
1 files changed, 443 insertions, 0 deletions
diff --git a/apps/plugins/mpegplayer/libmpeg2/idct_arm.S b/apps/plugins/mpegplayer/libmpeg2/idct_arm.S
new file mode 100644
index 0000000000..97a87a8b59
--- /dev/null
+++ b/apps/plugins/mpegplayer/libmpeg2/idct_arm.S
@@ -0,0 +1,443 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 by Michael Sevakis
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include "config.h"
23
24 .global mpeg2_idct_copy
25 .type mpeg2_idct_copy, %function
26 .global mpeg2_idct_add
27 .type mpeg2_idct_add, %function
28
29
30/* Custom calling convention:
31 * r0 contains block pointer and is non-volatile
32 * all non-volatile c context saved and restored on its behalf
33 */
34.idct:
35 add r12, r0, #128
361:
37 ldrsh r1, [r0, #0] /* d0 */
38 ldrsh r2, [r0, #2] /* d1 */
39 ldrsh r3, [r0, #4] /* d2 */
40 ldrsh r4, [r0, #6] /* d3 */
41 ldrsh r5, [r0, #8] /* d0 */
42 ldrsh r6, [r0, #10] /* d1 */
43 ldrsh r7, [r0, #12] /* d2 */
44 ldrsh r8, [r0, #14] /* d3 */
45 orrs r9, r2, r3
46 orreqs r9, r4, r5
47 orreqs r9, r6, r7
48 cmpeq r8, #0
49 bne 2f
50 mov r1, r1, asl #15
51 bic r1, r1, #0x8000
52 orr r1, r1, r1, lsr #16
53 str r1, [r0], #4
54 str r1, [r0], #4
55 str r1, [r0], #4
56 str r1, [r0], #4
57 cmp r0, r12
58 blo 1b
59 b 3f
602:
61 mov r1, r1, asl #11 /* r1 = d0 = (block[0] << 11) + 2048 */
62 add r1, r1, #2048
63 add r1, r1, r3, asl #11 /* r1 = t0 = d0 + (block[2] << 11) */
64 sub r3, r1, r3, asl #12 /* r3 = t1 = d0 - (block[2] << 11) */
65
66 add r9, r2, r4 /* r9 = tmp = (d1+d3)*(1108/4) */
67 add r10, r9, r9, asl #2
68 add r10, r10, r9, asl #4
69 add r9, r10, r9, asl #8
70
71 add r10, r2, r2, asl #4 /* r2 = t2 = tmp + (d1*(1568/32)*8) */
72 add r2, r10, r2, asl #5
73 add r2, r9, r2, asl #3
74
75 add r10, r4, r4, asl #2 /* r4 = t3 = tmp - (d3*(3784/8)*2) */
76 rsb r10, r10, r4, asl #6
77 add r4, r4, r10, asl #3
78 sub r4, r9, r4, asl #1
79 /* t2 & t3 are 1/4 final value here */
80 add r1, r1, r2, asl #2 /* r1 = a0 = t0 + t2 */
81 sub r2, r1, r2, asl #3 /* r2 = a3 = t0 - t2 */
82 add r3, r3, r4, asl #2 /* r3 = a1 = t1 + t3 */
83 sub r4, r3, r4, asl #3 /* r4 = a2 = t1 - t3 */
84
85 add r9, r8, r5 /* r9 = tmp = 565*(d3 + d0) */
86 add r10, r9, r9, asl #4
87 add r10, r10, r10, asl #5
88 add r9, r10, r9, asl #2
89
90 add r10, r5, r5, asl #4 /* r5 = t0 = tmp + (((2276/4)*d0)*4) */
91 add r10, r10, r10, asl #5
92 add r5, r10, r5, asl #3
93 add r5, r9, r5, asl #2
94
95 add r10, r8, r8, asl #2 /* r8 = t1 = tmp - (((3406/2)*d3)*2) */
96 add r10, r10, r10, asl #4
97 add r10, r10, r8, asl #7
98 rsb r8, r8, r10, asl #3
99 sub r8, r9, r8, asl #1
100
101 add r9, r6, r7 /* r9 = tmp = (2408/8)*(d1 + d2) */
102 add r10, r9, r9, asl #3
103 add r10, r10, r10, asl #5
104 add r9, r10, r9, asl #2
105
106 add r10, r7, r7, asl #3 /* r7 = t2 = (tmp*8) - 799*d2 */
107 add r10, r10, r7, asl #4
108 rsb r7, r7, r10, asl #5
109 rsb r7, r7, r9, asl #3
110
111 sub r10, r6, r6, asl #4 /* r6 = t3 = (tmp*8) - 4017*d1 */
112 sub r10, r10, r6, asl #6
113 add r10, r10, r6, asl #12
114 add r6, r10, r6
115 rsb r6, r6, r9, asl #3
116 /* t0 = r5, t1 = r8, t2 = r7, t3 = r6*/
117 add r9, r5, r7 /* r9 = b0 = t0 + t2 */
118 add r10, r8, r6 /* r10 = b3 = t1 + t3 */
119 sub r5, r5, r7 /* t0 -= t2 */
120 sub r8, r8, r6 /* t1 -= t3 */
121 add r6, r5, r8 /* r6 = t0 + t1 */
122 sub r7, r5, r8 /* r7 = t0 - t1 */
123
124 add r11, r6, r6, asr #2 /* r6 = b1 = r6*(181/128) */
125 add r11, r11, r11, asr #5
126 add r6, r11, r6, asr #3
127 add r11, r7, r7, asr #2 /* r7 = b2 = r7*(181/128) */
128 add r11, r11, r11, asr #5
129 add r7, r11, r7, asr #3
130 /* r1 = a0, r3 = a1, r4 = a2, r2 = a3 */
131 /* r9 = b0, r6 = b1*2, r7 = b2*2, r10 = b3 */
132 add r5, r1, r9 /* block[0] = (a0 + b0) >> 12 */
133 mov r5, r5, asr #12
134 strh r5, [r0], #2
135 add r8, r3, r6, asr #1 /* block[1] = (a1 + b1) >> 12 */
136 mov r8, r8, asr #12
137 strh r8, [r0], #2
138 add r5, r4, r7, asr #1 /* block[2] = (a2 + b2) >> 12 */
139 mov r5, r5, asr #12
140 strh r5, [r0], #2
141 add r8, r2, r10 /* block[3] = (a3 + b3) >> 12 */
142 mov r8, r8, asr #12
143 strh r8, [r0], #2
144 sub r5, r2, r10 /* block[4] = (a3 - b3) >> 12 */
145 mov r5, r5, asr #12
146 strh r5, [r0], #2
147 sub r8, r4, r7, asr #1 /* block[5] = (a2 - b2) >> 12 */
148 mov r8, r8, asr #12
149 strh r8, [r0], #2
150 sub r5, r3, r6, asr #1 /* block[6] = (a1 - b1) >> 12 */
151 mov r5, r5, asr #12
152 strh r5, [r0], #2
153 sub r8, r1, r9 /* block[7] = (a0 - b0) >> 12 */
154 mov r8, r8, asr #12
155 strh r8, [r0], #2
156 cmp r0, r12
157 blo 1b
1583:
159 sub r0, r0, #128
160 add r12, r0, #16
1614:
162 ldrsh r1, [r0, #0*8] /* d0 */
163 ldrsh r2, [r0, #2*8] /* d1 */
164 ldrsh r3, [r0, #4*8] /* d2 */
165 ldrsh r4, [r0, #6*8] /* d3 */
166 ldrsh r5, [r0, #8*8] /* d0 */
167 ldrsh r6, [r0, #10*8] /* d1 */
168 ldrsh r7, [r0, #12*8] /* d2 */
169 ldrsh r8, [r0, #14*8] /* d3 */
170
171 mov r1, r1, asl #11 /* r1 = d0 = (block[0] << 11) + 2048 */
172 add r1, r1, #65536
173 add r1, r1, r3, asl #11 /* r1 = t0 = d0 + d2:(block[2] << 11) */
174 sub r3, r1, r3, asl #12 /* r3 = t1 = d0 - d2:(block[2] << 11) */
175
176 add r9, r2, r4 /* r9 = tmp = (d1+d3)*(1108/4) */
177 add r10, r9, r9, asl #2
178 add r10, r10, r9, asl #4
179 add r9, r10, r9, asl #8
180
181 add r11, r2, r2, asl #4 /* r2 = t2 = tmp + (d1*(1568/32)*8) */
182 add r2, r11, r2, asl #5
183 add r2, r9, r2, asl #3
184
185 add r10, r4, r4, asl #2 /* r4 = t3 = tmp - (d3*(3784/8)*2) */
186 rsb r10, r10, r4, asl #6
187 add r4, r4, r10, asl #3
188 sub r4, r9, r4, asl #1
189 /* t2 & t3 are 1/4 final value here */
190 add r1, r1, r2, asl #2 /* r1 = a0 = t0 + t2 */
191 sub r2, r1, r2, asl #3 /* r2 = a3 = t0 - t2 */
192 add r3, r3, r4, asl #2 /* r3 = a1 = t1 + t3 */
193 sub r4, r3, r4, asl #3 /* r4 = a2 = t1 - t3 */
194
195 add r9, r8, r5 /* r9 = tmp = 565*(d3 + d0) */
196 add r10, r9, r9, asl #4
197 add r10, r10, r10, asl #5
198 add r9, r10, r9, asl #2
199
200 add r10, r5, r5, asl #4 /* r5 = t0 = tmp + (((2276/4)*d0)*4) */
201 add r10, r10, r10, asl #5
202 add r5, r10, r5, asl #3
203 add r5, r9, r5, asl #2
204
205 add r10, r8, r8, asl #2 /* r8 = t1 = tmp - (((3406/2)*d3)*2) */
206 add r10, r10, r10, asl #4
207 add r10, r10, r8, asl #7
208 rsb r8, r8, r10, asl #3
209 sub r8, r9, r8, asl #1
210
211 add r9, r6, r7 /* r9 = tmp = (2408/8)*(d1 + d2) */
212 add r10, r9, r9, asl #3
213 add r10, r10, r10, asl #5
214 add r9, r10, r9, asl #2
215
216 add r10, r7, r7, asl #3 /* r7 = t2 = (tmp*8) - 799*d2 */
217 add r10, r10, r7, asl #4
218 rsb r7, r7, r10, asl #5
219 rsb r7, r7, r9, asl #3
220
221 sub r10, r6, r6, asl #4 /* r6 = t3 = (tmp*8) - 4017*d1 */
222 sub r10, r10, r6, asl #6
223 add r10, r10, r6, asl #12
224 add r6, r10, r6
225 rsb r6, r6, r9, asl #3
226 /* t0=r5, t1=r8, t2=r7, t3=r6*/
227 add r9, r5, r7 /* r9 = b0 = t0 + t2 */
228 add r10, r8, r6 /* r10 = b3 = t1 + t3 */
229 sub r5, r5, r7 /* t0 -= t2 */
230 sub r8, r8, r6 /* t1 -= t3 */
231 add r6, r5, r8 /* r6 = t0 + t1 */
232 sub r7, r5, r8 /* r7 = t0 - t1 */
233
234 add r11, r6, r6, asr #2 /* r6 = b1 = r5*(181/128) */
235 add r11, r11, r11, asr #5
236 add r6, r11, r6, asr #3
237 add r11, r7, r7, asr #2 /* r7 = b2 = r6*(181/128) */
238 add r11, r11, r11, asr #5
239 add r7, r11, r7, asr #3
240 /* r1 = a0, r3 = a1, r4 = a2, r2 = a3 */
241 /* r9 = b0, r6 = b1*2, r7 = b2*2, r10 = b3 */
242 add r5, r1, r9 /* block[0] = (a0 + b0) >> 17 */
243 mov r5, r5, asr #17
244 strh r5, [r0, #0*8]
245 add r8, r3, r6, asr #1 /* block[1] = (a1 + b1) >> 17 */
246 mov r8, r8, asr #17
247 strh r8, [r0, #2*8]
248 add r5, r4, r7, asr #1 /* block[2] = (a2 + b2) >> 17 */
249 mov r5, r5, asr #17
250 strh r5, [r0, #4*8]
251 add r8, r2, r10 /* block[3] = (a3 + b3) >> 17 */
252 mov r8, r8, asr #17
253 strh r8, [r0, #6*8]
254 sub r5, r2, r10 /* block[4] = (a3 - b3) >> 17 */
255 mov r5, r5, asr #17
256 strh r5, [r0, #8*8]
257 sub r8, r4, r7, asr #1 /* block[5] = (a2 - b2) >> 17 */
258 mov r8, r8, asr #17
259 strh r8, [r0, #10*8]
260 sub r5, r3, r6, asr #1 /* block[6] = (a1 - b1) >> 17 */
261 mov r5, r5, asr #17
262 strh r5, [r0, #12*8]
263 sub r8, r1, r9 /* block[7] = (a0 - b0) >> 17 */
264 mov r8, r8, asr #17
265 strh r8, [r0, #14*8]
266 add r0, r0, #2
267 cmp r0, r12
268 blo 4b
269 sub r0, r0, #16
270 bx lr
271
272mpeg2_idct_copy:
273 stmfd sp!, { r1-r2, r4-r11, lr }
274 bl .idct
275 ldmfd sp!, { r1-r2 }
276 mov r11, #0
277 add r12, r0, #128
2781:
279 ldrsh r3, [r0, #0]
280 ldrsh r4, [r0, #2]
281 ldrsh r5, [r0, #4]
282 ldrsh r6, [r0, #6]
283 ldrsh r7, [r0, #8]
284 ldrsh r8, [r0, #10]
285 ldrsh r9, [r0, #12]
286 ldrsh r10, [r0, #14]
287 cmp r3, #255
288 mvnhi r3, r3, asr #31
289 strb r3, [r1, #0]
290 str r11, [r0], #4
291 cmp r4, #255
292 mvnhi r4, r4, asr #31
293 strb r4, [r1, #1]
294 cmp r5, #255
295 mvnhi r5, r5, asr #31
296 strb r5, [r1, #2]
297 str r11, [r0], #4
298 cmp r6, #255
299 mvnhi r6, r6, asr #31
300 strb r6, [r1, #3]
301 cmp r7, #255
302 mvnhi r7, r7, asr #31
303 strb r7, [r1, #4]
304 str r11, [r0], #4
305 cmp r8, #255
306 mvnhi r8, r8, asr #31
307 strb r8, [r1, #5]
308 cmp r9, #255
309 mvnhi r9, r9, asr #31
310 strb r9, [r1, #6]
311 str r11, [r0], #4
312 cmp r10, #255
313 mvnhi r10, r10, asr #31
314 strb r10, [r1, #7]
315 add r1, r1, r2
316 cmp r0, r12
317 blo 1b
318 ldmpc regs=r4-r11
319
320mpeg2_idct_add:
321 cmp r0, #129
322 mov r0, r1
323 ldreqsh r1, [r0, #0]
324 bne 1f
325 and r1, r1, #0x70
326 cmp r1, #0x40
327 bne 3f
3281:
329 stmfd sp!, { r2-r11, lr }
330 bl .idct
331 ldmfd sp!, { r1-r2 }
332 mov r11, #0
333 add r12, r0, #128
3342:
335 ldrb r3, [r1, #0]
336 ldrb r4, [r1, #1]
337 ldrb r5, [r1, #2]
338 ldrb r6, [r1, #3]
339 ldrsh r7, [r0, #0]
340 ldrsh r8, [r0, #2]
341 ldrsh r9, [r0, #4]
342 ldrsh r10, [r0, #6]
343 add r7, r7, r3
344 ldrb r3, [r1, #4]
345 cmp r7, #255
346 mvnhi r7, r7, asr #31
347 strb r7, [r1, #0]
348 ldrsh r7, [r0, #8]
349 add r8, r8, r4
350 ldrb r4, [r1, #5]
351 cmp r8, #255
352 mvnhi r8, r8, asr #31
353 strb r8, [r1, #1]
354 ldrsh r8, [r0, #10]
355 add r9, r9, r5
356 ldrb r5, [r1, #6]
357 cmp r9, #255
358 mvnhi r9, r9, asr #31
359 strb r9, [r1, #2]
360 ldrsh r9, [r0, #12]
361 add r10, r10, r6
362 ldrb r6, [r1, #7]
363 cmp r10, #255
364 mvnhi r10, r10, asr #31
365 strb r10, [r1, #3]
366 ldrsh r10, [r0, #14]
367 str r11, [r0], #4
368 add r7, r7, r3
369 cmp r7, #255
370 mvnhi r7, r7, asr #31
371 strb r7, [r1, #4]
372 str r11, [r0], #4
373 add r8, r8, r4
374 cmp r8, #255
375 mvnhi r8, r8, asr #31
376 strb r8, [r1, #5]
377 str r11, [r0], #4
378 add r9, r9, r5
379 cmp r9, #255
380 mvnhi r9, r9, asr #31
381 strb r9, [r1, #6]
382 add r10, r10, r6
383 cmp r10, #255
384 mvnhi r10, r10, asr #31
385 strb r10, [r1, #7]
386 str r11, [r0], #4
387 add r1, r1, r2
388 cmp r0, r12
389 blo 2b
390 ldmpc regs=r4-r11
3913:
392 stmfd sp!, { r4-r5, lr }
393 ldrsh r1, [r0, #0] /* r1 = block[0] */
394 mov r4, #0
395 strh r4, [r0, #0] /* block[0] = 0 */
396 strh r4, [r0, #126] /* block[63] = 0 */
397 add r1, r1, #64 /* r1 = DC << 7 */
398 add r0, r2, r3, asl #3
3994:
400 ldrb r4, [r2, #0]
401 ldrb r5, [r2, #1]
402 ldrb r12, [r2, #2]
403 ldrb lr, [r2, #3]
404 add r4, r4, r1, asr #7
405 cmp r4, #255
406 mvnhi r4, r4, asr #31
407 strb r4, [r2, #0]
408 add r5, r5, r1, asr #7
409 cmp r5, #255
410 mvnhi r5, r5, asr #31
411 strb r5, [r2, #1]
412 add r12, r12, r1, asr #7
413 cmp r12, #255
414 mvnhi r12, r12, asr #31
415 strb r12, [r2, #2]
416 add lr, lr, r1, asr #7
417 cmp lr, #255
418 mvnhi lr, lr, asr #31
419 strb lr, [r2, #3]
420 ldrb r4, [r2, #4]
421 ldrb r5, [r2, #5]
422 ldrb r12, [r2, #6]
423 ldrb lr, [r2, #7]
424 add r4, r4, r1, asr #7
425 cmp r4, #255
426 mvnhi r4, r4, asr #31
427 strb r4, [r2, #4]
428 add r5, r5, r1, asr #7
429 cmp r5, #255
430 mvnhi r5, r5, asr #31
431 strb r5, [r2, #5]
432 add r12, r12, r1, asr #7
433 cmp r12, #255
434 mvnhi r12, r12, asr #31
435 strb r12, [r2, #6]
436 add lr, lr, r1, asr #7
437 cmp lr, #255
438 mvnhi lr, lr, asr #31
439 strb lr, [r2, #7]
440 add r2, r2, r3
441 cmp r2, r0
442 blo 4b
443 ldmpc regs=r4-r5