Fix mp3 playback on the gigabeat by not putting code in IRAM. Someone actually famila...
[kugel-rb.git] / apps / codecs / libmad / dct32_arm.S
blob8ead5af899972e1b246b147ed72fad12f6eaa472
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2007 by Tomasz Malesinski
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  ****************************************************************************/
20 #include "config.h"
22     .global dct32
24 /* This performs slower in IRAM on PP502x and there is no space in
25    mpegplayer on the PP5002 */
26 #if defined(CPU_PP502x) || (CONFIG_CPU == PP5002 && defined(MPEGPLAYER)) || defined(TOSHIBA_GIGABEAT_F)
27     .section    .text,"ax",%progbits
28 #else
29     .section    .icode,"ax",%progbits
30 #endif
32 dct32:
33     stmdb    r13!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}
34     sub      r13, r13, #144
35     str      r0, [r13, #12]
36     str      r1, [r13, #8]
37     str      r2, [r13, #4]
38     str      r3, [r13]
39     add      r0, r13, #16
40     add      r1, r0, #128
41     ldr      r2, =bitrev
42 .shuffle:
43     ldr      r5, [r13, #12]
44     ldr      r3, [r2], #4
45     sub      r4, r5, r3, lsl #4
46     add      r3, r5, r3, lsl #4
47     ldr      r6, [r3]
48     ldr      r8, [r4, #124]
49     add      r6, r6, r8
50     sub      r8, r6, r8, lsl #1
51     ldr      r7, [r3, #8]
52     ldr      lr, [r4, #116]
53     add      r7, r7, lr
54     sub      lr, r7, lr, lsl #1
55     ldr      r10, [r3, #64]
56     ldr      r9, [r4, #60]
57     add      r10, r10, r9
58     sub      r9, r10, r9, lsl #1
59     ldr      r11, [r3, #72]
60     ldr      r12, [r4, #52]
61     add      r11, r11, r12
62     sub      r12, r11, r12, lsl #1
63     add      r6, r6, r10
64     sub      r10, r6, r10, lsl #1
65     add      r7, r7, r11
66     sub      r11, r7, r11, lsl #1
67     add      r8, r8, r12
68     sub      r12, r8, r12, lsl #1
69     add      lr, lr, r9
70     sub      r9, lr, r9, lsl #1
71     stmia    r0!, {r6, r7, r8, r9, r10, r11, r12, lr}
72     cmp      r0, r1
73     bne      .shuffle
74     ldr      r0, =189812531
75     add      r1, r13, #16
76     add      r3, r1, #128
77 .l2:
78     add      r2, r1, #32
79     ldmia    r2, {r4, r5, r8, r9}
80     ldmia    r1, {r6, r7, r10, r11}
81     add      r6, r6, r4
82     sub      r4, r6, r4, lsl #1
83     add      r7, r7, r5
84     sub      r5, r7, r5, lsl #1
85     stmia    r2!, {r4, r5}
86     stmia    r1!, {r6, r7}
87     add      r9, r9, r8
88     sub      r8, r9, r8, lsl #1
89     smull    r4, r6, r9, r0
90     movs     r4, r4, lsr #28
91     adc      r4, r4, r6, lsl #4
92     smull    r5, r6, r8, r0
93     movs     r5, r5, lsr #28
94     adc      r5, r5, r6, lsl #4
95     add      r10, r10, r4
96     sub      r4, r10, r4, lsl #1
97     add      r11, r11, r5
98     sub      r5, r11, r5, lsl #1
99     stmia    r2!, {r4, r5}
100     stmia    r1!, {r10, r11}
101     ldmia    r2, {r5, r6, r8, r11}
102     ldmia    r1, {r4, r7, r9, r10}
103     add      r4, r4, r6
104     sub      r6, r4, r6, lsl #1
105     add      r7, r7, r5
106     sub      r5, r7, r5, lsl #1
107     stmia    r2!, {r6, r7}
108     stmia    r1!, {r4, r5}
109     add      r11, r11, r8
110     sub      r8, r11, r8, lsl #1
111     smull    r5, r4, r8, r0
112     movs     r5, r5, lsr #28
113     adc      r5, r5, r4, lsl #4
114     smull    r6, r4, r11, r0
115     movs     r6, r6, lsr #28
116     adc      r6, r6, r4, lsl #4
117     add      r9, r9, r5
118     sub      r5, r9, r5, lsl #1
119     sub      r10, r10, r6
120     add      r6, r10, r6, lsl #1
121     stmia    r2!, {r5, r6}
122     stmia    r1!, {r9, r10}
123     add      r1, r1, #32
124     cmp      r1, r3
125     bne      .l2
126     add      r2, r13, #16
127     add      r3, r2, #64
128     ldr      r0, =sincos
129     add      r1, r0, #128
130 .lbut8:
131     ldmia    r3, {r7, r8}
132     ldmia    r0, {r9, r10}
133     add      r0, r0, #16
134     smull    r6, r5, r7, r9
135     smlal    r6, r5, r10, r8
136     movs     r6, r6, lsr #28
137     adc      r6, r6, r5, lsl #4
138     smull    r10, r5, r7, r10
139     rsb      r9, r9, #0
140     smlal    r10, r5, r8, r9
141     movs     r10, r10, lsr #28
142     adc      r5, r10, r5, lsl #4
143     ldmia    r2, {r7, r8}
144     add      r7, r7, r5
145     sub      r5, r7, r5, lsl #1
146     add      r8, r8, r6
147     sub      r6, r8, r6, lsl #1
148     stmia    r3!, {r5, r6}
149     stmia    r2!, {r7, r8}
150     cmp      r0, r1
151     bne      .lbut8
152     add      r1, r13, #16
153     ldr      r2, =sincos
154     ldr      r3, =sincos2
155     ldr      r0, [r13, #8]
156     mov      r0, r0, lsl #2
157     ldr      r4, [r13, #4]
158     add      r4, r4, r0
159     ldr      r5, [r13]
160     add      r5, r5, #480
161     add      r5, r5, r0
162     mov      r0, #0
163 .l4:
164     rsb      r12, r0, #16
165     and      r12, r12, #15
166     add      lr, r13, #16
167     add      r12, lr, r12, lsl #3
168     ldmia    r1!, {r10, r11}
169     ldmia    r12, {r6, r7}
170     add      r6, r6, r10
171     sub      r10, r6, r10, lsl #1
172     add      r11, r11, r7
173     sub      r7, r11, r7, lsl #1
174     ldmia    r2!, {r12, lr}
175     smull    r9, r8, r11, r12
176     smlal    r9, r8, lr, r10
177     movs     r9, r9, lsr #28
178     adc      r9, r9, r8, lsl #4
179     smull    lr, r8, r11, lr
180     rsb      r12, r12, #0
181     smlal    lr, r8, r10, r12
182     movs     lr, lr, lsr #28
183     adc      r8, lr, r8, lsl #4
184     add      r6, r6, r8
185     sub      r8, r6, r8, lsl #1
186     add      r7, r7, r9
187     sub      r9, r7, r9, lsl #1
188     add      lr, r3, #128
189     ldmia    lr, {r10, r11}
190     smull    lr, r12, r8, r11
191     smlal    lr, r12, r9, r10
192     movs     lr, lr, lsr #28
193     adc      r12, lr, r12, lsl #4
194     str      r12, [r4], #32
195     cmp      r0, #0
196     cmpne    r0, #8
197     beq      .skip1
198     smull    lr, r12, r8, r10
199     rsb      r9, r9, #0
200     smlal    lr, r12, r9, r11
201     movs     lr, lr, lsr #28
202     adc      r12, lr, r12, lsl #4
203     add      lr, r5, r0, lsl #6
204     str      r12, [lr, #-512]
205 .skip1:
206     ldmia    r3!, {r10, r11}
207     smull    lr, r12, r7, r10
208     smlal    lr, r12, r6, r11
209     movs     lr, lr, lsr #28
210     adc      r12, lr, r12, lsl #4
211     str      r12, [r5], #-32
212     cmp      r0, #0
213     cmpne    r0, #8
214     beq      .skip2
215     smull    lr, r12, r6, r10
216     rsb      r7, r7, #0
217     smlal    lr, r12, r7, r11
218     movs     lr, lr, lsr #28
219     adc      r12, lr, r12, lsl #4
220     sub      lr, r4, r0, lsl #6
221     str      r12, [lr, #480]
222 .skip2:
223     add      r0, r0, #1
224     cmp      r0, #9
225     bne      .l4
226     add      r13, r13, #144
227     ldmia    r13!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, pc}
228 bitrev:
229     .word 0x0
230     .word 0x2
231     .word 0x1
232     .word 0x3
234 sincos:
235     .word 0x0
236     .word 0x10000000
237     .word -0x31f1708
238     .word 0xfb14be8
239     .word -0x61f78aa
240     .word 0xec835e8
241     .word -0x8e39d9d
242     .word 0xd4db315
243     .word -0xb504f33
244     .word 0xb504f33
245     .word -0xd4db315
246     .word 0x8e39d9d
247     .word -0xec835e8
248     .word 0x61f78aa
249     .word -0xfb14be8
250     .word 0x31f1708
251     .word -0x10000000
252     .word 0x0
253     .word -0xfb14be8
254     .word -0x31f1708
255     .word -0xec835e8
256     .word -0x61f78aa
257     .word -0xd4db315
258     .word -0x8e39d9d
259     .word -0xb504f33
260     .word -0xb504f33
261     .word -0x8e39d9d
262     .word -0xd4db315
263     .word -0x61f78aa
264     .word -0xec835e8
265     .word -0x31f1708
266     .word -0xfb14be8
268 sincos2:
269     .word 0x0
270     .word 0x8000000
271     .word 0x647d98
272     .word 0x7fd8879
273     .word 0xc8bd36
274     .word 0x7f62369
275     .word 0x12c8107
276     .word 0x7e9d560
277     .word 0x18f8b84
278     .word 0x7d8a5f4
279     .word 0x1f19f98
280     .word 0x7c29fbf
281     .word 0x25280c6
282     .word 0x7a7d056
283     .word 0x2b1f34f
284     .word 0x7884841
285     .word 0x30fbc55
286     .word 0x7641af4
287     .word 0x36ba201
288     .word 0x73b5ebd
289     .word 0x3c56ba7
290     .word 0x70e2cbc
291     .word 0x41ce1e6
292     .word 0x6dca0d1
293     .word 0x471cece
294     .word 0x6a6d98a
295     .word 0x4c3fdff
296     .word 0x66cf812
297     .word 0x5133cc9
298     .word 0x62f201b
299     .word 0x55f5a4d
300     .word 0x5ed77c9
301     .word 0x5a8279a
302     .word 0x5a8279a
303     .word 0x5ed77c9
304     .word 0x55f5a4d
305     .word 0x62f201b
306     .word 0x5133cc9
307     .word 0x66cf812
308     .word 0x4c3fdff
309     .word 0x6a6d98a
310     .word 0x471cece
311     .word 0x6dca0d1
312     .word 0x41ce1e6
313     .word 0x70e2cbc
314     .word 0x3c56ba7
315     .word 0x73b5ebd
316     .word 0x36ba201
317     .word 0x7641af4
318     .word 0x30fbc55
319     .word 0x7884841
320     .word 0x2b1f34f
321     .word 0x7a7d056
322     .word 0x25280c6
323     .word 0x7c29fbf
324     .word 0x1f19f98
325     .word 0x7d8a5f4
326     .word 0x18f8b84
327     .word 0x7e9d560
328     .word 0x12c8107
329     .word 0x7f62369
330     .word 0xc8bd36
331     .word 0x7fd8879
332     .word 0x647d98