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
25    .global ixheaacd_imdct_using_fft_armv7
26ixheaacd_imdct_using_fft_armv7:
27
28    STMFD           sp!, {r4-r12, lr}
29    vpush           {d8-d15}
30
31@    LDR         r4, [sp, #0x68]
32@    LDR         r5, [sp, #0x68+4]
33@    LDR         r6, [sp, #0x68+8]
34@    LDR         r7, [sp, #0x68+12]
35
36    LDR             r8, =11600
37    ADD             r4, r0, r8
38    LDR             r8, =11856
39    ADD             r5, r0, r8
40    LDR             r8, =11920
41    ADD             r6, r0, r8
42    LDR             r8, =11936
43    ADD             r7, r0, r8
44
45
46
47
48
49COND_1: CMP         r1, #0x400
50    BNE             COND_2
51
52    MOV             r8, #4
53    B               RADIX_4_FIRST_START
54
55
56COND_2: CMP         r1, #0x200
57    BNE             COND_3
58
59    MOV             r8, #3
60    MOV             r4, r5
61    B               RADIX_8_FIRST_START
62
63COND_3: CMP         r1, #0x100
64    BNE             COND_4
65
66    MOV             r8, #3
67    MOV             r4, r5
68    B               RADIX_4_FIRST_START
69
70COND_4: CMP         r1, #0x80
71    BNE             COND_5
72
73    MOV             r8, #2
74    MOV             r4, r6
75    B               RADIX_8_FIRST_START
76
77COND_5: CMP         r1, #0x40
78    BNE             COND_6
79
80    MOV             r8, #2
81    MOV             r4, r6
82    B               RADIX_4_FIRST_START
83COND_6:
84
85    MOV             r8, #1
86    MOV             r4, r7
87
88
89
90
91
92
93RADIX_8_FIRST_START:
94
95
96    LSR             r9 , r1, #5
97    LSL             r1, r1, #1
98
99RADIX_8_FIRST_LOOP:
100
101    MOV             r5 , r2
102    MOV             r6 , r2
103    MOV             r7 , r2
104    MOV             r11 , r2
105
106    LDRB            r12, [r4, #0]
107    ADD             r5, r5, r12, LSL #3
108    VLD2.32         {d0[0], d2[0]}, [r5] , r1
109    ADD             r5, r5, r1
110    VLD2.32         {d8[0], d10[0]}, [r5] , r1
111    SUB             r5, r5, r1, LSL #1
112    VLD2.32         {d4[0], d6[0]}, [r5] , r1
113    ADD             r5, r5, r1
114    VLD2.32         {d12[0], d14[0]}, [r5], r1
115    SUB             r5, r5, r1, LSL #2
116
117    LDRB            r12, [r4, #1]
118    ADD             r6, r6, r12, LSL #3
119    VLD2.32         {d0[1], d2[1]}, [r6] , r1
120    ADD             r6, r6, r1
121    VLD2.32         {d8[1], d10[1]}, [r6] , r1
122    SUB             r6, r6, r1, LSL #1
123    VLD2.32         {d4[1], d6[1]}, [r6] , r1
124    ADD             r6, r6, r1
125    VLD2.32         {d12[1], d14[1]}, [r6], r1
126    SUB             r6, r6, r1, LSL #2
127
128
129    LDRB            r12, [r4, #2]
130    ADD             r7, r7, r12 , LSL #3
131    VLD2.32         {d1[0], d3[0]}, [r7] , r1
132    ADD             r7, r7, r1
133    VLD2.32         {d9[0], d11[0]}, [r7] , r1
134    SUB             r7, r7, r1, LSL #1
135
136    LDRB            r12, [r4, #3]
137    ADD             r11, r11, r12 , LSL #3
138    VLD2.32         {d1[1], d3[1]}, [r11] , r1
139    ADD             r11, r11, r1
140    VLD2.32         {d9[1], d11[1]}, [r11] , r1
141    SUB             r11, r11, r1, LSL #1
142
143
144
145    VADD.I32        q8, q0, q4
146    VLD2.32         {d5[0], d7[0]}, [r7] , r1
147    ADD             r7, r7, r1
148
149    VSUB.I32        q9, q0, q4
150    VLD2.32         {d13[0], d15[0]}, [r7], r1
151    SUB             r7, r7, r1, LSL #2
152
153
154
155
156    VADD.I32        q0, q1, q5
157    VLD2.32         {d5[1], d7[1]}, [r11] , r1
158    ADD             r11, r11, r1
159
160    VSUB.I32        q4, q1, q5
161    VLD2.32         {d13[1], d15[1]}, [r11], r1
162    SUB             r11, r11, r1, LSL #2
163
164
165
166    ADD             r4, r4, #4
167
168    ADD             r5, r5, r1, LSR #1
169    ADD             r6, r6, r1, LSR #1
170    ADD             r7, r7, r1, LSR #1
171    ADD             r11, r11, r1, LSR #1
172
173
174    VADD.I32        q1, q2, q6
175    VLD2.32         {d28[0], d30[0]}, [r5] , r1
176
177
178    VSUB.I32        q5, q2, q6
179    VLD2.32         {d20[0], d22[0]}, [r5] , r1
180
181
182    VADD.I32        q2, q3, q7
183    VLD2.32         {d24[0], d26[0]}, [r5] , r1
184
185
186    VSUB.I32        q6, q3, q7
187    VLD2.32         {d28[1], d30[1]}, [r6] , r1
188
189    VADD.S32        q3, q9, q6
190    VLD2.32         {d20[1], d22[1]}, [r6] , r1
191
192    VSUB.S32        q7, q9, q6
193    VLD2.32         {d24[1], d26[1]}, [r6] , r1
194
195    VSUB.S32        q6, q4, q5
196    VLD2.32         {d29[0], d31[0]}, [r7] , r1
197
198    VADD.S32        q9, q4, q5
199    VLD2.32         {d21[0], d23[0]}, [r7] , r1
200
201    VADD.S32        q4, q8, q1
202    VLD2.32         {d25[0], d27[0]}, [r7] , r1
203
204    VSUB.S32        q5, q8, q1
205    VLD2.32         {d29[1], d31[1]}, [r11] , r1
206
207    VADD.S32        q8, q0, q2
208    VLD2.32         {d21[1], d23[1]}, [r11] , r1
209
210    VSUB.S32        q0, q0, q2
211    VLD2.32         {d25[1], d27[1]}, [r11] , r1
212
213
214    VPUSH           {q3}
215    VPUSH           {q7}
216
217
218
219
220
221
222
223
224    VLD2.32         {d2[0], d4[0]}, [r5], r1
225
226    VADD.I32        q7, q14, q12
227
228    VLD2.32         {d2[1], d4[1]}, [r6] , r1
229
230    VSUB.I32        q3, q14, q12
231
232    VLD2.32         {d3[0], d5[0]}, [r7] , r1
233
234    VADD.I32        q14, q15, q13
235
236    VLD2.32         {d3[1], d5[1]}, [r11] , r1
237
238    VSUB.I32        q12, q15, q13
239
240
241
242
243
244
245
246
247
248    VADD.I32        q15, q10, q1
249    VSUB.I32        q13, q10, q1
250    VADD.I32        q10, q11, q2
251    VSUB.I32        q1, q11, q2
252
253
254
255    VADD.S32        q11, q7, q15
256    VSUB.S32        q2, q7, q15
257    VADD.S32        q7, q14, q10
258    VSUB.S32        q15, q14, q10
259
260    VADD.S32        q14, q3, q12
261    VSUB.S32        q10, q3, q12
262    VADD.S32        q3, q13, q1
263    VSUB.S32        q12, q13, q1
264
265    VADD.S32        q1 , q14, q12
266    VSUB.S32        q13, q14, q12
267    VSUB.S32        q12, q3, q10
268
269    VUZP.16         d2, d3
270    VADD.S32        q14, q3, q10
271
272    VUZP.16         d26, d27
273    VADD.S32        q3, q4, q11
274
275    VUZP.16         d24, d25
276    VSUB.S32        q10, q4, q11
277
278    VUZP.16         d28, d29
279    VADD.S32        q4, q8, q7
280
281    LDR             r14, =0x5a82
282
283    VSUB.S32        q11, q8, q7
284
285    VADD.S32        q8, q5, q15
286    VSUB.S32        q7, q5, q15
287    VSUB.S32        q5, q0, q2
288    VADD.S32        q15, q0, q2
289
290    VPOP            {q0}
291    VPOP            {q2}
292    VPUSH           {q3-q4}
293    VPUSH           {q10}
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311    VDUP.16         d20, r14
312
313
314    VMULL.u16       q4, d26, d20
315    VMULL.u16       q3, d28, d20
316
317    VPUSH           {q7-q8}
318    VPUSH           {q5}
319
320    VSHR.S32        q4, q4, #15
321    VSHR.S32        q3, q3, #15
322
323    VQDMLAL.S16     q4, d27, d20
324    VQDMLAL.S16     q3, d29, d20
325
326
327    VPUSH           {q11}
328
329    VMULL.u16       q13, d24, d20
330    VMULL.u16       q14, d2, d20
331
332    VADD.S32        q5, q2, q4
333    VSUB.S32        q7, q2, q4
334
335    VADD.S32        q8, q6, q3
336    VSUB.S32        q6, q6, q3
337
338
339
340
341
342
343    VSHR.S32        q13, q13, #15
344    VSHR.S32        q14, q14, #15
345
346    VQDMLAL.S16     q13, d25, d20
347    VQDMLAL.S16     q14, d3, d20
348
349    VPOP            {q1}
350    VPOP            {q10}
351
352    VADD.S32        q2, q0, q13
353    VSUB.S32        q4, q0, q13
354
355    VADD.S32        q11, q9, q14
356    VSUB.S32        q3, q9, q14
357
358
359
360
361    VPOP            {q14}
362    VPOP            {q9}
363    VPOP            {q0}
364    VPOP            {q12, q13}
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394    VTRN.32         q12, q5
395    VSHL.S32        q12, q12, #3
396    VTRN.32         q9, q2
397    VSHL.S32        q5, q5, #3
398
399    VSHL.S32        q9, q9, #3
400    VTRN.32         q0, q7
401    VSHL.S32        q2, q2, #3
402
403    VSHL.S32        q0, q0, #3
404    VTRN.32         q14, q4
405    VSHL.S32        q7, q7, #3
406
407    VSHL.S32        q14, q14, #3
408    VTRN.32         q13, q6
409    VSHL.S32        q4, q4, #3
410
411    VSHL.S32        q13, q13, #3
412    VTRN.32         q10, q3
413    VSHL.S32        q6, q6, #3
414
415    VSHL.S32        q10, q10, #3
416    VTRN.32         q1, q8
417    VSHL.S32        q3, q3, #3
418
419    VSHL.S32        q1, q1, #3
420    VTRN.32         q15, q11
421    VSHL.S32        q8, q8, #3
422
423    VSHL.S32        q15, q15, #3
424    VSWP            d18, d25
425
426    VSHL.S32        q11, q11, #3
427    VSWP            d4, d11
428
429    VSWP            d1, d28
430    VSWP            d15, d8
431
432    VSWP            d20, d27
433    VSWP            d6, d13
434
435    VSWP            d30, d3
436    VSWP            d22, d17
437
438    VST2.32         {q12, q13}, [r3]!
439    VST2.32         {q0, q1}, [r3]!
440
441    VST2.32         {q5, q6}, [r3]!
442    VST2.32         {q7, q8}, [r3]!
443
444    VMOV            q5, q11
445
446    VST2.32         {q9, q10}, [r3]!
447    VST2.32         {q14, q15}, [r3]!
448
449    VST2.32         {q2, q3}, [r3]!
450    VST2.32         {q4, q5}, [r3]!
451
452
453    SUBS            r9, r9, #1
454    BNE             RADIX_8_FIRST_LOOP
455
456    LSR             r1, r1, #1
457    SUB             r3, r1, LSL #3
458
459    MOV             r5, #8
460    MOV             r4, #32
461    LSR             r6, r1, #5
462
463    B               RADIX_4_FIRST_ENDS
464
465RADIX_8_FIRST_ENDS:
466
467
468RADIX_4_FIRST_START:
469
470
471    LSR             r9 , r1, #4
472    LSL             r1, r1, #1
473
474RADIX_4_LOOP:
475
476    MOV             r5 , r2
477    MOV             r6 , r2
478    MOV             r7 , r2
479    MOV             r11 , r2
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495    LDRB            r12, [r4, #0]
496    ADD             r5, r5, r12, LSL #3
497
498    VLD2.32         {d0[0], d2[0]}, [r5] , r1
499    ADD             r5, r5, r1
500    VLD2.32         {d8[0], d10[0]}, [r5] , r1
501    SUB             r5, r5, r1, LSL #1
502    VLD2.32         {d4[0], d6[0]}, [r5] , r1
503    ADD             r5, r5, r1
504    VLD2.32         {d12[0], d14[0]}, [r5], r1
505
506    LDRB            r12, [r4, #1]
507    ADD             r6, r6, r12, LSL #3
508
509    VLD2.32         {d0[1], d2[1]}, [r6] , r1
510    ADD             r6, r6, r1
511    VLD2.32         {d8[1], d10[1]}, [r6] , r1
512    SUB             r6, r6, r1, LSL #1
513    VLD2.32         {d4[1], d6[1]}, [r6] , r1
514    ADD             r6, r6, r1
515    VLD2.32         {d12[1], d14[1]}, [r6], r1
516
517
518    LDRB            r12, [r4, #2]
519    ADD             r7, r7, r12, LSL #3
520
521    VLD2.32         {d1[0], d3[0]}, [r7] , r1
522    ADD             r7, r7, r1
523    VLD2.32         {d9[0], d11[0]}, [r7] , r1
524
525    LDRB            r12, [r4, #3]
526    ADD             r11, r11, r12 , LSL #3
527
528    VLD2.32         {d1[1], d3[1]}, [r11] , r1
529    ADD             r11, r11, r1
530    VLD2.32         {d9[1], d11[1]}, [r11] , r1
531
532
533    SUB             r7, r7, r1, LSL #1
534    VADD.S32        q8, q0, q4
535    VLD2.32         {d5[0], d7[0]}, [r7] , r1
536    ADD             r7, r7, r1
537    VADD.S32        q9, q1, q5
538    VLD2.32         {d13[0], d15[0]}, [r7], r1
539
540
541
542    SUB             r11, r11, r1, LSL #1
543    VSUB.S32        q10, q0, q4
544    VLD2.32         {d5[1], d7[1]}, [r11] , r1
545    ADD             r11, r11, r1
546    VSUB.S32        q11, q1, q5
547    VLD2.32         {d13[1], d15[1]}, [r11], r1
548
549
550    ADD             r4, r4, #4
551
552    VADD.S32        q12, q2, q6
553    VADD.S32        q13, q3, q7
554    VSUB.S32        q14, q2, q6
555    VSUB.S32        q15, q3, q7
556
557    VADD.S32        q0, q8, q12
558    VADD.S32        q1, q9, q13
559    VSUB.S32        q2, q8, q12
560    VSUB.S32        q3, q9, q13
561
562    VADD.S32        q4, q10, q15
563    VSUB.S32        q5, q11, q14
564    VADD.S32        q7, q11, q14
565    VSUB.S32        q6, q10, q15
566
567
568
569
570    VTRN.32         q0, q4
571
572    VSHL.S32        q0, q0, #2
573    VTRN.32         q2, q6
574    VSHL.S32        q4, q4, #2
575
576    VSHL.S32        q2, q2, #2
577    VTRN.32         q1, q5
578    VSHL.S32        q6, q6, #2
579
580    VSHL.S32        q1, q1, #2
581    VTRN.32         q3, q7
582    VSHL.S32        q5, q5, #2
583
584    VSHL.S32        q3, q3, #2
585    VSWP            d4, d1
586
587    VSHL.S32        q7, q7, #2
588    VSWP            d12, d9
589
590
591
592    VSWP            d6, d3
593    VSWP            d14, d11
594
595
596    VST2.32         {q0, q1}, [r3]!
597    VST2.32         {q4, q5}, [r3]!
598
599    VST2.32         {q2, q3}, [r3]!
600    VST2.32         {q6, q7}, [r3]!
601
602
603
604    SUBS            r9, r9, #1
605    BNE             RADIX_4_LOOP
606
607    LSR             r1, r1, #1
608    SUB             r3, r1, LSL #3
609    MOV             r5, #4
610    MOV             r4, #64
611    LSR             r6, r1, #4
612
613
614RADIX_4_FIRST_ENDS:
615
616    PUSH            {r3}
617    LSR             r5, r5, #2
618    LDR             r14, =8528
619    ADD             r0, r0, r14
620
621OUTER_LOOP_R4:
622
623
624    LDR             r14, [sp]
625
626    MOV             r7, r5
627    MOV             r2, #0
628    MOV             r9, r0
629    LSL             r12 , r5, #5
630MIDDLE_LOOP_R4:
631
632
633    VLD2.16         {d0[0], d1[0]}, [r9], r2
634    VLD2.16         {d2[0], d3[0]}, [r9], r2
635    ADD             r11, r2, r4, LSL #2
636    VLD2.16         {d4[0], d5[0]}, [r9]
637    ADD             r10, r0, r11
638
639
640    VLD2.16         {d0[1], d1[1]}, [r10], r11
641    VLD2.16         {d2[1], d3[1]}, [r10], r11
642    ADD             r2, r11, r4, LSL #2
643    VLD2.16         {d4[1], d5[1]}, [r10]
644    ADD             r9, r0, r2
645
646
647    VLD2.16         {d0[2], d1[2]}, [r9], r2
648    VLD2.16         {d2[2], d3[2]}, [r9], r2
649    ADD             r11, r2, r4, LSL #2
650    VLD2.16         {d4[2], d5[2]}, [r9]
651    ADD             r10, r0, r11
652
653
654
655    VLD2.16         {d0[3], d1[3]}, [r10], r11
656    VLD2.16         {d2[3], d3[3]}, [r10], r11
657    ADD             r2, r11, r4, LSL #2
658    VLD2.16         {d4[3], d5[3]}, [r10]
659    ADD             r9, r0, r2
660
661    MOV             r10, r6
662
663
664
665INNER_LOOP_R4:
666
667    VLD2.32         {q3, q4}, [r14], r12
668
669    VSHR.S32        q3, q3, #1
670    VLD4.16         {q5, q6}, [r14], r12
671    VSHR.S32        q4, q4, #1
672
673    VSHR.U16        d10, d10, #1
674    VLD4.16         {q7, q8}, [r14], r12
675    VSHR.U16        d12, d12, #1
676
677    VMULL.S16       q11, d10, d0
678    VMLSL.S16       q11, d12, d1
679    VLD4.16         {q9, q10}, [r14], r12
680    VMULL.S16       q12, d10, d1
681    VMLAL.S16       q12, d12, d0
682
683    VSHR.U16        d14, d14, #1
684    VSHR.U16        d16, d16, #1
685
686    SUB             r14, r14, r12, LSL #2
687
688    VSHR.U16        d18, d18, #1
689    VSHR.U16        d20, d20, #1
690
691    VMULL.S16       q13, d14, d2
692    VMLSL.S16       q13, d16, d3
693
694    VSHR.S32        q11, q11, #15
695
696    VMULL.S16       q14, d14, d3
697    VMLAL.S16       q14, d16, d2
698
699    VMULL.S16       q15, d18, d4
700    VMLSL.S16       q15, d20, d5
701
702    VMLAL.S16       q11, d11, d0
703    VMLSL.S16       q11, d13, d1
704
705    VSHR.S32        q12, q12, #15
706    VSHR.S32        q13, q13, #15
707    VSHR.S32        q14, q14, #15
708    VSHR.S32        q15, q15, #15
709
710
711    VMLAL.S16       q12, d11, d1
712    VMLAL.S16       q12, d13, d0
713
714
715    VMULL.S16       q5, d18, d5
716    VMLAL.S16       q5, d20, d4
717
718
719    VMLAL.S16       q13, d15, d2
720    VMLSL.S16       q13, d17, d3
721
722    VMLAL.S16       q14, d15, d3
723    VMLAL.S16       q14, d17, d2
724
725
726    VMLAL.S16       q15, d19, d4
727    VMLSL.S16       q15, d21, d5
728
729    VSHR.S32        q5, q5, #15
730
731    VMLAL.S16       q5, d19, d5
732    VMLAL.S16       q5, d21, d4
733
734
735
736    CMP             r7, r5
737    BNE             BYPASS_IF
738
739    ADD             r14, r14, r12
740
741    LDR             r3, [r14], r12
742    ASR             r3, r3, #1
743    VMOV.32         d22[0], r3
744
745    LDR             r3, [r14], r12
746    ASR             r3, r3, #1
747    VMOV.32         d26[0], r3
748
749    LDR             r3, [r14]
750    ASR             r3, r3, #1
751    VMOV.32         d30[0], r3
752
753    SUB             r14, r14, r12, LSL #1
754    ADD             r14, r14, #4
755
756    LDR             r3, [r14], r12
757    ASR             r3, r3, #1
758    VMOV.32         d24[0], r3
759
760    LDR             r3, [r14], r12
761    ASR             r3, r3, #1
762    VMOV.32         d28[0], r3
763
764    LDR             r3, [r14], r12
765    ASR             r3, r3, #1
766    VMOV.32         d10[0], r3
767
768    SUB             r14, r14, #4
769
770    SUB             r14, r14, r12, LSL #2
771
772BYPASS_IF:
773
774    VADD.S32        q6, q3, q13
775    VADD.S32        q7, q4, q14
776    VSUB.S32        q3, q3, q13
777    VSUB.S32        q4, q4, q14
778    VADD.S32        q8, q11, q15
779    VADD.S32        q9, q12, q5
780
781    VSUB.S32        q15, q11, q15
782    VSUB.S32        q14, q12, q5
783
784    VADD.S32        q10, q6, q8
785    VADD.S32        q11, q7, q9
786    VADD.S32        q12, q3, q14
787    VSUB.S32        q13, q4, q15
788
789    VSUB.S32        q6, q6, q8
790    VST2.32         {q10, q11}, [r14], r12
791    VSUB.S32        q7, q7, q9
792
793    VSUB.S32        q8, q3, q14
794    VST2.32         {q12, q13}, [r14], r12
795    VADD.S32        q9, q4, q15
796
797
798    VST2.32         {q6, q7}, [r14], r12
799    VST2.32         {q8, q9}, [r14], r12
800
801
802
803
804    SUBS            r10, r10, #1
805    BNE             INNER_LOOP_R4
806
807    SUB             r14, r14, r1, LSL #3
808    ADD             r14, r14, #32
809
810    SUBS            r7, r7, #1
811    BNE             MIDDLE_LOOP_R4
812
813
814
815
816    LSR             r4, r4, #2
817    LSL             r5, r5, #2
818    LSR             r6, r6, #2
819    SUBS            r8, r8, #1
820    BNE             OUTER_LOOP_R4
821END_LOOPS:
822    POP             {r3}
823    vpop            {d8-d15}
824    LDMFD           sp!, {r4-r12, pc}
825
826