Rearange menu of mpegplayer. Add new menu with "settings" and "quit", and remove...
[kugel-rb.git] / apps / plugins / mpegplayer / idct_armv6.S
blobfbffa4dfa93f71b8faf899ef7cb59e2581fd9f4a
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2009 by Jens Arnold
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  ****************************************************************************/
23     .global     mpeg2_idct_copy
24     .type       mpeg2_idct_copy, %function
25     .global     mpeg2_idct_add
26     .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     str     lr, [sp, #-4]!      @ lr is used
34     add     r1, r0, #128        @ secondary, transposed temp buffer
35     mov     r14, #8             @ loop counter
37 .row_loop:
38     ldmia   r0!, {r2, r3, r10, r11} @ fetch f0, f2, f4, f6, f1, f3, f5, f7
39     ldrd    r4, L_W1357         @ load  W1, W3, W5, W7
41     smuad   r6, r4, r10         @ b0 = W1 * f1 + W3 * f3
42     smlad   r6, r5, r11, r6     @    + W5 * f5 + W7 * f7
44     smultt  r7, r5, r10         @ b1 = -W7 * f3
45     smlabb  r7, r4, r11, r7     @    + -W1 * f5
46     smlabt  r7, r5, r11, r7     @    + -W5 * f7
47     rsb     r7, r7, #0
48     smlatb  r7, r4, r10, r7     @    + W3 * f1
50     smulbt  r8, r4, r10         @ b2 = -W1 * f3
51     rsb     r8, r8, #0
52     smlabb  r8, r5, r10, r8     @    + W5 * f1
53     smlatb  r8, r5, r11, r8     @    + W7 * f5
54     smlatt  r8, r4, r11, r8     @    + W3 * f7
56     smusdx  r9, r10, r5         @ b3 = f1 * W7 - f3 * W5
57     smlsdx  r9, r11, r4, r9     @    + f5 * W3 - f1 * W1
59     ldrd    r4, L_W0246         @ load  W0, W2, W4, W6
60     add     r2, r2, #1          @ f0 += 1
62     smulbb  r10, r4, r2         @ a0' = W0 * f0
63     smlabb  r10, r5, r3, r10    @     + W4 * f4
64     smultt  r12, r4, r2         @ a3' = W2 * f2
65     smlatt  r12, r5, r3, r12    @     + W6 * f6
66     add     r10, r10, r12       @ a0  = a0' + a3'
67     sub     r12, r10, r12, lsl #1  @ a3  = a0 - 2 * a3'
69     smulbb  r11, r5, r3         @ a1' = -W4 * f4
70     rsb     r11, r11, #0
71     smlabb  r11, r4, r2, r11    @     + W0 * f0
72     smultt  r3, r4, r3          @ a2' = -W2 * f6
73     rsb     r3, r3, #0
74     smlatt  r3, r5, r2, r3      @     + W6 * f2
75     add     r11, r11, r3        @ a1  = a1' + a2'
76     sub     r3, r11, r3, lsl #1 @ a2  = a1 - 2 * a2'
77     
78     @ Special store order for making the column pass calculate columns in
79     @ the order 0-2-1-3-4-6-5-7, allowing for uxtab16 use in later stages.
80     sub     r2, r10, r6         @ block[7] = (a0 - b0)
81     mov     r2, r2, asr #12     @            >> 12
82     strh    r2, [r1, #7*16]
83     sub     r2, r11, r7         @ block[6] = (a1 - b1)
84     mov     r2, r2, asr #12     @            >> 12
85     strh    r2, [r1, #5*16]
86     sub     r2, r3, r8          @ block[5] = (a2 - b2)
87     mov     r2, r2, asr #12     @            >> 12
88     strh    r2, [r1, #6*16]
89     sub     r2, r12, r9         @ block[4] = (a3 - b3)
90     mov     r2, r2, asr #12     @            >> 12
91     strh    r2, [r1, #4*16]
92     add     r2, r12, r9         @ block[3] = (a3 + b3)
93     mov     r2, r2, asr #12     @            >> 12
94     strh    r2, [r1, #3*16]
95     add     r2, r3, r8          @ block[2] = (a2 + b2)
96     mov     r2, r2, asr #12     @            >> 12
97     strh    r2, [r1, #1*16]
98     add     r2, r11, r7         @ block[1] = (a1 + b1)
99     mov     r2, r2, asr #12     @            >> 12
100     strh    r2, [r1, #2*16]
101     add     r2, r10, r6         @ block[0] = (a0 + b0)
102     mov     r2, r2, asr #12     @            >> 12
103     strh    r2, [r1], #2        @ advance to next temp column
104     
105     subs    r14, r14, #1
106     bne     .row_loop
107     b       .col_start
109     @placed here because of ldrd's offset limit
110 L_W1357:
111     .short  2841
112     .short  2408
113     .short  1609
114     .short   565
116 L_W0246:
117     .short  2048
118     .short  2676
119     .short  2048
120     .short  1108
122 .col_start:
123     @ r0 now points to the temp buffer, where we need it.
124     sub     r1, r1, #128+16     @ point r1 back to the input block
125     mov     r14, #8             @ loop counter
127 .col_loop:
128     ldmia   r0!, {r2, r3, r10, r11} @ fetch f0, f2, f4, f6, f1, f3, f5, f7
129     ldrd    r4, L_W1357         @ load  W1, W3, W5, W7
131     smuad   r6, r4, r10         @ b0 = W1 * f1 + W3 * f3
132     smlad   r6, r5, r11, r6     @    + W5 * f5 + W7 * f7
134     smultt  r7, r5, r10         @ b1 = -W7 * f3
135     smlabb  r7, r4, r11, r7     @    + -W1 * f5
136     smlabt  r7, r5, r11, r7     @    + -W5 * f7
137     rsb     r7, r7, #0
138     smlatb  r7, r4, r10, r7     @    + W3 * f1
140     smulbt  r8, r4, r10         @ b2 = -W1 * f3
141     rsb     r8, r8, #0
142     smlabb  r8, r5, r10, r8     @    + W5 * f1
143     smlatb  r8, r5, r11, r8     @    + W7 * f5
144     smlatt  r8, r4, r11, r8     @    + W3 * f7
146     smusdx  r9, r10, r5         @ b3 = f1 * W7 - f3 * W5
147     smlsdx  r9, r11, r4, r9     @    + f5 * W3 - f1 * W1
149     ldrd    r4, L_W0246         @ load  W0, W2, W4, W6
150     add     r2, r2, #32         @ DC offset: 0.5
152     smulbb  r10, r4, r2         @ a0' = W0 * f0
153     smlabb  r10, r5, r3, r10    @     + W4 * f4
154     smultt  r12, r4, r2         @ a3' = W2 * f2
155     smlatt  r12, r5, r3, r12    @     + W6 * f6
156     add     r10, r10, r12       @ a0  = a0' + a3'
157     sub     r12, r10, r12, lsl #1  @ a3  = a0 - 2 * a3'
159     smulbb  r11, r5, r3         @ a1' = -W4 * f4
160     rsb     r11, r11, #0
161     smlabb  r11, r4, r2, r11    @     + W0 * f0
162     smultt  r3, r4, r3          @ a2' = -W2 * f6
163     rsb     r3, r3, #0
164     smlatt  r3, r5, r2, r3      @     + W6 * f2
165     add     r11, r11, r3        @ a1  = a1' + a2'
166     sub     r3, r11, r3, lsl #1 @ a2  = a1 - 2 * a2'
167     
168     sub     r2, r10, r6         @ block[7] = (a0 - b0)
169     mov     r2, r2, asr #17     @            >> 17
170     strh    r2, [r1, #7*16]
171     sub     r2, r11, r7         @ block[6] = (a1 - b1)
172     mov     r2, r2, asr #17     @            >> 17
173     strh    r2, [r1, #6*16]
174     sub     r2, r3, r8          @ block[5] = (a2 - b2)
175     mov     r2, r2, asr #17     @            >> 17
176     strh    r2, [r1, #5*16]
177     sub     r2, r12, r9         @ block[4] = (a3 - b3)
178     mov     r2, r2, asr #17     @            >> 17
179     strh    r2, [r1, #4*16]
180     add     r2, r12, r9         @ block[3] = (a3 + b3)
181     mov     r2, r2, asr #17     @            >> 17
182     strh    r2, [r1, #3*16]
183     add     r2, r3, r8          @ block[2] = (a2 + b2)
184     mov     r2, r2, asr #17     @            >> 17
185     strh    r2, [r1, #2*16]
186     add     r2, r11, r7         @ block[1] = (a1 + b1)
187     mov     r2, r2, asr #17     @            >> 17
188     strh    r2, [r1, #1*16]
189     add     r2, r10, r6         @ block[0] = (a0 + b0)
190     mov     r2, r2, asr #17     @            >> 17
191     strh    r2, [r1], #2        @ advance to next column
193     subs    r14, r14, #1
194     bne     .col_loop
196     sub     r0, r0, #256        @ point r0 back to the input block
197     ldr     pc, [sp], #4
200 mpeg2_idct_copy:
201     stmfd  sp!, {r1-r2, r4-r11, lr}
202     bl     .idct
203     ldmfd  sp!, {r1-r2}
205     add    r3, r0, #128
206     mov    r8, #0
207     mov    r9, #0
208     mov    r10, #0
209     mov    r11, #0
210 1:                              @ idct data is in order 0-2-1-3-4-6-5-7,
211     ldmia  r0,  {r4-r7}         @ see above
212     stmia  r0!, {r8-r11}
213     usat16 r4, #8, r4
214     usat16 r5, #8, r5
215     orr    r4, r4, r5, lsl #8
216     usat16 r6, #8, r6
217     usat16 r7, #8, r7
218     orr    r5, r6, r7, lsl #8
219     strd   r4, [r1]             @ r4, r5
220     add    r1, r1, r2
221     cmp    r0, r3
222     blo    1b
224     ldmfd  sp!, {r4-r11, pc}
226 mpeg2_idct_add:
227     cmp    r0, #129
228     mov    r0, r1
229     ldreqsh r1, [r0, #0]
230     bne    1f
231     and    r1, r1, #0x70
232     cmp    r1, #0x40
233     bne    3f
235     stmfd  sp!, {r2-r11, lr}
236     bl     .idct
237     ldmfd  sp!, {r1-r2}
239     add    r3, r0, #128
240     mov    r10, #0
241     mov    r11, #0
242     mov    r12, #0
243     mov    lr, #0
244     ldrd   r8, [r1]             @ r8, r9
245 2:                              @ idct data is in order 0-2-1-3-4-6-5-7,
246     ldmia  r0,  {r4-r7}         @ see above
247     stmia  r0!, {r10-r12, lr}
248     uxtab16 r4, r4, r8
249     uxtab16 r5, r5, r8, ror #8
250     usat16 r4, #8, r4
251     usat16 r5, #8, r5
252     orr    r4, r4, r5, lsl #8
253     uxtab16 r6, r6, r9
254     uxtab16 r7, r7, r9, ror #8
255     usat16 r6, #8, r6
256     usat16 r7, #8, r7
257     orr    r5, r6, r7, lsl #8
258     strd   r4, [r1]             @ r4, r5
259     add    r1, r1, r2
260     cmp    r0, r3
261     ldrlod r8, [r1]             @ r8, r9
262     blo    2b
264     ldmfd  sp!, {r4-r11, pc}
267     stmfd  sp!, {r4, lr}
268     ldrsh  r4, [r0, #0]         @ r4 = block[0]
269     mov    r12, #0
270     strh   r12, [r0, #0]        @ block[0] = 0
271     strh   r12, [r0, #126]      @ block[63] = 0
272     add    r4, r4, #64
273     mov    r4, r4, asr #7       @ r4 = DC
274     mov    r4, r4, lsl #16      @ spread to 2 halfwords
275     orr    r4, r4, r4, lsr #16
276     ldrd   r0, [r2]             @ r0, r1
277     add    r12, r2, r3, asl #3
279     uxtab16 lr, r4, r0, ror #8
280     uxtab16 r0, r4, r0
281     usat16 lr, #8, lr
282     usat16 r0, #8, r0
283     orr    r0, r0, lr, lsl #8
284     uxtab16 lr, r4, r1, ror #8
285     uxtab16 r1, r4, r1
286     usat16 lr, #8, lr
287     usat16 r1, #8, r1
288     orr    r1, r1, lr, lsl #8
289     strd   r0, [r2]             @ r0, r1
290     add    r2, r2, r3
291     cmp    r2, r12
292     ldrlod r0, [r2]             @ r0, r1
293     blo    4b
295     ldmfd  sp!, {r4, pc}