1@/******************************************************************************
2@ *
3@ * Copyright (C) 2018 The Android Open Source Project
4@ *
5@ * Licensed under the Apache License, Version 2.0 (the "License");
6@ * you may not use this file except in compliance with the License.
7@ * You may obtain a copy of the License at:
8@ *
9@ * http://www.apache.org/licenses/LICENSE-2.0
10@ *
11@ * Unless required by applicable law or agreed to in writing, software
12@ * distributed under the License is distributed on an "AS IS" BASIS,
13@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14@ * See the License for the specific language governing permissions and
15@ * limitations under the License.
16@ *
17@ *****************************************************************************
18@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19@*/
20
21
22.text
23.p2align 2
24        .extern ixheaacd_radix4bfly
25.hidden ixheaacd_radix4bfly
26        .extern ixheaacd_postradixcompute2
27.hidden ixheaacd_postradixcompute2
28        .extern ixheaacd_sbr_imdct_using_fft
29.hidden ixheaacd_sbr_imdct_using_fft
30
31        .global ixheaacd_dec_DCT2_64_asm
32        .type ixheaacd_dec_DCT2_64_asm, %function
33
34ixheaacd_dec_DCT2_64_asm:
35
36    STMFD           sp!, {r0-r3, r4-r12, r14}
37    ADD             R2, R1, #252
38    MOV             R3, #32
39    MOV             R4, #-4
40
41    ADD             R2, R2, #4
42
43
44FOR_LOOP:
45
46    VLD2.32         {Q0, Q1}, [R0]!
47    SUBS            R3, R3, #4
48
49    VST1.32         {Q0}, [R1]!
50    SUB             R2, R2, #16
51
52    VREV64.32       Q1, Q1
53    VSWP            D2, D3
54    VST1.32         {Q1}, [R2]
55    BGT             FOR_LOOP
56
57    LDR             r0, [sp, #8]
58    MOV             r1, #32
59    LDR             r2, [sp, #4]
60    LDR             r3, [sp]
61
62    LDR             r4, [sp, #12]
63    STR             r4, [sp, #-4]!
64    STR             r4, [sp, #-4]!
65    STR             r4, [sp, #-4]!
66    STR             r4, [sp, #-4]!
67
68    BL              ixheaacd_sbr_imdct_using_fft
69
70    ADD             sp, sp, #16
71
72    LDR             r0, [sp]
73
74
75    LDR             r2, [sp, #56]
76
77    VPUSH           {D8 - D15}
78    ADD             R5, R0, #252
79    VLD1.32         D0, [R0]
80    ADD             R3, R2, #2
81    VSHL.S32        D0, D0, #1
82    VST1.32         D0, [R0]!
83    SUB             R5, R5, #28
84
85
86    VLD2.32         {Q0, Q1}, [R0]!
87
88    VLD2.32         {Q2, Q3}, [R5]!
89    VREV64.32       Q2, Q2
90    VSWP            D4, D5
91    MOV             R10, #-8
92    VREV64.32       Q3, Q3
93    ADD             R4, R2, #30
94    VSWP            D6, D7
95    SUB             R4, R4, #6
96    VLD1.16         D8, [R3]!
97    VSUB.I32        Q11, Q3, Q1
98    VLD1.16         D10, [R4], R10
99    VADD.I32        Q10, Q3, Q1
100    VREV64.16       D10, D10
101    VSUB.I32        Q9, Q0, Q2
102    VUZP.16         D20, D21
103    VADD.I32        Q8, Q0, Q2
104    VUZP.16         D18, D19
105    VMULL.U16       Q15, D20, D8
106    VMLSL.U16       Q15, D18, D10
107    VMULL.U16       Q14, D18, D8
108    VMLAL.U16       Q14, D20, D10
109    SUB             R11, R0, #32
110    VSHR.S32        Q15, Q15, #16
111    VSHR.U32        Q14, Q14, #16
112    SUB             R12, R5, #32
113    VMLAL.S16       Q15, D21, D8
114    VMLSL.S16       Q15, D19, D10
115
116    VLD2.32         {Q0, Q1}, [R0]!
117    SUB             R5, R5, #64
118    VMLAL.S16       Q14, D19, D8
119    VLD2.32         {Q2, Q3}, [R5]!
120    VMLAL.S16       Q14, D21, D10
121    VREV64.32       Q2, Q2
122    VSHL.S32        Q15, Q15, #1
123    VSWP            D4, D5
124    VSHL.S32        Q14, Q14, #1
125
126    VREV64.32       Q3, Q3
127    VADD.I32        Q13, Q8, Q15
128    VSWP            D6, D7
129    VADD.I32        Q12, Q11, Q14
130
131
132    VLD1.16         D8, [R3]!
133    VSUB.I32        Q7, Q14, Q11
134    VLD1.16         D10, [R4], R10
135
136    VSUB.I32        Q6, Q8, Q15
137    VREV64.32       Q7, Q7
138    VREV64.32       Q6, Q6
139    VSWP            D14, D15
140    VSWP            D12, D13
141    VREV64.16       D10, D10
142
143
144    VSUB.I32        Q11, Q3, Q1
145    VSWP            Q13, Q12
146    VADD.I32        Q10, Q3, Q1
147    VST2.32         {Q12, Q13}, [R11]!
148    VSUB.I32        Q9, Q0, Q2
149
150    VADD.I32        Q8, Q0, Q2
151    VST2.32         {Q6, Q7}, [R12]
152    SUB             R11, R0, #32
153
154    VUZP.16         D20, D21
155    SUB             R12, R5, #32
156
157    VUZP.16         D18, D19
158    SUB             R5, R5, #64
159
160    VMULL.U16       Q15, D20, D8
161    VLD2.32         {Q0, Q1}, [R0]!
162    VMLSL.U16       Q15, D18, D10
163    VLD2.32         {Q2, Q3}, [R5]!
164    VMULL.U16       Q14, D18, D8
165    VREV64.32       Q2, Q2
166    VMLAL.U16       Q14, D20, D10
167    VSWP            D4, D5
168    VSHR.S32        Q15, Q15, #16
169    VREV64.32       Q3, Q3
170    VMLAL.S16       Q15, D21, D8
171    VMLSL.S16       Q15, D19, D10
172    VSWP            D6, D7
173    VSHR.U32        Q14, Q14, #16
174    VMLAL.S16       Q14, D19, D8
175    VLD1.16         D8, [R3]!
176    VMLAL.S16       Q14, D21, D10
177    VSHL.S32        Q15, Q15, #1
178    VLD1.16         D10, [R4], R10
179
180    VSHL.S32        Q14, Q14, #1
181    VREV64.16       D10, D10
182    VADD.I32        Q13, Q8, Q15
183    VADD.I32        Q12, Q11, Q14
184
185
186    VSUB.I32        Q7, Q14, Q11
187    VSUB.I32        Q6, Q8, Q15
188    VREV64.32       Q7, Q7
189    VSUB.I32        Q11, Q3, Q1
190    VREV64.32       Q6, Q6
191    VADD.I32        Q10, Q3, Q1
192    VSWP            D14, D15
193    VSUB.I32        Q9, Q0, Q2
194    VSWP            D12, D13
195    VADD.I32        Q8, Q0, Q2
196    VSWP            Q13, Q12
197
198
199    VUZP.16         D20, D21
200    VUZP.16         D18, D19
201    VMULL.U16       Q15, D20, D8
202    VMLSL.U16       Q15, D18, D10
203    VST2.32         {Q12, Q13}, [R11]!
204    VMULL.U16       Q14, D18, D8
205    VMLAL.U16       Q14, D20, D10
206    VST2.32         {Q6, Q7}, [R12]
207
208    SUB             R11, R0, #32
209    VLD2.32         {Q0, Q1}, [R0]!
210    SUB             R12, R5, #32
211    SUB             R5, R5, #64
212    VSHR.S32        Q15, Q15, #16
213    VLD2.32         {Q2, Q3}, [R5]!
214    VMLAL.S16       Q15, D21, D8
215    VREV64.32       Q2, Q2
216    VMLSL.S16       Q15, D19, D10
217    VSWP            D4, D5
218    VSHR.U32        Q14, Q14, #16
219
220    VREV64.32       Q3, Q3
221    VMLAL.S16       Q14, D19, D8
222    VSWP            D6, D7
223    VMLAL.S16       Q14, D21, D10
224    VSHL.S32        Q15, Q15, #1
225
226    VLD1.16         D8, [R3]!
227    VSHL.S32        Q14, Q14, #1
228
229    VADD.I32        Q13, Q8, Q15
230
231    VLD1.16         D10, [R4], R10
232
233    VADD.I32        Q12, Q11, Q14
234
235
236    VREV64.16       D10, D10
237    VSUB.I32        Q7, Q14, Q11
238
239
240    VSUB.I32        Q6, Q8, Q15
241    VREV64.32       Q7, Q7
242    VREV64.32       Q6, Q6
243    VSWP            D14, D15
244    VSWP            D12, D13
245
246    VSWP            Q13, Q12
247    VSUB.I32        Q11, Q3, Q1
248    VST2.32         {Q12, Q13}, [R11]!
249    VADD.I32        Q10, Q3, Q1
250
251    VST2.32         {Q6, Q7}, [R12]
252
253    SUB             R11, R0, #32
254
255    VSUB.I32        Q9, Q0, Q2
256    VADD.I32        Q8, Q0, Q2
257    VUZP.16         D20, D21
258    SUB             R12, R5, #32
259    VUZP.16         D18, D19
260    SUB             R5, R5, #64
261
262    VMULL.U16       Q15, D20, D8
263    VMLSL.U16       Q15, D18, D10
264    VMULL.U16       Q14, D18, D8
265    VMLAL.U16       Q14, D20, D10
266    VSHR.S32        Q15, Q15, #16
267    VMLAL.S16       Q15, D21, D8
268    VMLSL.S16       Q15, D19, D10
269
270    VSHR.U32        Q14, Q14, #16
271    VMLAL.S16       Q14, D19, D8
272    VMLAL.S16       Q14, D21, D10
273
274    VSHL.S32        Q15, Q15, #1
275    VSHL.S32        Q14, Q14, #1
276    VADD.I32        Q13, Q8, Q15
277    VADD.I32        Q12, Q11, Q14
278
279    VSUB.I32        Q7, Q14, Q11
280    VSUB.I32        Q6, Q8, Q15
281    VREV64.32       Q7, Q7
282    VREV64.32       Q6, Q6
283    VSWP            D14, D15
284    VSWP            D12, D13
285
286
287    VSWP            Q13, Q12
288    VST2.32         {Q12, Q13}, [R11]!
289
290    VST2.32         {Q6, Q7}, [R12]
291    VPOP            {D8 - D15}
292
293
294
295
296
297
298
299
300
301
302
303
304    LDMFD           sp!, {r0-r2, r3}
305    LDR             R1, [SP, #48]
306    LDR             R2, [SP, #44]
307    ADD             R3, R1, #126
308    VLD1.32         D0[0], [R0, :32]!
309    SUB             R4, R1, #2
310
311    ADD             R5, R1, #130
312    VLD1.32         D1[0], [R0, :32]!
313    ADD             R7, R2, #4
314
315    MOV             R6, #0x8000
316    VDUP.32         Q15, R6
317
318    VADD.I32        D2, D0, D1
319    VSHR.S32        D2, D2, #1
320    VSHL.S32        D2, D2, #4
321    VADD.I32        Q2, Q1, Q15
322    VSHR.S32        Q2, Q2, #16
323    VSUB.I32        D6, D0, D1
324    VST1.16         D4[0], [R1]!
325    MOV             R8, #28
326
327    MOV             R9, #-2
328    VLD2.32         {Q0, Q1}, [R0]!
329    SUB             R4, R4, #6
330
331    SUB             R3, R3, #6
332    VLD2.16         {D4, D5}, [R7]!
333
334    VUZP.16         D0, D1
335
336    VUZP.16         D2, D3
337    VMULL.U16       Q14, D0, D4
338
339    VMLSL.U16       Q14, D2, D5
340    VSHR.S32        Q14, Q14, #16
341    VMLAL.S16       Q14, D1, D4
342    VMLSL.S16       Q14, D3, D5
343
344
345    VMULL.U16       Q13, D0, D5
346    VMLAL.U16       Q13, D2, D4
347    VSHR.U32        Q13, Q13, #16
348    VMLAL.S16       Q13, D1, D5
349    VMLAL.S16       Q13, D3, D4
350
351    VSHL.S32        Q12, Q14, #4
352    VLD2.32         {Q0, Q1}, [R0]!
353    VADD.I32        Q12, Q12, Q15
354
355    VSHR.S32        Q12, Q12, #16
356    VUZP.16         D24, D25
357
358
359    VSHL.S32        Q11, Q13, #4
360    VLD2.16         {D4, D5}, [R7]!
361    VADD.I32        Q11, Q11, Q15
362
363    VSHR.S32        Q11, Q11, #16
364    VUZP.16         D22, D23
365
366
367    VQNEG.S16       D20, D22
368
369    VUZP.16         D0, D1
370    VUZP.16         D2, D3
371    SUB             R8, R8, #8
372
373LOOP_2:
374
375    VMULL.U16       Q14, D0, D4
376    VST1.16         D24, [R1]!
377    VMLSL.U16       Q14, D2, D5
378
379    VREV64.16       D24, D24
380    VMULL.U16       Q13, D0, D5
381
382    VMLAL.U16       Q13, D2, D4
383    VST1.16         D24, [R4]
384    SUB             R4, R4, #8
385
386    VREV64.16       D22, D22
387    VSHR.S32        Q14, Q14, #16
388    VSHR.U32        Q13, Q13, #16
389    VST1.16         D22, [R3]
390    VMLAL.S16       Q14, D1, D4
391    VMLSL.S16       Q14, D3, D5
392    VST1.16         D20, [R5]!
393    VMLAL.S16       Q13, D1, D5
394    VMLAL.S16       Q13, D3, D4
395    VSHL.S32        Q12, Q14, #4
396
397    SUB             R3, R3, #8
398    VLD2.32         {Q0, Q1}, [R0]!
399    VSHL.S32        Q11, Q13, #4
400
401    VADD.I32        Q12, Q12, Q15
402    VLD2.16         {D4, D5}, [R7]!
403
404    VADD.I32        Q11, Q11, Q15
405    VUZP.16         D0, D1
406    VSHR.S32        Q12, Q12, #16
407    VUZP.16         D24, D25
408
409
410    VSHR.S32        Q11, Q11, #16
411    VUZP.16         D22, D23
412    SUBS            R8, R8, #4
413
414    VUZP.16         D2, D3
415    VQNEG.S16       D20, D22
416
417    BGT             LOOP_2
418
419
420    VMULL.U16       Q14, D0, D4
421    VST1.16         D24, [R1]!
422    VMLSL.U16       Q14, D2, D5
423    VREV64.16       D24, D24
424    VMULL.U16       Q13, D0, D5
425    VMLAL.U16       Q13, D2, D4
426    VST1.16         D24, [R4]
427    VSHR.S32        Q14, Q14, #16
428    SUB             R4, R4, #8
429    VST1.16         D20, [R5]!
430
431    VMLAL.S16       Q14, D1, D4
432    VMLSL.S16       Q14, D3, D5
433    VREV64.16       D22, D22
434    VSHR.U32        Q13, Q13, #16
435    VST1.16         D22, [R3]
436    SUB             R3, R3, #8
437    VMLAL.S16       Q13, D1, D5
438    VSHL.S32        Q12, Q14, #4
439    VMLAL.S16       Q13, D3, D4
440    VADD.I32        Q12, Q12, Q15
441
442    VSHL.S32        Q11, Q13, #4
443
444    VSHR.S32        Q12, Q12, #16
445    VUZP.16         D24, D25
446    VADD.I32        Q11, Q11, Q15
447
448    VST1.16         D24, [R1]!
449    VSHR.S32        Q11, Q11, #16
450    VREV64.16       D24, D24
451    VUZP.16         D22, D23
452
453    VST1.16         D24, [R4]
454    VQNEG.S16       D20, D22
455
456    SUB             R4, R4, #2
457    VREV64.16       D22, D22
458    VST1.16         D22, [R3]
459    SUB             R3, R3, #2
460
461    VST1.16         D20, [R5]!
462    VLD2.32         {Q0, Q1}, [R0]!
463
464    VLD2.16         {Q2}, [R7]
465    ADD             R7, R7, #12
466    VUZP.16         D0, D1
467    VUZP.16         D2, D3
468
469    VMULL.U16       Q14, D0, D4
470    VMLSL.U16       Q14, D2, D5
471    VSHR.S32        Q14, Q14, #16
472    VMLAL.S16       Q14, D1, D4
473    VMLSL.S16       Q14, D3, D5
474
475    VMULL.U16       Q13, D0, D5
476    VMLAL.U16       Q13, D2, D4
477    VSHR.U32        Q13, Q13, #16
478    VMLAL.S16       Q13, D1, D5
479    VMLAL.S16       Q13, D3, D4
480
481    VSHL.S32        Q12, Q14, #4
482    VADD.I32        Q12, Q12, Q15
483    VSHR.S32        Q12, Q12, #16
484    VUZP.16         D24, D25
485
486    VSHL.S32        Q11, Q13, #4
487    VADD.I32        Q11, Q11, Q15
488    VSHR.S32        Q11, Q11, #16
489    VUZP.16         D22, D23
490
491    VQNEG.S16       D20, D22
492
493    VST1.16         D24[0], [R1]!
494    VST1.16         D24[1], [R1]!
495    VST1.16         D24[2], [R1]!
496
497    VST1.16         D24[0], [R4], R9
498    VST1.16         D24[1], [R4], R9
499    VST1.16         D24[2], [R4], R9
500
501    VST1.16         D22[0], [R3], R9
502    VST1.16         D22[1], [R3], R9
503    VST1.16         D22[2], [R3], R9
504
505    VST1.16         D20[0], [R5]!
506    VST1.16         D20[1], [R5]!
507    VST1.16         D20[2], [R5]!
508    VUZP.16         D6, D7
509    VLD1.16         D0, [R7]!
510    VMULL.U16       Q1, D0, D6
511    VSHR.S32        Q1, Q1, #16
512    VMLAL.S16       Q1, D0, D7
513    VSHL.S32        Q1, Q1, #4
514
515    VADD.I32        Q1, Q1, Q15
516    VSHR.S32        Q1, Q1, #16
517
518    VST1.16         D2[0], [R1]!
519    VST1.16         D2[0], [R4], R9
520
521    LDMFD           sp!, {r4-r12, r15}
522
523
524