| rev |
line source |
|
nengel@2
|
1 /*
|
|
nengel@2
|
2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
|
|
nengel@2
|
3 *
|
|
nengel@2
|
4 * This file is part of FFmpeg.
|
|
nengel@2
|
5 *
|
|
nengel@2
|
6 * FFmpeg is free software; you can redistribute it and/or
|
|
nengel@2
|
7 * modify it under the terms of the GNU Lesser General Public
|
|
nengel@2
|
8 * License as published by the Free Software Foundation; either
|
|
nengel@2
|
9 * version 2.1 of the License, or (at your option) any later version.
|
|
nengel@2
|
10 *
|
|
nengel@2
|
11 * FFmpeg is distributed in the hope that it will be useful,
|
|
nengel@2
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
nengel@2
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
nengel@2
|
14 * Lesser General Public License for more details.
|
|
nengel@2
|
15 *
|
|
nengel@2
|
16 * You should have received a copy of the GNU Lesser General Public
|
|
nengel@2
|
17 * License along with FFmpeg; if not, write to the Free Software
|
|
nengel@2
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
nengel@2
|
19 */
|
|
nengel@2
|
20
|
|
nengel@2
|
21 #include "asm.S"
|
|
nengel@2
|
22
|
|
nengel@2
|
23 .macro transpose_8x8 r0 r1 r2 r3 r4 r5 r6 r7
|
|
nengel@2
|
24 vtrn.32 \r0, \r4
|
|
nengel@2
|
25 vtrn.32 \r1, \r5
|
|
nengel@2
|
26 vtrn.32 \r2, \r6
|
|
nengel@2
|
27 vtrn.32 \r3, \r7
|
|
nengel@2
|
28 vtrn.16 \r0, \r2
|
|
nengel@2
|
29 vtrn.16 \r1, \r3
|
|
nengel@2
|
30 vtrn.16 \r4, \r6
|
|
nengel@2
|
31 vtrn.16 \r5, \r7
|
|
nengel@2
|
32 vtrn.8 \r0, \r1
|
|
nengel@2
|
33 vtrn.8 \r2, \r3
|
|
nengel@2
|
34 vtrn.8 \r4, \r5
|
|
nengel@2
|
35 vtrn.8 \r6, \r7
|
|
nengel@2
|
36 .endm
|
|
nengel@2
|
37
|
|
nengel@2
|
38 .macro transpose_4x4 r0 r1 r2 r3
|
|
nengel@2
|
39 vtrn.16 \r0, \r2
|
|
nengel@2
|
40 vtrn.16 \r1, \r3
|
|
nengel@2
|
41 vtrn.8 \r0, \r1
|
|
nengel@2
|
42 vtrn.8 \r2, \r3
|
|
nengel@2
|
43 .endm
|
|
nengel@2
|
44
|
|
nengel@2
|
45 .macro swap4 r0 r1 r2 r3 r4 r5 r6 r7
|
|
nengel@2
|
46 vswp \r0, \r4
|
|
nengel@2
|
47 vswp \r1, \r5
|
|
nengel@2
|
48 vswp \r2, \r6
|
|
nengel@2
|
49 vswp \r3, \r7
|
|
nengel@2
|
50 .endm
|
|
nengel@2
|
51
|
|
nengel@2
|
52 .macro transpose16_4x4 r0 r1 r2 r3 r4 r5 r6 r7
|
|
nengel@2
|
53 vtrn.32 \r0, \r2
|
|
nengel@2
|
54 vtrn.32 \r1, \r3
|
|
nengel@2
|
55 vtrn.32 \r4, \r6
|
|
nengel@2
|
56 vtrn.32 \r5, \r7
|
|
nengel@2
|
57 vtrn.16 \r0, \r1
|
|
nengel@2
|
58 vtrn.16 \r2, \r3
|
|
nengel@2
|
59 vtrn.16 \r4, \r5
|
|
nengel@2
|
60 vtrn.16 \r6, \r7
|
|
nengel@2
|
61 .endm
|
|
nengel@2
|
62
|
|
nengel@2
|
63 /* chroma_mc8(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y) */
|
|
nengel@2
|
64 .macro h264_chroma_mc8 type
|
|
nengel@2
|
65 function ff_\type\()_h264_chroma_mc8_neon, export=1
|
|
nengel@2
|
66 push {r4-r7, lr}
|
|
nengel@2
|
67 ldrd r4, [sp, #20]
|
|
nengel@2
|
68 .ifc \type,avg
|
|
nengel@2
|
69 mov lr, r0
|
|
nengel@2
|
70 .endif
|
|
nengel@2
|
71 pld [r1]
|
|
nengel@2
|
72 pld [r1, r2]
|
|
nengel@2
|
73
|
|
nengel@2
|
74 muls r7, r4, r5
|
|
nengel@2
|
75 rsb r6, r7, r5, lsl #3
|
|
nengel@2
|
76 rsb ip, r7, r4, lsl #3
|
|
nengel@2
|
77 sub r4, r7, r4, lsl #3
|
|
nengel@2
|
78 sub r4, r4, r5, lsl #3
|
|
nengel@2
|
79 add r4, r4, #64
|
|
nengel@2
|
80
|
|
nengel@2
|
81 beq 2f
|
|
nengel@2
|
82
|
|
nengel@2
|
83 add r5, r1, r2
|
|
nengel@2
|
84
|
|
nengel@2
|
85 vdup.8 d0, r4
|
|
nengel@2
|
86 lsl r4, r2, #1
|
|
nengel@2
|
87 vdup.8 d1, ip
|
|
nengel@2
|
88 vld1.64 {d4, d5}, [r1], r4
|
|
nengel@2
|
89 vdup.8 d2, r6
|
|
nengel@2
|
90 vld1.64 {d6, d7}, [r5], r4
|
|
nengel@2
|
91 vdup.8 d3, r7
|
|
nengel@2
|
92
|
|
nengel@2
|
93 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
94 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
95
|
|
nengel@2
|
96 1: pld [r5]
|
|
nengel@2
|
97 vmull.u8 q8, d4, d0
|
|
nengel@2
|
98 vmlal.u8 q8, d5, d1
|
|
nengel@2
|
99 vld1.64 {d4, d5}, [r1], r4
|
|
nengel@2
|
100 vmlal.u8 q8, d6, d2
|
|
nengel@2
|
101 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
102 vmlal.u8 q8, d7, d3
|
|
nengel@2
|
103 vmull.u8 q9, d6, d0
|
|
nengel@2
|
104 subs r3, r3, #2
|
|
nengel@2
|
105 vmlal.u8 q9, d7, d1
|
|
nengel@2
|
106 vmlal.u8 q9, d4, d2
|
|
nengel@2
|
107 vmlal.u8 q9, d5, d3
|
|
nengel@2
|
108 vrshrn.u16 d16, q8, #6
|
|
nengel@2
|
109 vld1.64 {d6, d7}, [r5], r4
|
|
nengel@2
|
110 pld [r1]
|
|
nengel@2
|
111 vrshrn.u16 d17, q9, #6
|
|
nengel@2
|
112 .ifc \type,avg
|
|
nengel@2
|
113 vld1.64 {d20}, [lr,:64], r2
|
|
nengel@2
|
114 vld1.64 {d21}, [lr,:64], r2
|
|
nengel@2
|
115 vrhadd.u8 q8, q8, q10
|
|
nengel@2
|
116 .endif
|
|
nengel@2
|
117 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
118 vst1.64 {d16}, [r0,:64], r2
|
|
nengel@2
|
119 vst1.64 {d17}, [r0,:64], r2
|
|
nengel@2
|
120 bgt 1b
|
|
nengel@2
|
121
|
|
nengel@2
|
122 pop {r4-r7, pc}
|
|
nengel@2
|
123
|
|
nengel@2
|
124 2: tst r6, r6
|
|
nengel@2
|
125 add ip, ip, r6
|
|
nengel@2
|
126 vdup.8 d0, r4
|
|
nengel@2
|
127 vdup.8 d1, ip
|
|
nengel@2
|
128
|
|
nengel@2
|
129 beq 4f
|
|
nengel@2
|
130
|
|
nengel@2
|
131 add r5, r1, r2
|
|
nengel@2
|
132 lsl r4, r2, #1
|
|
nengel@2
|
133 vld1.64 {d4}, [r1], r4
|
|
nengel@2
|
134 vld1.64 {d6}, [r5], r4
|
|
nengel@2
|
135
|
|
nengel@2
|
136 3: pld [r5]
|
|
nengel@2
|
137 vmull.u8 q8, d4, d0
|
|
nengel@2
|
138 vmlal.u8 q8, d6, d1
|
|
nengel@2
|
139 vld1.64 {d4}, [r1], r4
|
|
nengel@2
|
140 vmull.u8 q9, d6, d0
|
|
nengel@2
|
141 vmlal.u8 q9, d4, d1
|
|
nengel@2
|
142 vld1.64 {d6}, [r5], r4
|
|
nengel@2
|
143 vrshrn.u16 d16, q8, #6
|
|
nengel@2
|
144 vrshrn.u16 d17, q9, #6
|
|
nengel@2
|
145 .ifc \type,avg
|
|
nengel@2
|
146 vld1.64 {d20}, [lr,:64], r2
|
|
nengel@2
|
147 vld1.64 {d21}, [lr,:64], r2
|
|
nengel@2
|
148 vrhadd.u8 q8, q8, q10
|
|
nengel@2
|
149 .endif
|
|
nengel@2
|
150 subs r3, r3, #2
|
|
nengel@2
|
151 pld [r1]
|
|
nengel@2
|
152 vst1.64 {d16}, [r0,:64], r2
|
|
nengel@2
|
153 vst1.64 {d17}, [r0,:64], r2
|
|
nengel@2
|
154 bgt 3b
|
|
nengel@2
|
155
|
|
nengel@2
|
156 pop {r4-r7, pc}
|
|
nengel@2
|
157
|
|
nengel@2
|
158 4: vld1.64 {d4, d5}, [r1], r2
|
|
nengel@2
|
159 vld1.64 {d6, d7}, [r1], r2
|
|
nengel@2
|
160 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
161 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
162
|
|
nengel@2
|
163 5: pld [r1]
|
|
nengel@2
|
164 subs r3, r3, #2
|
|
nengel@2
|
165 vmull.u8 q8, d4, d0
|
|
nengel@2
|
166 vmlal.u8 q8, d5, d1
|
|
nengel@2
|
167 vld1.64 {d4, d5}, [r1], r2
|
|
nengel@2
|
168 vmull.u8 q9, d6, d0
|
|
nengel@2
|
169 vmlal.u8 q9, d7, d1
|
|
nengel@2
|
170 pld [r1]
|
|
nengel@2
|
171 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
172 vrshrn.u16 d16, q8, #6
|
|
nengel@2
|
173 vrshrn.u16 d17, q9, #6
|
|
nengel@2
|
174 .ifc \type,avg
|
|
nengel@2
|
175 vld1.64 {d20}, [lr,:64], r2
|
|
nengel@2
|
176 vld1.64 {d21}, [lr,:64], r2
|
|
nengel@2
|
177 vrhadd.u8 q8, q8, q10
|
|
nengel@2
|
178 .endif
|
|
nengel@2
|
179 vld1.64 {d6, d7}, [r1], r2
|
|
nengel@2
|
180 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
181 vst1.64 {d16}, [r0,:64], r2
|
|
nengel@2
|
182 vst1.64 {d17}, [r0,:64], r2
|
|
nengel@2
|
183 bgt 5b
|
|
nengel@2
|
184
|
|
nengel@2
|
185 pop {r4-r7, pc}
|
|
nengel@2
|
186 endfunc
|
|
nengel@2
|
187 .endm
|
|
nengel@2
|
188
|
|
nengel@2
|
189 /* chroma_mc4(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y) */
|
|
nengel@2
|
190 .macro h264_chroma_mc4 type
|
|
nengel@2
|
191 function ff_\type\()_h264_chroma_mc4_neon, export=1
|
|
nengel@2
|
192 push {r4-r7, lr}
|
|
nengel@2
|
193 ldrd r4, [sp, #20]
|
|
nengel@2
|
194 .ifc \type,avg
|
|
nengel@2
|
195 mov lr, r0
|
|
nengel@2
|
196 .endif
|
|
nengel@2
|
197 pld [r1]
|
|
nengel@2
|
198 pld [r1, r2]
|
|
nengel@2
|
199
|
|
nengel@2
|
200 muls r7, r4, r5
|
|
nengel@2
|
201 rsb r6, r7, r5, lsl #3
|
|
nengel@2
|
202 rsb ip, r7, r4, lsl #3
|
|
nengel@2
|
203 sub r4, r7, r4, lsl #3
|
|
nengel@2
|
204 sub r4, r4, r5, lsl #3
|
|
nengel@2
|
205 add r4, r4, #64
|
|
nengel@2
|
206
|
|
nengel@2
|
207 beq 2f
|
|
nengel@2
|
208
|
|
nengel@2
|
209 add r5, r1, r2
|
|
nengel@2
|
210
|
|
nengel@2
|
211 vdup.8 d0, r4
|
|
nengel@2
|
212 lsl r4, r2, #1
|
|
nengel@2
|
213 vdup.8 d1, ip
|
|
nengel@2
|
214 vld1.64 {d4}, [r1], r4
|
|
nengel@2
|
215 vdup.8 d2, r6
|
|
nengel@2
|
216 vld1.64 {d6}, [r5], r4
|
|
nengel@2
|
217 vdup.8 d3, r7
|
|
nengel@2
|
218
|
|
nengel@2
|
219 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
220 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
221 vtrn.32 d4, d5
|
|
nengel@2
|
222 vtrn.32 d6, d7
|
|
nengel@2
|
223
|
|
nengel@2
|
224 vtrn.32 d0, d1
|
|
nengel@2
|
225 vtrn.32 d2, d3
|
|
nengel@2
|
226
|
|
nengel@2
|
227 1: pld [r5]
|
|
nengel@2
|
228 vmull.u8 q8, d4, d0
|
|
nengel@2
|
229 vmlal.u8 q8, d6, d2
|
|
nengel@2
|
230 vld1.64 {d4}, [r1], r4
|
|
nengel@2
|
231 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
232 vtrn.32 d4, d5
|
|
nengel@2
|
233 vmull.u8 q9, d6, d0
|
|
nengel@2
|
234 vmlal.u8 q9, d4, d2
|
|
nengel@2
|
235 vld1.64 {d6}, [r5], r4
|
|
nengel@2
|
236 vadd.i16 d16, d16, d17
|
|
nengel@2
|
237 vadd.i16 d17, d18, d19
|
|
nengel@2
|
238 vrshrn.u16 d16, q8, #6
|
|
nengel@2
|
239 subs r3, r3, #2
|
|
nengel@2
|
240 pld [r1]
|
|
nengel@2
|
241 .ifc \type,avg
|
|
nengel@2
|
242 vld1.32 {d20[0]}, [lr,:32], r2
|
|
nengel@2
|
243 vld1.32 {d20[1]}, [lr,:32], r2
|
|
nengel@2
|
244 vrhadd.u8 d16, d16, d20
|
|
nengel@2
|
245 .endif
|
|
nengel@2
|
246 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
247 vtrn.32 d6, d7
|
|
nengel@2
|
248 vst1.32 {d16[0]}, [r0,:32], r2
|
|
nengel@2
|
249 vst1.32 {d16[1]}, [r0,:32], r2
|
|
nengel@2
|
250 bgt 1b
|
|
nengel@2
|
251
|
|
nengel@2
|
252 pop {r4-r7, pc}
|
|
nengel@2
|
253
|
|
nengel@2
|
254 2: tst r6, r6
|
|
nengel@2
|
255 add ip, ip, r6
|
|
nengel@2
|
256 vdup.8 d0, r4
|
|
nengel@2
|
257 vdup.8 d1, ip
|
|
nengel@2
|
258 vtrn.32 d0, d1
|
|
nengel@2
|
259
|
|
nengel@2
|
260 beq 4f
|
|
nengel@2
|
261
|
|
nengel@2
|
262 vext.32 d1, d0, d1, #1
|
|
nengel@2
|
263 add r5, r1, r2
|
|
nengel@2
|
264 lsl r4, r2, #1
|
|
nengel@2
|
265 vld1.32 {d4[0]}, [r1], r4
|
|
nengel@2
|
266 vld1.32 {d4[1]}, [r5], r4
|
|
nengel@2
|
267
|
|
nengel@2
|
268 3: pld [r5]
|
|
nengel@2
|
269 vmull.u8 q8, d4, d0
|
|
nengel@2
|
270 vld1.32 {d4[0]}, [r1], r4
|
|
nengel@2
|
271 vmull.u8 q9, d4, d1
|
|
nengel@2
|
272 vld1.32 {d4[1]}, [r5], r4
|
|
nengel@2
|
273 vadd.i16 d16, d16, d17
|
|
nengel@2
|
274 vadd.i16 d17, d18, d19
|
|
nengel@2
|
275 vrshrn.u16 d16, q8, #6
|
|
nengel@2
|
276 .ifc \type,avg
|
|
nengel@2
|
277 vld1.32 {d20[0]}, [lr,:32], r2
|
|
nengel@2
|
278 vld1.32 {d20[1]}, [lr,:32], r2
|
|
nengel@2
|
279 vrhadd.u8 d16, d16, d20
|
|
nengel@2
|
280 .endif
|
|
nengel@2
|
281 subs r3, r3, #2
|
|
nengel@2
|
282 pld [r1]
|
|
nengel@2
|
283 vst1.32 {d16[0]}, [r0,:32], r2
|
|
nengel@2
|
284 vst1.32 {d16[1]}, [r0,:32], r2
|
|
nengel@2
|
285 bgt 3b
|
|
nengel@2
|
286
|
|
nengel@2
|
287 pop {r4-r7, pc}
|
|
nengel@2
|
288
|
|
nengel@2
|
289 4: vld1.64 {d4}, [r1], r2
|
|
nengel@2
|
290 vld1.64 {d6}, [r1], r2
|
|
nengel@2
|
291 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
292 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
293 vtrn.32 d4, d5
|
|
nengel@2
|
294 vtrn.32 d6, d7
|
|
nengel@2
|
295
|
|
nengel@2
|
296 5: vmull.u8 q8, d4, d0
|
|
nengel@2
|
297 vmull.u8 q9, d6, d0
|
|
nengel@2
|
298 subs r3, r3, #2
|
|
nengel@2
|
299 vld1.64 {d4}, [r1], r2
|
|
nengel@2
|
300 vext.8 d5, d4, d5, #1
|
|
nengel@2
|
301 vtrn.32 d4, d5
|
|
nengel@2
|
302 vadd.i16 d16, d16, d17
|
|
nengel@2
|
303 vadd.i16 d17, d18, d19
|
|
nengel@2
|
304 pld [r1]
|
|
nengel@2
|
305 vrshrn.u16 d16, q8, #6
|
|
nengel@2
|
306 .ifc \type,avg
|
|
nengel@2
|
307 vld1.32 {d20[0]}, [lr,:32], r2
|
|
nengel@2
|
308 vld1.32 {d20[1]}, [lr,:32], r2
|
|
nengel@2
|
309 vrhadd.u8 d16, d16, d20
|
|
nengel@2
|
310 .endif
|
|
nengel@2
|
311 vld1.64 {d6}, [r1], r2
|
|
nengel@2
|
312 vext.8 d7, d6, d7, #1
|
|
nengel@2
|
313 vtrn.32 d6, d7
|
|
nengel@2
|
314 pld [r1]
|
|
nengel@2
|
315 vst1.32 {d16[0]}, [r0,:32], r2
|
|
nengel@2
|
316 vst1.32 {d16[1]}, [r0,:32], r2
|
|
nengel@2
|
317 bgt 5b
|
|
nengel@2
|
318
|
|
nengel@2
|
319 pop {r4-r7, pc}
|
|
nengel@2
|
320 endfunc
|
|
nengel@2
|
321 .endm
|
|
nengel@2
|
322
|
|
nengel@2
|
323 .macro h264_chroma_mc2 type
|
|
nengel@2
|
324 function ff_\type\()_h264_chroma_mc2_neon, export=1
|
|
nengel@2
|
325 push {r4-r6, lr}
|
|
nengel@2
|
326 ldr r4, [sp, #16]
|
|
nengel@2
|
327 ldr lr, [sp, #20]
|
|
nengel@2
|
328 pld [r1]
|
|
nengel@2
|
329 pld [r1, r2]
|
|
nengel@2
|
330 orrs r5, r4, lr
|
|
nengel@2
|
331 beq 2f
|
|
nengel@2
|
332
|
|
nengel@2
|
333 mul r5, r4, lr
|
|
nengel@2
|
334 rsb r6, r5, lr, lsl #3
|
|
nengel@2
|
335 rsb r12, r5, r4, lsl #3
|
|
nengel@2
|
336 sub r4, r5, r4, lsl #3
|
|
nengel@2
|
337 sub r4, r4, lr, lsl #3
|
|
nengel@2
|
338 add r4, r4, #64
|
|
nengel@2
|
339 vdup.8 d0, r4
|
|
nengel@2
|
340 vdup.8 d2, r12
|
|
nengel@2
|
341 vdup.8 d1, r6
|
|
nengel@2
|
342 vdup.8 d3, r5
|
|
nengel@2
|
343 vtrn.16 q0, q1
|
|
nengel@2
|
344 1:
|
|
nengel@2
|
345 vld1.32 {d4[0]}, [r1], r2
|
|
nengel@2
|
346 vld1.32 {d4[1]}, [r1], r2
|
|
nengel@2
|
347 vrev64.32 d5, d4
|
|
nengel@2
|
348 vld1.32 {d5[1]}, [r1]
|
|
nengel@2
|
349 vext.8 q3, q2, q2, #1
|
|
nengel@2
|
350 vtrn.16 q2, q3
|
|
nengel@2
|
351 vmull.u8 q8, d4, d0
|
|
nengel@2
|
352 vmlal.u8 q8, d5, d1
|
|
nengel@2
|
353 .ifc \type,avg
|
|
nengel@2
|
354 vld1.16 {d18[0]}, [r0,:16], r2
|
|
nengel@2
|
355 vld1.16 {d18[1]}, [r0,:16]
|
|
nengel@2
|
356 sub r0, r0, r2
|
|
nengel@2
|
357 .endif
|
|
nengel@2
|
358 vtrn.32 d16, d17
|
|
nengel@2
|
359 vadd.i16 d16, d16, d17
|
|
nengel@2
|
360 vrshrn.u16 d16, q8, #6
|
|
nengel@2
|
361 .ifc \type,avg
|
|
nengel@2
|
362 vrhadd.u8 d16, d16, d18
|
|
nengel@2
|
363 .endif
|
|
nengel@2
|
364 vst1.16 {d16[0]}, [r0,:16], r2
|
|
nengel@2
|
365 vst1.16 {d16[1]}, [r0,:16], r2
|
|
nengel@2
|
366 subs r3, r3, #2
|
|
nengel@2
|
367 bgt 1b
|
|
nengel@2
|
368 pop {r4-r6, pc}
|
|
nengel@2
|
369 2:
|
|
nengel@2
|
370 .ifc \type,put
|
|
nengel@2
|
371 ldrh r5, [r1], r2
|
|
nengel@2
|
372 strh r5, [r0], r2
|
|
nengel@2
|
373 ldrh r6, [r1], r2
|
|
nengel@2
|
374 strh r6, [r0], r2
|
|
nengel@2
|
375 .else
|
|
nengel@2
|
376 vld1.16 {d16[0]}, [r1], r2
|
|
nengel@2
|
377 vld1.16 {d16[1]}, [r1], r2
|
|
nengel@2
|
378 vld1.16 {d18[0]}, [r0,:16], r2
|
|
nengel@2
|
379 vld1.16 {d18[1]}, [r0,:16]
|
|
nengel@2
|
380 sub r0, r0, r2
|
|
nengel@2
|
381 vrhadd.u8 d16, d16, d18
|
|
nengel@2
|
382 vst1.16 {d16[0]}, [r0,:16], r2
|
|
nengel@2
|
383 vst1.16 {d16[1]}, [r0,:16], r2
|
|
nengel@2
|
384 .endif
|
|
nengel@2
|
385 subs r3, r3, #2
|
|
nengel@2
|
386 bgt 2b
|
|
nengel@2
|
387 pop {r4-r6, pc}
|
|
nengel@2
|
388 endfunc
|
|
nengel@2
|
389 .endm
|
|
nengel@2
|
390
|
|
nengel@2
|
391 .text
|
|
nengel@2
|
392 .align
|
|
nengel@2
|
393
|
|
nengel@2
|
394 h264_chroma_mc8 put
|
|
nengel@2
|
395 h264_chroma_mc8 avg
|
|
nengel@2
|
396 h264_chroma_mc4 put
|
|
nengel@2
|
397 h264_chroma_mc4 avg
|
|
nengel@2
|
398 h264_chroma_mc2 put
|
|
nengel@2
|
399 h264_chroma_mc2 avg
|
|
nengel@2
|
400
|
|
nengel@2
|
401 /* H.264 loop filter */
|
|
nengel@2
|
402
|
|
nengel@2
|
403 .macro h264_loop_filter_start
|
|
nengel@2
|
404 ldr ip, [sp]
|
|
nengel@2
|
405 tst r2, r2
|
|
nengel@2
|
406 ldr ip, [ip]
|
|
nengel@2
|
407 tstne r3, r3
|
|
nengel@2
|
408 vmov.32 d24[0], ip
|
|
nengel@2
|
409 and ip, ip, ip, lsl #16
|
|
nengel@2
|
410 bxeq lr
|
|
nengel@2
|
411 ands ip, ip, ip, lsl #8
|
|
nengel@2
|
412 bxlt lr
|
|
nengel@2
|
413 .endm
|
|
nengel@2
|
414
|
|
nengel@2
|
415 .macro align_push_regs
|
|
nengel@2
|
416 and ip, sp, #15
|
|
nengel@2
|
417 add ip, ip, #32
|
|
nengel@2
|
418 sub sp, sp, ip
|
|
nengel@2
|
419 vst1.64 {d12-d15}, [sp,:128]
|
|
nengel@2
|
420 sub sp, sp, #32
|
|
nengel@2
|
421 vst1.64 {d8-d11}, [sp,:128]
|
|
nengel@2
|
422 .endm
|
|
nengel@2
|
423
|
|
nengel@2
|
424 .macro align_pop_regs
|
|
nengel@2
|
425 vld1.64 {d8-d11}, [sp,:128]!
|
|
nengel@2
|
426 vld1.64 {d12-d15}, [sp,:128], ip
|
|
nengel@2
|
427 .endm
|
|
nengel@2
|
428
|
|
nengel@2
|
429 .macro h264_loop_filter_luma
|
|
nengel@2
|
430 vdup.8 q11, r2 @ alpha
|
|
nengel@2
|
431 vmovl.u8 q12, d24
|
|
nengel@2
|
432 vabd.u8 q6, q8, q0 @ abs(p0 - q0)
|
|
nengel@2
|
433 vmovl.u16 q12, d24
|
|
nengel@2
|
434 vabd.u8 q14, q9, q8 @ abs(p1 - p0)
|
|
nengel@2
|
435 vsli.16 q12, q12, #8
|
|
nengel@2
|
436 vabd.u8 q15, q1, q0 @ abs(q1 - q0)
|
|
nengel@2
|
437 vsli.32 q12, q12, #16
|
|
nengel@2
|
438 vclt.u8 q6, q6, q11 @ < alpha
|
|
nengel@2
|
439 vdup.8 q11, r3 @ beta
|
|
nengel@2
|
440 vclt.s8 q7, q12, #0
|
|
nengel@2
|
441 vclt.u8 q14, q14, q11 @ < beta
|
|
nengel@2
|
442 vclt.u8 q15, q15, q11 @ < beta
|
|
nengel@2
|
443 vbic q6, q6, q7
|
|
nengel@2
|
444 vabd.u8 q4, q10, q8 @ abs(p2 - p0)
|
|
nengel@2
|
445 vand q6, q6, q14
|
|
nengel@2
|
446 vabd.u8 q5, q2, q0 @ abs(q2 - q0)
|
|
nengel@2
|
447 vclt.u8 q4, q4, q11 @ < beta
|
|
nengel@2
|
448 vand q6, q6, q15
|
|
nengel@2
|
449 vclt.u8 q5, q5, q11 @ < beta
|
|
nengel@2
|
450 vand q4, q4, q6
|
|
nengel@2
|
451 vand q5, q5, q6
|
|
nengel@2
|
452 vand q12, q12, q6
|
|
nengel@2
|
453 vrhadd.u8 q14, q8, q0
|
|
nengel@2
|
454 vsub.i8 q6, q12, q4
|
|
nengel@2
|
455 vqadd.u8 q7, q9, q12
|
|
nengel@2
|
456 vhadd.u8 q10, q10, q14
|
|
nengel@2
|
457 vsub.i8 q6, q6, q5
|
|
nengel@2
|
458 vhadd.u8 q14, q2, q14
|
|
nengel@2
|
459 vmin.u8 q7, q7, q10
|
|
nengel@2
|
460 vqsub.u8 q11, q9, q12
|
|
nengel@2
|
461 vqadd.u8 q2, q1, q12
|
|
nengel@2
|
462 vmax.u8 q7, q7, q11
|
|
nengel@2
|
463 vqsub.u8 q11, q1, q12
|
|
nengel@2
|
464 vmin.u8 q14, q2, q14
|
|
nengel@2
|
465 vmovl.u8 q2, d0
|
|
nengel@2
|
466 vmax.u8 q14, q14, q11
|
|
nengel@2
|
467 vmovl.u8 q10, d1
|
|
nengel@2
|
468 vsubw.u8 q2, q2, d16
|
|
nengel@2
|
469 vsubw.u8 q10, q10, d17
|
|
nengel@2
|
470 vshl.i16 q2, q2, #2
|
|
nengel@2
|
471 vshl.i16 q10, q10, #2
|
|
nengel@2
|
472 vaddw.u8 q2, q2, d18
|
|
nengel@2
|
473 vaddw.u8 q10, q10, d19
|
|
nengel@2
|
474 vsubw.u8 q2, q2, d2
|
|
nengel@2
|
475 vsubw.u8 q10, q10, d3
|
|
nengel@2
|
476 vrshrn.i16 d4, q2, #3
|
|
nengel@2
|
477 vrshrn.i16 d5, q10, #3
|
|
nengel@2
|
478 vbsl q4, q7, q9
|
|
nengel@2
|
479 vbsl q5, q14, q1
|
|
nengel@2
|
480 vneg.s8 q7, q6
|
|
nengel@2
|
481 vmovl.u8 q14, d16
|
|
nengel@2
|
482 vmin.s8 q2, q2, q6
|
|
nengel@2
|
483 vmovl.u8 q6, d17
|
|
nengel@2
|
484 vmax.s8 q2, q2, q7
|
|
nengel@2
|
485 vmovl.u8 q11, d0
|
|
nengel@2
|
486 vmovl.u8 q12, d1
|
|
nengel@2
|
487 vaddw.s8 q14, q14, d4
|
|
nengel@2
|
488 vaddw.s8 q6, q6, d5
|
|
nengel@2
|
489 vsubw.s8 q11, q11, d4
|
|
nengel@2
|
490 vsubw.s8 q12, q12, d5
|
|
nengel@2
|
491 vqmovun.s16 d16, q14
|
|
nengel@2
|
492 vqmovun.s16 d17, q6
|
|
nengel@2
|
493 vqmovun.s16 d0, q11
|
|
nengel@2
|
494 vqmovun.s16 d1, q12
|
|
nengel@2
|
495 .endm
|
|
nengel@2
|
496
|
|
nengel@2
|
497 function ff_h264_v_loop_filter_luma_neon, export=1
|
|
nengel@2
|
498 h264_loop_filter_start
|
|
nengel@2
|
499
|
|
nengel@2
|
500 vld1.64 {d0, d1}, [r0,:128], r1
|
|
nengel@2
|
501 vld1.64 {d2, d3}, [r0,:128], r1
|
|
nengel@2
|
502 vld1.64 {d4, d5}, [r0,:128], r1
|
|
nengel@2
|
503 sub r0, r0, r1, lsl #2
|
|
nengel@2
|
504 sub r0, r0, r1, lsl #1
|
|
nengel@2
|
505 vld1.64 {d20,d21}, [r0,:128], r1
|
|
nengel@2
|
506 vld1.64 {d18,d19}, [r0,:128], r1
|
|
nengel@2
|
507 vld1.64 {d16,d17}, [r0,:128], r1
|
|
nengel@2
|
508
|
|
nengel@2
|
509 align_push_regs
|
|
nengel@2
|
510
|
|
nengel@2
|
511 h264_loop_filter_luma
|
|
nengel@2
|
512
|
|
nengel@2
|
513 sub r0, r0, r1, lsl #1
|
|
nengel@2
|
514 vst1.64 {d8, d9}, [r0,:128], r1
|
|
nengel@2
|
515 vst1.64 {d16,d17}, [r0,:128], r1
|
|
nengel@2
|
516 vst1.64 {d0, d1}, [r0,:128], r1
|
|
nengel@2
|
517 vst1.64 {d10,d11}, [r0,:128]
|
|
nengel@2
|
518
|
|
nengel@2
|
519 align_pop_regs
|
|
nengel@2
|
520 bx lr
|
|
nengel@2
|
521 endfunc
|
|
nengel@2
|
522
|
|
nengel@2
|
523 function ff_h264_h_loop_filter_luma_neon, export=1
|
|
nengel@2
|
524 h264_loop_filter_start
|
|
nengel@2
|
525
|
|
nengel@2
|
526 sub r0, r0, #4
|
|
nengel@2
|
527 vld1.64 {d6}, [r0], r1
|
|
nengel@2
|
528 vld1.64 {d20}, [r0], r1
|
|
nengel@2
|
529 vld1.64 {d18}, [r0], r1
|
|
nengel@2
|
530 vld1.64 {d16}, [r0], r1
|
|
nengel@2
|
531 vld1.64 {d0}, [r0], r1
|
|
nengel@2
|
532 vld1.64 {d2}, [r0], r1
|
|
nengel@2
|
533 vld1.64 {d4}, [r0], r1
|
|
nengel@2
|
534 vld1.64 {d26}, [r0], r1
|
|
nengel@2
|
535 vld1.64 {d7}, [r0], r1
|
|
nengel@2
|
536 vld1.64 {d21}, [r0], r1
|
|
nengel@2
|
537 vld1.64 {d19}, [r0], r1
|
|
nengel@2
|
538 vld1.64 {d17}, [r0], r1
|
|
nengel@2
|
539 vld1.64 {d1}, [r0], r1
|
|
nengel@2
|
540 vld1.64 {d3}, [r0], r1
|
|
nengel@2
|
541 vld1.64 {d5}, [r0], r1
|
|
nengel@2
|
542 vld1.64 {d27}, [r0], r1
|
|
nengel@2
|
543
|
|
nengel@2
|
544 transpose_8x8 q3, q10, q9, q8, q0, q1, q2, q13
|
|
nengel@2
|
545
|
|
nengel@2
|
546 align_push_regs
|
|
nengel@2
|
547
|
|
nengel@2
|
548 h264_loop_filter_luma
|
|
nengel@2
|
549
|
|
nengel@2
|
550 transpose_4x4 q4, q8, q0, q5
|
|
nengel@2
|
551
|
|
nengel@2
|
552 sub r0, r0, r1, lsl #4
|
|
nengel@2
|
553 add r0, r0, #2
|
|
nengel@2
|
554 vst1.32 {d8[0]}, [r0], r1
|
|
nengel@2
|
555 vst1.32 {d16[0]}, [r0], r1
|
|
nengel@2
|
556 vst1.32 {d0[0]}, [r0], r1
|
|
nengel@2
|
557 vst1.32 {d10[0]}, [r0], r1
|
|
nengel@2
|
558 vst1.32 {d8[1]}, [r0], r1
|
|
nengel@2
|
559 vst1.32 {d16[1]}, [r0], r1
|
|
nengel@2
|
560 vst1.32 {d0[1]}, [r0], r1
|
|
nengel@2
|
561 vst1.32 {d10[1]}, [r0], r1
|
|
nengel@2
|
562 vst1.32 {d9[0]}, [r0], r1
|
|
nengel@2
|
563 vst1.32 {d17[0]}, [r0], r1
|
|
nengel@2
|
564 vst1.32 {d1[0]}, [r0], r1
|
|
nengel@2
|
565 vst1.32 {d11[0]}, [r0], r1
|
|
nengel@2
|
566 vst1.32 {d9[1]}, [r0], r1
|
|
nengel@2
|
567 vst1.32 {d17[1]}, [r0], r1
|
|
nengel@2
|
568 vst1.32 {d1[1]}, [r0], r1
|
|
nengel@2
|
569 vst1.32 {d11[1]}, [r0], r1
|
|
nengel@2
|
570
|
|
nengel@2
|
571 align_pop_regs
|
|
nengel@2
|
572 bx lr
|
|
nengel@2
|
573 endfunc
|
|
nengel@2
|
574
|
|
nengel@2
|
575 .macro h264_loop_filter_chroma
|
|
nengel@2
|
576 vdup.8 d22, r2 @ alpha
|
|
nengel@2
|
577 vmovl.u8 q12, d24
|
|
nengel@2
|
578 vabd.u8 d26, d16, d0 @ abs(p0 - q0)
|
|
nengel@2
|
579 vmovl.u8 q2, d0
|
|
nengel@2
|
580 vabd.u8 d28, d18, d16 @ abs(p1 - p0)
|
|
nengel@2
|
581 vsubw.u8 q2, q2, d16
|
|
nengel@2
|
582 vsli.16 d24, d24, #8
|
|
nengel@2
|
583 vshl.i16 q2, q2, #2
|
|
nengel@2
|
584 vabd.u8 d30, d2, d0 @ abs(q1 - q0)
|
|
nengel@2
|
585 vaddw.u8 q2, q2, d18
|
|
nengel@2
|
586 vclt.u8 d26, d26, d22 @ < alpha
|
|
nengel@2
|
587 vsubw.u8 q2, q2, d2
|
|
nengel@2
|
588 vdup.8 d22, r3 @ beta
|
|
nengel@2
|
589 vclt.s8 d25, d24, #0
|
|
nengel@2
|
590 vrshrn.i16 d4, q2, #3
|
|
nengel@2
|
591 vclt.u8 d28, d28, d22 @ < beta
|
|
nengel@2
|
592 vbic d26, d26, d25
|
|
nengel@2
|
593 vclt.u8 d30, d30, d22 @ < beta
|
|
nengel@2
|
594 vand d26, d26, d28
|
|
nengel@2
|
595 vneg.s8 d25, d24
|
|
nengel@2
|
596 vand d26, d26, d30
|
|
nengel@2
|
597 vmin.s8 d4, d4, d24
|
|
nengel@2
|
598 vmovl.u8 q14, d16
|
|
nengel@2
|
599 vand d4, d4, d26
|
|
nengel@2
|
600 vmax.s8 d4, d4, d25
|
|
nengel@2
|
601 vmovl.u8 q11, d0
|
|
nengel@2
|
602 vaddw.s8 q14, q14, d4
|
|
nengel@2
|
603 vsubw.s8 q11, q11, d4
|
|
nengel@2
|
604 vqmovun.s16 d16, q14
|
|
nengel@2
|
605 vqmovun.s16 d0, q11
|
|
nengel@2
|
606 .endm
|
|
nengel@2
|
607
|
|
nengel@2
|
608 function ff_h264_v_loop_filter_chroma_neon, export=1
|
|
nengel@2
|
609 h264_loop_filter_start
|
|
nengel@2
|
610
|
|
nengel@2
|
611 sub r0, r0, r1, lsl #1
|
|
nengel@2
|
612 vld1.64 {d18}, [r0,:64], r1
|
|
nengel@2
|
613 vld1.64 {d16}, [r0,:64], r1
|
|
nengel@2
|
614 vld1.64 {d0}, [r0,:64], r1
|
|
nengel@2
|
615 vld1.64 {d2}, [r0,:64]
|
|
nengel@2
|
616
|
|
nengel@2
|
617 h264_loop_filter_chroma
|
|
nengel@2
|
618
|
|
nengel@2
|
619 sub r0, r0, r1, lsl #1
|
|
nengel@2
|
620 vst1.64 {d16}, [r0,:64], r1
|
|
nengel@2
|
621 vst1.64 {d0}, [r0,:64], r1
|
|
nengel@2
|
622
|
|
nengel@2
|
623 bx lr
|
|
nengel@2
|
624 endfunc
|
|
nengel@2
|
625
|
|
nengel@2
|
626 function ff_h264_h_loop_filter_chroma_neon, export=1
|
|
nengel@2
|
627 h264_loop_filter_start
|
|
nengel@2
|
628
|
|
nengel@2
|
629 sub r0, r0, #2
|
|
nengel@2
|
630 vld1.32 {d18[0]}, [r0], r1
|
|
nengel@2
|
631 vld1.32 {d16[0]}, [r0], r1
|
|
nengel@2
|
632 vld1.32 {d0[0]}, [r0], r1
|
|
nengel@2
|
633 vld1.32 {d2[0]}, [r0], r1
|
|
nengel@2
|
634 vld1.32 {d18[1]}, [r0], r1
|
|
nengel@2
|
635 vld1.32 {d16[1]}, [r0], r1
|
|
nengel@2
|
636 vld1.32 {d0[1]}, [r0], r1
|
|
nengel@2
|
637 vld1.32 {d2[1]}, [r0], r1
|
|
nengel@2
|
638
|
|
nengel@2
|
639 vtrn.16 d18, d0
|
|
nengel@2
|
640 vtrn.16 d16, d2
|
|
nengel@2
|
641 vtrn.8 d18, d16
|
|
nengel@2
|
642 vtrn.8 d0, d2
|
|
nengel@2
|
643
|
|
nengel@2
|
644 h264_loop_filter_chroma
|
|
nengel@2
|
645
|
|
nengel@2
|
646 vtrn.16 d18, d0
|
|
nengel@2
|
647 vtrn.16 d16, d2
|
|
nengel@2
|
648 vtrn.8 d18, d16
|
|
nengel@2
|
649 vtrn.8 d0, d2
|
|
nengel@2
|
650
|
|
nengel@2
|
651 sub r0, r0, r1, lsl #3
|
|
nengel@2
|
652 vst1.32 {d18[0]}, [r0], r1
|
|
nengel@2
|
653 vst1.32 {d16[0]}, [r0], r1
|
|
nengel@2
|
654 vst1.32 {d0[0]}, [r0], r1
|
|
nengel@2
|
655 vst1.32 {d2[0]}, [r0], r1
|
|
nengel@2
|
656 vst1.32 {d18[1]}, [r0], r1
|
|
nengel@2
|
657 vst1.32 {d16[1]}, [r0], r1
|
|
nengel@2
|
658 vst1.32 {d0[1]}, [r0], r1
|
|
nengel@2
|
659 vst1.32 {d2[1]}, [r0], r1
|
|
nengel@2
|
660
|
|
nengel@2
|
661 bx lr
|
|
nengel@2
|
662 endfunc
|
|
nengel@2
|
663
|
|
nengel@2
|
664 /* H.264 qpel MC */
|
|
nengel@2
|
665
|
|
nengel@2
|
666 .macro lowpass_const r
|
|
nengel@2
|
667 movw \r, #5
|
|
nengel@2
|
668 movt \r, #20
|
|
nengel@2
|
669 vmov.32 d6[0], \r
|
|
nengel@2
|
670 .endm
|
|
nengel@2
|
671
|
|
nengel@2
|
672 .macro lowpass_8 r0, r1, r2, r3, d0, d1, narrow=1
|
|
nengel@2
|
673 .if \narrow
|
|
nengel@2
|
674 t0 .req q0
|
|
nengel@2
|
675 t1 .req q8
|
|
nengel@2
|
676 .else
|
|
nengel@2
|
677 t0 .req \d0
|
|
nengel@2
|
678 t1 .req \d1
|
|
nengel@2
|
679 .endif
|
|
nengel@2
|
680 vext.8 d2, \r0, \r1, #2
|
|
nengel@2
|
681 vext.8 d3, \r0, \r1, #3
|
|
nengel@2
|
682 vaddl.u8 q1, d2, d3
|
|
nengel@2
|
683 vext.8 d4, \r0, \r1, #1
|
|
nengel@2
|
684 vext.8 d5, \r0, \r1, #4
|
|
nengel@2
|
685 vaddl.u8 q2, d4, d5
|
|
nengel@2
|
686 vext.8 d30, \r0, \r1, #5
|
|
nengel@2
|
687 vaddl.u8 t0, \r0, d30
|
|
nengel@2
|
688 vext.8 d18, \r2, \r3, #2
|
|
nengel@2
|
689 vmla.i16 t0, q1, d6[1]
|
|
nengel@2
|
690 vext.8 d19, \r2, \r3, #3
|
|
nengel@2
|
691 vaddl.u8 q9, d18, d19
|
|
nengel@2
|
692 vext.8 d20, \r2, \r3, #1
|
|
nengel@2
|
693 vmls.i16 t0, q2, d6[0]
|
|
nengel@2
|
694 vext.8 d21, \r2, \r3, #4
|
|
nengel@2
|
695 vaddl.u8 q10, d20, d21
|
|
nengel@2
|
696 vext.8 d31, \r2, \r3, #5
|
|
nengel@2
|
697 vaddl.u8 t1, \r2, d31
|
|
nengel@2
|
698 vmla.i16 t1, q9, d6[1]
|
|
nengel@2
|
699 vmls.i16 t1, q10, d6[0]
|
|
nengel@2
|
700 .if \narrow
|
|
nengel@2
|
701 vqrshrun.s16 \d0, t0, #5
|
|
nengel@2
|
702 vqrshrun.s16 \d1, t1, #5
|
|
nengel@2
|
703 .endif
|
|
nengel@2
|
704 .unreq t0
|
|
nengel@2
|
705 .unreq t1
|
|
nengel@2
|
706 .endm
|
|
nengel@2
|
707
|
|
nengel@2
|
708 .macro lowpass_8_1 r0, r1, d0, narrow=1
|
|
nengel@2
|
709 .if \narrow
|
|
nengel@2
|
710 t0 .req q0
|
|
nengel@2
|
711 .else
|
|
nengel@2
|
712 t0 .req \d0
|
|
nengel@2
|
713 .endif
|
|
nengel@2
|
714 vext.8 d2, \r0, \r1, #2
|
|
nengel@2
|
715 vext.8 d3, \r0, \r1, #3
|
|
nengel@2
|
716 vaddl.u8 q1, d2, d3
|
|
nengel@2
|
717 vext.8 d4, \r0, \r1, #1
|
|
nengel@2
|
718 vext.8 d5, \r0, \r1, #4
|
|
nengel@2
|
719 vaddl.u8 q2, d4, d5
|
|
nengel@2
|
720 vext.8 d30, \r0, \r1, #5
|
|
nengel@2
|
721 vaddl.u8 t0, \r0, d30
|
|
nengel@2
|
722 vmla.i16 t0, q1, d6[1]
|
|
nengel@2
|
723 vmls.i16 t0, q2, d6[0]
|
|
nengel@2
|
724 .if \narrow
|
|
nengel@2
|
725 vqrshrun.s16 \d0, t0, #5
|
|
nengel@2
|
726 .endif
|
|
nengel@2
|
727 .unreq t0
|
|
nengel@2
|
728 .endm
|
|
nengel@2
|
729
|
|
nengel@2
|
730 .macro lowpass_8.16 r0, r1, l0, h0, l1, h1, d
|
|
nengel@2
|
731 vext.16 q1, \r0, \r1, #2
|
|
nengel@2
|
732 vext.16 q0, \r0, \r1, #3
|
|
nengel@2
|
733 vaddl.s16 q9, d2, d0
|
|
nengel@2
|
734 vext.16 q2, \r0, \r1, #1
|
|
nengel@2
|
735 vaddl.s16 q1, d3, d1
|
|
nengel@2
|
736 vext.16 q3, \r0, \r1, #4
|
|
nengel@2
|
737 vaddl.s16 q10, d4, d6
|
|
nengel@2
|
738 vext.16 \r1, \r0, \r1, #5
|
|
nengel@2
|
739 vaddl.s16 q2, d5, d7
|
|
nengel@2
|
740 vaddl.s16 q0, \h0, \h1
|
|
nengel@2
|
741 vaddl.s16 q8, \l0, \l1
|
|
nengel@2
|
742
|
|
nengel@2
|
743 vshl.i32 q3, q9, #4
|
|
nengel@2
|
744 vshl.i32 q9, q9, #2
|
|
nengel@2
|
745 vshl.i32 q15, q10, #2
|
|
nengel@2
|
746 vadd.i32 q9, q9, q3
|
|
nengel@2
|
747 vadd.i32 q10, q10, q15
|
|
nengel@2
|
748
|
|
nengel@2
|
749 vshl.i32 q3, q1, #4
|
|
nengel@2
|
750 vshl.i32 q1, q1, #2
|
|
nengel@2
|
751 vshl.i32 q15, q2, #2
|
|
nengel@2
|
752 vadd.i32 q1, q1, q3
|
|
nengel@2
|
753 vadd.i32 q2, q2, q15
|
|
nengel@2
|
754
|
|
nengel@2
|
755 vadd.i32 q9, q9, q8
|
|
nengel@2
|
756 vsub.i32 q9, q9, q10
|
|
nengel@2
|
757
|
|
nengel@2
|
758 vadd.i32 q1, q1, q0
|
|
nengel@2
|
759 vsub.i32 q1, q1, q2
|
|
nengel@2
|
760
|
|
nengel@2
|
761 vrshrn.s32 d18, q9, #10
|
|
nengel@2
|
762 vrshrn.s32 d19, q1, #10
|
|
nengel@2
|
763
|
|
nengel@2
|
764 vqmovun.s16 \d, q9
|
|
nengel@2
|
765 .endm
|
|
nengel@2
|
766
|
|
nengel@2
|
767 function put_h264_qpel16_h_lowpass_neon_packed
|
|
nengel@2
|
768 mov r4, lr
|
|
nengel@2
|
769 mov ip, #16
|
|
nengel@2
|
770 mov r3, #8
|
|
nengel@2
|
771 bl put_h264_qpel8_h_lowpass_neon
|
|
nengel@2
|
772 sub r1, r1, r2, lsl #4
|
|
nengel@2
|
773 add r1, r1, #8
|
|
nengel@2
|
774 mov ip, #16
|
|
nengel@2
|
775 mov lr, r4
|
|
nengel@2
|
776 b put_h264_qpel8_h_lowpass_neon
|
|
nengel@2
|
777 endfunc
|
|
nengel@2
|
778
|
|
nengel@2
|
779 .macro h264_qpel_h_lowpass type
|
|
nengel@2
|
780 function \type\()_h264_qpel16_h_lowpass_neon
|
|
nengel@2
|
781 push {lr}
|
|
nengel@2
|
782 mov ip, #16
|
|
nengel@2
|
783 bl \type\()_h264_qpel8_h_lowpass_neon
|
|
nengel@2
|
784 sub r0, r0, r3, lsl #4
|
|
nengel@2
|
785 sub r1, r1, r2, lsl #4
|
|
nengel@2
|
786 add r0, r0, #8
|
|
nengel@2
|
787 add r1, r1, #8
|
|
nengel@2
|
788 mov ip, #16
|
|
nengel@2
|
789 pop {lr}
|
|
nengel@2
|
790 endfunc
|
|
nengel@2
|
791
|
|
nengel@2
|
792 function \type\()_h264_qpel8_h_lowpass_neon
|
|
nengel@2
|
793 1: vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
794 vld1.64 {d16,d17}, [r1], r2
|
|
nengel@2
|
795 subs ip, ip, #2
|
|
nengel@2
|
796 lowpass_8 d0, d1, d16, d17, d0, d16
|
|
nengel@2
|
797 .ifc \type,avg
|
|
nengel@2
|
798 vld1.8 {d2}, [r0,:64], r3
|
|
nengel@2
|
799 vrhadd.u8 d0, d0, d2
|
|
nengel@2
|
800 vld1.8 {d3}, [r0,:64]
|
|
nengel@2
|
801 vrhadd.u8 d16, d16, d3
|
|
nengel@2
|
802 sub r0, r0, r3
|
|
nengel@2
|
803 .endif
|
|
nengel@2
|
804 vst1.64 {d0}, [r0,:64], r3
|
|
nengel@2
|
805 vst1.64 {d16}, [r0,:64], r3
|
|
nengel@2
|
806 bne 1b
|
|
nengel@2
|
807 bx lr
|
|
nengel@2
|
808 endfunc
|
|
nengel@2
|
809 .endm
|
|
nengel@2
|
810
|
|
nengel@2
|
811 h264_qpel_h_lowpass put
|
|
nengel@2
|
812 h264_qpel_h_lowpass avg
|
|
nengel@2
|
813
|
|
nengel@2
|
814 .macro h264_qpel_h_lowpass_l2 type
|
|
nengel@2
|
815 function \type\()_h264_qpel16_h_lowpass_l2_neon
|
|
nengel@2
|
816 push {lr}
|
|
nengel@2
|
817 mov ip, #16
|
|
nengel@2
|
818 bl \type\()_h264_qpel8_h_lowpass_l2_neon
|
|
nengel@2
|
819 sub r0, r0, r2, lsl #4
|
|
nengel@2
|
820 sub r1, r1, r2, lsl #4
|
|
nengel@2
|
821 sub r3, r3, r2, lsl #4
|
|
nengel@2
|
822 add r0, r0, #8
|
|
nengel@2
|
823 add r1, r1, #8
|
|
nengel@2
|
824 add r3, r3, #8
|
|
nengel@2
|
825 mov ip, #16
|
|
nengel@2
|
826 pop {lr}
|
|
nengel@2
|
827 endfunc
|
|
nengel@2
|
828
|
|
nengel@2
|
829 function \type\()_h264_qpel8_h_lowpass_l2_neon
|
|
nengel@2
|
830 1: vld1.64 {d0, d1}, [r1], r2
|
|
nengel@2
|
831 vld1.64 {d16,d17}, [r1], r2
|
|
nengel@2
|
832 vld1.64 {d28}, [r3], r2
|
|
nengel@2
|
833 vld1.64 {d29}, [r3], r2
|
|
nengel@2
|
834 subs ip, ip, #2
|
|
nengel@2
|
835 lowpass_8 d0, d1, d16, d17, d0, d1
|
|
nengel@2
|
836 vrhadd.u8 q0, q0, q14
|
|
nengel@2
|
837 .ifc \type,avg
|
|
nengel@2
|
838 vld1.8 {d2}, [r0,:64], r2
|
|
nengel@2
|
839 vrhadd.u8 d0, d0, d2
|
|
nengel@2
|
840 vld1.8 {d3}, [r0,:64]
|
|
nengel@2
|
841 vrhadd.u8 d1, d1, d3
|
|
nengel@2
|
842 sub r0, r0, r2
|
|
nengel@2
|
843 .endif
|
|
nengel@2
|
844 vst1.64 {d0}, [r0,:64], r2
|
|
nengel@2
|
845 vst1.64 {d1}, [r0,:64], r2
|
|
nengel@2
|
846 bne 1b
|
|
nengel@2
|
847 bx lr
|
|
nengel@2
|
848 endfunc
|
|
nengel@2
|
849 .endm
|
|
nengel@2
|
850
|
|
nengel@2
|
851 h264_qpel_h_lowpass_l2 put
|
|
nengel@2
|
852 h264_qpel_h_lowpass_l2 avg
|
|
nengel@2
|
853
|
|
nengel@2
|
854 function put_h264_qpel16_v_lowpass_neon_packed
|
|
nengel@2
|
855 mov r4, lr
|
|
nengel@2
|
856 mov r2, #8
|
|
nengel@2
|
857 bl put_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
858 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
859 bl put_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
860 sub r1, r1, r3, lsl #4
|
|
nengel@2
|
861 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
862 add r1, r1, #8
|
|
nengel@2
|
863 bl put_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
864 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
865 mov lr, r4
|
|
nengel@2
|
866 b put_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
867 endfunc
|
|
nengel@2
|
868
|
|
nengel@2
|
869 .macro h264_qpel_v_lowpass type
|
|
nengel@2
|
870 function \type\()_h264_qpel16_v_lowpass_neon
|
|
nengel@2
|
871 mov r4, lr
|
|
nengel@2
|
872 bl \type\()_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
873 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
874 bl \type\()_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
875 sub r0, r0, r2, lsl #4
|
|
nengel@2
|
876 add r0, r0, #8
|
|
nengel@2
|
877 sub r1, r1, r3, lsl #4
|
|
nengel@2
|
878 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
879 add r1, r1, #8
|
|
nengel@2
|
880 bl \type\()_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
881 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
882 mov lr, r4
|
|
nengel@2
|
883 endfunc
|
|
nengel@2
|
884
|
|
nengel@2
|
885 function \type\()_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
886 vld1.64 {d8}, [r1], r3
|
|
nengel@2
|
887 vld1.64 {d10}, [r1], r3
|
|
nengel@2
|
888 vld1.64 {d12}, [r1], r3
|
|
nengel@2
|
889 vld1.64 {d14}, [r1], r3
|
|
nengel@2
|
890 vld1.64 {d22}, [r1], r3
|
|
nengel@2
|
891 vld1.64 {d24}, [r1], r3
|
|
nengel@2
|
892 vld1.64 {d26}, [r1], r3
|
|
nengel@2
|
893 vld1.64 {d28}, [r1], r3
|
|
nengel@2
|
894 vld1.64 {d9}, [r1], r3
|
|
nengel@2
|
895 vld1.64 {d11}, [r1], r3
|
|
nengel@2
|
896 vld1.64 {d13}, [r1], r3
|
|
nengel@2
|
897 vld1.64 {d15}, [r1], r3
|
|
nengel@2
|
898 vld1.64 {d23}, [r1]
|
|
nengel@2
|
899
|
|
nengel@2
|
900 transpose_8x8 q4, q5, q6, q7, q11, q12, q13, q14
|
|
nengel@2
|
901 lowpass_8 d8, d9, d10, d11, d8, d10
|
|
nengel@2
|
902 lowpass_8 d12, d13, d14, d15, d12, d14
|
|
nengel@2
|
903 lowpass_8 d22, d23, d24, d25, d22, d24
|
|
nengel@2
|
904 lowpass_8 d26, d27, d28, d29, d26, d28
|
|
nengel@2
|
905 transpose_8x8 d8, d10, d12, d14, d22, d24, d26, d28
|
|
nengel@2
|
906
|
|
nengel@2
|
907 .ifc \type,avg
|
|
nengel@2
|
908 vld1.8 {d9}, [r0,:64], r2
|
|
nengel@2
|
909 vrhadd.u8 d8, d8, d9
|
|
nengel@2
|
910 vld1.8 {d11}, [r0,:64], r2
|
|
nengel@2
|
911 vrhadd.u8 d10, d10, d11
|
|
nengel@2
|
912 vld1.8 {d13}, [r0,:64], r2
|
|
nengel@2
|
913 vrhadd.u8 d12, d12, d13
|
|
nengel@2
|
914 vld1.8 {d15}, [r0,:64], r2
|
|
nengel@2
|
915 vrhadd.u8 d14, d14, d15
|
|
nengel@2
|
916 vld1.8 {d23}, [r0,:64], r2
|
|
nengel@2
|
917 vrhadd.u8 d22, d22, d23
|
|
nengel@2
|
918 vld1.8 {d25}, [r0,:64], r2
|
|
nengel@2
|
919 vrhadd.u8 d24, d24, d25
|
|
nengel@2
|
920 vld1.8 {d27}, [r0,:64], r2
|
|
nengel@2
|
921 vrhadd.u8 d26, d26, d27
|
|
nengel@2
|
922 vld1.8 {d29}, [r0,:64], r2
|
|
nengel@2
|
923 vrhadd.u8 d28, d28, d29
|
|
nengel@2
|
924 sub r0, r0, r2, lsl #3
|
|
nengel@2
|
925 .endif
|
|
nengel@2
|
926
|
|
nengel@2
|
927 vst1.64 {d8}, [r0,:64], r2
|
|
nengel@2
|
928 vst1.64 {d10}, [r0,:64], r2
|
|
nengel@2
|
929 vst1.64 {d12}, [r0,:64], r2
|
|
nengel@2
|
930 vst1.64 {d14}, [r0,:64], r2
|
|
nengel@2
|
931 vst1.64 {d22}, [r0,:64], r2
|
|
nengel@2
|
932 vst1.64 {d24}, [r0,:64], r2
|
|
nengel@2
|
933 vst1.64 {d26}, [r0,:64], r2
|
|
nengel@2
|
934 vst1.64 {d28}, [r0,:64], r2
|
|
nengel@2
|
935
|
|
nengel@2
|
936 bx lr
|
|
nengel@2
|
937 endfunc
|
|
nengel@2
|
938 .endm
|
|
nengel@2
|
939
|
|
nengel@2
|
940 h264_qpel_v_lowpass put
|
|
nengel@2
|
941 h264_qpel_v_lowpass avg
|
|
nengel@2
|
942
|
|
nengel@2
|
943 .macro h264_qpel_v_lowpass_l2 type
|
|
nengel@2
|
944 function \type\()_h264_qpel16_v_lowpass_l2_neon
|
|
nengel@2
|
945 mov r4, lr
|
|
nengel@2
|
946 bl \type\()_h264_qpel8_v_lowpass_l2_neon
|
|
nengel@2
|
947 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
948 bl \type\()_h264_qpel8_v_lowpass_l2_neon
|
|
nengel@2
|
949 sub r0, r0, r3, lsl #4
|
|
nengel@2
|
950 sub ip, ip, r2, lsl #4
|
|
nengel@2
|
951 add r0, r0, #8
|
|
nengel@2
|
952 add ip, ip, #8
|
|
nengel@2
|
953 sub r1, r1, r3, lsl #4
|
|
nengel@2
|
954 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
955 add r1, r1, #8
|
|
nengel@2
|
956 bl \type\()_h264_qpel8_v_lowpass_l2_neon
|
|
nengel@2
|
957 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
958 mov lr, r4
|
|
nengel@2
|
959 endfunc
|
|
nengel@2
|
960
|
|
nengel@2
|
961 function \type\()_h264_qpel8_v_lowpass_l2_neon
|
|
nengel@2
|
962 vld1.64 {d8}, [r1], r3
|
|
nengel@2
|
963 vld1.64 {d10}, [r1], r3
|
|
nengel@2
|
964 vld1.64 {d12}, [r1], r3
|
|
nengel@2
|
965 vld1.64 {d14}, [r1], r3
|
|
nengel@2
|
966 vld1.64 {d22}, [r1], r3
|
|
nengel@2
|
967 vld1.64 {d24}, [r1], r3
|
|
nengel@2
|
968 vld1.64 {d26}, [r1], r3
|
|
nengel@2
|
969 vld1.64 {d28}, [r1], r3
|
|
nengel@2
|
970 vld1.64 {d9}, [r1], r3
|
|
nengel@2
|
971 vld1.64 {d11}, [r1], r3
|
|
nengel@2
|
972 vld1.64 {d13}, [r1], r3
|
|
nengel@2
|
973 vld1.64 {d15}, [r1], r3
|
|
nengel@2
|
974 vld1.64 {d23}, [r1]
|
|
nengel@2
|
975
|
|
nengel@2
|
976 transpose_8x8 q4, q5, q6, q7, q11, q12, q13, q14
|
|
nengel@2
|
977 lowpass_8 d8, d9, d10, d11, d8, d9
|
|
nengel@2
|
978 lowpass_8 d12, d13, d14, d15, d12, d13
|
|
nengel@2
|
979 lowpass_8 d22, d23, d24, d25, d22, d23
|
|
nengel@2
|
980 lowpass_8 d26, d27, d28, d29, d26, d27
|
|
nengel@2
|
981 transpose_8x8 d8, d9, d12, d13, d22, d23, d26, d27
|
|
nengel@2
|
982
|
|
nengel@2
|
983 vld1.64 {d0}, [ip], r2
|
|
nengel@2
|
984 vld1.64 {d1}, [ip], r2
|
|
nengel@2
|
985 vld1.64 {d2}, [ip], r2
|
|
nengel@2
|
986 vld1.64 {d3}, [ip], r2
|
|
nengel@2
|
987 vld1.64 {d4}, [ip], r2
|
|
nengel@2
|
988 vrhadd.u8 q0, q0, q4
|
|
nengel@2
|
989 vld1.64 {d5}, [ip], r2
|
|
nengel@2
|
990 vrhadd.u8 q1, q1, q6
|
|
nengel@2
|
991 vld1.64 {d10}, [ip], r2
|
|
nengel@2
|
992 vrhadd.u8 q2, q2, q11
|
|
nengel@2
|
993 vld1.64 {d11}, [ip], r2
|
|
nengel@2
|
994 vrhadd.u8 q5, q5, q13
|
|
nengel@2
|
995
|
|
nengel@2
|
996 .ifc \type,avg
|
|
nengel@2
|
997 vld1.8 {d16}, [r0,:64], r3
|
|
nengel@2
|
998 vrhadd.u8 d0, d0, d16
|
|
nengel@2
|
999 vld1.8 {d17}, [r0,:64], r3
|
|
nengel@2
|
1000 vrhadd.u8 d1, d1, d17
|
|
nengel@2
|
1001 vld1.8 {d16}, [r0,:64], r3
|
|
nengel@2
|
1002 vrhadd.u8 d2, d2, d16
|
|
nengel@2
|
1003 vld1.8 {d17}, [r0,:64], r3
|
|
nengel@2
|
1004 vrhadd.u8 d3, d3, d17
|
|
nengel@2
|
1005 vld1.8 {d16}, [r0,:64], r3
|
|
nengel@2
|
1006 vrhadd.u8 d4, d4, d16
|
|
nengel@2
|
1007 vld1.8 {d17}, [r0,:64], r3
|
|
nengel@2
|
1008 vrhadd.u8 d5, d5, d17
|
|
nengel@2
|
1009 vld1.8 {d16}, [r0,:64], r3
|
|
nengel@2
|
1010 vrhadd.u8 d10, d10, d16
|
|
nengel@2
|
1011 vld1.8 {d17}, [r0,:64], r3
|
|
nengel@2
|
1012 vrhadd.u8 d11, d11, d17
|
|
nengel@2
|
1013 sub r0, r0, r3, lsl #3
|
|
nengel@2
|
1014 .endif
|
|
nengel@2
|
1015
|
|
nengel@2
|
1016 vst1.64 {d0}, [r0,:64], r3
|
|
nengel@2
|
1017 vst1.64 {d1}, [r0,:64], r3
|
|
nengel@2
|
1018 vst1.64 {d2}, [r0,:64], r3
|
|
nengel@2
|
1019 vst1.64 {d3}, [r0,:64], r3
|
|
nengel@2
|
1020 vst1.64 {d4}, [r0,:64], r3
|
|
nengel@2
|
1021 vst1.64 {d5}, [r0,:64], r3
|
|
nengel@2
|
1022 vst1.64 {d10}, [r0,:64], r3
|
|
nengel@2
|
1023 vst1.64 {d11}, [r0,:64], r3
|
|
nengel@2
|
1024
|
|
nengel@2
|
1025 bx lr
|
|
nengel@2
|
1026 endfunc
|
|
nengel@2
|
1027 .endm
|
|
nengel@2
|
1028
|
|
nengel@2
|
1029 h264_qpel_v_lowpass_l2 put
|
|
nengel@2
|
1030 h264_qpel_v_lowpass_l2 avg
|
|
nengel@2
|
1031
|
|
nengel@2
|
1032 function put_h264_qpel8_hv_lowpass_neon_top
|
|
nengel@2
|
1033 lowpass_const ip
|
|
nengel@2
|
1034 mov ip, #12
|
|
nengel@2
|
1035 1: vld1.64 {d0, d1}, [r1], r3
|
|
nengel@2
|
1036 vld1.64 {d16,d17}, [r1], r3
|
|
nengel@2
|
1037 subs ip, ip, #2
|
|
nengel@2
|
1038 lowpass_8 d0, d1, d16, d17, q11, q12, narrow=0
|
|
nengel@2
|
1039 vst1.64 {d22-d25}, [r4,:128]!
|
|
nengel@2
|
1040 bne 1b
|
|
nengel@2
|
1041
|
|
nengel@2
|
1042 vld1.64 {d0, d1}, [r1]
|
|
nengel@2
|
1043 lowpass_8_1 d0, d1, q12, narrow=0
|
|
nengel@2
|
1044
|
|
nengel@2
|
1045 mov ip, #-16
|
|
nengel@2
|
1046 add r4, r4, ip
|
|
nengel@2
|
1047 vld1.64 {d30,d31}, [r4,:128], ip
|
|
nengel@2
|
1048 vld1.64 {d20,d21}, [r4,:128], ip
|
|
nengel@2
|
1049 vld1.64 {d18,d19}, [r4,:128], ip
|
|
nengel@2
|
1050 vld1.64 {d16,d17}, [r4,:128], ip
|
|
nengel@2
|
1051 vld1.64 {d14,d15}, [r4,:128], ip
|
|
nengel@2
|
1052 vld1.64 {d12,d13}, [r4,:128], ip
|
|
nengel@2
|
1053 vld1.64 {d10,d11}, [r4,:128], ip
|
|
nengel@2
|
1054 vld1.64 {d8, d9}, [r4,:128], ip
|
|
nengel@2
|
1055 vld1.64 {d6, d7}, [r4,:128], ip
|
|
nengel@2
|
1056 vld1.64 {d4, d5}, [r4,:128], ip
|
|
nengel@2
|
1057 vld1.64 {d2, d3}, [r4,:128], ip
|
|
nengel@2
|
1058 vld1.64 {d0, d1}, [r4,:128]
|
|
nengel@2
|
1059
|
|
nengel@2
|
1060 swap4 d1, d3, d5, d7, d8, d10, d12, d14
|
|
nengel@2
|
1061 transpose16_4x4 q0, q1, q2, q3, q4, q5, q6, q7
|
|
nengel@2
|
1062
|
|
nengel@2
|
1063 swap4 d17, d19, d21, d31, d24, d26, d28, d22
|
|
nengel@2
|
1064 transpose16_4x4 q8, q9, q10, q15, q12, q13, q14, q11
|
|
nengel@2
|
1065
|
|
nengel@2
|
1066 vst1.64 {d30,d31}, [r4,:128]!
|
|
nengel@2
|
1067 vst1.64 {d6, d7}, [r4,:128]!
|
|
nengel@2
|
1068 vst1.64 {d20,d21}, [r4,:128]!
|
|
nengel@2
|
1069 vst1.64 {d4, d5}, [r4,:128]!
|
|
nengel@2
|
1070 vst1.64 {d18,d19}, [r4,:128]!
|
|
nengel@2
|
1071 vst1.64 {d2, d3}, [r4,:128]!
|
|
nengel@2
|
1072 vst1.64 {d16,d17}, [r4,:128]!
|
|
nengel@2
|
1073 vst1.64 {d0, d1}, [r4,:128]
|
|
nengel@2
|
1074
|
|
nengel@2
|
1075 lowpass_8.16 q4, q12, d8, d9, d24, d25, d8
|
|
nengel@2
|
1076 lowpass_8.16 q5, q13, d10, d11, d26, d27, d9
|
|
nengel@2
|
1077 lowpass_8.16 q6, q14, d12, d13, d28, d29, d10
|
|
nengel@2
|
1078 lowpass_8.16 q7, q11, d14, d15, d22, d23, d11
|
|
nengel@2
|
1079
|
|
nengel@2
|
1080 vld1.64 {d16,d17}, [r4,:128], ip
|
|
nengel@2
|
1081 vld1.64 {d30,d31}, [r4,:128], ip
|
|
nengel@2
|
1082 lowpass_8.16 q8, q15, d16, d17, d30, d31, d12
|
|
nengel@2
|
1083 vld1.64 {d16,d17}, [r4,:128], ip
|
|
nengel@2
|
1084 vld1.64 {d30,d31}, [r4,:128], ip
|
|
nengel@2
|
1085 lowpass_8.16 q8, q15, d16, d17, d30, d31, d13
|
|
nengel@2
|
1086 vld1.64 {d16,d17}, [r4,:128], ip
|
|
nengel@2
|
1087 vld1.64 {d30,d31}, [r4,:128], ip
|
|
nengel@2
|
1088 lowpass_8.16 q8, q15, d16, d17, d30, d31, d14
|
|
nengel@2
|
1089 vld1.64 {d16,d17}, [r4,:128], ip
|
|
nengel@2
|
1090 vld1.64 {d30,d31}, [r4,:128]
|
|
nengel@2
|
1091 lowpass_8.16 q8, q15, d16, d17, d30, d31, d15
|
|
nengel@2
|
1092
|
|
nengel@2
|
1093 transpose_8x8 d12, d13, d14, d15, d8, d9, d10, d11
|
|
nengel@2
|
1094
|
|
nengel@2
|
1095 bx lr
|
|
nengel@2
|
1096 endfunc
|
|
nengel@2
|
1097
|
|
nengel@2
|
1098 .macro h264_qpel8_hv_lowpass type
|
|
nengel@2
|
1099 function \type\()_h264_qpel8_hv_lowpass_neon
|
|
nengel@2
|
1100 mov r10, lr
|
|
nengel@2
|
1101 bl put_h264_qpel8_hv_lowpass_neon_top
|
|
nengel@2
|
1102 .ifc \type,avg
|
|
nengel@2
|
1103 vld1.8 {d0}, [r0,:64], r2
|
|
nengel@2
|
1104 vrhadd.u8 d12, d12, d0
|
|
nengel@2
|
1105 vld1.8 {d1}, [r0,:64], r2
|
|
nengel@2
|
1106 vrhadd.u8 d13, d13, d1
|
|
nengel@2
|
1107 vld1.8 {d2}, [r0,:64], r2
|
|
nengel@2
|
1108 vrhadd.u8 d14, d14, d2
|
|
nengel@2
|
1109 vld1.8 {d3}, [r0,:64], r2
|
|
nengel@2
|
1110 vrhadd.u8 d15, d15, d3
|
|
nengel@2
|
1111 vld1.8 {d4}, [r0,:64], r2
|
|
nengel@2
|
1112 vrhadd.u8 d8, d8, d4
|
|
nengel@2
|
1113 vld1.8 {d5}, [r0,:64], r2
|
|
nengel@2
|
1114 vrhadd.u8 d9, d9, d5
|
|
nengel@2
|
1115 vld1.8 {d6}, [r0,:64], r2
|
|
nengel@2
|
1116 vrhadd.u8 d10, d10, d6
|
|
nengel@2
|
1117 vld1.8 {d7}, [r0,:64], r2
|
|
nengel@2
|
1118 vrhadd.u8 d11, d11, d7
|
|
nengel@2
|
1119 sub r0, r0, r2, lsl #3
|
|
nengel@2
|
1120 .endif
|
|
nengel@2
|
1121 vst1.64 {d12}, [r0,:64], r2
|
|
nengel@2
|
1122 vst1.64 {d13}, [r0,:64], r2
|
|
nengel@2
|
1123 vst1.64 {d14}, [r0,:64], r2
|
|
nengel@2
|
1124 vst1.64 {d15}, [r0,:64], r2
|
|
nengel@2
|
1125 vst1.64 {d8}, [r0,:64], r2
|
|
nengel@2
|
1126 vst1.64 {d9}, [r0,:64], r2
|
|
nengel@2
|
1127 vst1.64 {d10}, [r0,:64], r2
|
|
nengel@2
|
1128 vst1.64 {d11}, [r0,:64], r2
|
|
nengel@2
|
1129
|
|
nengel@2
|
1130 mov lr, r10
|
|
nengel@2
|
1131 bx lr
|
|
nengel@2
|
1132 endfunc
|
|
nengel@2
|
1133 .endm
|
|
nengel@2
|
1134
|
|
nengel@2
|
1135 h264_qpel8_hv_lowpass put
|
|
nengel@2
|
1136 h264_qpel8_hv_lowpass avg
|
|
nengel@2
|
1137
|
|
nengel@2
|
1138 .macro h264_qpel8_hv_lowpass_l2 type
|
|
nengel@2
|
1139 function \type\()_h264_qpel8_hv_lowpass_l2_neon
|
|
nengel@2
|
1140 mov r10, lr
|
|
nengel@2
|
1141 bl put_h264_qpel8_hv_lowpass_neon_top
|
|
nengel@2
|
1142
|
|
nengel@2
|
1143 vld1.64 {d0, d1}, [r2,:128]!
|
|
nengel@2
|
1144 vld1.64 {d2, d3}, [r2,:128]!
|
|
nengel@2
|
1145 vrhadd.u8 q0, q0, q6
|
|
nengel@2
|
1146 vld1.64 {d4, d5}, [r2,:128]!
|
|
nengel@2
|
1147 vrhadd.u8 q1, q1, q7
|
|
nengel@2
|
1148 vld1.64 {d6, d7}, [r2,:128]!
|
|
nengel@2
|
1149 vrhadd.u8 q2, q2, q4
|
|
nengel@2
|
1150 vrhadd.u8 q3, q3, q5
|
|
nengel@2
|
1151 .ifc \type,avg
|
|
nengel@2
|
1152 vld1.8 {d16}, [r0,:64], r3
|
|
nengel@2
|
1153 vrhadd.u8 d0, d0, d16
|
|
nengel@2
|
1154 vld1.8 {d17}, [r0,:64], r3
|
|
nengel@2
|
1155 vrhadd.u8 d1, d1, d17
|
|
nengel@2
|
1156 vld1.8 {d18}, [r0,:64], r3
|
|
nengel@2
|
1157 vrhadd.u8 d2, d2, d18
|
|
nengel@2
|
1158 vld1.8 {d19}, [r0,:64], r3
|
|
nengel@2
|
1159 vrhadd.u8 d3, d3, d19
|
|
nengel@2
|
1160 vld1.8 {d20}, [r0,:64], r3
|
|
nengel@2
|
1161 vrhadd.u8 d4, d4, d20
|
|
nengel@2
|
1162 vld1.8 {d21}, [r0,:64], r3
|
|
nengel@2
|
1163 vrhadd.u8 d5, d5, d21
|
|
nengel@2
|
1164 vld1.8 {d22}, [r0,:64], r3
|
|
nengel@2
|
1165 vrhadd.u8 d6, d6, d22
|
|
nengel@2
|
1166 vld1.8 {d23}, [r0,:64], r3
|
|
nengel@2
|
1167 vrhadd.u8 d7, d7, d23
|
|
nengel@2
|
1168 sub r0, r0, r3, lsl #3
|
|
nengel@2
|
1169 .endif
|
|
nengel@2
|
1170 vst1.64 {d0}, [r0,:64], r3
|
|
nengel@2
|
1171 vst1.64 {d1}, [r0,:64], r3
|
|
nengel@2
|
1172 vst1.64 {d2}, [r0,:64], r3
|
|
nengel@2
|
1173 vst1.64 {d3}, [r0,:64], r3
|
|
nengel@2
|
1174 vst1.64 {d4}, [r0,:64], r3
|
|
nengel@2
|
1175 vst1.64 {d5}, [r0,:64], r3
|
|
nengel@2
|
1176 vst1.64 {d6}, [r0,:64], r3
|
|
nengel@2
|
1177 vst1.64 {d7}, [r0,:64], r3
|
|
nengel@2
|
1178
|
|
nengel@2
|
1179 mov lr, r10
|
|
nengel@2
|
1180 bx lr
|
|
nengel@2
|
1181 endfunc
|
|
nengel@2
|
1182 .endm
|
|
nengel@2
|
1183
|
|
nengel@2
|
1184 h264_qpel8_hv_lowpass_l2 put
|
|
nengel@2
|
1185 h264_qpel8_hv_lowpass_l2 avg
|
|
nengel@2
|
1186
|
|
nengel@2
|
1187 .macro h264_qpel16_hv type
|
|
nengel@2
|
1188 function \type\()_h264_qpel16_hv_lowpass_neon
|
|
nengel@2
|
1189 mov r9, lr
|
|
nengel@2
|
1190 bl \type\()_h264_qpel8_hv_lowpass_neon
|
|
nengel@2
|
1191 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
1192 bl \type\()_h264_qpel8_hv_lowpass_neon
|
|
nengel@2
|
1193 sub r1, r1, r3, lsl #4
|
|
nengel@2
|
1194 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
1195 add r1, r1, #8
|
|
nengel@2
|
1196 sub r0, r0, r2, lsl #4
|
|
nengel@2
|
1197 add r0, r0, #8
|
|
nengel@2
|
1198 bl \type\()_h264_qpel8_hv_lowpass_neon
|
|
nengel@2
|
1199 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
1200 mov lr, r9
|
|
nengel@2
|
1201 b \type\()_h264_qpel8_hv_lowpass_neon
|
|
nengel@2
|
1202 endfunc
|
|
nengel@2
|
1203
|
|
nengel@2
|
1204 function \type\()_h264_qpel16_hv_lowpass_l2_neon
|
|
nengel@2
|
1205 mov r9, lr
|
|
nengel@2
|
1206 sub r2, r4, #256
|
|
nengel@2
|
1207 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
|
|
nengel@2
|
1208 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
1209 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
|
|
nengel@2
|
1210 sub r1, r1, r3, lsl #4
|
|
nengel@2
|
1211 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
1212 add r1, r1, #8
|
|
nengel@2
|
1213 sub r0, r0, r3, lsl #4
|
|
nengel@2
|
1214 add r0, r0, #8
|
|
nengel@2
|
1215 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
|
|
nengel@2
|
1216 sub r1, r1, r3, lsl #2
|
|
nengel@2
|
1217 mov lr, r9
|
|
nengel@2
|
1218 b \type\()_h264_qpel8_hv_lowpass_l2_neon
|
|
nengel@2
|
1219 endfunc
|
|
nengel@2
|
1220 .endm
|
|
nengel@2
|
1221
|
|
nengel@2
|
1222 h264_qpel16_hv put
|
|
nengel@2
|
1223 h264_qpel16_hv avg
|
|
nengel@2
|
1224
|
|
nengel@2
|
1225 .macro h264_qpel8 type
|
|
nengel@2
|
1226 function ff_\type\()_h264_qpel8_mc10_neon, export=1
|
|
nengel@2
|
1227 lowpass_const r3
|
|
nengel@2
|
1228 mov r3, r1
|
|
nengel@2
|
1229 sub r1, r1, #2
|
|
nengel@2
|
1230 mov ip, #8
|
|
nengel@2
|
1231 b \type\()_h264_qpel8_h_lowpass_l2_neon
|
|
nengel@2
|
1232 endfunc
|
|
nengel@2
|
1233
|
|
nengel@2
|
1234 function ff_\type\()_h264_qpel8_mc20_neon, export=1
|
|
nengel@2
|
1235 lowpass_const r3
|
|
nengel@2
|
1236 sub r1, r1, #2
|
|
nengel@2
|
1237 mov r3, r2
|
|
nengel@2
|
1238 mov ip, #8
|
|
nengel@2
|
1239 b \type\()_h264_qpel8_h_lowpass_neon
|
|
nengel@2
|
1240 endfunc
|
|
nengel@2
|
1241
|
|
nengel@2
|
1242 function ff_\type\()_h264_qpel8_mc30_neon, export=1
|
|
nengel@2
|
1243 lowpass_const r3
|
|
nengel@2
|
1244 add r3, r1, #1
|
|
nengel@2
|
1245 sub r1, r1, #2
|
|
nengel@2
|
1246 mov ip, #8
|
|
nengel@2
|
1247 b \type\()_h264_qpel8_h_lowpass_l2_neon
|
|
nengel@2
|
1248 endfunc
|
|
nengel@2
|
1249
|
|
nengel@2
|
1250 function ff_\type\()_h264_qpel8_mc01_neon, export=1
|
|
nengel@2
|
1251 push {lr}
|
|
nengel@2
|
1252 mov ip, r1
|
|
nengel@2
|
1253 \type\()_h264_qpel8_mc01:
|
|
nengel@2
|
1254 lowpass_const r3
|
|
nengel@2
|
1255 mov r3, r2
|
|
nengel@2
|
1256 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1257 vpush {d8-d15}
|
|
nengel@2
|
1258 bl \type\()_h264_qpel8_v_lowpass_l2_neon
|
|
nengel@2
|
1259 vpop {d8-d15}
|
|
nengel@2
|
1260 pop {pc}
|
|
nengel@2
|
1261 endfunc
|
|
nengel@2
|
1262
|
|
nengel@2
|
1263 function ff_\type\()_h264_qpel8_mc11_neon, export=1
|
|
nengel@2
|
1264 push {r0, r1, r11, lr}
|
|
nengel@2
|
1265 \type\()_h264_qpel8_mc11:
|
|
nengel@2
|
1266 lowpass_const r3
|
|
nengel@2
|
1267 mov r11, sp
|
|
nengel@2
|
1268 bic sp, sp, #15
|
|
nengel@2
|
1269 sub sp, sp, #64
|
|
nengel@2
|
1270 mov r0, sp
|
|
nengel@2
|
1271 sub r1, r1, #2
|
|
nengel@2
|
1272 mov r3, #8
|
|
nengel@2
|
1273 mov ip, #8
|
|
nengel@2
|
1274 vpush {d8-d15}
|
|
nengel@2
|
1275 bl put_h264_qpel8_h_lowpass_neon
|
|
nengel@2
|
1276 ldrd r0, [r11]
|
|
nengel@2
|
1277 mov r3, r2
|
|
nengel@2
|
1278 add ip, sp, #64
|
|
nengel@2
|
1279 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1280 mov r2, #8
|
|
nengel@2
|
1281 bl \type\()_h264_qpel8_v_lowpass_l2_neon
|
|
nengel@2
|
1282 vpop {d8-d15}
|
|
nengel@2
|
1283 add sp, r11, #8
|
|
nengel@2
|
1284 pop {r11, pc}
|
|
nengel@2
|
1285 endfunc
|
|
nengel@2
|
1286
|
|
nengel@2
|
1287 function ff_\type\()_h264_qpel8_mc21_neon, export=1
|
|
nengel@2
|
1288 push {r0, r1, r4, r10, r11, lr}
|
|
nengel@2
|
1289 \type\()_h264_qpel8_mc21:
|
|
nengel@2
|
1290 lowpass_const r3
|
|
nengel@2
|
1291 mov r11, sp
|
|
nengel@2
|
1292 bic sp, sp, #15
|
|
nengel@2
|
1293 sub sp, sp, #(8*8+16*12)
|
|
nengel@2
|
1294 sub r1, r1, #2
|
|
nengel@2
|
1295 mov r3, #8
|
|
nengel@2
|
1296 mov r0, sp
|
|
nengel@2
|
1297 mov ip, #8
|
|
nengel@2
|
1298 vpush {d8-d15}
|
|
nengel@2
|
1299 bl put_h264_qpel8_h_lowpass_neon
|
|
nengel@2
|
1300 mov r4, r0
|
|
nengel@2
|
1301 ldrd r0, [r11]
|
|
nengel@2
|
1302 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1303 sub r1, r1, #2
|
|
nengel@2
|
1304 mov r3, r2
|
|
nengel@2
|
1305 sub r2, r4, #64
|
|
nengel@2
|
1306 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
|
|
nengel@2
|
1307 vpop {d8-d15}
|
|
nengel@2
|
1308 add sp, r11, #8
|
|
nengel@2
|
1309 pop {r4, r10, r11, pc}
|
|
nengel@2
|
1310 endfunc
|
|
nengel@2
|
1311
|
|
nengel@2
|
1312 function ff_\type\()_h264_qpel8_mc31_neon, export=1
|
|
nengel@2
|
1313 add r1, r1, #1
|
|
nengel@2
|
1314 push {r0, r1, r11, lr}
|
|
nengel@2
|
1315 sub r1, r1, #1
|
|
nengel@2
|
1316 b \type\()_h264_qpel8_mc11
|
|
nengel@2
|
1317 endfunc
|
|
nengel@2
|
1318
|
|
nengel@2
|
1319 function ff_\type\()_h264_qpel8_mc02_neon, export=1
|
|
nengel@2
|
1320 push {lr}
|
|
nengel@2
|
1321 lowpass_const r3
|
|
nengel@2
|
1322 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1323 mov r3, r2
|
|
nengel@2
|
1324 vpush {d8-d15}
|
|
nengel@2
|
1325 bl \type\()_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
1326 vpop {d8-d15}
|
|
nengel@2
|
1327 pop {pc}
|
|
nengel@2
|
1328 endfunc
|
|
nengel@2
|
1329
|
|
nengel@2
|
1330 function ff_\type\()_h264_qpel8_mc12_neon, export=1
|
|
nengel@2
|
1331 push {r0, r1, r4, r10, r11, lr}
|
|
nengel@2
|
1332 \type\()_h264_qpel8_mc12:
|
|
nengel@2
|
1333 lowpass_const r3
|
|
nengel@2
|
1334 mov r11, sp
|
|
nengel@2
|
1335 bic sp, sp, #15
|
|
nengel@2
|
1336 sub sp, sp, #(8*8+16*12)
|
|
nengel@2
|
1337 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1338 mov r3, r2
|
|
nengel@2
|
1339 mov r2, #8
|
|
nengel@2
|
1340 mov r0, sp
|
|
nengel@2
|
1341 vpush {d8-d15}
|
|
nengel@2
|
1342 bl put_h264_qpel8_v_lowpass_neon
|
|
nengel@2
|
1343 mov r4, r0
|
|
nengel@2
|
1344 ldrd r0, [r11]
|
|
nengel@2
|
1345 sub r1, r1, r3, lsl #1
|
|
nengel@2
|
1346 sub r1, r1, #2
|
|
nengel@2
|
1347 sub r2, r4, #64
|
|
nengel@2
|
1348 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
|
|
nengel@2
|
1349 vpop {d8-d15}
|
|
nengel@2
|
1350 add sp, r11, #8
|
|
nengel@2
|
1351 pop {r4, r10, r11, pc}
|
|
nengel@2
|
1352 endfunc
|
|
nengel@2
|
1353
|
|
nengel@2
|
1354 function ff_\type\()_h264_qpel8_mc22_neon, export=1
|
|
nengel@2
|
1355 push {r4, r10, r11, lr}
|
|
nengel@2
|
1356 mov r11, sp
|
|
nengel@2
|
1357 bic sp, sp, #15
|
|
nengel@2
|
1358 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1359 sub r1, r1, #2
|
|
nengel@2
|
1360 mov r3, r2
|
|
nengel@2
|
1361 sub sp, sp, #(16*12)
|
|
nengel@2
|
1362 mov r4, sp
|
|
nengel@2
|
1363 vpush {d8-d15}
|
|
nengel@2
|
1364 bl \type\()_h264_qpel8_hv_lowpass_neon
|
|
nengel@2
|
1365 vpop {d8-d15}
|
|
nengel@2
|
1366 mov sp, r11
|
|
nengel@2
|
1367 pop {r4, r10, r11, pc}
|
|
nengel@2
|
1368 endfunc
|
|
nengel@2
|
1369
|
|
nengel@2
|
1370 function ff_\type\()_h264_qpel8_mc32_neon, export=1
|
|
nengel@2
|
1371 push {r0, r1, r4, r10, r11, lr}
|
|
nengel@2
|
1372 add r1, r1, #1
|
|
nengel@2
|
1373 b \type\()_h264_qpel8_mc12
|
|
nengel@2
|
1374 endfunc
|
|
nengel@2
|
1375
|
|
nengel@2
|
1376 function ff_\type\()_h264_qpel8_mc03_neon, export=1
|
|
nengel@2
|
1377 push {lr}
|
|
nengel@2
|
1378 add ip, r1, r2
|
|
nengel@2
|
1379 b \type\()_h264_qpel8_mc01
|
|
nengel@2
|
1380 endfunc
|
|
nengel@2
|
1381
|
|
nengel@2
|
1382 function ff_\type\()_h264_qpel8_mc13_neon, export=1
|
|
nengel@2
|
1383 push {r0, r1, r11, lr}
|
|
nengel@2
|
1384 add r1, r1, r2
|
|
nengel@2
|
1385 b \type\()_h264_qpel8_mc11
|
|
nengel@2
|
1386 endfunc
|
|
nengel@2
|
1387
|
|
nengel@2
|
1388 function ff_\type\()_h264_qpel8_mc23_neon, export=1
|
|
nengel@2
|
1389 push {r0, r1, r4, r10, r11, lr}
|
|
nengel@2
|
1390 add r1, r1, r2
|
|
nengel@2
|
1391 b \type\()_h264_qpel8_mc21
|
|
nengel@2
|
1392 endfunc
|
|
nengel@2
|
1393
|
|
nengel@2
|
1394 function ff_\type\()_h264_qpel8_mc33_neon, export=1
|
|
nengel@2
|
1395 add r1, r1, #1
|
|
nengel@2
|
1396 push {r0, r1, r11, lr}
|
|
nengel@2
|
1397 add r1, r1, r2
|
|
nengel@2
|
1398 sub r1, r1, #1
|
|
nengel@2
|
1399 b \type\()_h264_qpel8_mc11
|
|
nengel@2
|
1400 endfunc
|
|
nengel@2
|
1401 .endm
|
|
nengel@2
|
1402
|
|
nengel@2
|
1403 h264_qpel8 put
|
|
nengel@2
|
1404 h264_qpel8 avg
|
|
nengel@2
|
1405
|
|
nengel@2
|
1406 .macro h264_qpel16 type
|
|
nengel@2
|
1407 function ff_\type\()_h264_qpel16_mc10_neon, export=1
|
|
nengel@2
|
1408 lowpass_const r3
|
|
nengel@2
|
1409 mov r3, r1
|
|
nengel@2
|
1410 sub r1, r1, #2
|
|
nengel@2
|
1411 b \type\()_h264_qpel16_h_lowpass_l2_neon
|
|
nengel@2
|
1412 endfunc
|
|
nengel@2
|
1413
|
|
nengel@2
|
1414 function ff_\type\()_h264_qpel16_mc20_neon, export=1
|
|
nengel@2
|
1415 lowpass_const r3
|
|
nengel@2
|
1416 sub r1, r1, #2
|
|
nengel@2
|
1417 mov r3, r2
|
|
nengel@2
|
1418 b \type\()_h264_qpel16_h_lowpass_neon
|
|
nengel@2
|
1419 endfunc
|
|
nengel@2
|
1420
|
|
nengel@2
|
1421 function ff_\type\()_h264_qpel16_mc30_neon, export=1
|
|
nengel@2
|
1422 lowpass_const r3
|
|
nengel@2
|
1423 add r3, r1, #1
|
|
nengel@2
|
1424 sub r1, r1, #2
|
|
nengel@2
|
1425 b \type\()_h264_qpel16_h_lowpass_l2_neon
|
|
nengel@2
|
1426 endfunc
|
|
nengel@2
|
1427
|
|
nengel@2
|
1428 function ff_\type\()_h264_qpel16_mc01_neon, export=1
|
|
nengel@2
|
1429 push {r4, lr}
|
|
nengel@2
|
1430 mov ip, r1
|
|
nengel@2
|
1431 \type\()_h264_qpel16_mc01:
|
|
nengel@2
|
1432 lowpass_const r3
|
|
nengel@2
|
1433 mov r3, r2
|
|
nengel@2
|
1434 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1435 vpush {d8-d15}
|
|
nengel@2
|
1436 bl \type\()_h264_qpel16_v_lowpass_l2_neon
|
|
nengel@2
|
1437 vpop {d8-d15}
|
|
nengel@2
|
1438 pop {r4, pc}
|
|
nengel@2
|
1439 endfunc
|
|
nengel@2
|
1440
|
|
nengel@2
|
1441 function ff_\type\()_h264_qpel16_mc11_neon, export=1
|
|
nengel@2
|
1442 push {r0, r1, r4, r11, lr}
|
|
nengel@2
|
1443 \type\()_h264_qpel16_mc11:
|
|
nengel@2
|
1444 lowpass_const r3
|
|
nengel@2
|
1445 mov r11, sp
|
|
nengel@2
|
1446 bic sp, sp, #15
|
|
nengel@2
|
1447 sub sp, sp, #256
|
|
nengel@2
|
1448 mov r0, sp
|
|
nengel@2
|
1449 sub r1, r1, #2
|
|
nengel@2
|
1450 mov r3, #16
|
|
nengel@2
|
1451 vpush {d8-d15}
|
|
nengel@2
|
1452 bl put_h264_qpel16_h_lowpass_neon
|
|
nengel@2
|
1453 ldrd r0, [r11]
|
|
nengel@2
|
1454 mov r3, r2
|
|
nengel@2
|
1455 add ip, sp, #64
|
|
nengel@2
|
1456 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1457 mov r2, #16
|
|
nengel@2
|
1458 bl \type\()_h264_qpel16_v_lowpass_l2_neon
|
|
nengel@2
|
1459 vpop {d8-d15}
|
|
nengel@2
|
1460 add sp, r11, #8
|
|
nengel@2
|
1461 pop {r4, r11, pc}
|
|
nengel@2
|
1462 endfunc
|
|
nengel@2
|
1463
|
|
nengel@2
|
1464 function ff_\type\()_h264_qpel16_mc21_neon, export=1
|
|
nengel@2
|
1465 push {r0, r1, r4-r5, r9-r11, lr}
|
|
nengel@2
|
1466 \type\()_h264_qpel16_mc21:
|
|
nengel@2
|
1467 lowpass_const r3
|
|
nengel@2
|
1468 mov r11, sp
|
|
nengel@2
|
1469 bic sp, sp, #15
|
|
nengel@2
|
1470 sub sp, sp, #(16*16+16*12)
|
|
nengel@2
|
1471 sub r1, r1, #2
|
|
nengel@2
|
1472 mov r0, sp
|
|
nengel@2
|
1473 vpush {d8-d15}
|
|
nengel@2
|
1474 bl put_h264_qpel16_h_lowpass_neon_packed
|
|
nengel@2
|
1475 mov r4, r0
|
|
nengel@2
|
1476 ldrd r0, [r11]
|
|
nengel@2
|
1477 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1478 sub r1, r1, #2
|
|
nengel@2
|
1479 mov r3, r2
|
|
nengel@2
|
1480 bl \type\()_h264_qpel16_hv_lowpass_l2_neon
|
|
nengel@2
|
1481 vpop {d8-d15}
|
|
nengel@2
|
1482 add sp, r11, #8
|
|
nengel@2
|
1483 pop {r4-r5, r9-r11, pc}
|
|
nengel@2
|
1484 endfunc
|
|
nengel@2
|
1485
|
|
nengel@2
|
1486 function ff_\type\()_h264_qpel16_mc31_neon, export=1
|
|
nengel@2
|
1487 add r1, r1, #1
|
|
nengel@2
|
1488 push {r0, r1, r4, r11, lr}
|
|
nengel@2
|
1489 sub r1, r1, #1
|
|
nengel@2
|
1490 b \type\()_h264_qpel16_mc11
|
|
nengel@2
|
1491 endfunc
|
|
nengel@2
|
1492
|
|
nengel@2
|
1493 function ff_\type\()_h264_qpel16_mc02_neon, export=1
|
|
nengel@2
|
1494 push {r4, lr}
|
|
nengel@2
|
1495 lowpass_const r3
|
|
nengel@2
|
1496 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1497 mov r3, r2
|
|
nengel@2
|
1498 vpush {d8-d15}
|
|
nengel@2
|
1499 bl \type\()_h264_qpel16_v_lowpass_neon
|
|
nengel@2
|
1500 vpop {d8-d15}
|
|
nengel@2
|
1501 pop {r4, pc}
|
|
nengel@2
|
1502 endfunc
|
|
nengel@2
|
1503
|
|
nengel@2
|
1504 function ff_\type\()_h264_qpel16_mc12_neon, export=1
|
|
nengel@2
|
1505 push {r0, r1, r4-r5, r9-r11, lr}
|
|
nengel@2
|
1506 \type\()_h264_qpel16_mc12:
|
|
nengel@2
|
1507 lowpass_const r3
|
|
nengel@2
|
1508 mov r11, sp
|
|
nengel@2
|
1509 bic sp, sp, #15
|
|
nengel@2
|
1510 sub sp, sp, #(16*16+16*12)
|
|
nengel@2
|
1511 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1512 mov r0, sp
|
|
nengel@2
|
1513 mov r3, r2
|
|
nengel@2
|
1514 vpush {d8-d15}
|
|
nengel@2
|
1515 bl put_h264_qpel16_v_lowpass_neon_packed
|
|
nengel@2
|
1516 mov r4, r0
|
|
nengel@2
|
1517 ldrd r0, [r11]
|
|
nengel@2
|
1518 sub r1, r1, r3, lsl #1
|
|
nengel@2
|
1519 sub r1, r1, #2
|
|
nengel@2
|
1520 mov r2, r3
|
|
nengel@2
|
1521 bl \type\()_h264_qpel16_hv_lowpass_l2_neon
|
|
nengel@2
|
1522 vpop {d8-d15}
|
|
nengel@2
|
1523 add sp, r11, #8
|
|
nengel@2
|
1524 pop {r4-r5, r9-r11, pc}
|
|
nengel@2
|
1525 endfunc
|
|
nengel@2
|
1526
|
|
nengel@2
|
1527 function ff_\type\()_h264_qpel16_mc22_neon, export=1
|
|
nengel@2
|
1528 push {r4, r9-r11, lr}
|
|
nengel@2
|
1529 lowpass_const r3
|
|
nengel@2
|
1530 mov r11, sp
|
|
nengel@2
|
1531 bic sp, sp, #15
|
|
nengel@2
|
1532 sub r1, r1, r2, lsl #1
|
|
nengel@2
|
1533 sub r1, r1, #2
|
|
nengel@2
|
1534 mov r3, r2
|
|
nengel@2
|
1535 sub sp, sp, #(16*12)
|
|
nengel@2
|
1536 mov r4, sp
|
|
nengel@2
|
1537 vpush {d8-d15}
|
|
nengel@2
|
1538 bl \type\()_h264_qpel16_hv_lowpass_neon
|
|
nengel@2
|
1539 vpop {d8-d15}
|
|
nengel@2
|
1540 mov sp, r11
|
|
nengel@2
|
1541 pop {r4, r9-r11, pc}
|
|
nengel@2
|
1542 endfunc
|
|
nengel@2
|
1543
|
|
nengel@2
|
1544 function ff_\type\()_h264_qpel16_mc32_neon, export=1
|
|
nengel@2
|
1545 push {r0, r1, r4-r5, r9-r11, lr}
|
|
nengel@2
|
1546 add r1, r1, #1
|
|
nengel@2
|
1547 b \type\()_h264_qpel16_mc12
|
|
nengel@2
|
1548 endfunc
|
|
nengel@2
|
1549
|
|
nengel@2
|
1550 function ff_\type\()_h264_qpel16_mc03_neon, export=1
|
|
nengel@2
|
1551 push {r4, lr}
|
|
nengel@2
|
1552 add ip, r1, r2
|
|
nengel@2
|
1553 b \type\()_h264_qpel16_mc01
|
|
nengel@2
|
1554 endfunc
|
|
nengel@2
|
1555
|
|
nengel@2
|
1556 function ff_\type\()_h264_qpel16_mc13_neon, export=1
|
|
nengel@2
|
1557 push {r0, r1, r4, r11, lr}
|
|
nengel@2
|
1558 add r1, r1, r2
|
|
nengel@2
|
1559 b \type\()_h264_qpel16_mc11
|
|
nengel@2
|
1560 endfunc
|
|
nengel@2
|
1561
|
|
nengel@2
|
1562 function ff_\type\()_h264_qpel16_mc23_neon, export=1
|
|
nengel@2
|
1563 push {r0, r1, r4-r5, r9-r11, lr}
|
|
nengel@2
|
1564 add r1, r1, r2
|
|
nengel@2
|
1565 b \type\()_h264_qpel16_mc21
|
|
nengel@2
|
1566 endfunc
|
|
nengel@2
|
1567
|
|
nengel@2
|
1568 function ff_\type\()_h264_qpel16_mc33_neon, export=1
|
|
nengel@2
|
1569 add r1, r1, #1
|
|
nengel@2
|
1570 push {r0, r1, r4, r11, lr}
|
|
nengel@2
|
1571 add r1, r1, r2
|
|
nengel@2
|
1572 sub r1, r1, #1
|
|
nengel@2
|
1573 b \type\()_h264_qpel16_mc11
|
|
nengel@2
|
1574 endfunc
|
|
nengel@2
|
1575 .endm
|
|
nengel@2
|
1576
|
|
nengel@2
|
1577 h264_qpel16 put
|
|
nengel@2
|
1578 h264_qpel16 avg
|
|
nengel@2
|
1579
|
|
nengel@2
|
1580 @ Biweighted prediction
|
|
nengel@2
|
1581
|
|
nengel@2
|
1582 .macro biweight_16 macs, macd
|
|
nengel@2
|
1583 vdup.8 d0, r4
|
|
nengel@2
|
1584 vdup.8 d1, r5
|
|
nengel@2
|
1585 vmov q2, q8
|
|
nengel@2
|
1586 vmov q3, q8
|
|
nengel@2
|
1587 1: subs ip, ip, #2
|
|
nengel@2
|
1588 vld1.8 {d20-d21},[r0,:128], r2
|
|
nengel@2
|
1589 \macd q2, d0, d20
|
|
nengel@2
|
1590 pld [r0]
|
|
nengel@2
|
1591 \macd q3, d0, d21
|
|
nengel@2
|
1592 vld1.8 {d22-d23},[r1,:128], r2
|
|
nengel@2
|
1593 \macs q2, d1, d22
|
|
nengel@2
|
1594 pld [r1]
|
|
nengel@2
|
1595 \macs q3, d1, d23
|
|
nengel@2
|
1596 vmov q12, q8
|
|
nengel@2
|
1597 vld1.8 {d28-d29},[r0,:128], r2
|
|
nengel@2
|
1598 vmov q13, q8
|
|
nengel@2
|
1599 \macd q12, d0, d28
|
|
nengel@2
|
1600 pld [r0]
|
|
nengel@2
|
1601 \macd q13, d0, d29
|
|
nengel@2
|
1602 vld1.8 {d30-d31},[r1,:128], r2
|
|
nengel@2
|
1603 \macs q12, d1, d30
|
|
nengel@2
|
1604 pld [r1]
|
|
nengel@2
|
1605 \macs q13, d1, d31
|
|
nengel@2
|
1606 vshl.s16 q2, q2, q9
|
|
nengel@2
|
1607 vshl.s16 q3, q3, q9
|
|
nengel@2
|
1608 vqmovun.s16 d4, q2
|
|
nengel@2
|
1609 vqmovun.s16 d5, q3
|
|
nengel@2
|
1610 vshl.s16 q12, q12, q9
|
|
nengel@2
|
1611 vshl.s16 q13, q13, q9
|
|
nengel@2
|
1612 vqmovun.s16 d24, q12
|
|
nengel@2
|
1613 vqmovun.s16 d25, q13
|
|
nengel@2
|
1614 vmov q3, q8
|
|
nengel@2
|
1615 vst1.8 {d4- d5}, [r6,:128], r2
|
|
nengel@2
|
1616 vmov q2, q8
|
|
nengel@2
|
1617 vst1.8 {d24-d25},[r6,:128], r2
|
|
nengel@2
|
1618 bne 1b
|
|
nengel@2
|
1619 pop {r4-r6, pc}
|
|
nengel@2
|
1620 .endm
|
|
nengel@2
|
1621
|
|
nengel@2
|
1622 .macro biweight_8 macs, macd
|
|
nengel@2
|
1623 vdup.8 d0, r4
|
|
nengel@2
|
1624 vdup.8 d1, r5
|
|
nengel@2
|
1625 vmov q1, q8
|
|
nengel@2
|
1626 vmov q10, q8
|
|
nengel@2
|
1627 1: subs ip, ip, #2
|
|
nengel@2
|
1628 vld1.8 {d4},[r0,:64], r2
|
|
nengel@2
|
1629 \macd q1, d0, d4
|
|
nengel@2
|
1630 pld [r0]
|
|
nengel@2
|
1631 vld1.8 {d5},[r1,:64], r2
|
|
nengel@2
|
1632 \macs q1, d1, d5
|
|
nengel@2
|
1633 pld [r1]
|
|
nengel@2
|
1634 vld1.8 {d6},[r0,:64], r2
|
|
nengel@2
|
1635 \macd q10, d0, d6
|
|
nengel@2
|
1636 pld [r0]
|
|
nengel@2
|
1637 vld1.8 {d7},[r1,:64], r2
|
|
nengel@2
|
1638 \macs q10, d1, d7
|
|
nengel@2
|
1639 pld [r1]
|
|
nengel@2
|
1640 vshl.s16 q1, q1, q9
|
|
nengel@2
|
1641 vqmovun.s16 d2, q1
|
|
nengel@2
|
1642 vshl.s16 q10, q10, q9
|
|
nengel@2
|
1643 vqmovun.s16 d4, q10
|
|
nengel@2
|
1644 vmov q10, q8
|
|
nengel@2
|
1645 vst1.8 {d2},[r6,:64], r2
|
|
nengel@2
|
1646 vmov q1, q8
|
|
nengel@2
|
1647 vst1.8 {d4},[r6,:64], r2
|
|
nengel@2
|
1648 bne 1b
|
|
nengel@2
|
1649 pop {r4-r6, pc}
|
|
nengel@2
|
1650 .endm
|
|
nengel@2
|
1651
|
|
nengel@2
|
1652 .macro biweight_4 macs, macd
|
|
nengel@2
|
1653 vdup.8 d0, r4
|
|
nengel@2
|
1654 vdup.8 d1, r5
|
|
nengel@2
|
1655 vmov q1, q8
|
|
nengel@2
|
1656 vmov q10, q8
|
|
nengel@2
|
1657 1: subs ip, ip, #4
|
|
nengel@2
|
1658 vld1.32 {d4[0]},[r0,:32], r2
|
|
nengel@2
|
1659 vld1.32 {d4[1]},[r0,:32], r2
|
|
nengel@2
|
1660 \macd q1, d0, d4
|
|
nengel@2
|
1661 pld [r0]
|
|
nengel@2
|
1662 vld1.32 {d5[0]},[r1,:32], r2
|
|
nengel@2
|
1663 vld1.32 {d5[1]},[r1,:32], r2
|
|
nengel@2
|
1664 \macs q1, d1, d5
|
|
nengel@2
|
1665 pld [r1]
|
|
nengel@2
|
1666 blt 2f
|
|
nengel@2
|
1667 vld1.32 {d6[0]},[r0,:32], r2
|
|
nengel@2
|
1668 vld1.32 {d6[1]},[r0,:32], r2
|
|
nengel@2
|
1669 \macd q10, d0, d6
|
|
nengel@2
|
1670 pld [r0]
|
|
nengel@2
|
1671 vld1.32 {d7[0]},[r1,:32], r2
|
|
nengel@2
|
1672 vld1.32 {d7[1]},[r1,:32], r2
|
|
nengel@2
|
1673 \macs q10, d1, d7
|
|
nengel@2
|
1674 pld [r1]
|
|
nengel@2
|
1675 vshl.s16 q1, q1, q9
|
|
nengel@2
|
1676 vqmovun.s16 d2, q1
|
|
nengel@2
|
1677 vshl.s16 q10, q10, q9
|
|
nengel@2
|
1678 vqmovun.s16 d4, q10
|
|
nengel@2
|
1679 vmov q10, q8
|
|
nengel@2
|
1680 vst1.32 {d2[0]},[r6,:32], r2
|
|
nengel@2
|
1681 vst1.32 {d2[1]},[r6,:32], r2
|
|
nengel@2
|
1682 vmov q1, q8
|
|
nengel@2
|
1683 vst1.32 {d4[0]},[r6,:32], r2
|
|
nengel@2
|
1684 vst1.32 {d4[1]},[r6,:32], r2
|
|
nengel@2
|
1685 bne 1b
|
|
nengel@2
|
1686 pop {r4-r6, pc}
|
|
nengel@2
|
1687 2: vshl.s16 q1, q1, q9
|
|
nengel@2
|
1688 vqmovun.s16 d2, q1
|
|
nengel@2
|
1689 vst1.32 {d2[0]},[r6,:32], r2
|
|
nengel@2
|
1690 vst1.32 {d2[1]},[r6,:32], r2
|
|
nengel@2
|
1691 pop {r4-r6, pc}
|
|
nengel@2
|
1692 .endm
|
|
nengel@2
|
1693
|
|
nengel@2
|
1694 .macro biweight_func w
|
|
nengel@2
|
1695 function biweight_h264_pixels_\w\()_neon
|
|
nengel@2
|
1696 push {r4-r6, lr}
|
|
nengel@2
|
1697 add r4, sp, #16
|
|
nengel@2
|
1698 ldm r4, {r4-r6}
|
|
nengel@2
|
1699 lsr lr, r4, #31
|
|
nengel@2
|
1700 add r6, r6, #1
|
|
nengel@2
|
1701 eors lr, lr, r5, lsr #30
|
|
nengel@2
|
1702 orr r6, r6, #1
|
|
nengel@2
|
1703 vdup.16 q9, r3
|
|
nengel@2
|
1704 lsl r6, r6, r3
|
|
nengel@2
|
1705 vmvn q9, q9
|
|
nengel@2
|
1706 vdup.16 q8, r6
|
|
nengel@2
|
1707 mov r6, r0
|
|
nengel@2
|
1708 beq 10f
|
|
nengel@2
|
1709 subs lr, lr, #1
|
|
nengel@2
|
1710 beq 20f
|
|
nengel@2
|
1711 subs lr, lr, #1
|
|
nengel@2
|
1712 beq 30f
|
|
nengel@2
|
1713 b 40f
|
|
nengel@2
|
1714 10: biweight_\w vmlal.u8, vmlal.u8
|
|
nengel@2
|
1715 20: rsb r4, r4, #0
|
|
nengel@2
|
1716 biweight_\w vmlal.u8, vmlsl.u8
|
|
nengel@2
|
1717 30: rsb r4, r4, #0
|
|
nengel@2
|
1718 rsb r5, r5, #0
|
|
nengel@2
|
1719 biweight_\w vmlsl.u8, vmlsl.u8
|
|
nengel@2
|
1720 40: rsb r5, r5, #0
|
|
nengel@2
|
1721 biweight_\w vmlsl.u8, vmlal.u8
|
|
nengel@2
|
1722 endfunc
|
|
nengel@2
|
1723 .endm
|
|
nengel@2
|
1724
|
|
nengel@2
|
1725 .macro biweight_entry w, h, b=1
|
|
nengel@2
|
1726 function ff_biweight_h264_pixels_\w\()x\h\()_neon, export=1
|
|
nengel@2
|
1727 mov ip, #\h
|
|
nengel@2
|
1728 .if \b
|
|
nengel@2
|
1729 b biweight_h264_pixels_\w\()_neon
|
|
nengel@2
|
1730 .endif
|
|
nengel@2
|
1731 endfunc
|
|
nengel@2
|
1732 .endm
|
|
nengel@2
|
1733
|
|
nengel@2
|
1734 biweight_entry 16, 8
|
|
nengel@2
|
1735 biweight_entry 16, 16, b=0
|
|
nengel@2
|
1736 biweight_func 16
|
|
nengel@2
|
1737
|
|
nengel@2
|
1738 biweight_entry 8, 16
|
|
nengel@2
|
1739 biweight_entry 8, 4
|
|
nengel@2
|
1740 biweight_entry 8, 8, b=0
|
|
nengel@2
|
1741 biweight_func 8
|
|
nengel@2
|
1742
|
|
nengel@2
|
1743 biweight_entry 4, 8
|
|
nengel@2
|
1744 biweight_entry 4, 2
|
|
nengel@2
|
1745 biweight_entry 4, 4, b=0
|
|
nengel@2
|
1746 biweight_func 4
|
|
nengel@2
|
1747
|
|
nengel@2
|
1748 @ Weighted prediction
|
|
nengel@2
|
1749
|
|
nengel@2
|
1750 .macro weight_16 add
|
|
nengel@2
|
1751 vdup.8 d0, r3
|
|
nengel@2
|
1752 1: subs ip, ip, #2
|
|
nengel@2
|
1753 vld1.8 {d20-d21},[r0,:128], r1
|
|
nengel@2
|
1754 vmull.u8 q2, d0, d20
|
|
nengel@2
|
1755 pld [r0]
|
|
nengel@2
|
1756 vmull.u8 q3, d0, d21
|
|
nengel@2
|
1757 vld1.8 {d28-d29},[r0,:128], r1
|
|
nengel@2
|
1758 vmull.u8 q12, d0, d28
|
|
nengel@2
|
1759 pld [r0]
|
|
nengel@2
|
1760 vmull.u8 q13, d0, d29
|
|
nengel@2
|
1761 \add q2, q8, q2
|
|
nengel@2
|
1762 vrshl.s16 q2, q2, q9
|
|
nengel@2
|
1763 \add q3, q8, q3
|
|
nengel@2
|
1764 vrshl.s16 q3, q3, q9
|
|
nengel@2
|
1765 vqmovun.s16 d4, q2
|
|
nengel@2
|
1766 vqmovun.s16 d5, q3
|
|
nengel@2
|
1767 \add q12, q8, q12
|
|
nengel@2
|
1768 vrshl.s16 q12, q12, q9
|
|
nengel@2
|
1769 \add q13, q8, q13
|
|
nengel@2
|
1770 vrshl.s16 q13, q13, q9
|
|
nengel@2
|
1771 vqmovun.s16 d24, q12
|
|
nengel@2
|
1772 vqmovun.s16 d25, q13
|
|
nengel@2
|
1773 vst1.8 {d4- d5}, [r4,:128], r1
|
|
nengel@2
|
1774 vst1.8 {d24-d25},[r4,:128], r1
|
|
nengel@2
|
1775 bne 1b
|
|
nengel@2
|
1776 pop {r4, pc}
|
|
nengel@2
|
1777 .endm
|
|
nengel@2
|
1778
|
|
nengel@2
|
1779 .macro weight_8 add
|
|
nengel@2
|
1780 vdup.8 d0, r3
|
|
nengel@2
|
1781 1: subs ip, ip, #2
|
|
nengel@2
|
1782 vld1.8 {d4},[r0,:64], r1
|
|
nengel@2
|
1783 vmull.u8 q1, d0, d4
|
|
nengel@2
|
1784 pld [r0]
|
|
nengel@2
|
1785 vld1.8 {d6},[r0,:64], r1
|
|
nengel@2
|
1786 vmull.u8 q10, d0, d6
|
|
nengel@2
|
1787 \add q1, q8, q1
|
|
nengel@2
|
1788 pld [r0]
|
|
nengel@2
|
1789 vrshl.s16 q1, q1, q9
|
|
nengel@2
|
1790 vqmovun.s16 d2, q1
|
|
nengel@2
|
1791 \add q10, q8, q10
|
|
nengel@2
|
1792 vrshl.s16 q10, q10, q9
|
|
nengel@2
|
1793 vqmovun.s16 d4, q10
|
|
nengel@2
|
1794 vst1.8 {d2},[r4,:64], r1
|
|
nengel@2
|
1795 vst1.8 {d4},[r4,:64], r1
|
|
nengel@2
|
1796 bne 1b
|
|
nengel@2
|
1797 pop {r4, pc}
|
|
nengel@2
|
1798 .endm
|
|
nengel@2
|
1799
|
|
nengel@2
|
1800 .macro weight_4 add
|
|
nengel@2
|
1801 vdup.8 d0, r3
|
|
nengel@2
|
1802 vmov q1, q8
|
|
nengel@2
|
1803 vmov q10, q8
|
|
nengel@2
|
1804 1: subs ip, ip, #4
|
|
nengel@2
|
1805 vld1.32 {d4[0]},[r0,:32], r1
|
|
nengel@2
|
1806 vld1.32 {d4[1]},[r0,:32], r1
|
|
nengel@2
|
1807 vmull.u8 q1, d0, d4
|
|
nengel@2
|
1808 pld [r0]
|
|
nengel@2
|
1809 blt 2f
|
|
nengel@2
|
1810 vld1.32 {d6[0]},[r0,:32], r1
|
|
nengel@2
|
1811 vld1.32 {d6[1]},[r0,:32], r1
|
|
nengel@2
|
1812 vmull.u8 q10, d0, d6
|
|
nengel@2
|
1813 pld [r0]
|
|
nengel@2
|
1814 \add q1, q8, q1
|
|
nengel@2
|
1815 vrshl.s16 q1, q1, q9
|
|
nengel@2
|
1816 vqmovun.s16 d2, q1
|
|
nengel@2
|
1817 \add q10, q8, q10
|
|
nengel@2
|
1818 vrshl.s16 q10, q10, q9
|
|
nengel@2
|
1819 vqmovun.s16 d4, q10
|
|
nengel@2
|
1820 vmov q10, q8
|
|
nengel@2
|
1821 vst1.32 {d2[0]},[r4,:32], r1
|
|
nengel@2
|
1822 vst1.32 {d2[1]},[r4,:32], r1
|
|
nengel@2
|
1823 vmov q1, q8
|
|
nengel@2
|
1824 vst1.32 {d4[0]},[r4,:32], r1
|
|
nengel@2
|
1825 vst1.32 {d4[1]},[r4,:32], r1
|
|
nengel@2
|
1826 bne 1b
|
|
nengel@2
|
1827 pop {r4, pc}
|
|
nengel@2
|
1828 2: \add q1, q8, q1
|
|
nengel@2
|
1829 vrshl.s16 q1, q1, q9
|
|
nengel@2
|
1830 vqmovun.s16 d2, q1
|
|
nengel@2
|
1831 vst1.32 {d2[0]},[r4,:32], r1
|
|
nengel@2
|
1832 vst1.32 {d2[1]},[r4,:32], r1
|
|
nengel@2
|
1833 pop {r4, pc}
|
|
nengel@2
|
1834 .endm
|
|
nengel@2
|
1835
|
|
nengel@2
|
1836 .macro weight_func w
|
|
nengel@2
|
1837 function weight_h264_pixels_\w\()_neon
|
|
nengel@2
|
1838 push {r4, lr}
|
|
nengel@2
|
1839 ldr r4, [sp, #8]
|
|
nengel@2
|
1840 cmp r2, #1
|
|
nengel@2
|
1841 lsl r4, r4, r2
|
|
nengel@2
|
1842 vdup.16 q8, r4
|
|
nengel@2
|
1843 mov r4, r0
|
|
nengel@2
|
1844 ble 20f
|
|
nengel@2
|
1845 rsb lr, r2, #1
|
|
nengel@2
|
1846 vdup.16 q9, lr
|
|
nengel@2
|
1847 cmp r3, #0
|
|
nengel@2
|
1848 blt 10f
|
|
nengel@2
|
1849 weight_\w vhadd.s16
|
|
nengel@2
|
1850 10: rsb r3, r3, #0
|
|
nengel@2
|
1851 weight_\w vhsub.s16
|
|
nengel@2
|
1852 20: rsb lr, r2, #0
|
|
nengel@2
|
1853 vdup.16 q9, lr
|
|
nengel@2
|
1854 cmp r3, #0
|
|
nengel@2
|
1855 blt 10f
|
|
nengel@2
|
1856 weight_\w vadd.s16
|
|
nengel@2
|
1857 10: rsb r3, r3, #0
|
|
nengel@2
|
1858 weight_\w vsub.s16
|
|
nengel@2
|
1859 endfunc
|
|
nengel@2
|
1860 .endm
|
|
nengel@2
|
1861
|
|
nengel@2
|
1862 .macro weight_entry w, h, b=1
|
|
nengel@2
|
1863 function ff_weight_h264_pixels_\w\()x\h\()_neon, export=1
|
|
nengel@2
|
1864 mov ip, #\h
|
|
nengel@2
|
1865 .if \b
|
|
nengel@2
|
1866 b weight_h264_pixels_\w\()_neon
|
|
nengel@2
|
1867 .endif
|
|
nengel@2
|
1868 endfunc
|
|
nengel@2
|
1869 .endm
|
|
nengel@2
|
1870
|
|
nengel@2
|
1871 weight_entry 16, 8
|
|
nengel@2
|
1872 weight_entry 16, 16, b=0
|
|
nengel@2
|
1873 weight_func 16
|
|
nengel@2
|
1874
|
|
nengel@2
|
1875 weight_entry 8, 16
|
|
nengel@2
|
1876 weight_entry 8, 4
|
|
nengel@2
|
1877 weight_entry 8, 8, b=0
|
|
nengel@2
|
1878 weight_func 8
|
|
nengel@2
|
1879
|
|
nengel@2
|
1880 weight_entry 4, 8
|
|
nengel@2
|
1881 weight_entry 4, 2
|
|
nengel@2
|
1882 weight_entry 4, 4, b=0
|
|
nengel@2
|
1883 weight_func 4
|