FS#11335 by me: make ARM assembly functions thumb-friendly
[kugel-rb.git] / apps / codecs / libmad / synth_full_arm.S
blobdec437f6660bbb52aa69eade696496bb9a09483b
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 "config.h"
23 #include "mad_iram.h"
25     .section    ICODE_SECTION_MPA_ARM,"ax",%progbits
27     .global synth_full_odd_sbsample
28     .global synth_full_even_sbsample
30     ;; r0 = pcm
31     ;; r1 = fo
32     ;; r2 = fe
33     ;; r3 = D0ptr
34     ;; r4 = D1ptr
35 synth_full_odd_sbsample:
36     stmdb   sp!, {r4-r11, lr}
37     ldr     r4, [sp, #36]
38     ldr     r5, =synth_full_sp
39     str     sp, [r5]
40     mov     r5, #15
41     add     r2, r2, #32
42 .l:
43     add     r3, r3, #128
44     add     r4, r4, #128
45     ldmia   r1!, {r10, r11, r12, lr}
46     ldr     r7, [r3, #4]
47     smull   r6, r7, r10, r7
48     ldr     r9, [r4, #120]
49     smull   r8, r9, r10, r9
51     ldr     r10, [r3, #60]
52     smlal   r6, r7, r11, r10
53     ldr     r10, [r3, #52]
54     smlal   r6, r7, r12, r10
55     ldr     r10, [r3, #44]
56     smlal   r6, r7, lr, r10
58     ldr     r10, [r4, #64]
59     smlal   r8, r9, r11, r10
60     ldr     r10, [r4, #72]
61     smlal   r8, r9, r12, r10
62     ldr     r10, [r4, #80]
63     smlal   r8, r9, lr, r10
65     ldmia   r1!, {r11, r12, sp, lr}
66     ldr     r10, [r3, #36]
67     smlal   r6, r7, r11, r10
68     ldr     r10, [r3, #28]
69     smlal   r6, r7, r12, r10
70     ldr     r10, [r3, #20]
71     smlal   r6, r7, sp, r10
72     ldr     r10, [r3, #12]
73     smlal   r6, r7, lr, r10
75     ldr     r10, [r4, #88]
76     smlal   r8, r9, r11, r10
77     ldr     r10, [r4, #96]
78     smlal   r8, r9, r12, r10
79     ldr     r10, [r4, #104]
80     smlal   r8, r9, sp, r10
81     ldr     r10, [r4, #112]
82     smlal   r8, r9, lr, r10
83     
84     rsbs    r6, r6, #0
85     rsc     r7, r7, #0
87     ldmia   r2!, {r11, r12, sp, lr}
89     ldr     r10, [r3, #0]
90     smlal   r6, r7, r11, r10
91     ldr     r10, [r3, #56]
92     smlal   r6, r7, r12, r10
93     ldr     r10, [r3, #48]
94     smlal   r6, r7, sp, r10
95     ldr     r10, [r3, #40]
96     smlal   r6, r7, lr, r10
98     ldr     r10, [r4, #60]
99     smlal   r8, r9, r11, r10
100     ldr     r10, [r4, #68]
101     smlal   r8, r9, r12, r10
102     ldr     r10, [r4, #76]
103     smlal   r8, r9, sp, r10
104     ldr     r10, [r4, #84]
105     smlal   r8, r9, lr, r10
107     ldmia   r2!, {r11, r12, sp, lr}
108     ldr     r10, [r3, #32]
109     smlal   r6, r7, r11, r10
110     ldr     r10, [r3, #24]
111     smlal   r6, r7, r12, r10
112     ldr     r10, [r3, #16]
113     smlal   r6, r7, sp, r10
114     ldr     r10, [r3, #8]
115     smlal   r6, r7, lr, r10
117     ldr     r10, [r4, #92]
118     smlal   r8, r9, r11, r10
119     ldr     r10, [r4, #100]
120     smlal   r8, r9, r12, r10
121     ldr     r10, [r4, #108]
122     smlal   r8, r9, sp, r10
123     ldr     r10, [r4, #116]
124     smlal   r8, r9, lr, r10
126     movs    r6, r6, lsr #16
127     adc     r6, r6, r7, lsl #16
128     str     r6, [r0, -r5, lsl #2]
130     movs    r8, r8, lsr #16
131     adc     r8, r8, r9, lsl #16
132     str     r8, [r0, r5, lsl #2]
133         
134     subs    r5, r5, #1
135     bne     .l
137     ldr     r5, =synth_full_sp
138     ldr     sp, [r5]
139     ldmpc   regs=r4-r11
141 synth_full_even_sbsample:
142     stmdb   sp!, {r4-r11, lr}
143     ldr     r4, [sp, #36]
144     ldr     r5, =synth_full_sp
145     str     sp, [r5]
146     mov     r5, #15
147     add     r2, r2, #32
148 .l2:
149     add     r3, r3, #128
150     add     r4, r4, #128
151     ldmia   r1!, {r10, r11, r12, lr}
152     ldr     r7, [r3, #0]
153     smull   r6, r7, r10, r7
154     ldr     r9, [r4, #60]
155     smull   r8, r9, r10, r9
157     ldr     r10, [r3, #56]
158     smlal   r6, r7, r11, r10
159     ldr     r10, [r3, #48]
160     smlal   r6, r7, r12, r10
161     ldr     r10, [r3, #40]
162     smlal   r6, r7, lr, r10
164     ldr     r10, [r4, #68]
165     smlal   r8, r9, r11, r10
166     ldr     r10, [r4, #76]
167     smlal   r8, r9, r12, r10
168     ldr     r10, [r4, #84]
169     smlal   r8, r9, lr, r10
171     ldmia   r1!, {r11, r12, sp, lr}
172     ldr     r10, [r3, #32]
173     smlal   r6, r7, r11, r10
174     ldr     r10, [r3, #24]
175     smlal   r6, r7, r12, r10
176     ldr     r10, [r3, #16]
177     smlal   r6, r7, sp, r10
178     ldr     r10, [r3, #8]
179     smlal   r6, r7, lr, r10
181     ldr     r10, [r4, #92]
182     smlal   r8, r9, r11, r10
183     ldr     r10, [r4, #100]
184     smlal   r8, r9, r12, r10
185     ldr     r10, [r4, #108]
186     smlal   r8, r9, sp, r10
187     ldr     r10, [r4, #116]
188     smlal   r8, r9, lr, r10
189     
190     rsbs    r6, r6, #0
191     rsc     r7, r7, #0
193     ldmia   r2!, {r11, r12, sp, lr}
195     ldr     r10, [r3, #4]
196     smlal   r6, r7, r11, r10
197     ldr     r10, [r3, #60]
198     smlal   r6, r7, r12, r10
199     ldr     r10, [r3, #52]
200     smlal   r6, r7, sp, r10
201     ldr     r10, [r3, #44]
202     smlal   r6, r7, lr, r10
204     ldr     r10, [r4, #120]
205     smlal   r8, r9, r11, r10
206     ldr     r10, [r4, #64]
207     smlal   r8, r9, r12, r10
208     ldr     r10, [r4, #72]
209     smlal   r8, r9, sp, r10
210     ldr     r10, [r4, #80]
211     smlal   r8, r9, lr, r10
213     ldmia   r2!, {r11, r12, sp, lr}
214     ldr     r10, [r3, #36]
215     smlal   r6, r7, r11, r10
216     ldr     r10, [r3, #28]
217     smlal   r6, r7, r12, r10
218     ldr     r10, [r3, #20]
219     smlal   r6, r7, sp, r10
220     ldr     r10, [r3, #12]
221     smlal   r6, r7, lr, r10
223     ldr     r10, [r4, #88]
224     smlal   r8, r9, r11, r10
225     ldr     r10, [r4, #96]
226     smlal   r8, r9, r12, r10
227     ldr     r10, [r4, #104]
228     smlal   r8, r9, sp, r10
229     ldr     r10, [r4, #112]
230     smlal   r8, r9, lr, r10
232     movs    r6, r6, lsr #16
233     adc     r6, r6, r7, lsl #16
234     str     r6, [r0, -r5, lsl #2]
236     movs    r8, r8, lsr #16
237     adc     r8, r8, r9, lsl #16
238     str     r8, [r0, r5, lsl #2]
239         
240     subs    r5, r5, #1
241     bne     .l2
243     ldr     r5, =synth_full_sp
244     ldr     sp, [r5]
245     ldmpc   regs=r4-r11
247     .global III_aliasreduce
249 III_aliasreduce:
250     stmdb   sp!, {r4-r11, lr}
251     add     r1, r0, r1, lsl #2
252     add     r0, r0, #72
253 .arl1:
254     mov     r2, #8
255     mov     r3, r0              @ a
256     mov     r4, r0              @ b
257     ldr     r5, =csa            @ cs/ca
258 .arl2:
259     ldmdb   r3, {r6, r12}
260     ldmia   r4, {r7, lr}
262     ldmia   r5!, {r8, r9}
263     smull   r10, r11, r7, r8
264     smlal   r10, r11, r12, r9
265     movs    r10, r10, lsr #28
266     adc     r10, r10, r11, lsl #4
268     rsb     r7, r7, #0
269     smull   r11, r8, r12, r8
270     smlal   r11, r8, r7, r9
271     movs    r11, r11, lsr #28
272     adc     r11, r11, r8, lsl #4
273     
274     ldmia   r5!, {r8, r9}
275     smull   r12, r7, lr, r8
276     smlal   r12, r7, r6, r9
277     movs    r12, r12, lsr #28
278     adc     r12, r12, r7, lsl #4
279     stmia   r4!, {r10, r12}
281     rsb     lr, lr, #0
282     smull   r7, r10, r6, r8
283     smlal   r7, r10, lr, r9
284     movs    r7, r7, lsr #28
285     adc     r7, r7, r10, lsl #4
286     stmdb   r3!, {r7, r11}
287     
288     subs    r2, r2, #2
289     bne     .arl2
290     add     r0, r0, #72
291     cmp     r0, r1
292     blo     .arl1
293     ldmpc   regs=r4-r11
295 csa:
296     .word +0x0db84a81
297     .word -0x083b5fe7
298     .word +0x0e1b9d7f 
299     .word -0x078c36d2 
300     .word +0x0f31adcf
301     .word -0x05039814  
302     .word +0x0fbba815 
303     .word -0x02e91dd1 
304     .word +0x0feda417
305     .word -0x0183603a  
306     .word +0x0ffc8fc8 
307     .word -0x00a7cb87 
308     .word +0x0fff964c
309     .word -0x003a2847  
310     .word +0x0ffff8d3
311     .word -0x000f27b4
313     .global III_overlap
314 III_overlap:
315     stmdb   sp!, {r4-r7, lr}
316     add     r2, r2, r3, lsl #2
317     mov     r3, #6
318 .ol:
319     ldmia r0!, {r4, r5, r6}
320     ldmia r1!, {r7, r12, lr}
321     add   r4, r4, r7
322     add   r5, r5, r12
323     add   r6, r6, lr
324     str   r4, [r2], #128
325     str   r5, [r2], #128
326     str   r6, [r2], #128
327     subs  r3, r3, #1
328     bne   .ol
329     sub   r1, r1, #72
330     ldmia r0!, {r4, r5, r6, r7, r12, lr}
331     stmia r1!, {r4, r5, r6, r7, r12, lr}
332     ldmia r0!, {r4, r5, r6, r7, r12, lr}
333     stmia r1!, {r4, r5, r6, r7, r12, lr}
334     ldmia r0!, {r4, r5, r6, r7, r12, lr}
335     stmia r1!, {r4, r5, r6, r7, r12, lr}
336     ldmpc regs=r4-r7
338     .section    IBSS_SECTION_MPA_ARM,"aw",%nobits
339 synth_full_sp:
340     .space 4