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