Submit initial patch from FS#12176. Adds support for several new game music formats...
[kugel-rb.git] / apps / codecs / libmad / synth_full_arm.S
blob27383ed3d07538c2fef022938e18e3e7eb152524
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    
36   /*;; r5 = loop counter
37     ;; r6,r7 accumulator1
38     ;; r8,r9 accumulator2 */
39      
40 synth_full_odd_sbsample:
41     stmdb   sp!, {r4-r11, lr}
42     ldr     r4, [sp, #36]
43     ldr     r5, =synth_full_sp
44     str     sp, [r5]
45     mov     r5, #15
46     add     r2, r2, #32
47 .l:
48     /* ;; PROD_O and odd half of SB_SAMPLE*/
49     add     r3, r3, #128
50     add     r4, r4, #128
51     ldr     r7, [r3, #4]
52     ldmia   r1!, {r10, r11, r12, lr}
53     ldr     r9, [r4, #120]
54     smull   r6, r7, r10, r7
55     ldr     sp, [r3, #60]
56     smull   r8, r9, r10, r9
57     ldr     r10, [r3, #52]
58     smlal   r6, r7, r11, sp
59     ldr     sp, [r3, #44]
60     smlal   r6, r7, r12, r10
61     ldr     r10, [r4, #64]
62     smlal   r6, r7, lr, sp
63     ldr     sp, [r4, #72]
64     smlal   r8, r9, r11, r10
65     ldr     r10, [r4, #80]
66     smlal   r8, r9, r12, sp
67     smlal   r8, r9, lr, r10
68     ldr     r10, [r3, #36]   
69     
70     ldmia   r1!, {r11, r12, sp, lr}
71     smlal   r6, r7, r11, r10
73     ldr     r10, [r4, #88]  /*;;1 cycle stall on arm9, but we free up r11*/
74     smlal   r8, r9, r11, r10
75     
76     ldr     r10, [r3, #28]
77     ldr     r11, [r3, #20]
78     smlal   r6, r7, r12, r10
79     ldr     r10, [r3, #12]
80     smlal   r6, r7, sp, r11
81     ldr     r11, [r4, #96]
82     smlal   r6, r7, lr, r10
83     ldr     r10, [r4, #104]
84     smlal   r8, r9, r12, r11
85     ldr     r11, [r4, #112]    
86     smlal   r8, r9, sp, r10
87     smlal   r8, r9, lr, r11
88     
89     rsbs    r6, r6, #0
90     rsc     r7, r7, #0
91     
92     /* ;; PROD_A and even half of SB_SAMPLE*/
93     ldr     r10, [r3, #0]
94     ldmia   r2!, {r11, r12, sp, lr}
95     smlal   r6, r7, r11, r10
96     
97     ldr     r10, [r4, #60]  /*;;1 cycle stall on arm9, but we free up r11*/
98     smlal   r8, r9, r11, r10    
99     ldr     r11, [r3, #56]
100     ldr     r10, [r3, #48]
101     smlal   r6, r7, r12, r11
102     ldr     r11, [r3, #40]
103     smlal   r6, r7, sp, r10
104     ldr     r10, [r4, #68]
105     smlal   r6, r7, lr, r11
106     ldr     r11, [r4, #76]
107     smlal   r8, r9, r12, r10
108     ldr     r10, [r4, #84]    
109     smlal   r8, r9, sp, r11
110     smlal   r8, r9, lr, r10
111     
112     ldr     r10, [r3, #32]
113     ldmia   r2!, {r11, r12, sp, lr}
114     smlal   r6, r7, r11, r10
116     ldr     r10, [r4, #92]  /*;;1 cycle stall on arm9, but we free up r11*/
117     smlal   r8, r9, r11, r10
118     
119     ldr     r10, [r3, #24]
120     ldr     r11, [r3, #16]
121     smlal   r6, r7, r12, r10
122     ldr     r10, [r3, #8]
123     smlal   r6, r7, sp, r11
124     ldr     r11, [r4, #100]
125     smlal   r6, r7, lr, r10
126     ldr     r10, [r4, #108]
127     smlal   r8, r9, r12, r11
128     ldr     r11, [r4, #116]
129     smlal   r8, r9, sp, r10
130     smlal   r8, r9, lr, r11
132     movs    r6, r6, lsr #16
133     adc     r6, r6, r7, lsl #16
134     str     r6, [r0, -r5, lsl #2]
136     movs    r8, r8, lsr #16
137     adc     r8, r8, r9, lsl #16
138     str     r8, [r0, r5, lsl #2]
139         
140     subs    r5, r5, #1
141     bne     .l
143     ldr     r5, =synth_full_sp
144     ldr     sp, [r5]
145     ldmpc   regs=r4-r11
147 synth_full_even_sbsample:
148     stmdb   sp!, {r4-r11, lr}
149     ldr     r4, [sp, #36]
150     ldr     r5, =synth_full_sp
151     str     sp, [r5]
152     mov     r5, #15
153     add     r2, r2, #32
154 .l2:
155  /* ;; PROD_O and odd half of SB_SAMPLE*/
156     add     r3, r3, #128
157     add     r4, r4, #128
158     ldr     r7, [r3, #0]
159     ldmia   r1!, {r10, r11, r12, lr}
160     ldr     r9, [r4, #60]
161     smull   r6, r7, r10, r7
162     ldr     sp, [r3, #56]
163     smull   r8, r9, r10, r9
164     ldr     r10, [r3, #48]
165     smlal   r6, r7, r11, sp
166     ldr     sp, [r3, #40]
167     smlal   r6, r7, r12, r10
168     ldr     r10, [r4, #68]
169     smlal   r6, r7, lr, sp
171     ldr     sp, [r4, #76]
172     smlal   r8, r9, r11, r10
173     ldr     r10, [r4, #84]
174     smlal   r8, r9, r12, sp
175     smlal   r8, r9, lr, r10
176     
177     ldr     r10, [r3, #32]
178     ldmia   r1!, {r11, r12, sp, lr}
180     smlal   r6, r7, r11, r10
181     ldr     r10, [r4, #92]  
182     smlal   r8, r9, r11, r10
183     ldr     r10, [r3, #24]
184     ldr     r11, [r3, #16]
185     smlal   r6, r7, r12, r10
186     ldr     r10, [r3, #8]
187     smlal   r6, r7, sp, r11
188     ldr     r11, [r4, #100]
189     smlal   r6, r7, lr, r10
190     ldr     r10, [r4, #108]
191     smlal   r8, r9, r12, r11
192     ldr     r11, [r4, #116]
193     smlal   r8, r9, sp, r10
194     smlal   r8, r9, lr, r11
195     
196     rsbs    r6, r6, #0
197     rsc     r7, r7, #0
199     ldr     r10, [r3, #4]
200     ldmia   r2!, {r11, r12, sp, lr}
201     smlal   r6, r7, r11, r10
202     ldr     r10, [r4, #120] /*;;1 cycle stall on arm9, but we free up r11*/
203     smlal   r8, r9, r11, r10
204     ldr     r10, [r3, #60]
205     ldr     r11, [r3, #52]
206     smlal   r6, r7, r12, r10
207     ldr     r10, [r3, #44]    
208     smlal   r6, r7, sp, r11
209     ldr     r11, [r4, #64]
210     smlal   r6, r7, lr, r10
212     ldr     r10, [r4, #72]
213     smlal   r8, r9, r12, r11
214     ldr     r11, [r4, #80]
215     smlal   r8, r9, sp, r10
217     smlal   r8, r9, lr, r11
219     ldr     r10, [r3, #36]
220     ldmia   r2!, {r11, r12, sp, lr}
221     smlal   r6, r7, r11, r10
222     ldr     r10, [r4, #88]  /*;;1 cycle stall on arm9, but we free up r11*/    
223     smlal   r8, r9, r11, r10
224     
225     ldr     r10, [r3, #28]
226     ldr     r11, [r3, #20]
227     smlal   r6, r7, r12, r10
228     ldr     r10, [r3, #12]
229     smlal   r6, r7, sp, r11
230     ldr     r11, [r4, #96]
231     smlal   r6, r7, lr, r10
232     ldr     r10, [r4, #104]
233     smlal   r8, r9, r12, r11
234     ldr     r11, [r4, #112]
235     smlal   r8, r9, sp, r10
236     smlal   r8, r9, lr, r11
238     movs    r6, r6, lsr #16
239     adc     r6, r6, r7, lsl #16
240     str     r6, [r0, -r5, lsl #2]
242     movs    r8, r8, lsr #16
243     adc     r8, r8, r9, lsl #16
244     str     r8, [r0, r5, lsl #2]
245         
246     subs    r5, r5, #1
247     bne     .l2
249     ldr     r5, =synth_full_sp
250     ldr     sp, [r5]
251     ldmpc   regs=r4-r11
253     .global III_aliasreduce
255 III_aliasreduce:
256     stmdb   sp!, {r4-r11, lr}
257     add     r1, r0, r1, lsl #2
258     add     r0, r0, #72
259 .arl1:
260     mov     r2, #8
261     mov     r3, r0              @ a
262     mov     r4, r0              @ b
263     ldr     r5, =csa            @ cs/ca
264 .arl2:
265     ldmdb   r3, {r6, r12}
266     ldmia   r4, {r7, lr}
268     ldmia   r5!, {r8, r9}
269     smull   r10, r11, r7, r8
270     smlal   r10, r11, r12, r9
271     movs    r10, r10, lsr #28
272     adc     r10, r10, r11, lsl #4
274     rsb     r7, r7, #0
275     smull   r11, r8, r12, r8
276     smlal   r11, r8, r7, r9
277     movs    r11, r11, lsr #28
278     adc     r11, r11, r8, lsl #4
279     
280     ldmia   r5!, {r8, r9}
281     smull   r12, r7, lr, r8
282     smlal   r12, r7, r6, r9
283     movs    r12, r12, lsr #28
284     adc     r12, r12, r7, lsl #4
285     stmia   r4!, {r10, r12}
287     rsb     lr, lr, #0
288     smull   r7, r10, r6, r8
289     smlal   r7, r10, lr, r9
290     movs    r7, r7, lsr #28
291     adc     r7, r7, r10, lsl #4
292     stmdb   r3!, {r7, r11}
293     
294     subs    r2, r2, #2
295     bne     .arl2
296     add     r0, r0, #72
297     cmp     r0, r1
298     blo     .arl1
299     ldmpc   regs=r4-r11
301 csa:
302     .word +0x0db84a81
303     .word -0x083b5fe7
304     .word +0x0e1b9d7f 
305     .word -0x078c36d2 
306     .word +0x0f31adcf
307     .word -0x05039814  
308     .word +0x0fbba815 
309     .word -0x02e91dd1 
310     .word +0x0feda417
311     .word -0x0183603a  
312     .word +0x0ffc8fc8 
313     .word -0x00a7cb87 
314     .word +0x0fff964c
315     .word -0x003a2847  
316     .word +0x0ffff8d3
317     .word -0x000f27b4
319     .global III_overlap
320 III_overlap:
321     stmdb   sp!, {r4-r7, lr}
322     add     r2, r2, r3, lsl #2
323     mov     r3, #6
324 .ol:
325     ldmia r0!, {r4, r5, r6}
326     ldmia r1!, {r7, r12, lr}
327     add   r4, r4, r7
328     add   r5, r5, r12
329     add   r6, r6, lr
330     str   r4, [r2], #128
331     str   r5, [r2], #128
332     str   r6, [r2], #128
333     subs  r3, r3, #1
334     bne   .ol
335     sub   r1, r1, #72
336     ldmia r0!, {r4, r5, r6, r7, r12, lr}
337     stmia r1!, {r4, r5, r6, r7, r12, lr}
338     ldmia r0!, {r4, r5, r6, r7, r12, lr}
339     stmia r1!, {r4, r5, r6, r7, r12, lr}
340     ldmia r0!, {r4, r5, r6, r7, r12, lr}
341     stmia r1!, {r4, r5, r6, r7, r12, lr}
342     ldmpc regs=r4-r7
344     .section    IBSS_SECTION_MPA_ARM,"aw",%nobits
345 synth_full_sp:
346     .space 4