| rev |
line source |
|
nengel@2
|
1 /*
|
|
nengel@2
|
2 * ARM NEON optimised DSP functions
|
|
nengel@2
|
3 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
|
|
nengel@2
|
4 *
|
|
nengel@2
|
5 * This file is part of FFmpeg.
|
|
nengel@2
|
6 *
|
|
nengel@2
|
7 * FFmpeg is free software; you can redistribute it and/or
|
|
nengel@2
|
8 * modify it under the terms of the GNU Lesser General Public
|
|
nengel@2
|
9 * License as published by the Free Software Foundation; either
|
|
nengel@2
|
10 * version 2.1 of the License, or (at your option) any later version.
|
|
nengel@2
|
11 *
|
|
nengel@2
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
|
nengel@2
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
nengel@2
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
nengel@2
|
15 * Lesser General Public License for more details.
|
|
nengel@2
|
16 *
|
|
nengel@2
|
17 * You should have received a copy of the GNU Lesser General Public
|
|
nengel@2
|
18 * License along with FFmpeg; if not, write to the Free Software
|
|
nengel@2
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
nengel@2
|
20 */
|
|
nengel@2
|
21
|
|
nengel@2
|
22 #include "config.h"
|
|
nengel@2
|
23 #include "asm.S"
|
|
nengel@2
|
24
|
|
nengel@2
|
25 preserve8
|
|
nengel@2
|
26 .text
|
|
nengel@2
|
27
|
|
nengel@2
|
28 .macro pixels16 avg=0
|
|
nengel@2
|
29 .if \avg
|
|
nengel@2
|
30 mov ip, r0
|
|
nengel@2
|
31 .endif
|
|
nengel@2
|
32 1: vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
33 vld1.64 {d2, d3}, [r1], r2
|
|
nengel@2
|
34 vld1.64 {d4, d5}, [r1], r2
|
|
nengel@2
|
35 pld [r1, r2, lsl #2]
|
|
nengel@2
|
36 vld1.64 {d6, d7}, [r1], r2
|
|
nengel@2
|
37 pld [r1]
|
|
nengel@2
|
38 pld [r1, r2]
|
|
nengel@2
|
39 pld [r1, r2, lsl #1]
|
|
nengel@2
|
40 .if \avg
|
|
nengel@2
|
41 vld1.64 {d16,d17}, [ip,:128], r2
|
|
nengel@2
|
42 vrhadd.u8 q0, q0, q8
|
|
nengel@2
|
43 vld1.64 {d18,d19}, [ip,:128], r2
|
|
nengel@2
|
44 vrhadd.u8 q1, q1, q9
|
|
nengel@2
|
45 vld1.64 {d20,d21}, [ip,:128], r2
|
|
nengel@2
|
46 vrhadd.u8 q2, q2, q10
|
|
nengel@2
|
47 vld1.64 {d22,d23}, [ip,:128], r2
|
|
nengel@2
|
48 vrhadd.u8 q3, q3, q11
|
|
nengel@2
|
49 .endif
|
|
nengel@2
|
50 subs r3, r3, #4
|
|
nengel@2
|
51 vst1.64 {d0, d1}, [r0,:128], r2
|
|
nengel@2
|
52 vst1.64 {d2, d3}, [r0,:128], r2
|
|
nengel@2
|
53 vst1.64 {d4, d5}, [r0,:128], r2
|
|
nengel@2
|
54 vst1.64 {d6, d7}, [r0,:128], r2
|
|
nengel@2
|
55 bne 1b
|
|
nengel@2
|
56 bx lr
|
|
nengel@2
|
57 .endm
|
|
nengel@2
|
58
|
|
nengel@2
|
59 .macro pixels16_x2 vhadd=vrhadd.u8
|
|
nengel@2
|
60 1: vld1.64 {d0-d2}, [r1], r2
|
|
nengel@2
|
61 vld1.64 {d4-d6}, [r1], r2
|
|
nengel@2
|
62 pld [r1]
|
|
nengel@2
|
63 pld [r1, r2]
|
|
nengel@2
|
64 subs r3, r3, #2
|
|
nengel@2
|
65 vext.8 q1, q0, q1, #1
|
|
nengel@2
|
66 \vhadd q0, q0, q1
|
|
nengel@2
|
67 vext.8 q3, q2, q3, #1
|
|
nengel@2
|
68 \vhadd q2, q2, q3
|
|
nengel@2
|
69 vst1.64 {d0, d1}, [r0,:128], r2
|
|
nengel@2
|
70 vst1.64 {d4, d5}, [r0,:128], r2
|
|
nengel@2
|
71 bne 1b
|
|
nengel@2
|
72 bx lr
|
|
nengel@2
|
73 .endm
|
|
nengel@2
|
74
|
|
nengel@2
|
75 .macro pixels16_y2 vhadd=vrhadd.u8
|
|
nengel@2
|
76 vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
77 vld1.64 {d2, d3}, [r1], r2
|
|
nengel@2
|
78 1: subs r3, r3, #2
|
|
nengel@2
|
79 \vhadd q2, q0, q1
|
|
nengel@2
|
80 vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
81 \vhadd q3, q0, q1
|
|
nengel@2
|
82 vld1.64 {d2, d3}, [r1], r2
|
|
nengel@2
|
83 pld [r1]
|
|
nengel@2
|
84 pld [r1, r2]
|
|
nengel@2
|
85 vst1.64 {d4, d5}, [r0,:128], r2
|
|
nengel@2
|
86 vst1.64 {d6, d7}, [r0,:128], r2
|
|
nengel@2
|
87 bne 1b
|
|
nengel@2
|
88 bx lr
|
|
nengel@2
|
89 .endm
|
|
nengel@2
|
90
|
|
nengel@2
|
91 .macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0
|
|
nengel@2
|
92 vld1.64 {d0-d2}, [r1], r2
|
|
nengel@2
|
93 vld1.64 {d4-d6}, [r1], r2
|
|
nengel@2
|
94 .if \no_rnd
|
|
nengel@2
|
95 vmov.i16 q13, #1
|
|
nengel@2
|
96 .endif
|
|
nengel@2
|
97 pld [r1]
|
|
nengel@2
|
98 pld [r1, r2]
|
|
nengel@2
|
99 vext.8 q1, q0, q1, #1
|
|
nengel@2
|
100 vext.8 q3, q2, q3, #1
|
|
nengel@2
|
101 vaddl.u8 q8, d0, d2
|
|
nengel@2
|
102 vaddl.u8 q10, d1, d3
|
|
nengel@2
|
103 vaddl.u8 q9, d4, d6
|
|
nengel@2
|
104 vaddl.u8 q11, d5, d7
|
|
nengel@2
|
105 1: subs r3, r3, #2
|
|
nengel@2
|
106 vld1.64 {d0-d2}, [r1], r2
|
|
nengel@2
|
107 vadd.u16 q12, q8, q9
|
|
nengel@2
|
108 pld [r1]
|
|
nengel@2
|
109 .if \no_rnd
|
|
nengel@2
|
110 vadd.u16 q12, q12, q13
|
|
nengel@2
|
111 .endif
|
|
nengel@2
|
112 vext.8 q15, q0, q1, #1
|
|
nengel@2
|
113 vadd.u16 q1 , q10, q11
|
|
nengel@2
|
114 \vshrn d28, q12, #2
|
|
nengel@2
|
115 .if \no_rnd
|
|
nengel@2
|
116 vadd.u16 q1, q1, q13
|
|
nengel@2
|
117 .endif
|
|
nengel@2
|
118 \vshrn d29, q1, #2
|
|
nengel@2
|
119 vaddl.u8 q8, d0, d30
|
|
nengel@2
|
120 vld1.64 {d2-d4}, [r1], r2
|
|
nengel@2
|
121 vaddl.u8 q10, d1, d31
|
|
nengel@2
|
122 vst1.64 {d28,d29}, [r0,:128], r2
|
|
nengel@2
|
123 vadd.u16 q12, q8, q9
|
|
nengel@2
|
124 pld [r1, r2]
|
|
nengel@2
|
125 .if \no_rnd
|
|
nengel@2
|
126 vadd.u16 q12, q12, q13
|
|
nengel@2
|
127 .endif
|
|
nengel@2
|
128 vext.8 q2, q1, q2, #1
|
|
nengel@2
|
129 vadd.u16 q0, q10, q11
|
|
nengel@2
|
130 \vshrn d30, q12, #2
|
|
nengel@2
|
131 .if \no_rnd
|
|
nengel@2
|
132 vadd.u16 q0, q0, q13
|
|
nengel@2
|
133 .endif
|
|
nengel@2
|
134 \vshrn d31, q0, #2
|
|
nengel@2
|
135 vaddl.u8 q9, d2, d4
|
|
nengel@2
|
136 vaddl.u8 q11, d3, d5
|
|
nengel@2
|
137 vst1.64 {d30,d31}, [r0,:128], r2
|
|
nengel@2
|
138 bgt 1b
|
|
nengel@2
|
139 bx lr
|
|
nengel@2
|
140 .endm
|
|
nengel@2
|
141
|
|
nengel@2
|
142 .macro pixels8 avg=0
|
|
nengel@2
|
143 1: vld1.64 {d0}, [r1], r2
|
|
nengel@2
|
144 vld1.64 {d1}, [r1], r2
|
|
nengel@2
|
145 vld1.64 {d2}, [r1], r2
|
|
nengel@2
|
146 pld [r1, r2, lsl #2]
|
|
nengel@2
|
147 vld1.64 {d3}, [r1], r2
|
|
nengel@2
|
148 pld [r1]
|
|
nengel@2
|
149 pld [r1, r2]
|
|
nengel@2
|
150 pld [r1, r2, lsl #1]
|
|
nengel@2
|
151 .if \avg
|
|
nengel@2
|
152 vld1.64 {d4}, [r0,:64], r2
|
|
nengel@2
|
153 vrhadd.u8 d0, d0, d4
|
|
nengel@2
|
154 vld1.64 {d5}, [r0,:64], r2
|
|
nengel@2
|
155 vrhadd.u8 d1, d1, d5
|
|
nengel@2
|
156 vld1.64 {d6}, [r0,:64], r2
|
|
nengel@2
|
157 vrhadd.u8 d2, d2, d6
|
|
nengel@2
|
158 vld1.64 {d7}, [r0,:64], r2
|
|
nengel@2
|
159 vrhadd.u8 d3, d3, d7
|
|
nengel@2
|
160 sub r0, r0, r2, lsl #2
|
|
nengel@2
|
161 .endif
|
|
nengel@2
|
162 subs r3, r3, #4
|
|
nengel@2
|
163 vst1.64 {d0}, [r0,:64], r2
|
|
nengel@2
|
164 vst1.64 {d1}, [r0,:64], r2
|
|
nengel@2
|
165 vst1.64 {d2}, [r0,:64], r2
|
|
nengel@2
|
166 vst1.64 {d3}, [r0,:64], r2
|
|
nengel@2
|
167 bne 1b
|
|
nengel@2
|
168 bx lr
|
|
nengel@2
|
169 .endm
|
|
nengel@2
|
170
|
|
nengel@2
|
171 .macro pixels8_x2 vhadd=vrhadd.u8
|
|
nengel@2
|
172 1: vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
173 vext.8 d1, d0, d1, #1
|
|
nengel@2
|
174 vld1.64 {d2, d3}, [r1], r2
|
|
nengel@2
|
175 vext.8 d3, d2, d3, #1
|
|
nengel@2
|
176 pld [r1]
|
|
nengel@2
|
177 pld [r1, r2]
|
|
nengel@2
|
178 subs r3, r3, #2
|
|
nengel@2
|
179 vswp d1, d2
|
|
nengel@2
|
180 \vhadd q0, q0, q1
|
|
nengel@2
|
181 vst1.64 {d0}, [r0,:64], r2
|
|
nengel@2
|
182 vst1.64 {d1}, [r0,:64], r2
|
|
nengel@2
|
183 bne 1b
|
|
nengel@2
|
184 bx lr
|
|
nengel@2
|
185 .endm
|
|
nengel@2
|
186
|
|
nengel@2
|
187 .macro pixels8_y2 vhadd=vrhadd.u8
|
|
nengel@2
|
188 vld1.64 {d0}, [r1], r2
|
|
nengel@2
|
189 vld1.64 {d1}, [r1], r2
|
|
nengel@2
|
190 1: subs r3, r3, #2
|
|
nengel@2
|
191 \vhadd d4, d0, d1
|
|
nengel@2
|
192 vld1.64 {d0}, [r1], r2
|
|
nengel@2
|
193 \vhadd d5, d0, d1
|
|
nengel@2
|
194 vld1.64 {d1}, [r1], r2
|
|
nengel@2
|
195 pld [r1]
|
|
nengel@2
|
196 pld [r1, r2]
|
|
nengel@2
|
197 vst1.64 {d4}, [r0,:64], r2
|
|
nengel@2
|
198 vst1.64 {d5}, [r0,:64], r2
|
|
nengel@2
|
199 bne 1b
|
|
nengel@2
|
200 bx lr
|
|
nengel@2
|
201 .endm
|
|
nengel@2
|
202
|
|
nengel@2
|
203 .macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0
|
|
nengel@2
|
204 vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
205 vld1.64 {d2, d3}, [r1], r2
|
|
nengel@2
|
206 .if \no_rnd
|
|
nengel@2
|
207 vmov.i16 q11, #1
|
|
nengel@2
|
208 .endif
|
|
nengel@2
|
209 pld [r1]
|
|
nengel@2
|
210 pld [r1, r2]
|
|
nengel@2
|
211 vext.8 d4, d0, d1, #1
|
|
nengel@2
|
212 vext.8 d6, d2, d3, #1
|
|
nengel@2
|
213 vaddl.u8 q8, d0, d4
|
|
nengel@2
|
214 vaddl.u8 q9, d2, d6
|
|
nengel@2
|
215 1: subs r3, r3, #2
|
|
nengel@2
|
216 vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
217 pld [r1]
|
|
nengel@2
|
218 vadd.u16 q10, q8, q9
|
|
nengel@2
|
219 vext.8 d4, d0, d1, #1
|
|
nengel@2
|
220 .if \no_rnd
|
|
nengel@2
|
221 vadd.u16 q10, q10, q11
|
|
nengel@2
|
222 .endif
|
|
nengel@2
|
223 vaddl.u8 q8, d0, d4
|
|
nengel@2
|
224 \vshrn d5, q10, #2
|
|
nengel@2
|
225 vld1.64 {d2, d3}, [r1], r2
|
|
nengel@2
|
226 vadd.u16 q10, q8, q9
|
|
nengel@2
|
227 pld [r1, r2]
|
|
nengel@2
|
228 .if \no_rnd
|
|
nengel@2
|
229 vadd.u16 q10, q10, q11
|
|
nengel@2
|
230 .endif
|
|
nengel@2
|
231 vst1.64 {d5}, [r0,:64], r2
|
|
nengel@2
|
232 \vshrn d7, q10, #2
|
|
nengel@2
|
233 vext.8 d6, d2, d3, #1
|
|
nengel@2
|
234 vaddl.u8 q9, d2, d6
|
|
nengel@2
|
235 vst1.64 {d7}, [r0,:64], r2
|
|
nengel@2
|
236 bgt 1b
|
|
nengel@2
|
237 bx lr
|
|
nengel@2
|
238 .endm
|
|
nengel@2
|
239
|
|
nengel@2
|
240 .macro pixfunc pfx name suf rnd_op args:vararg
|
|
nengel@2
|
241 function ff_\pfx\name\suf\()_neon, export=1
|
|
nengel@2
|
242 \name \rnd_op \args
|
|
nengel@2
|
243 endfunc
|
|
nengel@2
|
244 .endm
|
|
nengel@2
|
245
|
|
nengel@2
|
246 .macro pixfunc2 pfx name args:vararg
|
|
nengel@2
|
247 pixfunc \pfx \name
|
|
nengel@2
|
248 pixfunc \pfx \name \args
|
|
nengel@2
|
249 .endm
|
|
nengel@2
|
250
|
|
nengel@2
|
251 function ff_put_h264_qpel16_mc00_neon, export=1
|
|
nengel@2
|
252 mov r3, #16
|
|
nengel@2
|
253 endfunc
|
|
nengel@2
|
254
|
|
nengel@2
|
255 pixfunc put_ pixels16
|
|
nengel@2
|
256 pixfunc2 put_ pixels16_x2, _no_rnd, vhadd.u8
|
|
nengel@2
|
257 pixfunc2 put_ pixels16_y2, _no_rnd, vhadd.u8
|
|
nengel@2
|
258 pixfunc2 put_ pixels16_xy2, _no_rnd, vshrn.u16, 1
|
|
nengel@2
|
259
|
|
nengel@2
|
260 function ff_avg_h264_qpel16_mc00_neon, export=1
|
|
nengel@2
|
261 mov r3, #16
|
|
nengel@2
|
262 endfunc
|
|
nengel@2
|
263
|
|
nengel@2
|
264 pixfunc avg_ pixels16,, 1
|
|
nengel@2
|
265
|
|
nengel@2
|
266 function ff_put_h264_qpel8_mc00_neon, export=1
|
|
nengel@2
|
267 mov r3, #8
|
|
nengel@2
|
268 endfunc
|
|
nengel@2
|
269
|
|
nengel@2
|
270 pixfunc put_ pixels8
|
|
nengel@2
|
271 pixfunc2 put_ pixels8_x2, _no_rnd, vhadd.u8
|
|
nengel@2
|
272 pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8
|
|
nengel@2
|
273 pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1
|
|
nengel@2
|
274
|
|
nengel@2
|
275 function ff_avg_h264_qpel8_mc00_neon, export=1
|
|
nengel@2
|
276 mov r3, #8
|
|
nengel@2
|
277 endfunc
|
|
nengel@2
|
278
|
|
nengel@2
|
279 pixfunc avg_ pixels8,, 1
|
|
nengel@2
|
280
|
|
nengel@2
|
281 function ff_put_pixels_clamped_neon, export=1
|
|
nengel@2
|
282 vld1.64 {d16-d19}, [r0,:128]!
|
|
nengel@2
|
283 vqmovun.s16 d0, q8
|
|
nengel@2
|
284 vld1.64 {d20-d23}, [r0,:128]!
|
|
nengel@2
|
285 vqmovun.s16 d1, q9
|
|
nengel@2
|
286 vld1.64 {d24-d27}, [r0,:128]!
|
|
nengel@2
|
287 vqmovun.s16 d2, q10
|
|
nengel@2
|
288 vld1.64 {d28-d31}, [r0,:128]!
|
|
nengel@2
|
289 vqmovun.s16 d3, q11
|
|
nengel@2
|
290 vst1.64 {d0}, [r1,:64], r2
|
|
nengel@2
|
291 vqmovun.s16 d4, q12
|
|
nengel@2
|
292 vst1.64 {d1}, [r1,:64], r2
|
|
nengel@2
|
293 vqmovun.s16 d5, q13
|
|
nengel@2
|
294 vst1.64 {d2}, [r1,:64], r2
|
|
nengel@2
|
295 vqmovun.s16 d6, q14
|
|
nengel@2
|
296 vst1.64 {d3}, [r1,:64], r2
|
|
nengel@2
|
297 vqmovun.s16 d7, q15
|
|
nengel@2
|
298 vst1.64 {d4}, [r1,:64], r2
|
|
nengel@2
|
299 vst1.64 {d5}, [r1,:64], r2
|
|
nengel@2
|
300 vst1.64 {d6}, [r1,:64], r2
|
|
nengel@2
|
301 vst1.64 {d7}, [r1,:64], r2
|
|
nengel@2
|
302 bx lr
|
|
nengel@2
|
303 endfunc
|
|
nengel@2
|
304
|
|
nengel@2
|
305 function ff_put_signed_pixels_clamped_neon, export=1
|
|
nengel@2
|
306 vmov.u8 d31, #128
|
|
nengel@2
|
307 vld1.64 {d16-d17}, [r0,:128]!
|
|
nengel@2
|
308 vqmovn.s16 d0, q8
|
|
nengel@2
|
309 vld1.64 {d18-d19}, [r0,:128]!
|
|
nengel@2
|
310 vqmovn.s16 d1, q9
|
|
nengel@2
|
311 vld1.64 {d16-d17}, [r0,:128]!
|
|
nengel@2
|
312 vqmovn.s16 d2, q8
|
|
nengel@2
|
313 vld1.64 {d18-d19}, [r0,:128]!
|
|
nengel@2
|
314 vadd.u8 d0, d0, d31
|
|
nengel@2
|
315 vld1.64 {d20-d21}, [r0,:128]!
|
|
nengel@2
|
316 vadd.u8 d1, d1, d31
|
|
nengel@2
|
317 vld1.64 {d22-d23}, [r0,:128]!
|
|
nengel@2
|
318 vadd.u8 d2, d2, d31
|
|
nengel@2
|
319 vst1.64 {d0}, [r1,:64], r2
|
|
nengel@2
|
320 vqmovn.s16 d3, q9
|
|
nengel@2
|
321 vst1.64 {d1}, [r1,:64], r2
|
|
nengel@2
|
322 vqmovn.s16 d4, q10
|
|
nengel@2
|
323 vst1.64 {d2}, [r1,:64], r2
|
|
nengel@2
|
324 vqmovn.s16 d5, q11
|
|
nengel@2
|
325 vld1.64 {d24-d25}, [r0,:128]!
|
|
nengel@2
|
326 vadd.u8 d3, d3, d31
|
|
nengel@2
|
327 vld1.64 {d26-d27}, [r0,:128]!
|
|
nengel@2
|
328 vadd.u8 d4, d4, d31
|
|
nengel@2
|
329 vadd.u8 d5, d5, d31
|
|
nengel@2
|
330 vst1.64 {d3}, [r1,:64], r2
|
|
nengel@2
|
331 vqmovn.s16 d6, q12
|
|
nengel@2
|
332 vst1.64 {d4}, [r1,:64], r2
|
|
nengel@2
|
333 vqmovn.s16 d7, q13
|
|
nengel@2
|
334 vst1.64 {d5}, [r1,:64], r2
|
|
nengel@2
|
335 vadd.u8 d6, d6, d31
|
|
nengel@2
|
336 vadd.u8 d7, d7, d31
|
|
nengel@2
|
337 vst1.64 {d6}, [r1,:64], r2
|
|
nengel@2
|
338 vst1.64 {d7}, [r1,:64], r2
|
|
nengel@2
|
339 bx lr
|
|
nengel@2
|
340 endfunc
|
|
nengel@2
|
341
|
|
nengel@2
|
342 function ff_add_pixels_clamped_neon, export=1
|
|
nengel@2
|
343 mov r3, r1
|
|
nengel@2
|
344 vld1.64 {d16}, [r1,:64], r2
|
|
nengel@2
|
345 vld1.64 {d0-d1}, [r0,:128]!
|
|
nengel@2
|
346 vaddw.u8 q0, q0, d16
|
|
nengel@2
|
347 vld1.64 {d17}, [r1,:64], r2
|
|
nengel@2
|
348 vld1.64 {d2-d3}, [r0,:128]!
|
|
nengel@2
|
349 vqmovun.s16 d0, q0
|
|
nengel@2
|
350 vld1.64 {d18}, [r1,:64], r2
|
|
nengel@2
|
351 vaddw.u8 q1, q1, d17
|
|
nengel@2
|
352 vld1.64 {d4-d5}, [r0,:128]!
|
|
nengel@2
|
353 vaddw.u8 q2, q2, d18
|
|
nengel@2
|
354 vst1.64 {d0}, [r3,:64], r2
|
|
nengel@2
|
355 vqmovun.s16 d2, q1
|
|
nengel@2
|
356 vld1.64 {d19}, [r1,:64], r2
|
|
nengel@2
|
357 vld1.64 {d6-d7}, [r0,:128]!
|
|
nengel@2
|
358 vaddw.u8 q3, q3, d19
|
|
nengel@2
|
359 vqmovun.s16 d4, q2
|
|
nengel@2
|
360 vst1.64 {d2}, [r3,:64], r2
|
|
nengel@2
|
361 vld1.64 {d16}, [r1,:64], r2
|
|
nengel@2
|
362 vqmovun.s16 d6, q3
|
|
nengel@2
|
363 vld1.64 {d0-d1}, [r0,:128]!
|
|
nengel@2
|
364 vaddw.u8 q0, q0, d16
|
|
nengel@2
|
365 vst1.64 {d4}, [r3,:64], r2
|
|
nengel@2
|
366 vld1.64 {d17}, [r1,:64], r2
|
|
nengel@2
|
367 vld1.64 {d2-d3}, [r0,:128]!
|
|
nengel@2
|
368 vaddw.u8 q1, q1, d17
|
|
nengel@2
|
369 vst1.64 {d6}, [r3,:64], r2
|
|
nengel@2
|
370 vqmovun.s16 d0, q0
|
|
nengel@2
|
371 vld1.64 {d18}, [r1,:64], r2
|
|
nengel@2
|
372 vld1.64 {d4-d5}, [r0,:128]!
|
|
nengel@2
|
373 vaddw.u8 q2, q2, d18
|
|
nengel@2
|
374 vst1.64 {d0}, [r3,:64], r2
|
|
nengel@2
|
375 vqmovun.s16 d2, q1
|
|
nengel@2
|
376 vld1.64 {d19}, [r1,:64], r2
|
|
nengel@2
|
377 vqmovun.s16 d4, q2
|
|
nengel@2
|
378 vld1.64 {d6-d7}, [r0,:128]!
|
|
nengel@2
|
379 vaddw.u8 q3, q3, d19
|
|
nengel@2
|
380 vst1.64 {d2}, [r3,:64], r2
|
|
nengel@2
|
381 vqmovun.s16 d6, q3
|
|
nengel@2
|
382 vst1.64 {d4}, [r3,:64], r2
|
|
nengel@2
|
383 vst1.64 {d6}, [r3,:64], r2
|
|
nengel@2
|
384 bx lr
|
|
nengel@2
|
385 endfunc
|
|
nengel@2
|
386
|
|
nengel@2
|
387 function ff_float_to_int16_neon, export=1
|
|
nengel@2
|
388 subs r2, r2, #8
|
|
nengel@2
|
389 vld1.64 {d0-d1}, [r1,:128]!
|
|
nengel@2
|
390 vcvt.s32.f32 q8, q0, #16
|
|
nengel@2
|
391 vld1.64 {d2-d3}, [r1,:128]!
|
|
nengel@2
|
392 vcvt.s32.f32 q9, q1, #16
|
|
nengel@2
|
393 beq 3f
|
|
nengel@2
|
394 bics ip, r2, #15
|
|
nengel@2
|
395 beq 2f
|
|
nengel@2
|
396 1: subs ip, ip, #16
|
|
nengel@2
|
397 vshrn.s32 d4, q8, #16
|
|
nengel@2
|
398 vld1.64 {d0-d1}, [r1,:128]!
|
|
nengel@2
|
399 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
400 vshrn.s32 d5, q9, #16
|
|
nengel@2
|
401 vld1.64 {d2-d3}, [r1,:128]!
|
|
nengel@2
|
402 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
403 vshrn.s32 d6, q0, #16
|
|
nengel@2
|
404 vst1.64 {d4-d5}, [r0,:128]!
|
|
nengel@2
|
405 vshrn.s32 d7, q1, #16
|
|
nengel@2
|
406 vld1.64 {d16-d17},[r1,:128]!
|
|
nengel@2
|
407 vcvt.s32.f32 q8, q8, #16
|
|
nengel@2
|
408 vld1.64 {d18-d19},[r1,:128]!
|
|
nengel@2
|
409 vcvt.s32.f32 q9, q9, #16
|
|
nengel@2
|
410 vst1.64 {d6-d7}, [r0,:128]!
|
|
nengel@2
|
411 bne 1b
|
|
nengel@2
|
412 ands r2, r2, #15
|
|
nengel@2
|
413 beq 3f
|
|
nengel@2
|
414 2: vld1.64 {d0-d1}, [r1,:128]!
|
|
nengel@2
|
415 vshrn.s32 d4, q8, #16
|
|
nengel@2
|
416 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
417 vld1.64 {d2-d3}, [r1,:128]!
|
|
nengel@2
|
418 vshrn.s32 d5, q9, #16
|
|
nengel@2
|
419 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
420 vshrn.s32 d6, q0, #16
|
|
nengel@2
|
421 vst1.64 {d4-d5}, [r0,:128]!
|
|
nengel@2
|
422 vshrn.s32 d7, q1, #16
|
|
nengel@2
|
423 vst1.64 {d6-d7}, [r0,:128]!
|
|
nengel@2
|
424 bx lr
|
|
nengel@2
|
425 3: vshrn.s32 d4, q8, #16
|
|
nengel@2
|
426 vshrn.s32 d5, q9, #16
|
|
nengel@2
|
427 vst1.64 {d4-d5}, [r0,:128]!
|
|
nengel@2
|
428 bx lr
|
|
nengel@2
|
429 endfunc
|
|
nengel@2
|
430
|
|
nengel@2
|
431 function ff_float_to_int16_interleave_neon, export=1
|
|
nengel@2
|
432 cmp r3, #2
|
|
nengel@2
|
433 ldrlt r1, [r1]
|
|
nengel@2
|
434 blt ff_float_to_int16_neon
|
|
nengel@2
|
435 bne 4f
|
|
nengel@2
|
436
|
|
nengel@2
|
437 ldr r3, [r1]
|
|
nengel@2
|
438 ldr r1, [r1, #4]
|
|
nengel@2
|
439
|
|
nengel@2
|
440 subs r2, r2, #8
|
|
nengel@2
|
441 vld1.64 {d0-d1}, [r3,:128]!
|
|
nengel@2
|
442 vcvt.s32.f32 q8, q0, #16
|
|
nengel@2
|
443 vld1.64 {d2-d3}, [r3,:128]!
|
|
nengel@2
|
444 vcvt.s32.f32 q9, q1, #16
|
|
nengel@2
|
445 vld1.64 {d20-d21},[r1,:128]!
|
|
nengel@2
|
446 vcvt.s32.f32 q10, q10, #16
|
|
nengel@2
|
447 vld1.64 {d22-d23},[r1,:128]!
|
|
nengel@2
|
448 vcvt.s32.f32 q11, q11, #16
|
|
nengel@2
|
449 beq 3f
|
|
nengel@2
|
450 bics ip, r2, #15
|
|
nengel@2
|
451 beq 2f
|
|
nengel@2
|
452 1: subs ip, ip, #16
|
|
nengel@2
|
453 vld1.64 {d0-d1}, [r3,:128]!
|
|
nengel@2
|
454 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
455 vsri.32 q10, q8, #16
|
|
nengel@2
|
456 vld1.64 {d2-d3}, [r3,:128]!
|
|
nengel@2
|
457 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
458 vld1.64 {d24-d25},[r1,:128]!
|
|
nengel@2
|
459 vcvt.s32.f32 q12, q12, #16
|
|
nengel@2
|
460 vld1.64 {d26-d27},[r1,:128]!
|
|
nengel@2
|
461 vsri.32 q11, q9, #16
|
|
nengel@2
|
462 vst1.64 {d20-d21},[r0,:128]!
|
|
nengel@2
|
463 vcvt.s32.f32 q13, q13, #16
|
|
nengel@2
|
464 vst1.64 {d22-d23},[r0,:128]!
|
|
nengel@2
|
465 vsri.32 q12, q0, #16
|
|
nengel@2
|
466 vld1.64 {d16-d17},[r3,:128]!
|
|
nengel@2
|
467 vsri.32 q13, q1, #16
|
|
nengel@2
|
468 vst1.64 {d24-d25},[r0,:128]!
|
|
nengel@2
|
469 vcvt.s32.f32 q8, q8, #16
|
|
nengel@2
|
470 vld1.64 {d18-d19},[r3,:128]!
|
|
nengel@2
|
471 vcvt.s32.f32 q9, q9, #16
|
|
nengel@2
|
472 vld1.64 {d20-d21},[r1,:128]!
|
|
nengel@2
|
473 vcvt.s32.f32 q10, q10, #16
|
|
nengel@2
|
474 vld1.64 {d22-d23},[r1,:128]!
|
|
nengel@2
|
475 vcvt.s32.f32 q11, q11, #16
|
|
nengel@2
|
476 vst1.64 {d26-d27},[r0,:128]!
|
|
nengel@2
|
477 bne 1b
|
|
nengel@2
|
478 ands r2, r2, #15
|
|
nengel@2
|
479 beq 3f
|
|
nengel@2
|
480 2: vsri.32 q10, q8, #16
|
|
nengel@2
|
481 vld1.64 {d0-d1}, [r3,:128]!
|
|
nengel@2
|
482 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
483 vld1.64 {d2-d3}, [r3,:128]!
|
|
nengel@2
|
484 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
485 vld1.64 {d24-d25},[r1,:128]!
|
|
nengel@2
|
486 vcvt.s32.f32 q12, q12, #16
|
|
nengel@2
|
487 vsri.32 q11, q9, #16
|
|
nengel@2
|
488 vld1.64 {d26-d27},[r1,:128]!
|
|
nengel@2
|
489 vcvt.s32.f32 q13, q13, #16
|
|
nengel@2
|
490 vst1.64 {d20-d21},[r0,:128]!
|
|
nengel@2
|
491 vsri.32 q12, q0, #16
|
|
nengel@2
|
492 vst1.64 {d22-d23},[r0,:128]!
|
|
nengel@2
|
493 vsri.32 q13, q1, #16
|
|
nengel@2
|
494 vst1.64 {d24-d27},[r0,:128]!
|
|
nengel@2
|
495 bx lr
|
|
nengel@2
|
496 3: vsri.32 q10, q8, #16
|
|
nengel@2
|
497 vsri.32 q11, q9, #16
|
|
nengel@2
|
498 vst1.64 {d20-d23},[r0,:128]!
|
|
nengel@2
|
499 bx lr
|
|
nengel@2
|
500
|
|
nengel@2
|
501 4: push {r4-r8,lr}
|
|
nengel@2
|
502 cmp r3, #4
|
|
nengel@2
|
503 lsl ip, r3, #1
|
|
nengel@2
|
504 blt 4f
|
|
nengel@2
|
505
|
|
nengel@2
|
506 @ 4 channels
|
|
nengel@2
|
507 5: ldmia r1!, {r4-r7}
|
|
nengel@2
|
508 mov lr, r2
|
|
nengel@2
|
509 mov r8, r0
|
|
nengel@2
|
510 vld1.64 {d16-d17},[r4,:128]!
|
|
nengel@2
|
511 vcvt.s32.f32 q8, q8, #16
|
|
nengel@2
|
512 vld1.64 {d18-d19},[r5,:128]!
|
|
nengel@2
|
513 vcvt.s32.f32 q9, q9, #16
|
|
nengel@2
|
514 vld1.64 {d20-d21},[r6,:128]!
|
|
nengel@2
|
515 vcvt.s32.f32 q10, q10, #16
|
|
nengel@2
|
516 vld1.64 {d22-d23},[r7,:128]!
|
|
nengel@2
|
517 vcvt.s32.f32 q11, q11, #16
|
|
nengel@2
|
518 6: subs lr, lr, #8
|
|
nengel@2
|
519 vld1.64 {d0-d1}, [r4,:128]!
|
|
nengel@2
|
520 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
521 vsri.32 q9, q8, #16
|
|
nengel@2
|
522 vld1.64 {d2-d3}, [r5,:128]!
|
|
nengel@2
|
523 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
524 vsri.32 q11, q10, #16
|
|
nengel@2
|
525 vld1.64 {d4-d5}, [r6,:128]!
|
|
nengel@2
|
526 vcvt.s32.f32 q2, q2, #16
|
|
nengel@2
|
527 vzip.32 d18, d22
|
|
nengel@2
|
528 vld1.64 {d6-d7}, [r7,:128]!
|
|
nengel@2
|
529 vcvt.s32.f32 q3, q3, #16
|
|
nengel@2
|
530 vzip.32 d19, d23
|
|
nengel@2
|
531 vst1.64 {d18}, [r8], ip
|
|
nengel@2
|
532 vsri.32 q1, q0, #16
|
|
nengel@2
|
533 vst1.64 {d22}, [r8], ip
|
|
nengel@2
|
534 vsri.32 q3, q2, #16
|
|
nengel@2
|
535 vst1.64 {d19}, [r8], ip
|
|
nengel@2
|
536 vzip.32 d2, d6
|
|
nengel@2
|
537 vst1.64 {d23}, [r8], ip
|
|
nengel@2
|
538 vzip.32 d3, d7
|
|
nengel@2
|
539 beq 7f
|
|
nengel@2
|
540 vld1.64 {d16-d17},[r4,:128]!
|
|
nengel@2
|
541 vcvt.s32.f32 q8, q8, #16
|
|
nengel@2
|
542 vst1.64 {d2}, [r8], ip
|
|
nengel@2
|
543 vld1.64 {d18-d19},[r5,:128]!
|
|
nengel@2
|
544 vcvt.s32.f32 q9, q9, #16
|
|
nengel@2
|
545 vst1.64 {d6}, [r8], ip
|
|
nengel@2
|
546 vld1.64 {d20-d21},[r6,:128]!
|
|
nengel@2
|
547 vcvt.s32.f32 q10, q10, #16
|
|
nengel@2
|
548 vst1.64 {d3}, [r8], ip
|
|
nengel@2
|
549 vld1.64 {d22-d23},[r7,:128]!
|
|
nengel@2
|
550 vcvt.s32.f32 q11, q11, #16
|
|
nengel@2
|
551 vst1.64 {d7}, [r8], ip
|
|
nengel@2
|
552 b 6b
|
|
nengel@2
|
553 7: vst1.64 {d2}, [r8], ip
|
|
nengel@2
|
554 vst1.64 {d6}, [r8], ip
|
|
nengel@2
|
555 vst1.64 {d3}, [r8], ip
|
|
nengel@2
|
556 vst1.64 {d7}, [r8], ip
|
|
nengel@2
|
557 subs r3, r3, #4
|
|
nengel@2
|
558 popeq {r4-r8,pc}
|
|
nengel@2
|
559 cmp r3, #4
|
|
nengel@2
|
560 add r0, r0, #8
|
|
nengel@2
|
561 bge 5b
|
|
nengel@2
|
562
|
|
nengel@2
|
563 @ 2 channels
|
|
nengel@2
|
564 4: cmp r3, #2
|
|
nengel@2
|
565 blt 4f
|
|
nengel@2
|
566 ldmia r1!, {r4-r5}
|
|
nengel@2
|
567 mov lr, r2
|
|
nengel@2
|
568 mov r8, r0
|
|
nengel@2
|
569 tst lr, #8
|
|
nengel@2
|
570 vld1.64 {d16-d17},[r4,:128]!
|
|
nengel@2
|
571 vcvt.s32.f32 q8, q8, #16
|
|
nengel@2
|
572 vld1.64 {d18-d19},[r5,:128]!
|
|
nengel@2
|
573 vcvt.s32.f32 q9, q9, #16
|
|
nengel@2
|
574 vld1.64 {d20-d21},[r4,:128]!
|
|
nengel@2
|
575 vcvt.s32.f32 q10, q10, #16
|
|
nengel@2
|
576 vld1.64 {d22-d23},[r5,:128]!
|
|
nengel@2
|
577 vcvt.s32.f32 q11, q11, #16
|
|
nengel@2
|
578 beq 6f
|
|
nengel@2
|
579 subs lr, lr, #8
|
|
nengel@2
|
580 beq 7f
|
|
nengel@2
|
581 vsri.32 d18, d16, #16
|
|
nengel@2
|
582 vsri.32 d19, d17, #16
|
|
nengel@2
|
583 vld1.64 {d16-d17},[r4,:128]!
|
|
nengel@2
|
584 vcvt.s32.f32 q8, q8, #16
|
|
nengel@2
|
585 vst1.32 {d18[0]}, [r8], ip
|
|
nengel@2
|
586 vsri.32 d22, d20, #16
|
|
nengel@2
|
587 vst1.32 {d18[1]}, [r8], ip
|
|
nengel@2
|
588 vsri.32 d23, d21, #16
|
|
nengel@2
|
589 vst1.32 {d19[0]}, [r8], ip
|
|
nengel@2
|
590 vst1.32 {d19[1]}, [r8], ip
|
|
nengel@2
|
591 vld1.64 {d18-d19},[r5,:128]!
|
|
nengel@2
|
592 vcvt.s32.f32 q9, q9, #16
|
|
nengel@2
|
593 vst1.32 {d22[0]}, [r8], ip
|
|
nengel@2
|
594 vst1.32 {d22[1]}, [r8], ip
|
|
nengel@2
|
595 vld1.64 {d20-d21},[r4,:128]!
|
|
nengel@2
|
596 vcvt.s32.f32 q10, q10, #16
|
|
nengel@2
|
597 vst1.32 {d23[0]}, [r8], ip
|
|
nengel@2
|
598 vst1.32 {d23[1]}, [r8], ip
|
|
nengel@2
|
599 vld1.64 {d22-d23},[r5,:128]!
|
|
nengel@2
|
600 vcvt.s32.f32 q11, q11, #16
|
|
nengel@2
|
601 6: subs lr, lr, #16
|
|
nengel@2
|
602 vld1.64 {d0-d1}, [r4,:128]!
|
|
nengel@2
|
603 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
604 vsri.32 d18, d16, #16
|
|
nengel@2
|
605 vld1.64 {d2-d3}, [r5,:128]!
|
|
nengel@2
|
606 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
607 vsri.32 d19, d17, #16
|
|
nengel@2
|
608 vld1.64 {d4-d5}, [r4,:128]!
|
|
nengel@2
|
609 vcvt.s32.f32 q2, q2, #16
|
|
nengel@2
|
610 vld1.64 {d6-d7}, [r5,:128]!
|
|
nengel@2
|
611 vcvt.s32.f32 q3, q3, #16
|
|
nengel@2
|
612 vst1.32 {d18[0]}, [r8], ip
|
|
nengel@2
|
613 vsri.32 d22, d20, #16
|
|
nengel@2
|
614 vst1.32 {d18[1]}, [r8], ip
|
|
nengel@2
|
615 vsri.32 d23, d21, #16
|
|
nengel@2
|
616 vst1.32 {d19[0]}, [r8], ip
|
|
nengel@2
|
617 vsri.32 d2, d0, #16
|
|
nengel@2
|
618 vst1.32 {d19[1]}, [r8], ip
|
|
nengel@2
|
619 vsri.32 d3, d1, #16
|
|
nengel@2
|
620 vst1.32 {d22[0]}, [r8], ip
|
|
nengel@2
|
621 vsri.32 d6, d4, #16
|
|
nengel@2
|
622 vst1.32 {d22[1]}, [r8], ip
|
|
nengel@2
|
623 vsri.32 d7, d5, #16
|
|
nengel@2
|
624 vst1.32 {d23[0]}, [r8], ip
|
|
nengel@2
|
625 vst1.32 {d23[1]}, [r8], ip
|
|
nengel@2
|
626 beq 6f
|
|
nengel@2
|
627 vld1.64 {d16-d17},[r4,:128]!
|
|
nengel@2
|
628 vcvt.s32.f32 q8, q8, #16
|
|
nengel@2
|
629 vst1.32 {d2[0]}, [r8], ip
|
|
nengel@2
|
630 vst1.32 {d2[1]}, [r8], ip
|
|
nengel@2
|
631 vld1.64 {d18-d19},[r5,:128]!
|
|
nengel@2
|
632 vcvt.s32.f32 q9, q9, #16
|
|
nengel@2
|
633 vst1.32 {d3[0]}, [r8], ip
|
|
nengel@2
|
634 vst1.32 {d3[1]}, [r8], ip
|
|
nengel@2
|
635 vld1.64 {d20-d21},[r4,:128]!
|
|
nengel@2
|
636 vcvt.s32.f32 q10, q10, #16
|
|
nengel@2
|
637 vst1.32 {d6[0]}, [r8], ip
|
|
nengel@2
|
638 vst1.32 {d6[1]}, [r8], ip
|
|
nengel@2
|
639 vld1.64 {d22-d23},[r5,:128]!
|
|
nengel@2
|
640 vcvt.s32.f32 q11, q11, #16
|
|
nengel@2
|
641 vst1.32 {d7[0]}, [r8], ip
|
|
nengel@2
|
642 vst1.32 {d7[1]}, [r8], ip
|
|
nengel@2
|
643 bgt 6b
|
|
nengel@2
|
644 6: vst1.32 {d2[0]}, [r8], ip
|
|
nengel@2
|
645 vst1.32 {d2[1]}, [r8], ip
|
|
nengel@2
|
646 vst1.32 {d3[0]}, [r8], ip
|
|
nengel@2
|
647 vst1.32 {d3[1]}, [r8], ip
|
|
nengel@2
|
648 vst1.32 {d6[0]}, [r8], ip
|
|
nengel@2
|
649 vst1.32 {d6[1]}, [r8], ip
|
|
nengel@2
|
650 vst1.32 {d7[0]}, [r8], ip
|
|
nengel@2
|
651 vst1.32 {d7[1]}, [r8], ip
|
|
nengel@2
|
652 b 8f
|
|
nengel@2
|
653 7: vsri.32 d18, d16, #16
|
|
nengel@2
|
654 vsri.32 d19, d17, #16
|
|
nengel@2
|
655 vst1.32 {d18[0]}, [r8], ip
|
|
nengel@2
|
656 vsri.32 d22, d20, #16
|
|
nengel@2
|
657 vst1.32 {d18[1]}, [r8], ip
|
|
nengel@2
|
658 vsri.32 d23, d21, #16
|
|
nengel@2
|
659 vst1.32 {d19[0]}, [r8], ip
|
|
nengel@2
|
660 vst1.32 {d19[1]}, [r8], ip
|
|
nengel@2
|
661 vst1.32 {d22[0]}, [r8], ip
|
|
nengel@2
|
662 vst1.32 {d22[1]}, [r8], ip
|
|
nengel@2
|
663 vst1.32 {d23[0]}, [r8], ip
|
|
nengel@2
|
664 vst1.32 {d23[1]}, [r8], ip
|
|
nengel@2
|
665 8: subs r3, r3, #2
|
|
nengel@2
|
666 add r0, r0, #4
|
|
nengel@2
|
667 popeq {r4-r8,pc}
|
|
nengel@2
|
668
|
|
nengel@2
|
669 @ 1 channel
|
|
nengel@2
|
670 4: ldr r4, [r1],#4
|
|
nengel@2
|
671 tst r2, #8
|
|
nengel@2
|
672 mov lr, r2
|
|
nengel@2
|
673 mov r5, r0
|
|
nengel@2
|
674 vld1.64 {d0-d1}, [r4,:128]!
|
|
nengel@2
|
675 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
676 vld1.64 {d2-d3}, [r4,:128]!
|
|
nengel@2
|
677 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
678 bne 8f
|
|
nengel@2
|
679 6: subs lr, lr, #16
|
|
nengel@2
|
680 vld1.64 {d4-d5}, [r4,:128]!
|
|
nengel@2
|
681 vcvt.s32.f32 q2, q2, #16
|
|
nengel@2
|
682 vld1.64 {d6-d7}, [r4,:128]!
|
|
nengel@2
|
683 vcvt.s32.f32 q3, q3, #16
|
|
nengel@2
|
684 vst1.16 {d0[1]}, [r5,:16], ip
|
|
nengel@2
|
685 vst1.16 {d0[3]}, [r5,:16], ip
|
|
nengel@2
|
686 vst1.16 {d1[1]}, [r5,:16], ip
|
|
nengel@2
|
687 vst1.16 {d1[3]}, [r5,:16], ip
|
|
nengel@2
|
688 vst1.16 {d2[1]}, [r5,:16], ip
|
|
nengel@2
|
689 vst1.16 {d2[3]}, [r5,:16], ip
|
|
nengel@2
|
690 vst1.16 {d3[1]}, [r5,:16], ip
|
|
nengel@2
|
691 vst1.16 {d3[3]}, [r5,:16], ip
|
|
nengel@2
|
692 beq 7f
|
|
nengel@2
|
693 vld1.64 {d0-d1}, [r4,:128]!
|
|
nengel@2
|
694 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
695 vld1.64 {d2-d3}, [r4,:128]!
|
|
nengel@2
|
696 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
697 7: vst1.16 {d4[1]}, [r5,:16], ip
|
|
nengel@2
|
698 vst1.16 {d4[3]}, [r5,:16], ip
|
|
nengel@2
|
699 vst1.16 {d5[1]}, [r5,:16], ip
|
|
nengel@2
|
700 vst1.16 {d5[3]}, [r5,:16], ip
|
|
nengel@2
|
701 vst1.16 {d6[1]}, [r5,:16], ip
|
|
nengel@2
|
702 vst1.16 {d6[3]}, [r5,:16], ip
|
|
nengel@2
|
703 vst1.16 {d7[1]}, [r5,:16], ip
|
|
nengel@2
|
704 vst1.16 {d7[3]}, [r5,:16], ip
|
|
nengel@2
|
705 bgt 6b
|
|
nengel@2
|
706 pop {r4-r8,pc}
|
|
nengel@2
|
707 8: subs lr, lr, #8
|
|
nengel@2
|
708 vst1.16 {d0[1]}, [r5,:16], ip
|
|
nengel@2
|
709 vst1.16 {d0[3]}, [r5,:16], ip
|
|
nengel@2
|
710 vst1.16 {d1[1]}, [r5,:16], ip
|
|
nengel@2
|
711 vst1.16 {d1[3]}, [r5,:16], ip
|
|
nengel@2
|
712 vst1.16 {d2[1]}, [r5,:16], ip
|
|
nengel@2
|
713 vst1.16 {d2[3]}, [r5,:16], ip
|
|
nengel@2
|
714 vst1.16 {d3[1]}, [r5,:16], ip
|
|
nengel@2
|
715 vst1.16 {d3[3]}, [r5,:16], ip
|
|
nengel@2
|
716 popeq {r4-r8,pc}
|
|
nengel@2
|
717 vld1.64 {d0-d1}, [r4,:128]!
|
|
nengel@2
|
718 vcvt.s32.f32 q0, q0, #16
|
|
nengel@2
|
719 vld1.64 {d2-d3}, [r4,:128]!
|
|
nengel@2
|
720 vcvt.s32.f32 q1, q1, #16
|
|
nengel@2
|
721 b 6b
|
|
nengel@2
|
722 endfunc
|
|
nengel@2
|
723
|
|
nengel@2
|
724 function ff_vector_fmul_neon, export=1
|
|
nengel@2
|
725 mov r3, r0
|
|
nengel@2
|
726 subs r2, r2, #8
|
|
nengel@2
|
727 vld1.64 {d0-d3}, [r0,:128]!
|
|
nengel@2
|
728 vld1.64 {d4-d7}, [r1,:128]!
|
|
nengel@2
|
729 vmul.f32 q8, q0, q2
|
|
nengel@2
|
730 vmul.f32 q9, q1, q3
|
|
nengel@2
|
731 beq 3f
|
|
nengel@2
|
732 bics ip, r2, #15
|
|
nengel@2
|
733 beq 2f
|
|
nengel@2
|
734 1: subs ip, ip, #16
|
|
nengel@2
|
735 vld1.64 {d0-d1}, [r0,:128]!
|
|
nengel@2
|
736 vld1.64 {d4-d5}, [r1,:128]!
|
|
nengel@2
|
737 vmul.f32 q10, q0, q2
|
|
nengel@2
|
738 vld1.64 {d2-d3}, [r0,:128]!
|
|
nengel@2
|
739 vld1.64 {d6-d7}, [r1,:128]!
|
|
nengel@2
|
740 vmul.f32 q11, q1, q3
|
|
nengel@2
|
741 vst1.64 {d16-d19},[r3,:128]!
|
|
nengel@2
|
742 vld1.64 {d0-d1}, [r0,:128]!
|
|
nengel@2
|
743 vld1.64 {d4-d5}, [r1,:128]!
|
|
nengel@2
|
744 vmul.f32 q8, q0, q2
|
|
nengel@2
|
745 vld1.64 {d2-d3}, [r0,:128]!
|
|
nengel@2
|
746 vld1.64 {d6-d7}, [r1,:128]!
|
|
nengel@2
|
747 vmul.f32 q9, q1, q3
|
|
nengel@2
|
748 vst1.64 {d20-d23},[r3,:128]!
|
|
nengel@2
|
749 bne 1b
|
|
nengel@2
|
750 ands r2, r2, #15
|
|
nengel@2
|
751 beq 3f
|
|
nengel@2
|
752 2: vld1.64 {d0-d1}, [r0,:128]!
|
|
nengel@2
|
753 vld1.64 {d4-d5}, [r1,:128]!
|
|
nengel@2
|
754 vst1.64 {d16-d17},[r3,:128]!
|
|
nengel@2
|
755 vmul.f32 q8, q0, q2
|
|
nengel@2
|
756 vld1.64 {d2-d3}, [r0,:128]!
|
|
nengel@2
|
757 vld1.64 {d6-d7}, [r1,:128]!
|
|
nengel@2
|
758 vst1.64 {d18-d19},[r3,:128]!
|
|
nengel@2
|
759 vmul.f32 q9, q1, q3
|
|
nengel@2
|
760 3: vst1.64 {d16-d19},[r3,:128]!
|
|
nengel@2
|
761 bx lr
|
|
nengel@2
|
762 endfunc
|
|
nengel@2
|
763
|
|
nengel@2
|
764 function ff_vector_fmul_window_neon, export=1
|
|
nengel@2
|
765 VFP vdup.32 q8, d0[0]
|
|
nengel@2
|
766 NOVFP vld1.32 {d16[],d17[]}, [sp,:32]
|
|
nengel@2
|
767 push {r4,r5,lr}
|
|
nengel@2
|
768 VFP ldr lr, [sp, #12]
|
|
nengel@2
|
769 NOVFP ldr lr, [sp, #16]
|
|
nengel@2
|
770 sub r2, r2, #8
|
|
nengel@2
|
771 sub r5, lr, #2
|
|
nengel@2
|
772 add r2, r2, r5, lsl #2
|
|
nengel@2
|
773 add r4, r3, r5, lsl #3
|
|
nengel@2
|
774 add ip, r0, r5, lsl #3
|
|
nengel@2
|
775 mov r5, #-16
|
|
nengel@2
|
776 vld1.64 {d0,d1}, [r1,:128]!
|
|
nengel@2
|
777 vld1.64 {d2,d3}, [r2,:128], r5
|
|
nengel@2
|
778 vld1.64 {d4,d5}, [r3,:128]!
|
|
nengel@2
|
779 vld1.64 {d6,d7}, [r4,:128], r5
|
|
nengel@2
|
780 1: subs lr, lr, #4
|
|
nengel@2
|
781 vmov q11, q8
|
|
nengel@2
|
782 vmla.f32 d22, d0, d4
|
|
nengel@2
|
783 vmov q10, q8
|
|
nengel@2
|
784 vmla.f32 d23, d1, d5
|
|
nengel@2
|
785 vrev64.32 q3, q3
|
|
nengel@2
|
786 vmla.f32 d20, d0, d7
|
|
nengel@2
|
787 vrev64.32 q1, q1
|
|
nengel@2
|
788 vmla.f32 d21, d1, d6
|
|
nengel@2
|
789 beq 2f
|
|
nengel@2
|
790 vmla.f32 d22, d3, d7
|
|
nengel@2
|
791 vld1.64 {d0,d1}, [r1,:128]!
|
|
nengel@2
|
792 vmla.f32 d23, d2, d6
|
|
nengel@2
|
793 vld1.64 {d18,d19},[r2,:128], r5
|
|
nengel@2
|
794 vmls.f32 d20, d3, d4
|
|
nengel@2
|
795 vld1.64 {d24,d25},[r3,:128]!
|
|
nengel@2
|
796 vmls.f32 d21, d2, d5
|
|
nengel@2
|
797 vld1.64 {d6,d7}, [r4,:128], r5
|
|
nengel@2
|
798 vmov q1, q9
|
|
nengel@2
|
799 vrev64.32 q11, q11
|
|
nengel@2
|
800 vmov q2, q12
|
|
nengel@2
|
801 vswp d22, d23
|
|
nengel@2
|
802 vst1.64 {d20,d21},[r0,:128]!
|
|
nengel@2
|
803 vst1.64 {d22,d23},[ip,:128], r5
|
|
nengel@2
|
804 b 1b
|
|
nengel@2
|
805 2: vmla.f32 d22, d3, d7
|
|
nengel@2
|
806 vmla.f32 d23, d2, d6
|
|
nengel@2
|
807 vmls.f32 d20, d3, d4
|
|
nengel@2
|
808 vmls.f32 d21, d2, d5
|
|
nengel@2
|
809 vrev64.32 q11, q11
|
|
nengel@2
|
810 vswp d22, d23
|
|
nengel@2
|
811 vst1.64 {d20,d21},[r0,:128]!
|
|
nengel@2
|
812 vst1.64 {d22,d23},[ip,:128], r5
|
|
nengel@2
|
813 pop {r4,r5,pc}
|
|
nengel@2
|
814 endfunc
|
|
nengel@2
|
815
|
|
nengel@2
|
816 #if CONFIG_VORBIS_DECODER
|
|
nengel@2
|
817 function ff_vorbis_inverse_coupling_neon, export=1
|
|
nengel@2
|
818 vmov.i32 q10, #1<<31
|
|
nengel@2
|
819 subs r2, r2, #4
|
|
nengel@2
|
820 mov r3, r0
|
|
nengel@2
|
821 mov r12, r1
|
|
nengel@2
|
822 beq 3f
|
|
nengel@2
|
823
|
|
nengel@2
|
824 vld1.32 {d24-d25},[r1,:128]!
|
|
nengel@2
|
825 vld1.32 {d22-d23},[r0,:128]!
|
|
nengel@2
|
826 vcle.s32 q8, q12, #0
|
|
nengel@2
|
827 vand q9, q11, q10
|
|
nengel@2
|
828 veor q12, q12, q9
|
|
nengel@2
|
829 vand q2, q12, q8
|
|
nengel@2
|
830 vbic q3, q12, q8
|
|
nengel@2
|
831 vadd.f32 q12, q11, q2
|
|
nengel@2
|
832 vsub.f32 q11, q11, q3
|
|
nengel@2
|
833 1: vld1.32 {d2-d3}, [r1,:128]!
|
|
nengel@2
|
834 vld1.32 {d0-d1}, [r0,:128]!
|
|
nengel@2
|
835 vcle.s32 q8, q1, #0
|
|
nengel@2
|
836 vand q9, q0, q10
|
|
nengel@2
|
837 veor q1, q1, q9
|
|
nengel@2
|
838 vst1.32 {d24-d25},[r3, :128]!
|
|
nengel@2
|
839 vst1.32 {d22-d23},[r12,:128]!
|
|
nengel@2
|
840 vand q2, q1, q8
|
|
nengel@2
|
841 vbic q3, q1, q8
|
|
nengel@2
|
842 vadd.f32 q1, q0, q2
|
|
nengel@2
|
843 vsub.f32 q0, q0, q3
|
|
nengel@2
|
844 subs r2, r2, #8
|
|
nengel@2
|
845 ble 2f
|
|
nengel@2
|
846 vld1.32 {d24-d25},[r1,:128]!
|
|
nengel@2
|
847 vld1.32 {d22-d23},[r0,:128]!
|
|
nengel@2
|
848 vcle.s32 q8, q12, #0
|
|
nengel@2
|
849 vand q9, q11, q10
|
|
nengel@2
|
850 veor q12, q12, q9
|
|
nengel@2
|
851 vst1.32 {d2-d3}, [r3, :128]!
|
|
nengel@2
|
852 vst1.32 {d0-d1}, [r12,:128]!
|
|
nengel@2
|
853 vand q2, q12, q8
|
|
nengel@2
|
854 vbic q3, q12, q8
|
|
nengel@2
|
855 vadd.f32 q12, q11, q2
|
|
nengel@2
|
856 vsub.f32 q11, q11, q3
|
|
nengel@2
|
857 b 1b
|
|
nengel@2
|
858
|
|
nengel@2
|
859 2: vst1.32 {d2-d3}, [r3, :128]!
|
|
nengel@2
|
860 vst1.32 {d0-d1}, [r12,:128]!
|
|
nengel@2
|
861 bxlt lr
|
|
nengel@2
|
862
|
|
nengel@2
|
863 3: vld1.32 {d2-d3}, [r1,:128]
|
|
nengel@2
|
864 vld1.32 {d0-d1}, [r0,:128]
|
|
nengel@2
|
865 vcle.s32 q8, q1, #0
|
|
nengel@2
|
866 vand q9, q0, q10
|
|
nengel@2
|
867 veor q1, q1, q9
|
|
nengel@2
|
868 vand q2, q1, q8
|
|
nengel@2
|
869 vbic q3, q1, q8
|
|
nengel@2
|
870 vadd.f32 q1, q0, q2
|
|
nengel@2
|
871 vsub.f32 q0, q0, q3
|
|
nengel@2
|
872 vst1.32 {d2-d3}, [r0,:128]!
|
|
nengel@2
|
873 vst1.32 {d0-d1}, [r1,:128]!
|
|
nengel@2
|
874 bx lr
|
|
nengel@2
|
875 endfunc
|
|
nengel@2
|
876 #endif
|
|
nengel@2
|
877
|
|
nengel@2
|
878 function ff_vector_fmul_scalar_neon, export=1
|
|
nengel@2
|
879 VFP len .req r2
|
|
nengel@2
|
880 NOVFP len .req r3
|
|
nengel@2
|
881 VFP vdup.32 q8, d0[0]
|
|
nengel@2
|
882 NOVFP vdup.32 q8, r2
|
|
nengel@2
|
883 bics r12, len, #15
|
|
nengel@2
|
884 beq 3f
|
|
nengel@2
|
885 vld1.32 {q0},[r1,:128]!
|
|
nengel@2
|
886 vld1.32 {q1},[r1,:128]!
|
|
nengel@2
|
887 1: vmul.f32 q0, q0, q8
|
|
nengel@2
|
888 vld1.32 {q2},[r1,:128]!
|
|
nengel@2
|
889 vmul.f32 q1, q1, q8
|
|
nengel@2
|
890 vld1.32 {q3},[r1,:128]!
|
|
nengel@2
|
891 vmul.f32 q2, q2, q8
|
|
nengel@2
|
892 vst1.32 {q0},[r0,:128]!
|
|
nengel@2
|
893 vmul.f32 q3, q3, q8
|
|
nengel@2
|
894 vst1.32 {q1},[r0,:128]!
|
|
nengel@2
|
895 subs r12, r12, #16
|
|
nengel@2
|
896 beq 2f
|
|
nengel@2
|
897 vld1.32 {q0},[r1,:128]!
|
|
nengel@2
|
898 vst1.32 {q2},[r0,:128]!
|
|
nengel@2
|
899 vld1.32 {q1},[r1,:128]!
|
|
nengel@2
|
900 vst1.32 {q3},[r0,:128]!
|
|
nengel@2
|
901 b 1b
|
|
nengel@2
|
902 2: vst1.32 {q2},[r0,:128]!
|
|
nengel@2
|
903 vst1.32 {q3},[r0,:128]!
|
|
nengel@2
|
904 ands len, len, #15
|
|
nengel@2
|
905 bxeq lr
|
|
nengel@2
|
906 3: vld1.32 {q0},[r1,:128]!
|
|
nengel@2
|
907 vmul.f32 q0, q0, q8
|
|
nengel@2
|
908 vst1.32 {q0},[r0,:128]!
|
|
nengel@2
|
909 subs len, len, #4
|
|
nengel@2
|
910 bgt 3b
|
|
nengel@2
|
911 bx lr
|
|
nengel@2
|
912 .unreq len
|
|
nengel@2
|
913 endfunc
|
|
nengel@2
|
914
|
|
nengel@2
|
915 function ff_vector_fmul_sv_scalar_2_neon, export=1
|
|
nengel@2
|
916 VFP vdup.32 d16, d0[0]
|
|
nengel@2
|
917 NOVFP vdup.32 d16, r3
|
|
nengel@2
|
918 NOVFP ldr r3, [sp]
|
|
nengel@2
|
919 vld1.32 {d0},[r1,:64]!
|
|
nengel@2
|
920 vld1.32 {d1},[r1,:64]!
|
|
nengel@2
|
921 1: subs r3, r3, #4
|
|
nengel@2
|
922 vmul.f32 d4, d0, d16
|
|
nengel@2
|
923 vmul.f32 d5, d1, d16
|
|
nengel@2
|
924 ldr r12, [r2], #4
|
|
nengel@2
|
925 vld1.32 {d2},[r12,:64]
|
|
nengel@2
|
926 ldr r12, [r2], #4
|
|
nengel@2
|
927 vld1.32 {d3},[r12,:64]
|
|
nengel@2
|
928 vmul.f32 d4, d4, d2
|
|
nengel@2
|
929 vmul.f32 d5, d5, d3
|
|
nengel@2
|
930 beq 2f
|
|
nengel@2
|
931 vld1.32 {d0},[r1,:64]!
|
|
nengel@2
|
932 vld1.32 {d1},[r1,:64]!
|
|
nengel@2
|
933 vst1.32 {d4},[r0,:64]!
|
|
nengel@2
|
934 vst1.32 {d5},[r0,:64]!
|
|
nengel@2
|
935 b 1b
|
|
nengel@2
|
936 2: vst1.32 {d4},[r0,:64]!
|
|
nengel@2
|
937 vst1.32 {d5},[r0,:64]!
|
|
nengel@2
|
938 bx lr
|
|
nengel@2
|
939 endfunc
|
|
nengel@2
|
940
|
|
nengel@2
|
941 function ff_vector_fmul_sv_scalar_4_neon, export=1
|
|
nengel@2
|
942 VFP vdup.32 q10, d0[0]
|
|
nengel@2
|
943 NOVFP vdup.32 q10, r3
|
|
nengel@2
|
944 NOVFP ldr r3, [sp]
|
|
nengel@2
|
945 push {lr}
|
|
nengel@2
|
946 bics lr, r3, #7
|
|
nengel@2
|
947 beq 3f
|
|
nengel@2
|
948 vld1.32 {q0},[r1,:128]!
|
|
nengel@2
|
949 vld1.32 {q2},[r1,:128]!
|
|
nengel@2
|
950 1: ldr r12, [r2], #4
|
|
nengel@2
|
951 vld1.32 {q1},[r12,:128]
|
|
nengel@2
|
952 ldr r12, [r2], #4
|
|
nengel@2
|
953 vld1.32 {q3},[r12,:128]
|
|
nengel@2
|
954 vmul.f32 q8, q0, q10
|
|
nengel@2
|
955 vmul.f32 q8, q8, q1
|
|
nengel@2
|
956 vmul.f32 q9, q2, q10
|
|
nengel@2
|
957 vmul.f32 q9, q9, q3
|
|
nengel@2
|
958 subs lr, lr, #8
|
|
nengel@2
|
959 beq 2f
|
|
nengel@2
|
960 vld1.32 {q0},[r1,:128]!
|
|
nengel@2
|
961 vld1.32 {q2},[r1,:128]!
|
|
nengel@2
|
962 vst1.32 {q8},[r0,:128]!
|
|
nengel@2
|
963 vst1.32 {q9},[r0,:128]!
|
|
nengel@2
|
964 b 1b
|
|
nengel@2
|
965 2: vst1.32 {q8},[r0,:128]!
|
|
nengel@2
|
966 vst1.32 {q9},[r0,:128]!
|
|
nengel@2
|
967 ands r3, r3, #7
|
|
nengel@2
|
968 popeq {pc}
|
|
nengel@2
|
969 3: vld1.32 {q0},[r1,:128]!
|
|
nengel@2
|
970 ldr r12, [r2], #4
|
|
nengel@2
|
971 vld1.32 {q1},[r12,:128]
|
|
nengel@2
|
972 vmul.f32 q0, q0, q10
|
|
nengel@2
|
973 vmul.f32 q0, q0, q1
|
|
nengel@2
|
974 vst1.32 {q0},[r0,:128]!
|
|
nengel@2
|
975 subs r3, r3, #4
|
|
nengel@2
|
976 bgt 3b
|
|
nengel@2
|
977 pop {pc}
|
|
nengel@2
|
978 endfunc
|
|
nengel@2
|
979
|
|
nengel@2
|
980 function ff_sv_fmul_scalar_2_neon, export=1
|
|
nengel@2
|
981 VFP len .req r2
|
|
nengel@2
|
982 NOVFP len .req r3
|
|
nengel@2
|
983 VFP vdup.32 q8, d0[0]
|
|
nengel@2
|
984 NOVFP vdup.32 q8, r2
|
|
nengel@2
|
985 ldr r12, [r1], #4
|
|
nengel@2
|
986 vld1.32 {d0},[r12,:64]
|
|
nengel@2
|
987 ldr r12, [r1], #4
|
|
nengel@2
|
988 vld1.32 {d1},[r12,:64]
|
|
nengel@2
|
989 1: vmul.f32 q1, q0, q8
|
|
nengel@2
|
990 subs len, len, #4
|
|
nengel@2
|
991 beq 2f
|
|
nengel@2
|
992 ldr r12, [r1], #4
|
|
nengel@2
|
993 vld1.32 {d0},[r12,:64]
|
|
nengel@2
|
994 ldr r12, [r1], #4
|
|
nengel@2
|
995 vld1.32 {d1},[r12,:64]
|
|
nengel@2
|
996 vst1.32 {q1},[r0,:128]!
|
|
nengel@2
|
997 b 1b
|
|
nengel@2
|
998 2: vst1.32 {q1},[r0,:128]!
|
|
nengel@2
|
999 bx lr
|
|
nengel@2
|
1000 .unreq len
|
|
nengel@2
|
1001 endfunc
|
|
nengel@2
|
1002
|
|
nengel@2
|
1003 function ff_sv_fmul_scalar_4_neon, export=1
|
|
nengel@2
|
1004 VFP len .req r2
|
|
nengel@2
|
1005 NOVFP len .req r3
|
|
nengel@2
|
1006 VFP vdup.32 q8, d0[0]
|
|
nengel@2
|
1007 NOVFP vdup.32 q8, r2
|
|
nengel@2
|
1008 1: ldr r12, [r1], #4
|
|
nengel@2
|
1009 vld1.32 {q0},[r12,:128]
|
|
nengel@2
|
1010 vmul.f32 q0, q0, q8
|
|
nengel@2
|
1011 vst1.32 {q0},[r0,:128]!
|
|
nengel@2
|
1012 subs len, len, #4
|
|
nengel@2
|
1013 bgt 1b
|
|
nengel@2
|
1014 bx lr
|
|
nengel@2
|
1015 .unreq len
|
|
nengel@2
|
1016 endfunc
|
|
nengel@2
|
1017
|
|
nengel@2
|
1018 function ff_butterflies_float_neon, export=1
|
|
nengel@2
|
1019 1: vld1.32 {q0},[r0,:128]
|
|
nengel@2
|
1020 vld1.32 {q1},[r1,:128]
|
|
nengel@2
|
1021 vsub.f32 q2, q0, q1
|
|
nengel@2
|
1022 vadd.f32 q1, q0, q1
|
|
nengel@2
|
1023 vst1.32 {q2},[r1,:128]!
|
|
nengel@2
|
1024 vst1.32 {q1},[r0,:128]!
|
|
nengel@2
|
1025 subs r2, r2, #4
|
|
nengel@2
|
1026 bgt 1b
|
|
nengel@2
|
1027 bx lr
|
|
nengel@2
|
1028 endfunc
|
|
nengel@2
|
1029
|
|
nengel@2
|
1030 function ff_scalarproduct_float_neon, export=1
|
|
nengel@2
|
1031 vmov.f32 q2, #0.0
|
|
nengel@2
|
1032 1: vld1.32 {q0},[r0,:128]!
|
|
nengel@2
|
1033 vld1.32 {q1},[r1,:128]!
|
|
nengel@2
|
1034 vmla.f32 q2, q0, q1
|
|
nengel@2
|
1035 subs r2, r2, #4
|
|
nengel@2
|
1036 bgt 1b
|
|
nengel@2
|
1037 vadd.f32 d0, d4, d5
|
|
nengel@2
|
1038 vpadd.f32 d0, d0, d0
|
|
nengel@2
|
1039 NOVFP vmov.32 r0, d0[0]
|
|
nengel@2
|
1040 bx lr
|
|
nengel@2
|
1041 endfunc
|
|
nengel@2
|
1042
|
|
nengel@2
|
1043 function ff_int32_to_float_fmul_scalar_neon, export=1
|
|
nengel@2
|
1044 VFP vdup.32 q0, d0[0]
|
|
nengel@2
|
1045 VFP len .req r2
|
|
nengel@2
|
1046 NOVFP vdup.32 q0, r2
|
|
nengel@2
|
1047 NOVFP len .req r3
|
|
nengel@2
|
1048
|
|
nengel@2
|
1049 vld1.32 {q1},[r1,:128]!
|
|
nengel@2
|
1050 vcvt.f32.s32 q3, q1
|
|
nengel@2
|
1051 vld1.32 {q2},[r1,:128]!
|
|
nengel@2
|
1052 vcvt.f32.s32 q8, q2
|
|
nengel@2
|
1053 1: subs len, len, #8
|
|
nengel@2
|
1054 pld [r1, #16]
|
|
nengel@2
|
1055 vmul.f32 q9, q3, q0
|
|
nengel@2
|
1056 vmul.f32 q10, q8, q0
|
|
nengel@2
|
1057 beq 2f
|
|
nengel@2
|
1058 vld1.32 {q1},[r1,:128]!
|
|
nengel@2
|
1059 vcvt.f32.s32 q3, q1
|
|
nengel@2
|
1060 vld1.32 {q2},[r1,:128]!
|
|
nengel@2
|
1061 vcvt.f32.s32 q8, q2
|
|
nengel@2
|
1062 vst1.32 {q9}, [r0,:128]!
|
|
nengel@2
|
1063 vst1.32 {q10},[r0,:128]!
|
|
nengel@2
|
1064 b 1b
|
|
nengel@2
|
1065 2: vst1.32 {q9}, [r0,:128]!
|
|
nengel@2
|
1066 vst1.32 {q10},[r0,:128]!
|
|
nengel@2
|
1067 bx lr
|
|
nengel@2
|
1068 .unreq len
|
|
nengel@2
|
1069 endfunc
|
|
nengel@2
|
1070
|
|
nengel@2
|
1071 function ff_vector_fmul_reverse_neon, export=1
|
|
nengel@2
|
1072 add r2, r2, r3, lsl #2
|
|
nengel@2
|
1073 sub r2, r2, #32
|
|
nengel@2
|
1074 mov r12, #-32
|
|
nengel@2
|
1075 vld1.32 {q0-q1}, [r1,:128]!
|
|
nengel@2
|
1076 vld1.32 {q2-q3}, [r2,:128], r12
|
|
nengel@2
|
1077 1: pld [r1, #32]
|
|
nengel@2
|
1078 vrev64.32 q3, q3
|
|
nengel@2
|
1079 vmul.f32 d16, d0, d7
|
|
nengel@2
|
1080 vmul.f32 d17, d1, d6
|
|
nengel@2
|
1081 pld [r2, #-32]
|
|
nengel@2
|
1082 vrev64.32 q2, q2
|
|
nengel@2
|
1083 vmul.f32 d18, d2, d5
|
|
nengel@2
|
1084 vmul.f32 d19, d3, d4
|
|
nengel@2
|
1085 subs r3, r3, #8
|
|
nengel@2
|
1086 beq 2f
|
|
nengel@2
|
1087 vld1.32 {q0-q1}, [r1,:128]!
|
|
nengel@2
|
1088 vld1.32 {q2-q3}, [r2,:128], r12
|
|
nengel@2
|
1089 vst1.32 {q8-q9}, [r0,:128]!
|
|
nengel@2
|
1090 b 1b
|
|
nengel@2
|
1091 2: vst1.32 {q8-q9}, [r0,:128]!
|
|
nengel@2
|
1092 bx lr
|
|
nengel@2
|
1093 endfunc
|
|
nengel@2
|
1094
|
|
nengel@2
|
1095 function ff_vector_fmul_add_neon, export=1
|
|
nengel@2
|
1096 ldr r12, [sp]
|
|
nengel@2
|
1097 vld1.32 {q0-q1}, [r1,:128]!
|
|
nengel@2
|
1098 vld1.32 {q8-q9}, [r2,:128]!
|
|
nengel@2
|
1099 vld1.32 {q2-q3}, [r3,:128]!
|
|
nengel@2
|
1100 vmul.f32 q10, q0, q8
|
|
nengel@2
|
1101 vmul.f32 q11, q1, q9
|
|
nengel@2
|
1102 1: vadd.f32 q12, q2, q10
|
|
nengel@2
|
1103 vadd.f32 q13, q3, q11
|
|
nengel@2
|
1104 pld [r1, #16]
|
|
nengel@2
|
1105 pld [r2, #16]
|
|
nengel@2
|
1106 pld [r3, #16]
|
|
nengel@2
|
1107 subs r12, r12, #8
|
|
nengel@2
|
1108 beq 2f
|
|
nengel@2
|
1109 vld1.32 {q0}, [r1,:128]!
|
|
nengel@2
|
1110 vld1.32 {q8}, [r2,:128]!
|
|
nengel@2
|
1111 vmul.f32 q10, q0, q8
|
|
nengel@2
|
1112 vld1.32 {q1}, [r1,:128]!
|
|
nengel@2
|
1113 vld1.32 {q9}, [r2,:128]!
|
|
nengel@2
|
1114 vmul.f32 q11, q1, q9
|
|
nengel@2
|
1115 vld1.32 {q2-q3}, [r3,:128]!
|
|
nengel@2
|
1116 vst1.32 {q12-q13},[r0,:128]!
|
|
nengel@2
|
1117 b 1b
|
|
nengel@2
|
1118 2: vst1.32 {q12-q13},[r0,:128]!
|
|
nengel@2
|
1119 bx lr
|
|
nengel@2
|
1120 endfunc
|
|
nengel@2
|
1121
|
|
nengel@2
|
1122 function ff_vector_clipf_neon, export=1
|
|
nengel@2
|
1123 VFP vdup.32 q1, d0[1]
|
|
nengel@2
|
1124 VFP vdup.32 q0, d0[0]
|
|
nengel@2
|
1125 NOVFP vdup.32 q0, r2
|
|
nengel@2
|
1126 NOVFP vdup.32 q1, r3
|
|
nengel@2
|
1127 NOVFP ldr r2, [sp]
|
|
nengel@2
|
1128 vld1.f32 {q2},[r1,:128]!
|
|
nengel@2
|
1129 vmin.f32 q10, q2, q1
|
|
nengel@2
|
1130 vld1.f32 {q3},[r1,:128]!
|
|
nengel@2
|
1131 vmin.f32 q11, q3, q1
|
|
nengel@2
|
1132 1: vmax.f32 q8, q10, q0
|
|
nengel@2
|
1133 vmax.f32 q9, q11, q0
|
|
nengel@2
|
1134 subs r2, r2, #8
|
|
nengel@2
|
1135 beq 2f
|
|
nengel@2
|
1136 vld1.f32 {q2},[r1,:128]!
|
|
nengel@2
|
1137 vmin.f32 q10, q2, q1
|
|
nengel@2
|
1138 vld1.f32 {q3},[r1,:128]!
|
|
nengel@2
|
1139 vmin.f32 q11, q3, q1
|
|
nengel@2
|
1140 vst1.f32 {q8},[r0,:128]!
|
|
nengel@2
|
1141 vst1.f32 {q9},[r0,:128]!
|
|
nengel@2
|
1142 b 1b
|
|
nengel@2
|
1143 2: vst1.f32 {q8},[r0,:128]!
|
|
nengel@2
|
1144 vst1.f32 {q9},[r0,:128]!
|
|
nengel@2
|
1145 bx lr
|
|
nengel@2
|
1146 endfunc
|