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_dct3_32
25.extern ixheaacd_radix4bfly
26.hidden ixheaacd_radix4bfly
27.extern ixheaacd_postradixcompute4
28.hidden ixheaacd_postradixcompute4
29
30ixheaacd_dct3_32:
31
32
33    STMFD           sp!, {R4-R12, R14}
34    VPUSH           {D8 - D15}
35    ADD             R6, R0, #196
36    SUB             R7, R6, #8
37    ADD             R10, R7, #4
38    MOV             R9, #0
39    VDUP.32         D0, R9
40    ADD             R4, R2, #8
41    MOV             R8, R1
42
43    VLD1.32         D0[0], [R10]
44    MOV             R11, #-4
45
46    VSHR.S32        D0, D0, #7
47    VLD4.16         {D12, D13, D14, D15}, [R4]!
48
49    MOV             R12, #-16
50    VST1.32         D0, [R8]!
51    SUB             R7, R7, #12
52
53    VLD1.32         {Q0}, [R6]!
54    VLD1.32         {Q1}, [R7], R12
55    SUB             R9, R6, #144
56
57    VREV64.32       Q1, Q1
58    SUB             R5, R7, #112
59
60    VSWP            D2, D3
61    VSHR.S32        Q0, Q0, #7
62
63    VSHR.S32        Q1, Q1, #7
64    VLD1.32         {Q3}, [R9]!
65    VADD.I32        Q2, Q1, Q0
66
67    VUZP.16         D4, D5
68    VSHR.S32        Q3, Q3, #7
69
70
71    VLD1.32         {Q4}, [R5], R12
72    VMULL.U16       Q15, D4, D12
73
74    VREV64.32       Q4, Q4
75    VMULL.U16       Q14, D4, D13
76
77    VSWP            D8, D9
78
79    VSHR.S32        Q4, Q4, #7
80    VLD1.32         {Q0}, [R6]!
81    VSUB.I32        Q5, Q3, Q4
82
83    VUZP.16         D10, D11
84
85    VMLAL.U16       Q15, D10, D13
86    VLD1.32         {Q1}, [R7], R12
87    VMLSL.U16       Q14, D10, D12
88
89    VREV64.32       Q1, Q1
90    VSHR.S32        Q0, Q0, #7
91
92    VSWP            D2, D3
93
94    VSHR.U32        Q15, Q15, #16
95    VSHR.S32        Q1, Q1, #7
96
97    VMLAL.S16       Q15, D5, D12
98    VMLAL.S16       Q15, D11, D13
99
100
101    VSHR.S32        Q14, Q14, #16
102    VMLAL.S16       Q14, D5, D13
103    VADD.I32        Q2, Q1, Q0
104    VMLSL.S16       Q14, D11, D12
105
106    VUZP.16         D4, D5
107    SUB             R9, R6, #144
108
109    VSWP            Q15, Q14
110    SUB             R5, R7, #112
111
112    VST2.32         {Q14, Q15}, [R8]!
113
114    VLD1.32         {Q3}, [R9]!
115
116    VLD1.32         {Q4}, [R5], R12
117    VSHR.S32        Q3, Q3, #7
118
119    VREV64.32       Q4, Q4
120
121    VSWP            D8, D9
122
123    VSHR.S32        Q4, Q4, #7
124    VLD4.16         {D12, D13, D14, D15}, [R4]!
125    VSUB.I32        Q5, Q3, Q4
126
127    VUZP.16         D10, D11
128    VMULL.U16       Q15, D4, D12
129    VMLAL.U16       Q15, D10, D13
130    VMULL.U16       Q14, D4, D13
131    VLD1.32         {Q0}, [R6]!
132    VMLSL.U16       Q14, D10, D12
133    VLD1.32         {Q1}, [R7], R11
134    VSHR.U32        Q15, Q15, #16
135
136    VREV64.32       Q1, Q1
137    VSHR.S32        Q14, Q14, #16
138
139    VSWP            D2, D3
140    VSHR.S32        Q0, Q0, #7
141
142    SUB             R9, R6, #144
143
144    SUB             R5, R7, #124
145    VLD1.32         {Q3}, [R9]!
146    VMLAL.S16       Q14, D5, D13
147
148    VMLSL.S16       Q14, D11, D12
149    VLD1.32         {Q4}, [R5], R11
150    VMLAL.S16       Q15, D5, D12
151
152    VREV64.32       Q4, Q4
153    VMLAL.S16       Q15, D11, D13
154
155    VSWP            D8, D9
156    VSHR.S32        Q1, Q1, #7
157
158    VADD.I32        Q2, Q1, Q0
159    VLD4.16         {D12, D13, D14, D15}, [R4]!
160    VSHR.S32        Q3, Q3, #7
161
162    VUZP.16         D4, D5
163    VSHR.S32        Q4, Q4, #7
164
165    VSWP            Q15, Q14
166    VSUB.I32        Q5, Q3, Q4
167
168    VST2.32         {Q14, Q15}, [R8]!
169
170    VUZP.16         D10, D11
171    VMULL.U16       Q15, D4, D12
172
173    VMLAL.U16       Q15, D10, D13
174    VLD1.32         D0, [R6]!
175    VMULL.U16       Q14, D4, D13
176
177    VMLSL.U16       Q14, D10, D12
178    VLD1.32         D1[0], [R6]!
179
180    VSHR.U32        Q15, Q15, #16
181    VLD1.32         D2[0], [R7], R11
182
183    VMLAL.S16       Q15, D5, D12
184    VLD1.32         D2[1], [R7], R11
185    VMLAL.S16       Q15, D11, D13
186
187    SUB             R9, R6, #140
188    VLD1.32         D3[0], [R7], R11
189
190    SUB             R5, R7, #116
191    VLD1.32         D6, [R9]!
192    VSHR.S32        Q14, Q14, #16
193
194    VSHR.S32        Q0, Q0, #7
195    VLD1.32         D7[0], [R9]!
196    VMLAL.S16       Q14, D5, D13
197
198    VLD1.32         D8[0], [R5], R11
199    VMLSL.S16       Q14, D11, D12
200
201    VSHR.S32        Q1, Q1, #7
202    VLD4.16         {D12, D13, D14, D15}, [R4]
203    VADD.I32        Q2, Q1, Q0
204
205    VLD1.32         D8[1], [R5], R11
206    VSHR.S32        Q3, Q3, #7
207
208    VSWP            Q15, Q14
209
210    VLD1.32         D9[0], [R5], R11
211
212    VSHR.S32        Q4, Q4, #7
213    VST2.32         {Q14, Q15}, [R8]!
214    ADD             R4, #24
215
216    VUZP.16         D4, D5
217    VSUB.I32        Q5, Q3, Q4
218
219    VUZP.16         D10, D11
220    VMULL.U16       Q15, D4, D12
221
222    VMLAL.U16       Q15, D10, D13
223    VMULL.U16       Q14, D4, D13
224
225    VMLSL.U16       Q14, D10, D12
226    VLD1.16         D0[0], [R4]!
227    VSHR.U32        Q15, Q15, #16
228
229    VSHR.S32        Q14, Q14, #16
230    VLD1.32         D2[0], [R7], R11
231    VMLAL.S16       Q15, D5, D12
232
233    SUB             R5, R7, #124
234    VMLAL.S16       Q15, D11, D13
235    VLD1.32         D4[0], [R5]
236    VMLAL.S16       Q14, D5, D13
237
238    VMLSL.S16       Q14, D11, D12
239
240    VSHR.S32        D2, D2, #7
241    VST1.32         D30[0], [R8]!
242    VSHR.S32        D4, D4, #7
243    VSUB.I32        D2, D2, D4
244
245    VMOV            D4, D2
246    VST1.32         D28[0], [R8]!
247    MOV             R6, R1
248
249    ADD             R7, R1, #124
250    VST1.32         D30[1], [R8]!
251    ADD             R10, R3, #16
252
253    SUB             R7, R7, #28
254    VST1.32         D28[1], [R8]!
255    MOV             R5, #-16
256
257    MOV             R9, #-4
258    VST1.32         D31[0], [R8]!
259    MOV             R11, #16
260
261    VST1.32         D29[0], [R8]!
262    MOV             R12, #4
263
264    VUZP.16         D4, D5
265    MOV             R8, #6
266
267    VLD1.16         D1[0], [R4], R8
268    VMULL.U16       Q15, D4, D0
269
270
271    VUZP.16         D2, D3
272    VMULL.U16       Q14, D4, D1
273
274    VMLAL.U16       Q15, D2, D1
275    VLD2.32         {D10, D11}, [R6]
276    VMLSL.U16       Q14, D2, D0
277
278    ADD             R4, R3, #4
279    MOV             R8, #-32
280    VSHR.U32        Q15, Q15, #16
281    VSHR.S32        Q14, Q14, #16
282    VMLAL.S16       Q15, D5, D0
283    VMLAL.S16       Q15, D3, D1
284    VMLAL.S16       Q14, D5, D1
285    VMLSL.S16       Q14, D3, D0
286
287    VADD.I32        D14, D11, D28
288    VLD2.32         {Q2, Q3}, [R7]
289    VNEG.S32        D14, D14
290
291    VREV64.32       Q2, Q2
292    VSUB.I32        D12, D10, D30
293
294    VREV64.32       Q3, Q3
295    VADD.I32        D10, D10, D30
296
297    VSWP            D4, D5
298    VADD.I32        D10, D10, D14
299
300    VSWP            D6, D7
301    VSUB.I32        D11, D11, D28
302
303    VADD.I32        D11, D11, D12
304    VLD2.16         {D8, D9}, [R10], R5
305    VSHR.S32        D10, D10, #1
306
307    VREV64.16       D8, D8
308    VSHR.S32        D11, D11, #1
309
310    VUZP.32         D10, D11
311
312    VST1.32         D10, [R6]!
313    VLD2.32         {Q0, Q1}, [R6]
314
315    VADD.I32        Q7, Q0, Q2
316    VLD2.16         {D10, D11}, [R4], R11
317    VSUB.I32        Q6, Q0, Q2
318
319    VUZP.16         D12, D13
320    VADD.I32        Q8, Q1, Q3
321
322    VUZP.16         D16, D17
323    VSUB.I32        Q9, Q1, Q3
324
325
326    VMULL.U16       Q15, D12, D8
327    VMLAL.U16       Q15, D16, D10
328    VMULL.U16       Q14, D12, D10
329    VMLSL.U16       Q14, D16, D8
330    VSHR.S32        Q7, Q7, #1
331    VSHR.U32        Q15, Q15, #16
332    VSHR.S32        Q9, Q9, #1
333    VSHR.S32        Q14, Q14, #16
334    VMLAL.S16       Q15, D13, D8
335    VMLAL.S16       Q15, D17, D10
336    VMLAL.S16       Q14, D13, D10
337    VMLSL.S16       Q14, D17, D8
338
339    VSUB.I32        Q10, Q7, Q15
340    VLD2.16         {D8, D9}, [R10]
341    VADD.I32        Q13, Q7, Q15
342
343    VREV64.32       Q13, Q13
344    VSWP            D26, D27
345
346    VADD.I32        Q11, Q9, Q14
347    VREV64.16       D8, D8
348
349    VSUB.I32        Q12, Q14, Q9
350
351    VREV64.32       Q12, Q12
352
353    VST2.32         {Q10, Q11}, [R6]!
354    VSWP            D24, D25
355    VSWP            Q12, Q13
356    VST2.32         {Q12, Q13}, [R7], R8
357
358    VLD2.32         {Q0, Q1}, [R6]
359    VLD2.32         {Q2, Q3}, [R7]
360
361    VREV64.32       Q2, Q2
362    VREV64.32       Q3, Q3
363
364    VSWP            D4, D5
365    VSWP            D6, D7
366
367    VSUB.I32        Q6, Q0, Q2
368    VADD.I32        Q7, Q0, Q2
369    VLD2.16         {D10, D11}, [R4], R11
370    VADD.I32        Q8, Q1, Q3
371
372    VUZP.16         D12, D13
373    VSUB.I32        Q9, Q1, Q3
374
375
376    VUZP.16         D16, D17
377    VMULL.U16       Q15, D12, D8
378
379    VMLAL.U16       Q15, D16, D10
380    VMULL.U16       Q14, D12, D10
381    VMLSL.U16       Q14, D16, D8
382    ADD             R7, R7, #8
383    VSHR.U32        Q15, Q15, #16
384    VSHR.S32        Q7, Q7, #1
385    VSHR.S32        Q14, Q14, #16
386    VMLAL.S16       Q15, D13, D8
387    VMLAL.S16       Q15, D17, D10
388    VMLAL.S16       Q14, D13, D10
389    VMLSL.S16       Q14, D17, D8
390
391    VSHR.S32        Q9, Q9, #1
392    VSUB.I32        Q10, Q7, Q15
393    VSUB.I32        Q12, Q14, Q9
394
395    VADD.I32        Q11, Q9, Q14
396    VST1.32         D20[0], [R6]!
397    VADD.I32        Q13, Q7, Q15
398
399
400    VST1.32         D22[0], [R6]!
401    VST1.32         D20[1], [R6]!
402    VST1.32         D22[1], [R6]!
403    VST1.32         D21[0], [R6]!
404    VST1.32         D23[0], [R6]!
405
406    VREV64.32       Q12, Q12
407
408    VREV64.32       Q13, Q13
409    VSWP            D24, D25
410    VSWP            D26, D27
411
412
413    VST1.32         D26[1], [R7]!
414    VST1.32         D24[1], [R7]!
415    VST1.32         D27[0], [R7]!
416    VST1.32         D25[0], [R7]!
417    VST1.32         D27[1], [R7]!
418    VST1.32         D25[1], [R7]!
419
420    SUB             R7, R7, #32
421    VLD2.32         {D0, D1}, [R6]
422    VLD2.32         {D2, D3}, [R7]
423
424    VSUB.I32        D12, D0, D2
425    VLD1.16         D8, [R10], R9
426    VADD.I32        D14, D0, D2
427
428    VADD.I32        D16, D1, D3
429    VLD1.16         D10, [R4], R12
430    VSUB.I32        D18, D1, D3
431
432    VUZP.16         D12, D13
433    MOV             R4, R0
434
435    VUZP.16         D16, D17
436    VMULL.U16       Q15, D12, D8
437    VMLAL.U16       Q15, D16, D10
438    VMULL.U16       Q14, D12, D10
439    VMLSL.U16       Q14, D16, D8
440    VSHR.S32        D18, D18, #1
441    VSHR.U32        Q15, Q15, #16
442    VSHR.S32        Q14, Q14, #16
443
444    VMLAL.S16       Q15, D13, D8
445    VMLAL.S16       Q15, D17, D10
446
447    MOV             R10, R1
448
449    VMLAL.S16       Q14, D13, D10
450    VMLSL.S16       Q14, D17, D8
451    VNEG.S32        Q15, Q15
452    VSHR.S32        D14, D14, #1
453
454    VADD.I32        Q13, Q7, Q15
455
456    VADD.I32        Q11, Q9, Q14
457
458    LDR             r0 , [sp , #104]
459    VST1.32         D26[0], [R6]!
460    MOV             r2, #1
461
462    VST1.32         D22[0], [R6]!
463    MOV             r3, #4
464    BL              ixheaacd_radix4bfly
465
466    MOV             r0, r4
467    MOV             r1, r10
468    LDR             r2 , [sp , #108]
469    MOV             r3, #16
470    BL              ixheaacd_postradixcompute4
471
472    MOV             r0, r4
473    MOV             r1, r10
474    LDMIA           r0!, {r4, r5}
475    STR             r4, [r1], #4
476    STR             r5, [r1, #4]
477    ADD             r2, r0, #64
478    ADD             r3, r1, #116
479    MOV             r6, #7
480
481BACK3:
482
483    LDMIA           r0!, {r4, r5}
484    STR             r5, [r1], #8
485    STR             r4, [r1], #8
486
487    LDMIA           r2!, {r4, r5}
488    STR             r5, [r3], #-8
489    STR             r4, [r3], #-8
490
491    SUBS            r6, r6, #1
492    BNE             BACK3
493
494    LDMIA           r0!, {r4, r5}
495    STR             r5, [r1], #8
496    STR             r4, [r1], #8
497
498    VPOP            {D8 - D15}
499    LDMFD           sp!, {r4-r12, r15}
500
501
502
503
504
505
506
507