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