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
26    .global ixheaacd_over_lap_add1_armv7
27ixheaacd_over_lap_add1_armv7:
28
29    STMFD           sp!, {R4-R12, R14}
30    VPUSH           {d8 - d15}
31
32    LDR             R4, [SP, #104]
33    LDR             R5, [SP, #108]
34    LDR             R6, [SP, #112]
35    MOV             R10, R5, LSL #1
36    SUB             R11, R10, #1
37    MOV             R10, R11, LSL #2
38    ADD             R10, R0, R10
39    SUB             R10, R10, #12
40    MOV             R8, R11, LSL #1
41    ADD             R8, R8, R3
42    SUB             R8, R8, #14
43    MOV             R12, #0
44    VDUP.S16        D12, R12
45    MOV             R12, #-16
46    VDUP.16         Q11, R4
47    VLD1.32         {D6, D7}, [R10], R12
48    MOV             R7, #0x2000
49    VREV64.32       Q3, Q3
50    RSB             R7, R7, #0
51    VQNEG.S32       Q0, Q3
52    VDUP.32         Q10, R7
53    VUZP.16         D1, D0
54    SUB             R11, R5, #1
55    VUZP.16         D7, D6
56    SMULBB          R11, R11, R6
57    MOV             R11, R11, LSL #1
58    VLD2.16         {D2, D3}, [R8], R12
59    ADD             R11, R11, R2
60    VREV64.16       Q1, Q1
61    MOV             R4, R6, LSL #1
62    RSB             R4, R4, #0
63    MOV             R9, R6, LSL #1
64    SMULBB          R6, R5, R6
65    MOV             R6, R6, LSL #1
66    ADD             R6, R6, R2
67
68
69
70    VMULL.U16       Q15, D7, D2
71    VLD1.32         {D4, D5}, [R1]!
72    VSHR.U32        Q15, Q15, #16
73
74    VMLAL.S16       Q15, D6, D2
75    VQSHL.S32       Q15, Q15, Q11
76
77
78    VADDL.S16       Q7, D3, D12
79
80    VMULL.S32       Q13, D4, D14
81    VQMOVN.S64      D28, Q13
82    VMULL.S32       Q13, D5, D15
83    VQMOVN.S64      D29, Q13
84
85    VQADD.S32       Q14, Q14, Q10
86    VQSUB.S32       Q13, Q15, Q14
87    VQSHL.S32       Q13, Q13, #2
88    VSHR.S32        Q13, Q13, #16
89    VUZP.16         D26, D27
90
91
92    VMULL.U16       Q12, D1, D3
93    VSHR.U32        Q12, Q12, #16
94    VMLAL.S16       Q12, D0, D3
95    VQSHL.S32       Q12, Q12, Q11
96    VLD1.32         {D6, D7}, [R10], R12
97
98
99    VADDL.S16       Q7, D2, D12
100
101    VMULL.S32       Q0, D14, D4
102    VQMOVN.S64      D16, Q0
103    VMULL.S32       Q0, D15, D5
104    VQMOVN.S64      D17, Q0
105
106    VREV64.32       Q3, Q3
107    VQADD.S32       Q8, Q8, Q10
108    VQNEG.S32       Q0, Q3
109    VUZP.16         D1, D0
110    VQSUB.S32       Q9, Q12, Q8
111    VUZP.16         D7, D6
112    VQSHL.S32       Q9, Q9, #2
113    VLD2.16         {D2, D3}, [R8], R12
114    VSHR.S32        Q9, Q9, #16
115    VREV64.16       Q1, Q1
116    VUZP.16         D18, D19
117
118    VLD1.32         {D4, D5}, [R1]!
119    SUB             R5, R5, #8
120
121
122LOOP_1:
123
124    VST1.16         D26[0], [R11], R4
125    VMULL.U16       Q15, D7, D2
126    VST1.16         D26[1], [R11], R4
127    VMULL.U16       Q12, D1, D3
128    VST1.16         D26[2], [R11], R4
129    VSHR.U32        Q15, Q15, #16
130    VST1.16         D26[3], [R11], R4
131    VSHR.U32        Q12, Q12, #16
132    VST1.16         D18[0], [R6], R9
133    VMLAL.S16       Q15, D6, D2
134    VST1.16         D18[1], [R6], R9
135    VMLAL.S16       Q12, D0, D3
136    VST1.16         D18[2], [R6], R9
137    VQSHL.S32       Q15, Q15, Q11
138    VST1.16         D18[3], [R6], R9
139    VQSHL.S32       Q12, Q12, Q11
140    VLD1.32         {D6, D7}, [R10], R12
141
142
143    VADDL.S16       Q7, D3, D12
144
145    VMULL.S32       Q8, D4, D14
146    VQMOVN.S64      D28, Q8
147    VMULL.S32       Q8, D5, D15
148    VQMOVN.S64      D29, Q8
149    VREV64.32       Q3, Q3
150
151
152
153    VADDL.S16       Q7, D2, D12
154
155    VMULL.S32       Q0, D4, D14
156    VQMOVN.S64      D16, Q0
157    VMULL.S32       Q0, D5, D15
158    VQMOVN.S64      D17, Q0
159
160    VLD2.16         {D2, D3}, [R8], R12
161    VQNEG.S32       Q0, Q3
162    VLD1.32         {D4, D5}, [R1]!
163    VQADD.S32       Q14, Q14, Q10
164    VUZP.16         D1, D0
165    VQADD.S32       Q8, Q8, Q10
166    VUZP.16         D7, D6
167    VQSUB.S32       Q13, Q15, Q14
168    VREV64.16       Q1, Q1
169    VQSUB.S32       Q9, Q12, Q8
170    VQSHL.S32       Q13, Q13, #2
171    VQSHL.S32       Q9, Q9, #2
172    VMULL.U16       Q15, D7, D2
173    VSHR.S32        Q13, Q13, #16
174    VUZP.16         D26, D27
175    VSHR.S32        Q9, Q9, #16
176    VST1.16         D26[0], [R11], R4
177    VMULL.U16       Q12, D1, D3
178    VUZP.16         D18, D19
179    VSHR.U32        Q15, Q15, #16
180    VST1.16         D26[1], [R11], R4
181    VMLAL.S16       Q15, D6, D2         @MLA
182    VST1.16         D26[2], [R11], R4
183    VSHR.U32        Q12, Q12, #16
184    VST1.16         D26[3], [R11], R4
185    VMLAL.S16       Q12, D0, D3         @MLA
186    VST1.16         D18[0], [R6], R9
187    VQSHL.S32       Q15, Q15, Q11
188    VST1.16         D18[1], [R6], R9
189    VQSHL.S32       Q12, Q12, Q11
190    VST1.16         D18[2], [R6], R9
191
192
193    VADDL.S16       Q7, D3, D12
194
195    VMULL.S32       Q8, D4, D14
196    VQMOVN.S64      D28, Q8
197    VMULL.S32       Q8, D5, D15
198    VQMOVN.S64      D29, Q8
199
200    VST1.16         D18[3], [R6], R9
201
202
203    VADDL.S16       Q7, D2, D12
204
205    VMULL.S32       Q0, D4, D14
206    VQMOVN.S64      D16, Q0
207    VMULL.S32       Q0, D5, D15
208    VQMOVN.S64      D17, Q0
209
210    VLD1.32         {D6, D7}, [R10], R12
211    VQADD.S32       Q14, Q14, Q10
212    VREV64.32       Q3, Q3
213    VQNEG.S32       Q0, Q3
214    VUZP.16         D1, D0
215    VQSUB.S32       Q13, Q15, Q14
216    VUZP.16         D7, D6
217    VQADD.S32       Q8, Q8, Q10
218    VLD2.16         {D2, D3}, [R8], R12
219    VQSUB.S32       Q9, Q12, Q8
220    VREV64.16       Q1, Q1
221    VQSHL.S32       Q13, Q13, #2
222    VLD1.32         {D4, D5}, [R1]!
223    VQSHL.S32       Q9, Q9, #2
224    VSHR.S32        Q13, Q13, #16
225    SUBS            R5, R5, #8
226    VSHR.S32        Q9, Q9, #16
227    VUZP.16         D26, D27
228    VUZP.16         D18, D19
229
230
231
232    BGT             LOOP_1
233
234    VST1.16         D26[0], [R11], R4
235    VMULL.U16       Q15, D7, D2
236    VST1.16         D26[1], [R11], R4
237    VMULL.U16       Q12, D1, D3
238    VST1.16         D26[2], [R11], R4
239    VSHR.U32        Q15, Q15, #16
240    VST1.16         D26[3], [R11], R4
241    VSHR.U32        Q12, Q12, #16
242
243    VST1.16         D18[0], [R6], R9
244    VMLAL.S16       Q15, D6, D2
245    VST1.16         D18[1], [R6], R9
246    VMLAL.S16       Q12, D0, D3
247    VST1.16         D18[2], [R6], R9
248    VQSHL.S32       Q15, Q15, Q11
249    VST1.16         D18[3], [R6], R9
250    VQSHL.S32       Q12, Q12, Q11
251
252
253
254
255    VADDL.S16       Q7, D3, D12
256
257    VMULL.S32       Q8, D4, D14
258    VQMOVN.S64      D28, Q8
259    VMULL.S32       Q8, D5, D15
260    VQMOVN.S64      D29, Q8
261
262
263
264    VADDL.S16       Q7, D2, D12
265
266    VMULL.S32       Q13, D4, D14
267    VQMOVN.S64      D16, Q13
268    VMULL.S32       Q13, D5, D15
269    VQMOVN.S64      D17, Q13
270
271    VQADD.S32       Q14, Q14, Q10
272    VQADD.S32       Q8, Q8, Q10
273    VQSUB.S32       Q13, Q15, Q14
274    VQSUB.S32       Q9, Q12, Q8
275    VQSHL.S32       Q13, Q13, #2
276    VQSHL.S32       Q9, Q9, #2
277    VSHR.S32        Q13, Q13, #16
278    VSHR.S32        Q9, Q9, #16
279    VUZP.16         D26, D27
280
281    VUZP.16         D18, D19
282
283
284
285    VST1.16         D26[0], [R11], R4
286    VST1.16         D26[1], [R11], R4
287    VST1.16         D26[2], [R11], R4
288    VST1.16         D26[3], [R11], R4
289
290    VST1.16         D18[0], [R6], R9
291    VST1.16         D18[1], [R6], R9
292    VST1.16         D18[2], [R6], R9
293    VST1.16         D18[3], [R6], R9
294
295    VPOP            {d8 - d15}
296    LDMFD           sp!, {R4-R12, R15}
297
298