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