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