xref: /aosp_15_r20/external/libxaac/decoder/armv7/ixheaacd_post_twiddle_overlap.s (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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.global ixheaacd_post_twid_overlap_add_armv7
25
26ixheaacd_post_twid_overlap_add_armv7:
27
28    STMFD           sp!, {R4-R12}
29    VPUSH           {d8 - d15}
30
31    LDR             R4, [sp, #100]
32    LDR             R5, [sp, #104]
33    LDR             R6, [sp, #108]
34
35    LSL             R9, R3, #2
36    ASR             R9, R9, #1
37    ADD             R6, R6, R9
38    SUB             R6, R6, #4
39
40    MOVW            R8, #7500
41    ADD             R2, R2, R8
42
43
44
45    VMOV.S16        D18, #50
46    RSB             R9, R5, #15
47    VMOV.S32        Q10, #0x0000000
48    VDUP.32         Q8, R5
49    SUB             R5, R5, #16
50    STR             R5, [sp, #116]
51    MOV             R8, #1
52    LSL             R8, R8, R9
53    STR             R8, [sp, #120]
54
55
56ARM_PROLOGUE:
57
58
59    LDR             R8, [R1], #4
60    LDR             R9, [R1], #4
61
62    LDR             R10, [R2], #4
63
64    SMULWT          R11, R8, R10
65    SMULWB          R12, R9, R10
66    SMULWB          R5, R8, R10
67    SMLAWT          R7, R9, R10, R5
68    SUB             R8, R12, R11
69    MVN             R5, R7
70    ADD             R5, R5, #1
71
72    MOV             R9, #50
73    MOV             R12, #-50
74    SMULWB          R10, R5, R9
75    SMULWB          R11, R8, R12
76
77    ADD             R8, R8, R10
78    ADD             R5, R5, R11
79
80    LDR             R11, [sp, #104]
81    LDR             R10, [R6], #-32
82
83
84    SMULWB          R7, R8, R10
85    MVN             R8, R8
86    ADD             R8, R8, #1
87    SMULWT          R12, R8, R10
88
89    CMP             R11, #0
90    BLT             NEXT
91
92    RSBS            R9, R11, #16
93
94
95
96
97    LDR             R8, [sp, #120]
98    QADD            R5, R5, R8
99    ASR             R5, R5, R9
100
101    RSBS            R9, R11, #31
102    MOVS            R8, R7, ASR R9
103    CMNLT           R8, #1
104    MOVLT           R7, #0x80000000
105    MVNGT           R7, #0x80000000
106    MOVEQ           R7, R7, LSL R11
107
108    RSBS            R9, R11, #31
109    MOVS            R8, R12, ASR R9
110    CMNLT           R8, #1
111    MOVLT           R12, #0x80000000
112    MVNGT           R12, #0x80000000
113    MOVEQ           R12, R12, LSL R11
114
115    B               NEXT1
116NEXT:
117    MVN             R11, R11
118    ADD             R11, R11, #1
119    ASR             R5, R5, R11
120    MOV             R8, #0x8000
121    QADD            R5, R5, R8
122    ASR             R5, R5, #16
123    ASR             R7, R7, R11
124    ASR             R12, R12, R11
125
126NEXT1:
127    LDR             R9, [R4]
128    MOV             R8, #0x8000
129
130    STR             R5, [R4], #4
131
132
133    UXTH            R5, R10, ROR #16
134    UXTH            R10, R10
135
136
137    VDUP.32         D0, R9
138    VDUP.32         D2, R10
139    VDUP.32         D3, R5
140    VZIP.32         D2, D3
141    VMULL.S32       Q0, D2, D0
142    VQMOVN.S64      D8, Q0
143
144
145    VDUP.32         D0, R12
146    VDUP.32         D1, R7
147
148    VZIP.32         D0, D1
149    VQSUB.S32       D8, D0, D8
150
151
152    VDUP.32         D0, R8
153
154
155
156    LDR             R7, [sp, #112]
157    LSL             R7 , R7 , #1
158    LSL             R10, R7, #1
159
160    ASR             R5, R3, #1
161    SMULBB          R5, R10, R5
162    ADD             R5, R5, R0
163    SUB             R0, R5, R10
164    MVN             R9, R10
165    ADD             R9, R9, #1
166
167    VST1.32         D8[1], [R0], R9
168    VST1.32         D8[0], [R5], R10
169
170
171    MOV             R8, R1
172    LSL             R12, R3, #2
173
174    ADD             R1, R1, R12
175
176    SUB             R1, R1, #40
177
178    MOV             R12, #-32
179
180
181
182PROLOGUE_NEON:
183
184    ASR             R3, R3, #2
185    SUB             R3, R3, #4
186    ASR             R3, R3, #2
187    SUB             R3, R3, #2
188
189    VLD2.32         {Q0, Q1}, [R1], R12
190    VUZP.16         D0, D1
191    VUZP.16         D2, D3
192
193    VREV64.16       Q0, Q0
194    VREV64.16       Q1, Q1
195    VLD2.16         {D8, D9}, [R2]!
196
197    VLD2.32         {Q2, Q3}, [R8]!
198    VMULL.U16       Q15, D0, D9
199
200    VUZP.16         D4, D5
201    VMULL.U16       Q14, D2, D8
202
203    VUZP.16         D6, D7
204    VMULL.U16       Q13, D0, D8
205
206
207    VMULL.U16       Q12, D2, D9
208
209    VLD2.32         {Q5, Q6}, [R6], R12
210    VSHR.U32        Q15, Q15, #16
211
212    VUZP.16         D10, D11
213    VSHR.U32        Q14, Q14, #16
214
215    VUZP.16         D12, D13
216    VMLAL.S16       Q15, D1, D9
217
218    VREV64.16       Q5, Q5
219    VMLAL.S16       Q14, D3, D8
220
221    VREV64.16       Q6, Q6
222    VSHR.U32        Q13, Q13, #16
223
224
225    VSHR.U32        Q12, Q12, #16
226
227    VMLAL.S16       Q13, D1, D8
228    VMLAL.S16       Q12, D3, D9
229
230
231
232    VADD.I32        Q15, Q15, Q14
233    VNEG.S32        Q15, Q15
234
235    VMULL.U16       Q11, D4, D8
236
237    VSUB.I32        Q14, Q12, Q13
238
239
240    VMOV            Q13, Q15
241    VMOV            Q12, Q14
242
243    VUZP.16         D24, D25
244
245
246    VUZP.16         D26, D27
247    VMULL.U16       Q1, D24, D18
248
249    VMULL.U16       Q0, D26, D18
250
251    VSHR.U32        Q11, Q11, #16
252    VMLAL.S16       Q11, D5, D8
253
254    VSHR.U32        Q1, Q1, #16
255    VSHR.U32        Q0, Q0, #16
256    VMLAL.S16       Q1, D25, D18
257    VMLAL.S16       Q0, D27, D18
258
259    VMULL.U16       Q12, D4, D9
260    VMULL.U16       Q13, D6, D8
261
262    VNEG.S32        Q1, Q1
263    VADD.I32        Q14, Q14, Q0
264    VADD.I32        Q15, Q15, Q1
265
266    VMULL.U16       Q0, D6, D9
267    VSHR.S32        Q12, Q12, #16
268    VMLAL.S16       Q12, D5, D9
269    VSHR.S32        Q13, Q13, #16
270    VSHR.S32        Q0, Q0, #16
271    VMLAL.S16       Q13, D7, D8
272    VMLAL.S16       Q0, D7, D9
273
274
275
276
277    VADD.I32        Q11, Q11, Q0
278    VNEG.S32        Q11, Q11
279    VSUB.I32        Q12, Q13, Q12
280
281
282
283    LDR             R11, [sp, #120]
284    VDUP.S32        Q7, R11
285    VQADD.S32       Q14, Q14, Q7
286    LDR             R11, [sp, #116]
287    VDUP.S32        Q0, R11
288    VQSHL.S32       Q14, Q14, Q0
289
290    VMOV            Q0, Q11
291    VMOV            Q7, Q12
292
293
294    VUZP.16         D24, D25
295
296    VUZP.16         D22, D23
297    VMULL.U16       Q4, D24, D18
298    VMULL.U16       Q13, D22, D18
299
300    VNEG.S32        Q1, Q15
301    VUZP.16         D30, D31
302
303    VUZP.16         D2, D3
304    VMULL.U16       Q2, D30, D12
305
306    VMULL.U16       Q3, D2, D13
307
308    VSHR.U32        Q4, Q4, #16
309    VSHR.U32        Q13, Q13, #16
310
311    VMLAL.S16       Q4, D25, D18
312    VMLAL.S16       Q13, D23, D18
313
314    VSHR.U32        Q2, Q2, #16
315    VSHR.U32        Q3, Q3, #16
316
317    VMLAL.S16       Q2, D31, D12
318    VMLAL.S16       Q3, D3, D13
319
320    VNEG.S32        Q4, Q4
321    VADD.I32        Q7, Q7, Q13
322    VADD.I32        Q0, Q0, Q4
323
324    LDR             R11, [sp, #120]
325    VDUP.S32        Q4, R11
326    VQADD.S32       Q0, Q0, Q4
327    LDR             R11, [sp, #116]
328    VDUP.S32        Q13, R11
329    VQSHL.S32       Q0, Q0, Q13
330
331    VMOV            Q13, Q14
332
333    VLD2.32         {Q14, Q15}, [R4]
334
335    VZIP.32         Q13, Q0
336    VST1.32         {Q13}, [R4]!
337    VST1.32         {Q0}, [R4]!
338
339    VMOV.S32        D1, #0
340    VADDL.S16       Q0, D13, D1
341
342
343    VMULL.S32       Q13, D28, D0
344    VQMOVN.S64      D8, Q13
345    VMULL.S32       Q13, D29, D1
346    VQMOVN.S64      D9, Q13
347
348    VMOV.S32        D1, #0
349    VADDL.S16       Q0, D12, D1
350
351
352    VMULL.S32       Q12, D28, D0
353    VQMOVN.S64      D26, Q12
354    VMULL.S32       Q12, D29, D1
355    VQMOVN.S64      D27, Q12
356
357    VQSHL.S32       Q2, Q2, Q8
358    VQSHL.S32       Q3, Q3, Q8
359
360    VQSUB.S32       Q2, Q2, Q4
361    VQSUB.S32       Q3, Q3, Q13
362
363    VNEG.S32        Q13, Q7
364    VUZP.16         D14, D15
365    VUZP.16         D26, D27
366
367    VMOV.S32        D1, #0
368    VADDL.S16       Q0, D10, D1
369    VMULL.S32       Q11, D30, D0
370    VQMOVN.S64      D24, Q11
371    VMULL.S32       Q11, D31, D1
372    VQMOVN.S64      D25, Q11
373    VMOV.S32        D1, #0
374    VADDL.S16       Q0, D11, D1
375    VMULL.S32       Q4, D30, D0
376    VQMOVN.S64      D22, Q4
377    VMULL.S32       Q4, D31, D1
378    VQMOVN.S64      D23, Q4
379    VMULL.U16       Q4, D26, D11
380    VMULL.U16       Q15, D14, D10
381
382    VLD2.32         {Q0, Q1}, [R1], R12
383
384    VUZP.16         D0, D1
385
386    VUZP.16         D2, D3
387    VSHR.U32        Q4, Q4, #16
388
389    VREV64.16       Q0, Q0
390    VSHR.U32        Q15, Q15, #16
391
392    VREV64.16       Q1, Q1
393    VMLAL.S16       Q4, D27, D11
394
395    VMLAL.S16       Q15, D15, D10
396
397    VLD2.32         {Q5, Q6}, [R6], R12
398
399    VUZP.16         D10, D11
400
401    VUZP.16         D12, D13
402    VMOV            Q7,Q2
403
404    VREV64.16       Q5, Q5
405
406    VREV64.16       Q6, Q6
407    VQSHL.S32       Q4, Q4, Q8
408
409    VMOV             Q9,Q3
410
411    VLD2.32         {Q2, Q3}, [R8]!
412    VQSHL.S32       Q15, Q15, Q8
413
414    VUZP.16         D4, D5
415    VQSUB.S32       Q4, Q4, Q12
416
417    VUZP.16         D6, D7
418    VQSUB.S32       Q11, Q15, Q11
419
420     VMOV            Q15,Q4
421
422    VLD2.16         {D8, D9}, [R2]!
423
424CORE_LOOP_PTO:
425
426    VST1.32         D14[0], [R0, :32], R9
427
428    VST1.32         D22[0], [R0, :32], R9
429
430    VST1.32         D14[1], [R0, :32], R9
431
432    VST1.32         D22[1], [R0, :32], R9
433
434    VST1.32         D15[0], [R0, :32], R9
435
436    VST1.32         D23[0], [R0, :32], R9
437
438    VST1.32         D15[1], [R0, :32], R9
439
440    VST1.32         D23[1], [R0, :32], R9
441
442    VST1.32         D18[0], [R5, :32], R10
443
444    VST1.32         D30[0], [R5, :32] ,R10
445
446    VST1.32         D18[1], [R5, :32], R10
447
448    VST1.32         D30[1], [R5, :32], R10
449
450    VST1.32         D19[0], [R5, :32], R10
451
452    VST1.32         D31[0], [R5, :32], R10
453
454    VST1.32         D19[1], [R5, :32], R10
455
456    VST1.32         D31[1], [R5, :32], R10
457
458    VMULL.U16       Q15, D0, D9
459    VMULL.U16       Q14, D2, D8
460    VMULL.U16       Q13, D0, D8
461    VMULL.U16       Q12, D2, D9
462    VSHR.U32        Q15, Q15, #16
463    VSHR.U32        Q14, Q14, #16
464    VMLAL.S16       Q15, D1, D9
465    VMLAL.S16       Q14, D3, D8
466    VSHR.U32        Q13, Q13, #16
467    VSHR.U32        Q12, Q12, #16
468    VMLAL.S16       Q13, D1, D8
469    VMLAL.S16       Q12, D3, D9
470
471    VADD.I32        Q15, Q15, Q14
472    VNEG.S32        Q15, Q15
473    VSUB.I32        Q14, Q12, Q13
474
475    VMOV            Q13, Q15
476    VMULL.U16       Q11, D4, D8
477
478    VMOV            Q12, Q14
479
480    VUZP.16         D24, D25
481
482    VMOV.S16        D18, #50
483
484    VUZP.16         D26, D27
485    VMULL.U16       Q1, D24, D18
486    VMULL.U16       Q0, D26, D18
487
488    VSHR.U32        Q11, Q11, #16
489    VMLAL.S16       Q11, D5, D8
490
491    VSHR.U32        Q1, Q1, #16
492    VSHR.U32        Q0, Q0, #16
493    VMLAL.S16       Q1, D25, D18
494    VMLAL.S16       Q0, D27, D18
495
496    VMULL.U16       Q12, D4, D9
497    VMULL.U16       Q13, D6, D8
498
499    VNEG.S32        Q1, Q1
500    VADD.I32        Q14, Q14, Q0
501    VADD.I32        Q15, Q15, Q1
502
503    VMULL.U16       Q0, D6, D9
504    VSHR.S32        Q12, Q12, #16
505    VMLAL.S16       Q12, D5, D9
506    VSHR.S32        Q13, Q13, #16
507    VSHR.S32        Q0, Q0, #16
508    VMLAL.S16       Q13, D7, D8
509    VMLAL.S16       Q0, D7, D9
510
511
512
513    VADD.I32        Q11, Q11, Q0
514
515    VNEG.S32        Q11, Q11
516    VSUB.I32        Q12, Q13, Q12
517
518
519    LDR             R11, [sp, #120]
520    VDUP.S32        Q7, R11
521    VQADD.S32       Q14, Q14, Q7
522    LDR             R11, [sp, #116]
523    VDUP.S32        Q0, R11
524    VQSHL.S32       Q14, Q14, Q0
525
526
527    VMOV            Q0, Q11
528    VMOV            Q7, Q12
529
530    VUZP.16         D24, D25
531
532    VUZP.16         D22, D23
533    VMULL.U16       Q4, D24, D18
534    VMULL.U16       Q13, D22, D18
535
536    VNEG.S32        Q1, Q15
537
538    VUZP.16         D30, D31
539
540    VUZP.16         D2, D3
541    VMULL.U16       Q2, D30, D12
542    VMULL.U16       Q3, D2, D13
543
544    VSHR.U32        Q4, Q4, #16
545    VSHR.U32        Q13, Q13, #16
546
547    VMLAL.S16       Q4, D25, D18
548    VMLAL.S16       Q13, D23, D18
549
550    VSHR.U32        Q2, Q2, #16
551    VSHR.U32        Q3, Q3, #16
552
553    VMLAL.S16       Q2, D31, D12
554    VMLAL.S16       Q3, D3, D13
555
556    VNEG.S32        Q4, Q4
557    VADD.I32        Q7, Q7, Q13
558    VADD.I32        Q0, Q0, Q4
559
560
561
562    LDR             R11, [sp, #120]
563    VDUP.S32        Q4, R11
564    VQADD.S32       Q0, Q0, Q4
565    LDR             R11, [sp, #116]
566    VDUP.S32        Q13, R11
567    VQSHL.S32       Q0, Q0, Q13
568    VMOV            Q13, Q14
569
570    VLD2.32         {Q14, Q15}, [R4]
571
572    VZIP.32         Q13, Q0
573    VST1.32         {Q13}, [R4]!
574    VST1.32         {Q0}, [R4]!
575
576    VMOV.S32        D1, #0
577    VADDL.S16       Q0, D13, D1
578
579
580    VMULL.S32       Q13, D28, D0
581    VQMOVN.S64      D8, Q13
582    VMULL.S32       Q13, D29, D1
583    VQMOVN.S64      D9, Q13
584
585    VMOV.S32        D1, #0
586    VADDL.S16       Q0, D12, D1
587
588
589    VMULL.S32       Q12, D28, D0
590    VQMOVN.S64      D26, Q12
591    VMULL.S32       Q12, D29, D1
592    VQMOVN.S64      D27, Q12
593
594    VQSHL.S32       Q2, Q2, Q8
595    VQSHL.S32       Q3, Q3, Q8
596
597
598
599    VQSUB.S32       Q2, Q2, Q4
600    VQSUB.S32       Q3, Q3, Q13
601
602    VNEG.S32        Q13, Q7
603    VUZP.16         D26, D27
604
605    VMOV.S32        D1, #0
606    VADDL.S16       Q0, D10, D1
607    VMULL.S32       Q11, D30, D0
608    VQMOVN.S64      D24, Q11
609    VMULL.S32       Q11, D31, D1
610    VQMOVN.S64      D25, Q11
611
612    VMOV.S32        D1, #0
613    VADDL.S16       Q0, D11, D1
614
615    VMULL.S32       Q4, D30, D0
616    VQMOVN.S64      D22, Q4
617    VMULL.S32       Q4, D31, D1
618    VQMOVN.S64      D23, Q4
619
620
621    VUZP.16         D14, D15
622    VMULL.U16       Q4, D26, D11
623    VMULL.U16       Q15, D14, D10
624
625
626    VLD2.32         {Q0, Q1}, [R1], R12
627
628    VUZP.16         D0, D1
629
630    VUZP.16         D2, D3
631    VSHR.U32        Q4, Q4, #16
632
633    VREV64.16       Q0, Q0
634    VSHR.U32        Q15, Q15, #16
635
636    VREV64.16       Q1, Q1
637    VMLAL.S16       Q4, D27, D11
638
639    VMLAL.S16       Q15, D15, D10
640
641    VLD2.32         {Q5, Q6}, [R6], R12
642
643    VUZP.16         D10, D11
644
645    VUZP.16         D12, D13
646    VMOV             Q7 , Q2
647
648    VREV64.16       Q5, Q5
649
650    VREV64.16       Q6, Q6
651
652
653    VQSHL.S32       Q4, Q4, Q8
654
655    VMOV            Q9,Q3
656
657    VLD2.32         {Q2, Q3}, [R8]!
658    VQSHL.S32       Q15, Q15, Q8
659
660    VUZP.16         D4, D5
661    VQSUB.S32       Q4, Q4, Q12
662
663    VUZP.16         D6, D7
664    VQSUB.S32       Q11, Q15, Q11
665
666     VMOV            Q15,Q4
667
668    VLD2.16         {D8, D9}, [R2]!
669
670    SUBS            R3, R3, #1
671    BNE             CORE_LOOP_PTO
672
673
674
675
676
677EPILOGUE:
678
679    VST1.32         D14[0], [R0], R9
680
681    VST1.32         D22[0], [R0], R9
682
683    VST1.32         D14[1], [R0], R9
684
685    VST1.32         D22[1], [R0], R9
686
687    VST1.32         D15[0], [R0], R9
688
689    VST1.32         D23[0], [R0], R9
690
691    VST1.32         D15[1], [R0], R9
692
693    VST1.32         D23[1], [R0], R9
694
695    VST1.32         D18[0], [R5], R10
696
697    VST1.32         D30[0], [R5], R10
698
699    VST1.32         D18[1], [R5], R10
700
701    VST1.32         D30[1], [R5], R10
702
703    VST1.32         D19[0], [R5], R10
704
705    VST1.32         D31[0], [R5], R10
706
707    VST1.32         D19[1], [R5], R10
708
709    VST1.32         D31[1], [R5], R10
710
711    VMULL.U16       Q15, D0, D9
712    VMULL.U16       Q14, D2, D8
713    VMULL.U16       Q13, D0, D8
714    VMULL.U16       Q12, D2, D9
715    VSHR.U32        Q15, Q15, #16
716    VSHR.U32        Q14, Q14, #16
717    VMLAL.S16       Q15, D1, D9
718    VMLAL.S16       Q14, D3, D8
719    VSHR.U32        Q13, Q13, #16
720    VSHR.U32        Q12, Q12, #16
721    VMLAL.S16       Q13, D1, D8
722	VMLAL.S16       Q12, D3, D9
723    VADD.I32        Q15, Q15, Q14
724	VNEG.S32        Q15, Q15
725
726
727    VSUB.I32        Q14, Q12, Q13
728
729    VMOV.S16        D18, #50
730
731    VMULL.U16       Q11, D4, D8
732    VMOV            Q13, Q15
733    VMOV            Q12, Q14
734
735    VMOV            Q13, Q15
736    VMOV            Q12, Q14
737
738    VUZP.16         D26, D27
739    VUZP.16         D24, D25
740
741
742    VMULL.U16       Q1, D24, D18
743    VMULL.U16       Q0, D26, D18
744
745    VSHR.U32        Q11, Q11, #16
746    VMLAL.S16       Q11, D5, D8
747
748    VSHR.U32        Q1, Q1, #16
749    VSHR.U32        Q0, Q0, #16
750    VMLAL.S16       Q1, D25, D18
751    VMLAL.S16       Q0, D27, D18
752
753    VMULL.U16       Q12, D4, D9
754    VMULL.U16       Q13, D6, D8
755
756    VNEG.S32        Q1, Q1
757    VADD.I32        Q14, Q14, Q0
758    VADD.I32        Q15, Q15, Q1
759
760    VMULL.U16       Q0, D6, D9
761    VSHR.S32        Q12, Q12, #16
762    VMLAL.S16       Q12, D5, D9
763    VSHR.S32        Q13, Q13, #16
764    VSHR.S32        Q0, Q0, #16
765    VMLAL.S16       Q13, D7, D8
766    VMLAL.S16       Q0, D7, D9
767
768
769
770
771
772    VADD.I32        Q11, Q11, Q0
773    VNEG.S32        Q11, Q11
774    VSUB.I32        Q12, Q13, Q12
775
776
777
778
779    LDR             R11, [sp, #120]
780    VDUP.S32        Q7, R11
781    VQADD.S32       Q14, Q14, Q7
782    LDR             R11, [sp, #116]
783    VDUP.S32        Q0, R11
784    VQSHL.S32       Q14, Q14, Q0
785
786
787    VMOV            Q0, Q11
788    VMOV            Q7, Q12
789
790
791    VUZP.16         D22, D23
792    VUZP.16         D24, D25
793
794    VMULL.U16       Q4, D24, D18
795    VMULL.U16       Q13, D22, D18
796
797    VNEG.S32        Q1, Q15
798    VUZP.16         D30, D31
799    VUZP.16         D2, D3
800
801    VMULL.U16       Q2, D30, D12
802    VMULL.U16       Q3, D2, D13
803
804    VSHR.U32        Q4, Q4, #16
805    VSHR.U32        Q13, Q13, #16
806
807    VMLAL.S16       Q4, D25, D18
808    VMLAL.S16       Q13, D23, D18
809
810    VSHR.U32        Q2, Q2, #16
811    VSHR.U32        Q3, Q3, #16
812
813    VMLAL.S16       Q2, D31, D12
814    VMLAL.S16       Q3, D3, D13
815
816    VNEG.S32        Q4, Q4
817    VADD.I32        Q7, Q7, Q13
818    VADD.I32        Q0, Q0, Q4
819
820    LDR             R11, [sp, #120]
821    VDUP.S32        Q4, R11
822    VQADD.S32       Q0, Q0, Q4
823    LDR             R11, [sp, #116]
824    VDUP.S32        Q13, R11
825    VQSHL.S32       Q0, Q0, Q13
826
827
828    VMOV            Q13, Q14
829
830    VLD2.32         {Q14, Q15}, [R4]
831    VZIP.32         Q13, Q0
832    VST1.32         {Q13}, [R4]!
833    VST1.32         {Q0}, [R4]!
834
835    VMOV.S32        D1, #0
836    VADDL.S16       Q0, D13, D1
837
838    VMULL.S32       Q13, D28, D0
839    VQMOVN.S64      D8, Q13
840    VMULL.S32       Q13, D29, D1
841    VQMOVN.S64      D9, Q13
842
843    VMOV.S32        D1, #0
844    VADDL.S16       Q0, D12, D1
845
846    VMULL.S32       Q12, D28, D0
847    VQMOVN.S64      D26, Q12
848    VMULL.S32       Q12, D29, D1
849    VQMOVN.S64      D27, Q12
850
851    VQSHL.S32       Q2, Q2, Q8
852    VQSHL.S32       Q3, Q3, Q8
853
854    VQSUB.S32       Q2, Q2, Q4
855    VQSUB.S32       Q3, Q3, Q13
856
857    VNEG.S32        Q13, Q7
858    VUZP.16         D14, D15
859    VUZP.16         D26, D27
860
861    VMOV.S32        D1, #0
862    VADDL.S16       Q0, D10, D1
863
864
865    VMULL.S32       Q11, D30, D0
866    VQMOVN.S64      D24, Q11
867    VMULL.S32       Q11, D31, D1
868    VQMOVN.S64      D25, Q11
869
870    VMOV.S32        D1, #0
871    VADDL.S16       Q0, D11, D1
872
873    VMULL.S32       Q4, D30, D0
874    VQMOVN.S64      D22, Q4
875    VMULL.S32       Q4, D31, D1
876    VQMOVN.S64      D23, Q4
877
878
879    VMULL.U16       Q4, D26, D11
880    VMULL.U16       Q15, D14, D10
881
882    VSHR.U32        Q4, Q4, #16
883
884    VSHR.U32        Q15, Q15, #16
885
886    VMLAL.S16       Q4, D27, D11
887
888    VMLAL.S16       Q15, D15, D10
889
890
891
892    VQADD.S32       Q7, Q2, Q10
893
894    VQSHL.S32       Q4, Q4, Q8
895
896    VQSHL.S32       Q15, Q15, Q8
897
898    VQSUB.S32       Q4, Q4, Q12
899
900    VQSUB.S32       Q11, Q15, Q11
901
902    VMOV             Q15 , Q4
903
904    VST1.32         D14[0], [R0], R9
905    VST1.32         D22[0], [R0], R9
906    VST1.32         D14[1], [R0], R9
907    VST1.32         D22[1], [R0], R9
908    VST1.32         D15[0], [R0], R9
909    VST1.32         D23[0], [R0], R9
910    VST1.32         D15[1], [R0], R9
911    VST1.32         D23[1], [R0], R9
912    VST1.32         D6[0], [R5], R10
913    VST1.32         D30[0], [R5], R10
914    VST1.32         D6[1], [R5], R10
915    VST1.32         D30[1], [R5], R10
916    VST1.32         D7[0], [R5], R10
917    VST1.32         D31[0], [R5], R10
918    VST1.32         D7[1], [R5], R10
919    VST1.32         D31[1], [R5], R10
920
921ARM_EPILOGUE:
922
923ARM_LOOP:
924
925    VLD2.32         {Q0, Q1}, [R1]
926
927    VUZP.16         D0, D1
928    VUZP.16         D2, D3
929
930    VREV64.16       Q0, Q0
931    VREV64.16       Q1, Q1
932
933    VLD2.16         {D8, D9}, [R2]!
934
935    VLD2.32         {D4, D6}, [R8]!
936    VMOV.S32        D5, #0x00000000
937    VMOV.S32        D7, #0x00000000
938
939    VLD1.32         D5[0], [R8]!
940    VLD1.32         D7[0], [R8]
941
942    MOV             R12, #16
943
944    VUZP.16         D4, D5
945    VUZP.16         D6, D7
946
947    ADD             R6, R6, #16
948
949    MOV             R12, #-4
950    VLD2.32         {D11, D13}, [R6], R12
951
952
953    VMOV.S32        D10, #0x00000000
954
955    VLD1.32         D12[1], [R6], R12
956    VLD1.32         D10[1], [R6], R12
957    VLD1.32         D12[0], [R6], R12
958
959    VUZP.16         D10, D11
960    VUZP.16         D12, D13
961
962    VREV64.16       Q5, Q5
963    VREV64.16       Q6, Q6
964
965    VMULL.U16       Q15, D0, D9
966    VMULL.U16       Q14, D2, D8
967    VMULL.U16       Q13, D0, D8
968    VMULL.U16       Q12, D2, D9
969
970    VSHR.U32        Q15, Q15, #16
971    VSHR.U32        Q14, Q14, #16
972
973    VMLAL.S16       Q15, D1, D9
974    VMLAL.S16       Q14, D3, D8
975
976    VSHR.U32        Q13, Q13, #16
977    VSHR.U32        Q12, Q12, #16
978
979    VMLAL.S16       Q13, D1, D8
980    VMLAL.S16       Q12, D3, D9
981
982    VADD.I32        Q15, Q15, Q14
983    VNEG.S32        Q15, Q15
984
985    VMULL.U16       Q11, D4, D8
986
987    VSUB.I32        Q14, Q12, Q13
988
989
990    VMOV            Q13, Q15
991    VMOV            Q12, Q14
992
993    VUZP.16         D26, D27
994    VUZP.16         D24, D25
995
996
997    VMULL.U16       Q1, D24, D18
998    VMULL.U16       Q0, D26, D18
999
1000    VSHR.U32        Q11, Q11, #16
1001    VMLAL.S16       Q11, D5, D8
1002
1003    VSHR.U32        Q1, Q1, #16
1004    VSHR.U32        Q0, Q0, #16
1005    VMLAL.S16       Q1, D25, D18
1006    VMLAL.S16       Q0, D27, D18
1007
1008    VMULL.U16       Q12, D4, D9
1009    VMULL.U16       Q13, D6, D8
1010
1011    VNEG.S32        Q1, Q1
1012    VADD.I32        Q14, Q14, Q0
1013    VADD.I32        Q15, Q15, Q1
1014
1015    VMULL.U16       Q0, D6, D9
1016    VSHR.S32        Q12, Q12, #16
1017    VMLAL.S16       Q12, D5, D9
1018    VSHR.S32        Q13, Q13, #16
1019    VSHR.S32        Q0, Q0, #16
1020    VMLAL.S16       Q13, D7, D8
1021    VMLAL.S16       Q0, D7, D9
1022
1023    VADD.I32        Q11, Q11, Q0
1024    VNEG.S32        Q11, Q11
1025    VSUB.I32        Q12, Q13, Q12
1026
1027    LDR             R11, [sp, #120]
1028    VDUP.S32        Q7, R11
1029    VQADD.S32       Q14, Q14, Q7
1030    LDR             R11, [sp, #116]
1031    VDUP.S32        Q0, R11
1032    VQSHL.S32       Q14, Q14, Q0
1033
1034    VMOV            Q0, Q11
1035    VMOV            Q7, Q12
1036
1037    VUZP.16         D22, D23
1038    VUZP.16         D24, D25
1039
1040    VMULL.U16       Q4, D24, D18
1041    VMULL.U16       Q13, D22, D18
1042
1043    VNEG.S32        Q1, Q15
1044    VUZP.16         D30, D31
1045    VUZP.16         D2, D3
1046
1047    VMULL.U16       Q2, D30, D12
1048    VMULL.U16       Q3, D2, D13
1049
1050    VSHR.U32        Q4, Q4, #16
1051    VSHR.U32        Q13, Q13, #16
1052
1053    VMLAL.S16       Q4, D25, D18
1054    VMLAL.S16       Q13, D23, D18
1055
1056    VSHR.U32        Q2, Q2, #16
1057    VSHR.U32        Q3, Q3, #16
1058
1059    VMLAL.S16       Q2, D31, D12
1060    VMLAL.S16       Q3, D3, D13
1061
1062    VNEG.S32        Q4, Q4
1063    VADD.I32        Q7, Q7, Q13
1064    VADD.I32        Q0, Q0, Q4
1065
1066    LDR             R11, [sp, #120]
1067    VDUP.S32        Q4, R11
1068    VQADD.S32       Q0, Q0, Q4
1069    LDR             R11, [sp, #116]
1070    VDUP.S32        Q13, R11
1071    VQSHL.S32       Q0, Q0, Q13
1072
1073    VMOV            Q13, Q14
1074
1075    MOV             R6, R4
1076
1077    VLD1.32         {D28, D29}, [R4]!
1078    VMOV.S32        D31, #0x00000000
1079    VLD1.32         D30[0], [R4]!
1080    VLD1.32         D30[1], [R4]!
1081    VLD1.32         D31[0], [R4]!
1082    VUZP.32         Q14, Q15
1083
1084
1085    VST1.32         D26[0], [R6]!
1086    VST1.32         D0[0], [R6]!
1087    VST1.32         D26[1], [R6]!
1088    VST1.32         D0[1], [R6]!
1089    VST1.32         D27[0], [R6]!
1090    VST1.32         D1[0], [R6]!
1091    VST1.32         D27[1], [R6]!
1092
1093    VMOV.S32        D1, #0
1094    VADDL.S16       Q0, D13, D1
1095
1096    VMULL.S32       Q13, D28, D0
1097    VQMOVN.S64      D8, Q13
1098    VMULL.S32       Q13, D29, D1
1099    VQMOVN.S64      D9, Q13
1100
1101    VMOV.S32        D1, #0
1102    VADDL.S16       Q0, D12, D1
1103
1104    VMULL.S32       Q12, D28, D0
1105    VQMOVN.S64      D26, Q12
1106    VMULL.S32       Q12, D29, D1
1107    VQMOVN.S64      D27, Q12
1108
1109    VQSHL.S32       Q2, Q2, Q8
1110    VQSHL.S32       Q3, Q3, Q8
1111
1112    VQSUB.S32       Q2, Q2, Q4
1113    VQSUB.S32       Q3, Q3, Q13
1114
1115    VNEG.S32        Q13, Q7
1116    VUZP.16         D14, D15
1117    VUZP.16         D26, D27
1118
1119    VMOV.S32        D1, #0
1120    VADDL.S16       Q0, D10, D1
1121
1122
1123    VMULL.S32       Q11, D30, D0
1124    VQMOVN.S64      D24, Q11
1125    VMULL.S32       Q11, D31, D1
1126    VQMOVN.S64      D25, Q11
1127
1128
1129    VMOV.S32        D1, #0
1130    VADDL.S16       Q0, D11, D1
1131
1132    VMULL.S32       Q4, D30, D0
1133    VQMOVN.S64      D22, Q4
1134    VMULL.S32       Q4, D31, D1
1135    VQMOVN.S64      D23, Q4
1136
1137
1138    VMULL.U16       Q4, D26, D11
1139    VMULL.U16       Q15, D14, D10
1140
1141    VSHR.U32        Q4, Q4, #16
1142
1143    VSHR.U32        Q15, Q15, #16
1144
1145    VMLAL.S16       Q4, D27, D11
1146
1147    VMLAL.S16       Q15, D15, D10
1148
1149
1150
1151    VMOV           Q7 , Q2
1152
1153    VQSHL.S32       Q4, Q4, Q8
1154
1155    VQSHL.S32       Q15, Q15, Q8
1156
1157    VQSUB.S32       Q4, Q4, Q12
1158
1159    VQSUB.S32       Q11, Q15, Q11
1160
1161     VMOV            Q15, Q4
1162
1163
1164
1165
1166    VST1.32         D14[0], [R0], R9
1167    VST1.32         D22[0], [R0], R9
1168    VST1.32         D14[1], [R0], R9
1169    VST1.32         D22[1], [R0], R9
1170    VST1.32         D15[0], [R0], R9
1171    VST1.32         D23[0], [R0], R9
1172    VST1.32         D15[1], [R0], R9
1173
1174    VST1.32         D6[0], [R5], R10
1175    VST1.32         D30[0], [R5], R10
1176    VST1.32         D6[1], [R5], R10
1177    VST1.32         D30[1], [R5], R10
1178    VST1.32         D7[0], [R5], R10
1179    VST1.32         D31[0], [R5], R10
1180    VST1.32         D7[1], [R5], R10
1181
1182    VPOP            {d8 - d15}
1183    LDMFD           sp!, {R4-R12}
1184    BX              LR
1185
1186
1187