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