• 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_mps_mulshift_acc
25
26ixheaacd_mps_mulshift_acc:
27
28    STMFD           sp!, {R4-R12, R14}
29    VPUSH           {d8 - d15}
30    LDR             R4, [SP, #104]      @Argument V_fix
31    LDR             R5, [SP, #108]      @Argument 2*resolution
32    ASR             R6, R5, #1
33
34    MOV             R7, R4
35    MOV             R11, #40
36    MUL             R11, R11, R5
37    ADD             R7, R7, R11
38    LSL             R8, R5, #2
39    SUB             R8, R7, R8
40    MOV             R10, #9
41    MUL             R9, R5, R10
42
43COPYLOOP:
44    SUB             R8, R8, #32
45    VLD1.32         {Q0, Q1}, [R8]
46    SUB             R7, R7, #32
47    VST1.32         {Q0, Q1}, [R7]
48    SUBS            R9, R9, #8
49    BGT             COPYLOOP
50
51LOOP:
52    VMOV.I64        Q14, #0
53    VMOV.I64        Q15, #0
54    MOV             R7, R6
55    MOV             R8, R0
56    MOV             R9, R1
57
58LOOP1:
59    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
60    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
61    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
62    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
63
64    VMULL.S32       Q12, D0, D8
65    VMULL.S32       Q10, D1, D9
66    VMULL.S32       Q11, D3, D11
67    VMULL.S32       Q13, D2, D10
68
69    VMULL.S32       Q0, D4, D12
70    VMULL.S32       Q4, D5, D13
71    VMULL.S32       Q5, D7, D15
72    VMULL.S32       Q1, D6, D14
73
74    VSHR.S64        Q0, Q0, #31
75    VSHR.S64        Q1, Q1, #31
76    VSHR.S64        Q4, Q4, #31
77    VSHR.S64        Q5, Q5, #31
78
79    VSHR.S64        Q12, Q12, #31
80    VSHR.S64        Q13, Q13, #31
81    VSHR.S64        Q10, Q10, #31
82    VSHR.S64        Q11, Q11, #31
83
84    VSUB.I64        Q12, Q12, Q0
85    VSUB.I64        Q13, Q13, Q1
86    VSUB.I64        Q10, Q10, Q4
87    VSUB.I64        Q11, Q11, Q5
88
89    VADD.I64        Q12, Q12, Q13
90    VADD.I64        Q10, Q10, Q11
91    VADD.I64        Q12, Q12, Q10
92    VADD.I64        D24, D24, D25
93    VADD.I64        D28, D28, D24
94    SUBS            R7, R7, #8
95    BGT             LOOP1
96
97
98    MOV             R7, R6
99    MOV             R8, R0
100    MOV             R9, R1
101
102LOOP2:
103    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
104    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
105    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
106    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
107
108    VMULL.S32       Q12, D0, D8
109    VMULL.S32       Q10, D1, D9
110    VMULL.S32       Q11, D3, D11
111    VMULL.S32       Q13, D2, D10
112
113    VMULL.S32       Q0, D4, D12
114    VMULL.S32       Q4, D5, D13
115    VMULL.S32       Q5, D7, D15
116    VMULL.S32       Q1, D6, D14
117
118    VSHR.S64        Q12, Q12, #31
119    VSHR.S64        Q13, Q13, #31
120    VSHR.S64        Q10, Q10, #31
121    VSHR.S64        Q11, Q11, #31
122
123    VSHR.S64        Q0, Q0, #31
124    VSHR.S64        Q1, Q1, #31
125    VSHR.S64        Q4, Q4, #31
126    VSHR.S64        Q5, Q5, #31
127
128    VSUB.I64        Q12, Q12, Q0
129    VSUB.I64        Q13, Q13, Q1
130    VSUB.I64        Q10, Q10, Q4
131    VSUB.I64        Q11, Q11, Q5
132
133    VADD.I64        Q12, Q12, Q13
134    VADD.I64        Q10, Q10, Q11
135    VADD.I64        Q12, Q12, Q10
136    VADD.I64        D24, D24, D25
137    VADD.I64        D29, D29, D24
138    SUBS            R7, R7, #8
139    BGT             LOOP2
140
141    MOV             R7, R6
142    MOV             R8, R0
143    MOV             R9, R1
144
145
146LOOP3:
147    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
148    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
149    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
150    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
151
152    VMULL.S32       Q12, D0, D8
153    VMULL.S32       Q10, D1, D9
154    VMULL.S32       Q11, D3, D11
155    VMULL.S32       Q13, D2, D10
156
157    VMULL.S32       Q0, D4, D12
158    VMULL.S32       Q4, D5, D13
159    VMULL.S32       Q5, D7, D15
160    VMULL.S32       Q1, D6, D14
161
162    VSHR.S64        Q12, Q12, #31
163    VSHR.S64        Q13, Q13, #31
164    VSHR.S64        Q10, Q10, #31
165    VSHR.S64        Q11, Q11, #31
166
167    VSHR.S64        Q0, Q0, #31
168    VSHR.S64        Q1, Q1, #31
169    VSHR.S64        Q4, Q4, #31
170    VSHR.S64        Q5, Q5, #31
171
172    VSUB.I64        Q12, Q12, Q0
173    VSUB.I64        Q13, Q13, Q1
174    VSUB.I64        Q10, Q10, Q4
175    VSUB.I64        Q11, Q11, Q5
176
177    VADD.I64        Q12, Q12, Q13
178    VADD.I64        Q10, Q10, Q11
179    VADD.I64        Q12, Q12, Q10
180    VADD.I64        D24, D24, D25
181    VADD.I64        D30, D30, D24
182    SUBS            R7, R7, #8
183    BGT             LOOP3
184
185    MOV             R7, R6
186    MOV             R8, R0
187    MOV             R9, R1
188
189
190LOOP4:
191    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
192    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
193    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
194    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
195
196    VMULL.S32       Q12, D0, D8
197    VMULL.S32       Q10, D1, D9
198    VMULL.S32       Q11, D3, D11
199    VMULL.S32       Q13, D2, D10
200
201    VMULL.S32       Q0, D4, D12
202    VMULL.S32       Q4, D5, D13
203    VMULL.S32       Q5, D7, D15
204    VMULL.S32       Q1, D6, D14
205
206    VSHR.S64        Q12, Q12, #31
207    VSHR.S64        Q13, Q13, #31
208    VSHR.S64        Q10, Q10, #31
209    VSHR.S64        Q11, Q11, #31
210
211    VSHR.S64        Q0, Q0, #31
212    VSHR.S64        Q1, Q1, #31
213    VSHR.S64        Q4, Q4, #31
214    VSHR.S64        Q5, Q5, #31
215
216    VSUB.I64        Q12, Q12, Q0
217    VSUB.I64        Q13, Q13, Q1
218    VSUB.I64        Q10, Q10, Q4
219    VSUB.I64        Q11, Q11, Q5
220
221    VADD.I64        Q12, Q12, Q13
222    VADD.I64        Q10, Q10, Q11
223    VADD.I64        Q12, Q12, Q10
224    VADD.I64        D24, D24, D25
225    VADD.I64        D31, D31, D24
226    SUBS            R7, R7, #8
227    BGT             LOOP4
228
229    VQMOVN.S64      D0, Q14
230    VQMOVN.S64      D1, Q15
231
232    VST1.32         {Q0}, [R4]!         @Storing values to R4
233
234    SUBS            R5, R5, #4
235    BGT             LOOP
236
237    VPOP            {d8 - d15}
238    LDMFD           sp!, {R4-R12, R14}
239    BX              LR
240
241