FS#8961 - Anti-Aliased Fonts.
[kugel-rb.git] / apps / plugins / mpegplayer / idct_arm.S
blob7253d890bf2595631b9597ccaf6528df1290651b
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  ****************************************************************************/
22     .global     mpeg2_idct_copy
23     .type       mpeg2_idct_copy, %function
24     .global     mpeg2_idct_add
25     .type       mpeg2_idct_add, %function
28 /* Custom calling convention:
29  * r0 contains block pointer and is non-volatile
30  * all non-volatile c context saved and restored on its behalf
31  */
32 .idct:
33     add    r12, r0, #128
35     ldrsh  r1, [r0, #0]           /* d0 */
36     ldrsh  r2, [r0, #2]           /* d1 */
37     ldrsh  r3, [r0, #4]           /* d2 */
38     ldrsh  r4, [r0, #6]           /* d3 */
39     ldrsh  r5, [r0, #8]           /* d0 */
40     ldrsh  r6, [r0, #10]          /* d1 */
41     ldrsh  r7, [r0, #12]          /* d2 */
42     ldrsh  r8, [r0, #14]          /* d3 */
43     orrs   r9, r2, r3
44     orreqs r9, r4, r5
45     orreqs r9, r6, r7
46     cmpeq  r8, #0
47     bne    2f
48     mov    r1, r1, asl #15
49     bic    r1, r1, #0x8000
50     orr    r1, r1, r1, lsr #16
51     str    r1, [r0], #4
52     str    r1, [r0], #4
53     str    r1, [r0], #4
54     str    r1, [r0], #4
55     cmp    r0, r12
56     blo    1b
57     b      3f
59     mov    r1, r1, asl #11        /* r1 = d0 = (block[0] << 11) + 2048 */
60     add    r1, r1, #2048
61     add    r1, r1, r3, asl #11    /* r1 = t0 = d0 + (block[2] << 11) */
62     sub    r3, r1, r3, asl #12    /* r3 = t1 = d0 - (block[2] << 11) */
64     add    r9, r2, r4             /* r9 = tmp = (d1+d3)*(1108/4) */
65     add    r10, r9, r9, asl #2
66     add    r10, r10, r9, asl #4
67     add    r9, r10, r9, asl #8
69     add    r10, r2, r2, asl #4    /* r2 = t2 = tmp + (d1*(1568/32)*8) */
70     add    r2, r10, r2, asl #5
71     add    r2, r9, r2, asl #3
73     add    r10, r4, r4, asl #2    /* r4 = t3 = tmp - (d3*(3784/8)*2) */
74     rsb    r10, r10, r4, asl #6
75     add    r4, r4, r10, asl #3
76     sub    r4, r9, r4, asl #1
77     /* t2 & t3 are 1/4 final value here */
78     add    r1, r1, r2, asl #2     /* r1 = a0 = t0 + t2 */
79     sub    r2, r1, r2, asl #3     /* r2 = a3 = t0 - t2 */
80     add    r3, r3, r4, asl #2     /* r3 = a1 = t1 + t3 */
81     sub    r4, r3, r4, asl #3     /* r4 = a2 = t1 - t3 */
83     add    r9, r8, r5             /* r9 = tmp = 565*(d3 + d0) */
84     add    r10, r9, r9, asl #4
85     add    r10, r10, r10, asl #5
86     add    r9, r10, r9, asl #2
88     add    r10, r5, r5, asl #4    /* r5 = t0 = tmp + (((2276/4)*d0)*4) */
89     add    r10, r10, r10, asl #5
90     add    r5, r10, r5, asl #3
91     add    r5, r9, r5, asl #2
93     add    r10, r8, r8, asl #2    /* r8 = t1 = tmp - (((3406/2)*d3)*2) */
94     add    r10, r10, r10, asl #4
95     add    r10, r10, r8, asl #7
96     rsb    r8, r8, r10, asl #3
97     sub    r8, r9, r8, asl #1
99     add    r9, r6, r7             /* r9 = tmp = (2408/8)*(d1 + d2) */
100     add    r10, r9, r9, asl #3
101     add    r10, r10, r10, asl #5
102     add    r9, r10, r9, asl #2
104     add    r10, r7, r7, asl #3    /* r7 = t2 = (tmp*8) - 799*d2 */
105     add    r10, r10, r7, asl #4
106     rsb    r7, r7, r10, asl #5
107     rsb    r7, r7, r9, asl #3
109     sub    r10, r6, r6, asl #4    /* r6 = t3 = (tmp*8) - 4017*d1 */
110     sub    r10, r10, r6, asl #6
111     add    r10, r10, r6, asl #12
112     add    r6, r10, r6
113     rsb    r6, r6, r9, asl #3
114     /* t0 = r5, t1 = r8, t2 = r7, t3 = r6*/
115     add    r9, r5, r7             /* r9 = b0 = t0 + t2 */
116     add    r10, r8, r6            /* r10 = b3 = t1 + t3 */
117     sub    r5, r5, r7             /* t0 -= t2 */
118     sub    r8, r8, r6             /* t1 -= t3 */
119     add    r6, r5, r8             /* r6 = t0 + t1 */
120     sub    r7, r5, r8             /* r7 = t0 - t1 */
122     add    r11, r6, r6, asr #2    /* r6 = b1 = r6*(181/128) */
123     add    r11, r11, r11, asr #5
124     add    r6, r11, r6, asr #3
125     add    r11, r7, r7, asr #2    /* r7 = b2 = r7*(181/128) */
126     add    r11, r11, r11, asr #5
127     add    r7, r11, r7, asr #3
128     /* r1 = a0, r3 = a1,   r4 = a2,   r2 = a3 */
129     /* r9 = b0, r6 = b1*2, r7 = b2*2, r10 = b3 */
130     add    r5, r1, r9             /* block[0] = (a0 + b0) >> 12 */
131     mov    r5, r5, asr #12
132     strh   r5, [r0], #2
133     add    r8, r3, r6, asr #1     /* block[1] = (a1 + b1) >> 12 */
134     mov    r8, r8, asr #12
135     strh   r8, [r0], #2
136     add    r5, r4, r7, asr #1     /* block[2] = (a2 + b2) >> 12 */
137     mov    r5, r5, asr #12
138     strh   r5, [r0], #2
139     add    r8, r2, r10            /* block[3] = (a3 + b3) >> 12 */
140     mov    r8, r8, asr #12
141     strh   r8, [r0], #2
142     sub    r5, r2, r10            /* block[4] = (a3 - b3) >> 12 */
143     mov    r5, r5, asr #12
144     strh   r5, [r0], #2
145     sub    r8, r4, r7, asr #1     /* block[5] = (a2 - b2) >> 12 */
146     mov    r8, r8, asr #12
147     strh   r8, [r0], #2
148     sub    r5, r3, r6, asr #1     /* block[6] = (a1 - b1) >> 12 */
149     mov    r5, r5, asr #12
150     strh   r5, [r0], #2
151     sub    r8, r1, r9             /* block[7] = (a0 - b0) >> 12 */
152     mov    r8, r8, asr #12
153     strh   r8, [r0], #2
154     cmp    r0, r12
155     blo    1b
157     sub    r0, r0, #128
158     add    r12, r0, #16
160     ldrsh  r1, [r0, #0*8]         /* d0 */
161     ldrsh  r2, [r0, #2*8]         /* d1 */
162     ldrsh  r3, [r0, #4*8]         /* d2 */
163     ldrsh  r4, [r0, #6*8]         /* d3 */
164     ldrsh  r5, [r0, #8*8]         /* d0 */
165     ldrsh  r6, [r0, #10*8]        /* d1 */
166     ldrsh  r7, [r0, #12*8]        /* d2 */
167     ldrsh  r8, [r0, #14*8]        /* d3 */
169     mov    r1, r1, asl #11        /* r1 = d0 = (block[0] << 11) + 2048 */
170     add    r1, r1, #65536
171     add    r1, r1, r3, asl #11    /* r1 = t0 = d0 + d2:(block[2] << 11) */
172     sub    r3, r1, r3, asl #12    /* r3 = t1 = d0 - d2:(block[2] << 11) */
174     add    r9, r2, r4             /* r9 = tmp = (d1+d3)*(1108/4) */
175     add    r10, r9, r9, asl #2
176     add    r10, r10, r9, asl #4
177     add    r9, r10, r9, asl #8
179     add    r11, r2, r2, asl #4    /* r2 = t2 = tmp + (d1*(1568/32)*8) */
180     add    r2, r11, r2, asl #5
181     add    r2, r9, r2, asl #3
183     add    r10, r4, r4, asl #2    /* r4 = t3 = tmp - (d3*(3784/8)*2) */
184     rsb    r10, r10, r4, asl #6
185     add    r4, r4, r10, asl #3
186     sub    r4, r9, r4, asl #1
187     /* t2 & t3 are 1/4 final value here */
188     add    r1, r1, r2, asl #2     /* r1 = a0 = t0 + t2 */
189     sub    r2, r1, r2, asl #3     /* r2 = a3 = t0 - t2 */
190     add    r3, r3, r4, asl #2     /* r3 = a1 = t1 + t3 */
191     sub    r4, r3, r4, asl #3     /* r4 = a2 = t1 - t3 */
193     add    r9, r8, r5             /* r9 = tmp = 565*(d3 + d0) */
194     add    r10, r9, r9, asl #4
195     add    r10, r10, r10, asl #5
196     add    r9, r10, r9, asl #2
198     add    r10, r5, r5, asl #4    /* r5 = t0 = tmp + (((2276/4)*d0)*4) */
199     add    r10, r10, r10, asl #5
200     add    r5, r10, r5, asl #3
201     add    r5, r9, r5, asl #2
203     add    r10, r8, r8, asl #2    /* r8 = t1 = tmp - (((3406/2)*d3)*2) */
204     add    r10, r10, r10, asl #4
205     add    r10, r10, r8, asl #7
206     rsb    r8, r8, r10, asl #3
207     sub    r8, r9, r8, asl #1
209     add    r9, r6, r7             /* r9 = tmp = (2408/8)*(d1 + d2) */
210     add    r10, r9, r9, asl #3
211     add    r10, r10, r10, asl #5
212     add    r9, r10, r9, asl #2
214     add    r10, r7, r7, asl #3    /* r7 = t2 = (tmp*8) - 799*d2 */
215     add    r10, r10, r7, asl #4
216     rsb    r7, r7, r10, asl #5
217     rsb    r7, r7, r9, asl #3
219     sub    r10, r6, r6, asl #4    /* r6 = t3 = (tmp*8) - 4017*d1 */
220     sub    r10, r10, r6, asl #6
221     add    r10, r10, r6, asl #12
222     add    r6, r10, r6
223     rsb    r6, r6, r9, asl #3
224                                     /* t0=r5, t1=r8, t2=r7, t3=r6*/
225     add    r9, r5, r7             /* r9 = b0 = t0 + t2 */
226     add    r10, r8, r6            /* r10 = b3 = t1 + t3 */
227     sub    r5, r5, r7             /* t0 -= t2 */
228     sub    r8, r8, r6             /* t1 -= t3 */
229     add    r6, r5, r8             /* r6 = t0 + t1 */
230     sub    r7, r5, r8             /* r7 = t0 - t1 */
232     add    r11, r6, r6, asr #2    /* r6 = b1 = r5*(181/128) */
233     add    r11, r11, r11, asr #5
234     add    r6, r11, r6, asr #3
235     add    r11, r7, r7, asr #2    /* r7 = b2 = r6*(181/128) */
236     add    r11, r11, r11, asr #5
237     add    r7, r11, r7, asr #3
238     /* r1 = a0, r3 = a1,   r4 = a2,    r2 = a3 */
239     /* r9 = b0, r6 = b1*2, r7 = b2*2, r10 = b3 */
240     add    r5, r1, r9             /* block[0] = (a0 + b0) >> 17 */
241     mov    r5, r5, asr #17
242     strh   r5, [r0, #0*8]
243     add    r8, r3, r6, asr #1     /* block[1] = (a1 + b1) >> 17 */
244     mov    r8, r8, asr #17
245     strh   r8, [r0, #2*8]
246     add    r5, r4, r7, asr #1     /* block[2] = (a2 + b2) >> 17 */
247     mov    r5, r5, asr #17
248     strh   r5, [r0, #4*8]
249     add    r8, r2, r10            /* block[3] = (a3 + b3) >> 17 */
250     mov    r8, r8, asr #17
251     strh   r8, [r0, #6*8]
252     sub    r5, r2, r10            /* block[4] = (a3 - b3) >> 17 */
253     mov    r5, r5, asr #17
254     strh   r5, [r0, #8*8]
255     sub    r8, r4, r7, asr #1     /* block[5] = (a2 - b2) >> 17 */
256     mov    r8, r8, asr #17
257     strh   r8, [r0, #10*8]
258     sub    r5, r3, r6, asr #1     /* block[6] = (a1 - b1) >> 17 */
259     mov    r5, r5, asr #17
260     strh   r5, [r0, #12*8]
261     sub    r8, r1, r9             /* block[7] = (a0 - b0) >> 17 */
262     mov    r8, r8, asr #17
263     strh   r8, [r0, #14*8]
264     add    r0, r0, #2
265     cmp    r0, r12
266     blo    4b
267     sub    r0, r0, #16
268     bx     lr
270 mpeg2_idct_copy:
271     stmfd  sp!, { r1-r2, r4-r11, lr }
272     bl     .idct
273     ldmfd  sp!, { r1-r2 }
274     mov    r11, #0
275     add    r12, r0, #128
277     ldrsh  r3, [r0, #0]
278     ldrsh  r4, [r0, #2]
279     ldrsh  r5, [r0, #4]
280     ldrsh  r6, [r0, #6]
281     ldrsh  r7, [r0, #8]
282     ldrsh  r8, [r0, #10]
283     ldrsh  r9, [r0, #12]
284     ldrsh  r10, [r0, #14]
285     cmp    r3, #255
286     mvnhi  r3, r3, asr #31
287     strb   r3, [r1, #0]
288     str    r11, [r0], #4
289     cmp    r4, #255
290     mvnhi  r4, r4, asr #31
291     strb   r4, [r1, #1]
292     cmp    r5, #255
293     mvnhi  r5, r5, asr #31
294     strb   r5, [r1, #2]
295     str    r11, [r0], #4
296     cmp    r6, #255
297     mvnhi  r6, r6, asr #31
298     strb   r6, [r1, #3]
299     cmp    r7, #255
300     mvnhi  r7, r7, asr #31
301     strb   r7, [r1, #4]
302     str    r11, [r0], #4
303     cmp    r8, #255
304     mvnhi  r8, r8, asr #31
305     strb   r8, [r1, #5]
306     cmp    r9, #255
307     mvnhi  r9, r9, asr #31
308     strb   r9, [r1, #6]
309     str    r11, [r0], #4
310     cmp    r10, #255
311     mvnhi  r10, r10, asr #31
312     strb   r10, [r1, #7]
313     add    r1, r1, r2
314     cmp    r0, r12
315     blo    1b
316     ldmfd  sp!, { r4-r11, pc }
318 mpeg2_idct_add:
319     cmp    r0, #129
320     mov    r0, r1
321     ldreqsh r1, [r0, #0]
322     bne    1f
323     and    r1, r1, #0x70
324     cmp    r1, #0x40
325     bne    3f
327     stmfd  sp!, { r2-r11, lr }
328     bl     .idct
329     ldmfd  sp!, { r1-r2 }
330     mov    r11, #0
331     add    r12, r0, #128
333     ldrb   r3, [r1, #0]
334     ldrb   r4, [r1, #1]
335     ldrb   r5, [r1, #2]
336     ldrb   r6, [r1, #3]
337     ldrsh  r7, [r0, #0]
338     ldrsh  r8, [r0, #2]
339     ldrsh  r9, [r0, #4]
340     ldrsh  r10, [r0, #6]
341     add    r7, r7, r3
342     ldrb   r3, [r1, #4]
343     cmp    r7, #255
344     mvnhi  r7, r7, asr #31
345     strb   r7, [r1, #0]
346     ldrsh  r7, [r0, #8]
347     add    r8, r8, r4
348     ldrb   r4, [r1, #5]
349     cmp    r8, #255
350     mvnhi  r8, r8, asr #31
351     strb   r8, [r1, #1]
352     ldrsh  r8, [r0, #10]
353     add    r9, r9, r5
354     ldrb   r5, [r1, #6]
355     cmp    r9, #255
356     mvnhi  r9, r9, asr #31
357     strb   r9, [r1, #2]
358     ldrsh  r9, [r0, #12]
359     add    r10, r10, r6
360     ldrb   r6, [r1, #7]
361     cmp    r10, #255
362     mvnhi  r10, r10, asr #31
363     strb   r10, [r1, #3]
364     ldrsh  r10, [r0, #14]
365     str    r11, [r0], #4
366     add    r7, r7, r3
367     cmp    r7, #255
368     mvnhi  r7, r7, asr #31
369     strb   r7, [r1, #4]
370     str    r11, [r0], #4
371     add    r8, r8, r4
372     cmp    r8, #255
373     mvnhi  r8, r8, asr #31
374     strb   r8, [r1, #5]
375     str    r11, [r0], #4
376     add    r9, r9, r5
377     cmp    r9, #255
378     mvnhi  r9, r9, asr #31
379     strb   r9, [r1, #6]
380     add    r10, r10, r6
381     cmp    r10, #255
382     mvnhi  r10, r10, asr #31
383     strb   r10, [r1, #7]
384     str    r11, [r0], #4
385     add    r1, r1, r2
386     cmp    r0, r12
387     blo    2b
388     ldmfd  sp!, { r4-r11, pc }
390     stmfd  sp!, { r4-r5, lr }
391     ldrsh  r1, [r0, #0]           /* r1 = block[0] */
392     mov    r4, #0
393     strh   r4, [r0, #0]           /* block[0] = 0 */
394     strh   r4, [r0, #126]         /* block[63] = 0 */
395     add    r1, r1, #64            /* r1 = DC << 7 */
396     add    r0, r2, r3, asl #3
398     ldrb   r4, [r2, #0]
399     ldrb   r5, [r2, #1]
400     ldrb   r12, [r2, #2]
401     ldrb   lr, [r2, #3]
402     add    r4, r4, r1, asr #7
403     cmp    r4, #255
404     mvnhi  r4, r4, asr #31
405     strb   r4, [r2, #0]
406     add    r5, r5, r1, asr #7
407     cmp    r5, #255
408     mvnhi  r5, r5, asr #31
409     strb   r5, [r2, #1]
410     add    r12, r12, r1, asr #7
411     cmp    r12, #255
412     mvnhi  r12, r12, asr #31
413     strb   r12, [r2, #2]
414     add    lr, lr, r1, asr #7
415     cmp    lr, #255
416     mvnhi  lr, lr, asr #31
417     strb   lr, [r2, #3]
418     ldrb   r4, [r2, #4]
419     ldrb   r5, [r2, #5]
420     ldrb   r12, [r2, #6]
421     ldrb   lr, [r2, #7]
422     add    r4, r4, r1, asr #7
423     cmp    r4, #255
424     mvnhi  r4, r4, asr #31
425     strb   r4, [r2, #4]
426     add    r5, r5, r1, asr #7
427     cmp    r5, #255
428     mvnhi  r5, r5, asr #31
429     strb   r5, [r2, #5]
430     add    r12, r12, r1, asr #7
431     cmp    r12, #255
432     mvnhi  r12, r12, asr #31
433     strb   r12, [r2, #6]
434     add    lr, lr, r1, asr #7
435     cmp    lr, #255
436     mvnhi  lr, lr, asr #31
437     strb   lr, [r2, #7]
438     add    r2, r2, r3
439     cmp    r2, r0
440     blo    4b
441     ldmfd  sp!, { r4-r5, pc }