History

mv mc_neon.S to common,add MC arm code to encoder

Licai Guo committed 12 years ago

Commit 71467f91 parent 14f55186 files · +727 −8Browse files

Showing the changes to codec/decoder (1 of 6 files). Show all

Unified · Split

codec/decoder/core/arm/mc_neon.S+0−1602
@@ -1,1602 +0,0 @@
1/*!
2 * \copy
3 * Copyright (c) 2013, Cisco Systems
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 */
32
33#ifdef HAVE_NEON
34.text
35#include "arm_arch_common_macro.S"
36
37#ifdef APPLE_IOS
38.macro AVERAGE_TWO_8BITS
39// { // input:dst_d, src_d A and B; working: q13
40 vaddl.u8 q13, $2, $1
41 vrshrn.u16 $0, q13, #1
42// }
43.endm
44
45.macro FILTER_6TAG_8BITS
46// { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
47 vaddl.u8 q12, $0, $5 //q12=src[-2]+src[3]
48 vaddl.u8 q13, $2, $3 //src[0]+src[1]
49 vmla.u16 q12, q13, $7 //q12 += 20*(src[0]+src[1]), 2 cycles
50 vaddl.u8 q13, $1, $4 //src[-1]+src[2]
51 vmls.s16 q12, q13, $8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
52 vqrshrun.s16 $6, q12, #5
53// }
54.endm
55
56.macro FILTER_6TAG_8BITS_AVERAGE_WITH_0
57// { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
58 vaddl.u8 q12, $0, $5 //q12=src[-2]+src[3]
59 vaddl.u8 q13, $2, $3 //src[0]+src[1]
60 vmla.u16 q12, q13, $7 //q12 += 20*(src[0]+src[1]), 2 cycles
61 vaddl.u8 q13, $1, $4 //src[-1]+src[2]
62 vmls.s16 q12, q13, $8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
63 vqrshrun.s16 $6, q12, #5
64 vaddl.u8 q13, $2, $6
65 vrshrn.u16 $6, q13, #1
66// }
67.endm
68
69.macro FILTER_6TAG_8BITS_AVERAGE_WITH_1
70// { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
71 vaddl.u8 q12, $0, $5 //q12=src[-2]+src[3]
72 vaddl.u8 q13, $2, $3 //src[0]+src[1]
73 vmla.u16 q12, q13, $7 //q12 += 20*(src[0]+src[1]), 2 cycles
74 vaddl.u8 q13, $1, $4 //src[-1]+src[2]
75 vmls.s16 q12, q13, $8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
76 vqrshrun.s16 $6, q12, #5
77 vaddl.u8 q13, $3, $6
78 vrshrn.u16 $6, q13, #1
79// }
80.endm
81
82.macro FILTER_6TAG_8BITS_TO_16BITS
83// { // input:d_src[-2], d_src[-1], d_src[0], d_src[1], d_src[2], d_src[3], dst_q, multiplier a/b; working:q13
84 vaddl.u8 $6, $0, $5 //dst_q=src[-2]+src[3]
85 vaddl.u8 q13, $2, $3 //src[0]+src[1]
86 vmla.u16 $6, q13, $7 //dst_q += 20*(src[0]+src[1]), 2 cycles
87 vaddl.u8 q13, $1, $4 //src[-1]+src[2]
88 vmls.s16 $6, q13, $8 //dst_q -= 5*(src[-1]+src[2]), 2 cycles
89// }
90.endm
91
92.macro FILTER_3_IN_16BITS_TO_8BITS
93// { // input:a, b, c, dst_d;
94 vsub.s16 $0, $0, $1 //a-b
95 vshr.s16 $0, $0, #2 //(a-b)/4
96 vsub.s16 $0, $0, $1 //(a-b)/4-b
97 vadd.s16 $0, $0, $2 //(a-b)/4-b+c
98 vshr.s16 $0, $0, #2 //((a-b)/4-b+c)/4
99 vadd.s16 $0, $0, $2 //((a-b)/4-b+c)/4+c = (a-5*b+20*c)/16
100 vqrshrun.s16 $3, $0, #6 //(+32)>>6
101// }
102.endm
103
104.macro UNPACK_2_16BITS_TO_ABC
105// { // input:q_src[-2:5], q_src[6:13](avail 8+5)/q_src[6:**](avail 4+5), dst_a, dst_b, dst_c;
106 vext.16 $4, $0, $1, #2 //src[0]
107 vext.16 $3, $0, $1, #3 //src[1]
108 vadd.s16 $4, $3 //c=src[0]+src[1]
109
110 vext.16 $3, $0, $1, #1 //src[-1]
111 vext.16 $2, $0, $1, #4 //src[2]
112 vadd.s16 $3, $2 //b=src[-1]+src[2]
113
114 vext.16 $2, $0, $1, #5 //src[3]
115 vadd.s16 $2, $0 //a=src[-2]+src[3]
116// }
117.endm
118#else
119.macro AVERAGE_TWO_8BITS arg0, arg1, arg2
120// { // input:dst_d, src_d A and B; working: q13
121 vaddl.u8 q13, \arg2, \arg1
122 vrshrn.u16 \arg0, q13, #1
123// }
124.endm
125
126.macro FILTER_6TAG_8BITS arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
127// { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
128 vaddl.u8 q12, \arg0, \arg5 //q12=src[-2]+src[3]
129 vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
130 vmla.u16 q12, q13, \arg7 //q12 += 20*(src[0]+src[1]), 2 cycles
131 vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
132 vmls.s16 q12, q13, \arg8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
133 vqrshrun.s16 \arg6, q12, #5
134// }
135.endm
136
137.macro FILTER_6TAG_8BITS_AVERAGE_WITH_0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
138// { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
139 vaddl.u8 q12, \arg0, \arg5 //q12=src[-2]+src[3]
140 vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
141 vmla.u16 q12, q13, \arg7 //q12 += 20*(src[0]+src[1]), 2 cycles
142 vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
143 vmls.s16 q12, q13, \arg8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
144 vqrshrun.s16 \arg6, q12, #5
145 vaddl.u8 q13, \arg2, \arg6
146 vrshrn.u16 \arg6, q13, #1
147// }
148.endm
149
150.macro FILTER_6TAG_8BITS_AVERAGE_WITH_1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
151// { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
152 vaddl.u8 q12, \arg0, \arg5 //q12=src[-2]+src[3]
153 vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
154 vmla.u16 q12, q13, \arg7 //q12 += 20*(src[0]+src[1]), 2 cycles
155 vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
156 vmls.s16 q12, q13, \arg8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
157 vqrshrun.s16 \arg6, q12, #5
158 vaddl.u8 q13, \arg3, \arg6
159 vrshrn.u16 \arg6, q13, #1
160// }
161.endm
162
163.macro FILTER_6TAG_8BITS_TO_16BITS arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
164// { // input:d_src[-2], d_src[-1], d_src[0], d_src[1], d_src[2], d_src[3], dst_q, multiplier a/b; working:q13
165 vaddl.u8 \arg6, \arg0, \arg5 //dst_q=src[-2]+src[3]
166 vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
167 vmla.u16 \arg6, q13, \arg7 //dst_q += 20*(src[0]+src[1]), 2 cycles
168 vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
169 vmls.s16 \arg6, q13, \arg8 //dst_q -= 5*(src[-1]+src[2]), 2 cycles
170// }
171.endm
172
173.macro FILTER_3_IN_16BITS_TO_8BITS arg0, arg1, arg2, arg3
174// { // input:a, b, c, dst_d;
175 vsub.s16 \arg0, \arg0, \arg1 //a-b
176 vshr.s16 \arg0, \arg0, #2 //(a-b)/4
177 vsub.s16 \arg0, \arg0, \arg1 //(a-b)/4-b
178 vadd.s16 \arg0, \arg0, \arg2 //(a-b)/4-b+c
179 vshr.s16 \arg0, \arg0, #2 //((a-b)/4-b+c)/4
180 vadd.s16 \arg0, \arg0, \arg2 //((a-b)/4-b+c)/4+c = (a-5*b+20*c)/16
181 vqrshrun.s16 \arg3, \arg0, #6 //(+32)>>6
182// }
183.endm
184
185.macro UNPACK_2_16BITS_TO_ABC arg0, arg1, arg2, arg3, arg4
186// { // input:q_src[-2:5], q_src[6:13](avail 8+5)/q_src[6:**](avail 4+5), dst_a, dst_b, dst_c;
187 vext.16 \arg4, \arg0, \arg1, #2 //src[0]
188 vext.16 \arg3, \arg0, \arg1, #3 //src[1]
189 vadd.s16 \arg4, \arg3 //c=src[0]+src[1]
190
191 vext.16 \arg3, \arg0, \arg1, #1 //src[-1]
192 vext.16 \arg2, \arg0, \arg1, #4 //src[2]
193 vadd.s16 \arg3,\arg2 //b=src[-1]+src[2]
194
195 vext.16 \arg2, \arg0, \arg1, #5 //src[3]
196 vadd.s16 \arg2, \arg0 //a=src[-2]+src[3]
197// }
198.endm
199#endif
200
201WELS_ASM_FUNC_BEGIN McHorVer20WidthEq16_neon
202 push {r4}
203 ldr r4, [sp, #4]
204
205 sub r0, #2
206 vmov.u16 q14, #0x0014 // 20
207 vshr.u16 q15, q14, #2 // 5
208
209w16_h_mc_luma_loop:
210 vld1.u8 {d0,d1,d2}, [r0], r1 //only use 21(16+5); q0=src[-2]
211 pld [r0]
212 pld [r0, #16]
213
214 vext.8 q2, q0, q1, #1 //q2=src[-1]
215 vext.8 q3, q0, q1, #2 //q3=src[0]
216 vext.8 q4, q0, q1, #3 //q4=src[1]
217 vext.8 q5, q0, q1, #4 //q5=src[2]
218 vext.8 q6, q0, q1, #5 //q6=src[3]
219
220 FILTER_6TAG_8BITS d0, d4, d6, d8, d10, d12, d2, q14, q15
221
222 FILTER_6TAG_8BITS d1, d5, d7, d9, d11, d13, d3, q14, q15
223
224 sub r4, #1
225 vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
226
227 cmp r4, #0
228 bne w16_h_mc_luma_loop
229 pop {r4}
230WELS_ASM_FUNC_END
231
232
233WELS_ASM_FUNC_BEGIN McHorVer20WidthEq8_neon
234 push {r4}
235 ldr r4, [sp, #4]
236
237 sub r0, #2
238 vmov.u16 q14, #0x0014 // 20
239 vshr.u16 q15, q14, #2 // 5
240
241w8_h_mc_luma_loop:
242 vld1.u8 {d0,d1}, [r0], r1 //only use 13(8+5); q0=src[-2]
243 pld [r0]
244
245 vext.8 d2, d0, d1, #1 //d2=src[-1]
246 vext.8 d3, d0, d1, #2 //d3=src[0]
247 vext.8 d4, d0, d1, #3 //d4=src[1]
248 vext.8 d5, d0, d1, #4 //d5=src[2]
249 vext.8 d6, d0, d1, #5 //d6=src[3]
250
251 FILTER_6TAG_8BITS d0, d2, d3, d4, d5, d6, d1, q14, q15
252
253 sub r4, #1
254 vst1.u8 {d1}, [r2], r3
255
256 cmp r4, #0
257 bne w8_h_mc_luma_loop
258 pop {r4}
259WELS_ASM_FUNC_END
260
261
262WELS_ASM_FUNC_BEGIN McHorVer20WidthEq4_neon
263 push {r4, r5, r6}
264 ldr r6, [sp, #12]
265
266 sub r0, #2
267 vmov.u16 q14, #0x0014 // 20
268 vshr.u16 q15, q14, #2 // 5
269
270w4_h_mc_luma_loop:
271 vld1.u8 {d0, d1}, [r0], r1 //only use 9(4+5);d0: 1st row src[-2:5]
272 pld [r0]
273 vld1.u8 {d2, d3}, [r0], r1 //d2: 2nd row src[-2:5]
274 pld [r0]
275
276 vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
277 vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
278 vext.8 q3, q2, q2, #1 //src[0:6 *]
279 vext.8 q4, q2, q2, #2 //src[1:6 * *]
280
281 vtrn.32 q3, q4 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
282 vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
283 vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
284 vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
285
286 FILTER_6TAG_8BITS d0, d4, d6, d7, d2, d5, d1, q14, q15
287
288 vmov r4, r5, d1
289 str r4, [r2], r3
290 str r5, [r2], r3
291
292 sub r6, #2
293 cmp r6, #0
294 bne w4_h_mc_luma_loop
295
296 pop {r4, r5, r6}
297WELS_ASM_FUNC_END
298
299
300WELS_ASM_FUNC_BEGIN McHorVer10WidthEq16_neon
301 push {r4}
302 ldr r4, [sp, #4]
303
304 sub r0, #2
305 vmov.u16 q14, #0x0014 // 20
306 vshr.u16 q15, q14, #2 // 5
307
308w16_xy_10_mc_luma_loop:
309 vld1.u8 {d0,d1,d2}, [r0], r1 //only use 21(16+5); q0=src[-2]
310 pld [r0]
311 pld [r0, #16]
312
313 vext.8 q2, q0, q1, #1 //q2=src[-1]
314 vext.8 q3, q0, q1, #2 //q3=src[0]
315 vext.8 q4, q0, q1, #3 //q4=src[1]
316 vext.8 q5, q0, q1, #4 //q5=src[2]
317 vext.8 q6, q0, q1, #5 //q6=src[3]
318
319 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d4, d6, d8, d10, d12, d2, q14, q15
320
321 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d5, d7, d9, d11, d13, d3, q14, q15
322
323 sub r4, #1
324 vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
325
326 cmp r4, #0
327 bne w16_xy_10_mc_luma_loop
328 pop {r4}
329WELS_ASM_FUNC_END
330
331
332WELS_ASM_FUNC_BEGIN McHorVer10WidthEq8_neon
333 push {r4}
334 ldr r4, [sp, #4]
335
336 sub r0, #2
337 vmov.u16 q14, #0x0014 // 20
338 vshr.u16 q15, q14, #2 // 5
339
340w8_xy_10_mc_luma_loop:
341 vld1.u8 {d0,d1}, [r0], r1 //only use 13(8+5); q0=src[-2]
342 pld [r0]
343
344 vext.8 d2, d0, d1, #1 //d2=src[-1]
345 vext.8 d3, d0, d1, #2 //d3=src[0]
346 vext.8 d4, d0, d1, #3 //d4=src[1]
347 vext.8 d5, d0, d1, #4 //d5=src[2]
348 vext.8 d6, d0, d1, #5 //d6=src[3]
349
350 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d3, d4, d5, d6, d1, q14, q15
351
352 sub r4, #1
353 vst1.u8 {d1}, [r2], r3
354
355 cmp r4, #0
356 bne w8_xy_10_mc_luma_loop
357 pop {r4}
358WELS_ASM_FUNC_END
359
360
361WELS_ASM_FUNC_BEGIN McHorVer10WidthEq4_neon
362 push {r4, r5, r6}
363 ldr r6, [sp, #12]
364
365 sub r0, #2
366 vmov.u16 q14, #0x0014 // 20
367 vshr.u16 q15, q14, #2 // 5
368
369w4_xy_10_mc_luma_loop:
370 vld1.u8 {d0, d1}, [r0], r1 //only use 9(4+5);d0: 1st row src[-2:5]
371 pld [r0]
372 vld1.u8 {d2, d3}, [r0], r1 //d2: 2nd row src[-2:5]
373 pld [r0]
374
375 vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
376 vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
377 vext.8 q3, q2, q2, #1 //src[0:6 *]
378 vext.8 q4, q2, q2, #2 //src[1:6 * *]
379
380 vtrn.32 q3, q4 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
381 vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
382 vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
383 vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
384
385 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d4, d6, d7, d2, d5, d1, q14, q15
386
387 vmov r4, r5, d1
388 str r4, [r2], r3
389 str r5, [r2], r3
390
391 sub r6, #2
392 cmp r6, #0
393 bne w4_xy_10_mc_luma_loop
394
395 pop {r4, r5, r6}
396WELS_ASM_FUNC_END
397
398
399WELS_ASM_FUNC_BEGIN McHorVer30WidthEq16_neon
400 push {r4}
401 ldr r4, [sp, #4]
402
403 sub r0, #2
404 vmov.u16 q14, #0x0014 // 20
405 vshr.u16 q15, q14, #2 // 5
406
407w16_xy_30_mc_luma_loop:
408 vld1.u8 {d0,d1,d2}, [r0], r1 //only use 21(16+5); q0=src[-2]
409 pld [r0]
410 pld [r0, #16]
411
412 vext.8 q2, q0, q1, #1 //q2=src[-1]
413 vext.8 q3, q0, q1, #2 //q3=src[0]
414 vext.8 q4, q0, q1, #3 //q4=src[1]
415 vext.8 q5, q0, q1, #4 //q5=src[2]
416 vext.8 q6, q0, q1, #5 //q6=src[3]
417
418 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d4, d6, d8, d10, d12, d2, q14, q15
419
420 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d5, d7, d9, d11, d13, d3, q14, q15
421
422 sub r4, #1
423 vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
424
425 cmp r4, #0
426 bne w16_xy_30_mc_luma_loop
427 pop {r4}
428WELS_ASM_FUNC_END
429
430
431WELS_ASM_FUNC_BEGIN McHorVer30WidthEq8_neon
432 push {r4}
433 ldr r4, [sp, #4]
434
435 sub r0, #2
436 vmov.u16 q14, #0x0014 // 20
437 vshr.u16 q15, q14, #2 // 5
438
439w8_xy_30_mc_luma_loop:
440 vld1.u8 {d0,d1}, [r0], r1 //only use 13(8+5); q0=src[-2]
441 pld [r0]
442
443 vext.8 d2, d0, d1, #1 //d2=src[-1]
444 vext.8 d3, d0, d1, #2 //d3=src[0]
445 vext.8 d4, d0, d1, #3 //d4=src[1]
446 vext.8 d5, d0, d1, #4 //d5=src[2]
447 vext.8 d6, d0, d1, #5 //d6=src[3]
448
449 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d3, d4, d5, d6, d1, q14, q15
450
451 sub r4, #1
452 vst1.u8 {d1}, [r2], r3
453
454 cmp r4, #0
455 bne w8_xy_30_mc_luma_loop
456 pop {r4}
457WELS_ASM_FUNC_END
458
459
460WELS_ASM_FUNC_BEGIN McHorVer30WidthEq4_neon
461 push {r4, r5, r6}
462 ldr r6, [sp, #12]
463
464 sub r0, #2
465 vmov.u16 q14, #0x0014 // 20
466 vshr.u16 q15, q14, #2 // 5
467
468w4_xy_30_mc_luma_loop:
469 vld1.u8 {d0, d1}, [r0], r1 //only use 9(4+5);d0: 1st row src[-2:5]
470 pld [r0]
471 vld1.u8 {d2, d3}, [r0], r1 //d2: 2nd row src[-2:5]
472 pld [r0]
473
474 vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
475 vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
476 vext.8 q3, q2, q2, #1 //src[0:6 *]
477 vext.8 q4, q2, q2, #2 //src[1:6 * *]
478
479 vtrn.32 q3, q4 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
480 vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
481 vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
482 vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
483
484 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d4, d6, d7, d2, d5, d1, q14, q15
485
486 vmov r4, r5, d1
487 str r4, [r2], r3
488 str r5, [r2], r3
489
490 sub r6, #2
491 cmp r6, #0
492 bne w4_xy_30_mc_luma_loop
493
494 pop {r4, r5, r6}
495WELS_ASM_FUNC_END
496
497
498WELS_ASM_FUNC_BEGIN McHorVer01WidthEq16_neon
499 push {r4}
500 ldr r4, [sp, #4]
501
502 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
503 pld [r0]
504 pld [r0, r1]
505 vmov.u16 q14, #0x0014 // 20
506 vld1.u8 {q0}, [r0], r1 //q0=src[-2]
507 vld1.u8 {q1}, [r0], r1 //q1=src[-1]
508
509 pld [r0]
510 pld [r0, r1]
511 vshr.u16 q15, q14, #2 // 5
512 vld1.u8 {q2}, [r0], r1 //q2=src[0]
513 vld1.u8 {q3}, [r0], r1 //q3=src[1]
514 vld1.u8 {q4}, [r0], r1 //q4=src[2]
515
516w16_xy_01_luma_loop:
517
518 vld1.u8 {q5}, [r0], r1 //q5=src[3]
519
520 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d8, d10, d12, q14, q15
521 pld [r0]
522 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d9, d11, d13, q14, q15
523 vld1.u8 {q0}, [r0], r1 //read 2nd row
524 vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
525
526 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d8, d10, d0, d12, q14, q15
527 pld [r0]
528 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d9, d11, d1, d13, q14, q15
529 vld1.u8 {q1}, [r0], r1 //read 3rd row
530 vst1.u8 {q6}, [r2], r3 //write 2nd 16Byte
531
532 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d4, d6, d8, d10, d0, d2, d12, q14, q15
533 pld [r0]
534 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d5, d7, d9, d11, d1, d3, d13, q14, q15
535 vld1.u8 {q2}, [r0], r1 //read 4th row
536 vst1.u8 {q6}, [r2], r3 //write 3rd 16Byte
537
538 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d6, d8, d10, d0, d2, d4, d12, q14, q15
539 pld [r0]
540 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d7, d9, d11, d1, d3, d5, d13, q14, q15
541 vld1.u8 {q3}, [r0], r1 //read 5th row
542 vst1.u8 {q6}, [r2], r3 //write 4th 16Byte
543
544 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d8, d10, d0, d2, d4, d6, d12, q14, q15
545 pld [r0]
546 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d9, d11, d1, d3, d5, d7, d13, q14, q15
547 vld1.u8 {q4}, [r0], r1 //read 6th row
548 vst1.u8 {q6}, [r2], r3 //write 5th 16Byte
549
550 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d10, d0, d2, d4, d6, d8, d12, q14, q15
551 pld [r0]
552 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d11, d1, d3, d5, d7, d9, d13, q14, q15
553 vld1.u8 {q5}, [r0], r1 //read 7th row
554 vst1.u8 {q6}, [r2], r3 //write 6th 16Byte
555
556 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d8, d10, d12, q14, q15
557 pld [r0]
558 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d9, d11, d13, q14, q15
559 vld1.u8 {q0}, [r0], r1 //read 8th row
560 vst1.u8 {q6}, [r2], r3 //write 7th 16Byte
561
562 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d8, d10, d0, d12, q14, q15
563 pld [r0]
564 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d9, d11, d1, d13, q14, q15
565 vst1.u8 {q6}, [r2], r3 //write 8th 16Byte
566
567 //q2, q3, q4, q5, q0 --> q0~q4
568 vswp q0, q4
569 vswp q0, q2
570 vmov q1, q3
571 vmov q3, q5 //q0~q4
572
573 sub r4, #8
574 cmp r4, #0
575 bne w16_xy_01_luma_loop
576 pop {r4}
577WELS_ASM_FUNC_END
578
579
580WELS_ASM_FUNC_BEGIN McHorVer01WidthEq8_neon
581 push {r4}
582 ldr r4, [sp, #4]
583
584 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
585 pld [r0]
586 pld [r0, r1]
587 vmov.u16 q14, #0x0014 // 20
588 vld1.u8 {d0}, [r0], r1 //d0=src[-2]
589 vld1.u8 {d1}, [r0], r1 //d1=src[-1]
590
591 pld [r0]
592 pld [r0, r1]
593 vshr.u16 q15, q14, #2 // 5
594 vld1.u8 {d2}, [r0], r1 //d2=src[0]
595 vld1.u8 {d3}, [r0], r1 //d3=src[1]
596
597 vld1.u8 {d4}, [r0], r1 //d4=src[2]
598 vld1.u8 {d5}, [r0], r1 //d5=src[3]
599
600w8_xy_01_mc_luma_loop:
601
602 pld [r0]
603 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d12, q14, q15
604 vld1.u8 {d0}, [r0], r1 //read 2nd row
605 vst1.u8 {d12}, [r2], r3 //write 1st 8Byte
606
607 pld [r0]
608 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d2, d3, d4, d5, d0, d12, q14, q15
609 vld1.u8 {d1}, [r0], r1 //read 3rd row
610 vst1.u8 {d12}, [r2], r3 //write 2nd 8Byte
611
612 pld [r0]
613 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d12, q14, q15
614 vld1.u8 {d2}, [r0], r1 //read 4th row
615 vst1.u8 {d12}, [r2], r3 //write 3rd 8Byte
616
617 pld [r0]
618 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d4, d5, d0, d1, d2, d12, q14, q15
619 vld1.u8 {d3}, [r0], r1 //read 5th row
620 vst1.u8 {d12}, [r2], r3 //write 4th 8Byte
621
622 //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
623 vswp q0, q2
624 vswp q1, q2
625
626 sub r4, #4
627 cmp r4, #0
628 bne w8_xy_01_mc_luma_loop
629
630 pop {r4}
631WELS_ASM_FUNC_END
632
633
634WELS_ASM_FUNC_BEGIN McHorVer01WidthEq4_neon
635 push {r4, r5, r6, r7}
636 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
637 pld [r0]
638 pld [r0, r1]
639 vmov.u16 q14, #0x0014 // 20
640 ldr r4, [r0], r1 //r4=src[-2]
641 ldr r5, [r0], r1 //r5=src[-1]
642
643 pld [r0]
644 pld [r0, r1]
645 vshr.u16 q15, q14, #2 // 5
646 ldr r6, [r0], r1 //r6=src[0]
647 ldr r7, [r0], r1 //r7=src[1]
648
649 vmov d0, r4, r5
650 vmov d1, r5, r6
651 vmov d2, r6, r7
652
653 ldr r4, [r0], r1 //r4=src[2]
654 vmov d3, r7, r4
655 ldr r7, [sp, #16]
656
657w4_xy_01_mc_luma_loop:
658
659// pld [r0]
660 //using reserving r4
661 ldr r5, [r0], r1 //r5=src[3]
662 ldr r6, [r0], r1 //r6=src[0]
663 vmov d4, r4, r5
664 vmov d5, r5, r6 //reserved r6
665
666 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d12, q14, q15
667 vmov r4, r5, d12
668 str r4, [r2], r3 //write 1st 4Byte
669 str r5, [r2], r3 //write 2nd 4Byte
670
671 ldr r5, [r0], r1 //r5=src[1]
672 ldr r4, [r0], r1 //r4=src[2]
673 vmov d0, r6, r5
674 vmov d1, r5, r4 //reserved r4
675
676 FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d12, q14, q15
677 vmov r5, r6, d12
678 str r5, [r2], r3 //write 3rd 4Byte
679 str r6, [r2], r3 //write 4th 4Byte
680
681 //d4, d5, d0, d1 --> d0, d1, d2, d3
682 vmov q1, q0
683 vmov q0, q2
684
685 sub r7, #4
686 cmp r7, #0
687 bne w4_xy_01_mc_luma_loop
688
689 pop {r4, r5, r6, r7}
690WELS_ASM_FUNC_END
691
692
693WELS_ASM_FUNC_BEGIN McHorVer03WidthEq16_neon
694 push {r4}
695 ldr r4, [sp, #4]
696
697 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
698 pld [r0]
699 pld [r0, r1]
700 vmov.u16 q14, #0x0014 // 20
701 vld1.u8 {q0}, [r0], r1 //q0=src[-2]
702 vld1.u8 {q1}, [r0], r1 //q1=src[-1]
703
704 pld [r0]
705 pld [r0, r1]
706 vshr.u16 q15, q14, #2 // 5
707 vld1.u8 {q2}, [r0], r1 //q2=src[0]
708 vld1.u8 {q3}, [r0], r1 //q3=src[1]
709 vld1.u8 {q4}, [r0], r1 //q4=src[2]
710
711w16_xy_03_luma_loop:
712
713 vld1.u8 {q5}, [r0], r1 //q5=src[3]
714
715 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d8, d10, d12, q14, q15
716 pld [r0]
717 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d9, d11, d13, q14, q15
718 vld1.u8 {q0}, [r0], r1 //read 2nd row
719 vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
720
721 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d8, d10, d0, d12, q14, q15
722 pld [r0]
723 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d9, d11, d1, d13, q14, q15
724 vld1.u8 {q1}, [r0], r1 //read 3rd row
725 vst1.u8 {q6}, [r2], r3 //write 2nd 16Byte
726
727 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d4, d6, d8, d10, d0, d2, d12, q14, q15
728 pld [r0]
729 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d5, d7, d9, d11, d1, d3, d13, q14, q15
730 vld1.u8 {q2}, [r0], r1 //read 4th row
731 vst1.u8 {q6}, [r2], r3 //write 3rd 16Byte
732
733 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d6, d8, d10, d0, d2, d4, d12, q14, q15
734 pld [r0]
735 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d7, d9, d11, d1, d3, d5, d13, q14, q15
736 vld1.u8 {q3}, [r0], r1 //read 5th row
737 vst1.u8 {q6}, [r2], r3 //write 4th 16Byte
738
739 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d8, d10, d0, d2, d4, d6, d12, q14, q15
740 pld [r0]
741 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d9, d11, d1, d3, d5, d7, d13, q14, q15
742 vld1.u8 {q4}, [r0], r1 //read 6th row
743 vst1.u8 {q6}, [r2], r3 //write 5th 16Byte
744
745 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d10, d0, d2, d4, d6, d8, d12, q14, q15
746 pld [r0]
747 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d11, d1, d3, d5, d7, d9, d13, q14, q15
748 vld1.u8 {q5}, [r0], r1 //read 7th row
749 vst1.u8 {q6}, [r2], r3 //write 6th 16Byte
750
751 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d8, d10, d12, q14, q15
752 pld [r0]
753 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d9, d11, d13, q14, q15
754 vld1.u8 {q0}, [r0], r1 //read 8th row
755 vst1.u8 {q6}, [r2], r3 //write 7th 16Byte
756
757 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d8, d10, d0, d12, q14, q15
758 pld [r0]
759 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d9, d11, d1, d13, q14, q15
760 vst1.u8 {q6}, [r2], r3 //write 8th 16Byte
761
762 //q2, q3, q4, q5, q0 --> q0~q4
763 vswp q0, q4
764 vswp q0, q2
765 vmov q1, q3
766 vmov q3, q5 //q0~q4
767
768 sub r4, #8
769 cmp r4, #0
770 bne w16_xy_03_luma_loop
771 pop {r4}
772WELS_ASM_FUNC_END
773
774
775WELS_ASM_FUNC_BEGIN McHorVer03WidthEq8_neon
776 push {r4}
777 ldr r4, [sp, #4]
778
779 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
780 pld [r0]
781 pld [r0, r1]
782 vmov.u16 q14, #0x0014 // 20
783 vld1.u8 {d0}, [r0], r1 //d0=src[-2]
784 vld1.u8 {d1}, [r0], r1 //d1=src[-1]
785
786 pld [r0]
787 pld [r0, r1]
788 vshr.u16 q15, q14, #2 // 5
789 vld1.u8 {d2}, [r0], r1 //d2=src[0]
790 vld1.u8 {d3}, [r0], r1 //d3=src[1]
791
792 vld1.u8 {d4}, [r0], r1 //d4=src[2]
793 vld1.u8 {d5}, [r0], r1 //d5=src[3]
794
795w8_xy_03_mc_luma_loop:
796
797 pld [r0]
798 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d12, q14, q15
799 vld1.u8 {d0}, [r0], r1 //read 2nd row
800 vst1.u8 {d12}, [r2], r3 //write 1st 8Byte
801
802 pld [r0]
803 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d2, d3, d4, d5, d0, d12, q14, q15
804 vld1.u8 {d1}, [r0], r1 //read 3rd row
805 vst1.u8 {d12}, [r2], r3 //write 2nd 8Byte
806
807 pld [r0]
808 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d12, q14, q15
809 vld1.u8 {d2}, [r0], r1 //read 4th row
810 vst1.u8 {d12}, [r2], r3 //write 3rd 8Byte
811
812 pld [r0]
813 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d4, d5, d0, d1, d2, d12, q14, q15
814 vld1.u8 {d3}, [r0], r1 //read 5th row
815 vst1.u8 {d12}, [r2], r3 //write 4th 8Byte
816
817 //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
818 vswp q0, q2
819 vswp q1, q2
820
821 sub r4, #4
822 cmp r4, #0
823 bne w8_xy_03_mc_luma_loop
824
825 pop {r4}
826WELS_ASM_FUNC_END
827
828
829WELS_ASM_FUNC_BEGIN McHorVer03WidthEq4_neon
830 push {r4, r5, r6, r7}
831 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
832 pld [r0]
833 pld [r0, r1]
834 vmov.u16 q14, #0x0014 // 20
835 ldr r4, [r0], r1 //r4=src[-2]
836 ldr r5, [r0], r1 //r5=src[-1]
837
838 pld [r0]
839 pld [r0, r1]
840 vshr.u16 q15, q14, #2 // 5
841 ldr r6, [r0], r1 //r6=src[0]
842 ldr r7, [r0], r1 //r7=src[1]
843
844 vmov d0, r4, r5
845 vmov d1, r5, r6
846 vmov d2, r6, r7
847
848 ldr r4, [r0], r1 //r4=src[2]
849 vmov d3, r7, r4
850 ldr r7, [sp, #16]
851
852w4_xy_03_mc_luma_loop:
853
854// pld [r0]
855 //using reserving r4
856 ldr r5, [r0], r1 //r5=src[3]
857 ldr r6, [r0], r1 //r6=src[0]
858 vmov d4, r4, r5
859 vmov d5, r5, r6 //reserved r6
860
861 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d12, q14, q15
862 vmov r4, r5, d12
863 str r4, [r2], r3 //write 1st 4Byte
864 str r5, [r2], r3 //write 2nd 4Byte
865
866 ldr r5, [r0], r1 //r5=src[1]
867 ldr r4, [r0], r1 //r4=src[2]
868 vmov d0, r6, r5
869 vmov d1, r5, r4 //reserved r4
870
871 FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d12, q14, q15
872 vmov r5, r6, d12
873 str r5, [r2], r3 //write 3rd 4Byte
874 str r6, [r2], r3 //write 4th 4Byte
875
876 //d4, d5, d0, d1 --> d0, d1, d2, d3
877 vmov q1, q0
878 vmov q0, q2
879
880 sub r7, #4
881 cmp r7, #0
882 bne w4_xy_03_mc_luma_loop
883
884 pop {r4, r5, r6, r7}
885WELS_ASM_FUNC_END
886
887
888WELS_ASM_FUNC_BEGIN McHorVer02WidthEq16_neon
889 push {r4}
890 ldr r4, [sp, #4]
891
892 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
893 pld [r0]
894 pld [r0, r1]
895 vmov.u16 q14, #0x0014 // 20
896 vld1.u8 {q0}, [r0], r1 //q0=src[-2]
897 vld1.u8 {q1}, [r0], r1 //q1=src[-1]
898
899 pld [r0]
900 pld [r0, r1]
901 vshr.u16 q15, q14, #2 // 5
902 vld1.u8 {q2}, [r0], r1 //q2=src[0]
903 vld1.u8 {q3}, [r0], r1 //q3=src[1]
904 vld1.u8 {q4}, [r0], r1 //q4=src[2]
905
906w16_v_mc_luma_loop:
907
908 vld1.u8 {q5}, [r0], r1 //q5=src[3]
909
910 FILTER_6TAG_8BITS d0, d2, d4, d6, d8, d10, d12, q14, q15
911 pld [r0]
912 FILTER_6TAG_8BITS d1, d3, d5, d7, d9, d11, d13, q14, q15
913 vld1.u8 {q0}, [r0], r1 //read 2nd row
914 vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
915
916 FILTER_6TAG_8BITS d2, d4, d6, d8, d10, d0, d12, q14, q15
917 pld [r0]
918 FILTER_6TAG_8BITS d3, d5, d7, d9, d11, d1, d13, q14, q15
919 vld1.u8 {q1}, [r0], r1 //read 3rd row
920 vst1.u8 {q6}, [r2], r3 //write 2nd 16Byte
921
922 FILTER_6TAG_8BITS d4, d6, d8, d10, d0, d2, d12, q14, q15
923 pld [r0]
924 FILTER_6TAG_8BITS d5, d7, d9, d11, d1, d3, d13, q14, q15
925 vld1.u8 {q2}, [r0], r1 //read 4th row
926 vst1.u8 {q6}, [r2], r3 //write 3rd 16Byte
927
928 FILTER_6TAG_8BITS d6, d8, d10, d0, d2, d4, d12, q14, q15
929 pld [r0]
930 FILTER_6TAG_8BITS d7, d9, d11, d1, d3, d5, d13, q14, q15
931 vld1.u8 {q3}, [r0], r1 //read 5th row
932 vst1.u8 {q6}, [r2], r3 //write 4th 16Byte
933
934 FILTER_6TAG_8BITS d8, d10, d0, d2, d4, d6, d12, q14, q15
935 pld [r0]
936 FILTER_6TAG_8BITS d9, d11, d1, d3, d5, d7, d13, q14, q15
937 vld1.u8 {q4}, [r0], r1 //read 6th row
938 vst1.u8 {q6}, [r2], r3 //write 5th 16Byte
939
940 FILTER_6TAG_8BITS d10, d0, d2, d4, d6, d8, d12, q14, q15
941 pld [r0]
942 FILTER_6TAG_8BITS d11, d1, d3, d5, d7, d9, d13, q14, q15
943 vld1.u8 {q5}, [r0], r1 //read 7th row
944 vst1.u8 {q6}, [r2], r3 //write 6th 16Byte
945
946 FILTER_6TAG_8BITS d0, d2, d4, d6, d8, d10, d12, q14, q15
947 pld [r0]
948 FILTER_6TAG_8BITS d1, d3, d5, d7, d9, d11, d13, q14, q15
949 vld1.u8 {q0}, [r0], r1 //read 8th row
950 vst1.u8 {q6}, [r2], r3 //write 7th 16Byte
951
952 FILTER_6TAG_8BITS d2, d4, d6, d8, d10, d0, d12, q14, q15
953 pld [r0]
954 FILTER_6TAG_8BITS d3, d5, d7, d9, d11, d1, d13, q14, q15
955 vst1.u8 {q6}, [r2], r3 //write 8th 16Byte
956
957 //q2, q3, q4, q5, q0 --> q0~q4
958 vswp q0, q4
959 vswp q0, q2
960 vmov q1, q3
961 vmov q3, q5 //q0~q4
962
963 sub r4, #8
964 cmp r4, #0
965 bne w16_v_mc_luma_loop
966 pop {r4}
967WELS_ASM_FUNC_END
968
969
970WELS_ASM_FUNC_BEGIN McHorVer02WidthEq8_neon
971 push {r4}
972 ldr r4, [sp, #4]
973
974 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
975 pld [r0]
976 pld [r0, r1]
977 vmov.u16 q14, #0x0014 // 20
978 vld1.u8 {d0}, [r0], r1 //d0=src[-2]
979 vld1.u8 {d1}, [r0], r1 //d1=src[-1]
980
981 pld [r0]
982 pld [r0, r1]
983 vshr.u16 q15, q14, #2 // 5
984 vld1.u8 {d2}, [r0], r1 //d2=src[0]
985 vld1.u8 {d3}, [r0], r1 //d3=src[1]
986
987 vld1.u8 {d4}, [r0], r1 //d4=src[2]
988 vld1.u8 {d5}, [r0], r1 //d5=src[3]
989
990w8_v_mc_luma_loop:
991
992 pld [r0]
993 FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d12, q14, q15
994 vld1.u8 {d0}, [r0], r1 //read 2nd row
995 vst1.u8 {d12}, [r2], r3 //write 1st 8Byte
996
997 pld [r0]
998 FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d12, q14, q15
999 vld1.u8 {d1}, [r0], r1 //read 3rd row
1000 vst1.u8 {d12}, [r2], r3 //write 2nd 8Byte
1001
1002 pld [r0]
1003 FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d12, q14, q15
1004 vld1.u8 {d2}, [r0], r1 //read 4th row
1005 vst1.u8 {d12}, [r2], r3 //write 3rd 8Byte
1006
1007 pld [r0]
1008 FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d12, q14, q15
1009 vld1.u8 {d3}, [r0], r1 //read 5th row
1010 vst1.u8 {d12}, [r2], r3 //write 4th 8Byte
1011
1012 //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
1013 vswp q0, q2
1014 vswp q1, q2
1015
1016 sub r4, #4
1017 cmp r4, #0
1018 bne w8_v_mc_luma_loop
1019
1020 pop {r4}
1021WELS_ASM_FUNC_END
1022
1023
1024WELS_ASM_FUNC_BEGIN McHorVer02WidthEq4_neon
1025 push {r4, r5, r6, r7}
1026 sub r0, r0, r1, lsl #1 //src[-2*src_stride]
1027 pld [r0]
1028 pld [r0, r1]
1029 vmov.u16 q14, #0x0014 // 20
1030 ldr r4, [r0], r1 //r4=src[-2]
1031 ldr r5, [r0], r1 //r5=src[-1]
1032
1033 pld [r0]
1034 pld [r0, r1]
1035 vshr.u16 q15, q14, #2 // 5
1036 ldr r6, [r0], r1 //r6=src[0]
1037 ldr r7, [r0], r1 //r7=src[1]
1038
1039 vmov d0, r4, r5
1040 vmov d1, r5, r6
1041 vmov d2, r6, r7
1042
1043 ldr r4, [r0], r1 //r4=src[2]
1044 vmov d3, r7, r4
1045 ldr r7, [sp, #16]
1046
1047w4_v_mc_luma_loop:
1048
1049// pld [r0]
1050 //using reserving r4
1051 ldr r5, [r0], r1 //r5=src[3]
1052 ldr r6, [r0], r1 //r6=src[0]
1053 vmov d4, r4, r5
1054 vmov d5, r5, r6 //reserved r6
1055
1056 FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d12, q14, q15
1057 vmov r4, r5, d12
1058 str r4, [r2], r3 //write 1st 4Byte
1059 str r5, [r2], r3 //write 2nd 4Byte
1060
1061 ldr r5, [r0], r1 //r5=src[1]
1062 ldr r4, [r0], r1 //r4=src[2]
1063 vmov d0, r6, r5
1064 vmov d1, r5, r4 //reserved r4
1065
1066 FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d12, q14, q15
1067 vmov r5, r6, d12
1068 str r5, [r2], r3 //write 3rd 4Byte
1069 str r6, [r2], r3 //write 4th 4Byte
1070
1071 //d4, d5, d0, d1 --> d0, d1, d2, d3
1072 vmov q1, q0
1073 vmov q0, q2
1074
1075 sub r7, #4
1076 cmp r7, #0
1077 bne w4_v_mc_luma_loop
1078
1079 pop {r4, r5, r6, r7}
1080WELS_ASM_FUNC_END
1081
1082
1083WELS_ASM_FUNC_BEGIN McHorVer22WidthEq16_neon
1084 push {r4}
1085 ldr r4, [sp, #4]
1086
1087 sub r0, #2 //src[-2]
1088 sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
1089 pld [r0]
1090 pld [r0, r1]
1091
1092 vmov.u16 q14, #0x0014 // 20
1093 vld1.u8 {d0-d2}, [r0], r1 //use 21(16+5), =src[-2]
1094 vld1.u8 {d3-d5}, [r0], r1 //use 21(16+5), =src[-1]
1095
1096 pld [r0]
1097 pld [r0, r1]
1098 vshr.u16 q15, q14, #2 // 5
1099
1100 vld1.u8 {d6-d8}, [r0], r1 //use 21(16+5), =src[0]
1101 vld1.u8 {d9-d11}, [r0], r1 //use 21(16+5), =src[1]
1102 pld [r0]
1103 pld [r0, r1]
1104 vld1.u8 {d12-d14}, [r0], r1 //use 21(16+5), =src[2]
1105
1106w16_hv_mc_luma_loop:
1107
1108 vld1.u8 {d15-d17}, [r0], r1 //use 21(16+5), =src[3]
1109 //the 1st row
1110 pld [r0]
1111 // vertical filtered into q9/q10
1112 FILTER_6TAG_8BITS_TO_16BITS d0, d3, d6, d9, d12, d15, q9, q14, q15 // 8 avail
1113 FILTER_6TAG_8BITS_TO_16BITS d1, d4, d7,d10, d13, d16,q10, q14, q15 // 8 avail
1114 // horizon filtered
1115 UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1116 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d0 //output to q0[0]
1117
1118 // vertical filtered into q10/q11
1119 FILTER_6TAG_8BITS_TO_16BITS d2, d5, d8,d11, d14, d17,q11, q14, q15 // only 5 avail
1120 // horizon filtered
1121 UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1122 FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d1 //output to q0[1]
1123 vst1.u8 {q0}, [r2], r3 //write 16Byte
1124
1125
1126 vld1.u8 {d0-d2}, [r0], r1 //read 2nd row
1127 //the 2nd row
1128 pld [r0]
1129 // vertical filtered into q9/q10
1130 FILTER_6TAG_8BITS_TO_16BITS d3, d6, d9, d12, d15, d0, q9, q14, q15 // 8 avail
1131 FILTER_6TAG_8BITS_TO_16BITS d4, d7,d10, d13, d16, d1,q10, q14, q15 // 8 avail
1132 // horizon filtered
1133 UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1134 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d3 //output to d3
1135
1136 // vertical filtered into q10/q11
1137 FILTER_6TAG_8BITS_TO_16BITS d5, d8,d11, d14, d17, d2,q11, q14, q15 // only 5 avail
1138 // horizon filtered
1139 UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1140 FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d4 //output to d4
1141
1142 vst1.u8 {d3, d4}, [r2], r3 //write 16Byte
1143
1144 vld1.u8 {d3-d5}, [r0], r1 //read 3rd row
1145 //the 3rd row
1146 pld [r0]
1147 // vertical filtered into q9/q10
1148 FILTER_6TAG_8BITS_TO_16BITS d6, d9, d12, d15, d0, d3, q9, q14, q15 // 8 avail
1149 FILTER_6TAG_8BITS_TO_16BITS d7,d10, d13, d16, d1, d4,q10, q14, q15 // 8 avail
1150 // horizon filtered
1151 UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1152 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d6 //output to d6
1153
1154 // vertical filtered into q10/q11
1155 FILTER_6TAG_8BITS_TO_16BITS d8,d11, d14, d17, d2, d5,q11, q14, q15 // only 5 avail
1156 // horizon filtered
1157 UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1158 FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d7 //output to d7
1159 vst1.u8 {d6, d7}, [r2], r3 //write 16Byte
1160
1161 vld1.u8 {d6-d8}, [r0], r1 //read 4th row
1162 //the 4th row
1163 pld [r0]
1164 // vertical filtered into q9/q10
1165 FILTER_6TAG_8BITS_TO_16BITS d9, d12, d15, d0, d3, d6, q9, q14, q15 // 8 avail
1166 FILTER_6TAG_8BITS_TO_16BITS d10, d13, d16, d1, d4, d7,q10, q14, q15 // 8 avail
1167 // horizon filtered
1168 UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1169 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d9 //output to d9
1170 // vertical filtered into q10/q11
1171 FILTER_6TAG_8BITS_TO_16BITS d11, d14, d17, d2, d5, d8,q11, q14, q15 // only 5 avail
1172 // horizon filtered
1173 UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1174 FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d10 //output to d10
1175 vst1.u8 {d9, d10}, [r2], r3 //write 16Byte
1176
1177 //d12~d17(q6~q8), d0~d8(q0~q3+d8), --> d0~d14
1178 vswp q0, q6
1179 vswp q6, q3
1180 vmov q5, q2
1181 vmov q2, q8
1182
1183 vmov d20,d8
1184 vmov q4, q1
1185 vmov q1, q7
1186 vmov d14,d20
1187
1188 sub r4, #4
1189 cmp r4, #0
1190 bne w16_hv_mc_luma_loop
1191 pop {r4}
1192WELS_ASM_FUNC_END
1193
1194
1195WELS_ASM_FUNC_BEGIN McHorVer22WidthEq8_neon
1196 push {r4}
1197 ldr r4, [sp, #4]
1198
1199 sub r0, #2 //src[-2]
1200 sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
1201 pld [r0]
1202 pld [r0, r1]
1203
1204 vmov.u16 q14, #0x0014 // 20
1205 vld1.u8 {q0}, [r0], r1 //use 13(8+5), =src[-2]
1206 vld1.u8 {q1}, [r0], r1 //use 13(8+5), =src[-1]
1207
1208 pld [r0]
1209 pld [r0, r1]
1210 vshr.u16 q15, q14, #2 // 5
1211
1212 vld1.u8 {q2}, [r0], r1 //use 13(8+5), =src[0]
1213 vld1.u8 {q3}, [r0], r1 //use 13(8+5), =src[1]
1214 pld [r0]
1215 pld [r0, r1]
1216 vld1.u8 {q4}, [r0], r1 //use 13(8+5), =src[2]
1217
1218w8_hv_mc_luma_loop:
1219
1220 vld1.u8 {q5}, [r0], r1 //use 13(8+5), =src[3]
1221 //the 1st row
1222 pld [r0]
1223 // vertical filtered into q6/q7
1224 FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d10, q6, q14, q15 // 8 avail
1225 FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d11, q7, q14, q15 // 5 avail
1226 // horizon filtered
1227 UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
1228 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
1229 vst1.u8 d12, [r2], r3 //write 8Byte
1230
1231 vld1.u8 {q0}, [r0], r1 //read 2nd row
1232 //the 2nd row
1233 pld [r0]
1234 // vertical filtered into q6/q7
1235 FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d10, d0, q6, q14, q15 // 8 avail
1236 FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d11, d1, q7, q14, q15 // 5 avail
1237 // horizon filtered
1238 UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
1239 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
1240 vst1.u8 d12, [r2], r3 //write 8Byte
1241
1242 vld1.u8 {q1}, [r0], r1 //read 3rd row
1243 //the 3rd row
1244 pld [r0]
1245 // vertical filtered into q6/q7
1246 FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d10, d0, d2, q6, q14, q15 // 8 avail
1247 FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d11, d1, d3, q7, q14, q15 // 5 avail
1248 // horizon filtered
1249 UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
1250 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
1251 vst1.u8 d12, [r2], r3 //write 8Byte
1252
1253 vld1.u8 {q2}, [r0], r1 //read 4th row
1254 //the 4th row
1255 pld [r0]
1256 // vertical filtered into q6/q7
1257 FILTER_6TAG_8BITS_TO_16BITS d6, d8, d10, d0, d2, d4, q6, q14, q15 // 8 avail
1258 FILTER_6TAG_8BITS_TO_16BITS d7, d9, d11, d1, d3, d5, q7, q14, q15 // 5 avail
1259 // horizon filtered
1260 UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
1261 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
1262 vst1.u8 d12, [r2], r3 //write 8Byte
1263
1264 //q4~q5, q0~q2, --> q0~q4
1265 vswp q0, q4
1266 vswp q2, q4
1267 vmov q3, q1
1268 vmov q1, q5
1269
1270 sub r4, #4
1271 cmp r4, #0
1272 bne w8_hv_mc_luma_loop
1273 pop {r4}
1274WELS_ASM_FUNC_END
1275
1276
1277WELS_ASM_FUNC_BEGIN McHorVer22WidthEq4_neon
1278 push {r4 ,r5, r6}
1279 ldr r6, [sp, #12]
1280
1281 sub r0, #2 //src[-2]
1282 sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
1283 pld [r0]
1284 pld [r0, r1]
1285
1286 vmov.u16 q14, #0x0014 // 20
1287 vld1.u8 {q0}, [r0], r1 //use 9(4+5), =src[-2]
1288 vld1.u8 {q1}, [r0], r1 //use 9(4+5), =src[-1]
1289
1290 pld [r0]
1291 pld [r0, r1]
1292 vshr.u16 q15, q14, #2 // 5
1293
1294 vld1.u8 {q2}, [r0], r1 //use 9(4+5), =src[0]
1295 vld1.u8 {q3}, [r0], r1 //use 9(4+5), =src[1]
1296 pld [r0]
1297 pld [r0, r1]
1298 vld1.u8 {q4}, [r0], r1 //use 9(4+5), =src[2]
1299
1300w4_hv_mc_luma_loop:
1301
1302 vld1.u8 {q5}, [r0], r1 //use 9(4+5), =src[3]
1303 vld1.u8 {q6}, [r0], r1 //use 9(4+5), =src[4]
1304
1305 //the 1st&2nd row
1306 pld [r0]
1307 pld [r0, r1]
1308 // vertical filtered
1309 FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d10, q7, q14, q15 // 8 avail
1310 FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d11, q8, q14, q15 // 1 avail
1311
1312 FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8,d10, d12, q9, q14, q15 // 8 avail
1313 FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9,d11, d13,q10, q14, q15 // 1 avail
1314 // horizon filtered
1315 UNPACK_2_16BITS_TO_ABC q7, q8, q11, q12, q13 //4 avail
1316 UNPACK_2_16BITS_TO_ABC q9,q10, q0, q7, q8 //4 avail
1317
1318 vmov d23, d0
1319 vmov d25, d14
1320 vmov d27, d16
1321
1322 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d22 //output to q11[0]
1323 vmov r4 ,r5, d22
1324 str r4, [r2], r3 //write 4Byte
1325 str r5, [r2], r3 //write 4Byte
1326
1327 //the 3rd&4th row
1328 vld1.u8 {q0}, [r0], r1 //use 9(4+5), =src[3]
1329 vld1.u8 {q1}, [r0], r1 //use 9(4+5), =src[4]
1330 pld [r0]
1331 pld [r0, r1]
1332 // vertical filtered
1333 FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d10, d12, d0, q7, q14, q15 // 8 avail
1334 FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d11, d13, d1, q8, q14, q15 // 1 avail
1335
1336 FILTER_6TAG_8BITS_TO_16BITS d6, d8,d10, d12, d0, d2, q9, q14, q15 // 8 avail
1337 FILTER_6TAG_8BITS_TO_16BITS d7, d9,d11, d13, d1, d3,q10, q14, q15 // 1 avail
1338 // horizon filtered
1339 UNPACK_2_16BITS_TO_ABC q7, q8, q11, q12, q13 //4 avail
1340 UNPACK_2_16BITS_TO_ABC q9,q10, q2, q7, q8 //4 avail
1341
1342 vmov d23, d4
1343 vmov d25, d14
1344 vmov d27, d16
1345
1346 FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d22 //output to q11[0]
1347 vmov r4 ,r5, d22
1348 str r4, [r2], r3 //write 4Byte
1349 str r5, [r2], r3 //write 4Byte
1350
1351 //q4~q6, q0~q1, --> q0~q4
1352 vswp q4, q0
1353 vmov q3, q4
1354 vmov q4, q1
1355 vmov q1, q5
1356 vmov q2, q6
1357
1358 sub r6, #4
1359 cmp r6, #0
1360 bne w4_hv_mc_luma_loop
1361
1362 pop {r4, r5, r6}
1363WELS_ASM_FUNC_END
1364
1365
1366WELS_ASM_FUNC_BEGIN McCopyWidthEq16_neon
1367 push {r4}
1368 ldr r4, [sp, #4]
1369w16_copy_loop:
1370 vld1.u8 {q0}, [r0], r1
1371 sub r4, #2
1372 vld1.u8 {q1}, [r0], r1
1373 vst1.u8 {q0}, [r2], r3
1374 cmp r4, #0
1375 vst1.u8 {q1}, [r2], r3
1376 bne w16_copy_loop
1377
1378 pop {r4}
1379WELS_ASM_FUNC_END
1380
1381
1382WELS_ASM_FUNC_BEGIN McCopyWidthEq8_neon
1383 push {r4}
1384 ldr r4, [sp, #4]
1385w8_copy_loop:
1386 vld1.u8 {d0}, [r0], r1
1387 vld1.u8 {d1}, [r0], r1
1388 vst1.u8 {d0}, [r2], r3
1389 vst1.u8 {d1}, [r2], r3
1390 sub r4, #2
1391 cmp r4, #0
1392 bne w8_copy_loop
1393
1394 pop {r4}
1395WELS_ASM_FUNC_END
1396
1397
1398WELS_ASM_FUNC_BEGIN McCopyWidthEq4_neon
1399 push {r4, r5, r6}
1400 ldr r4, [sp, #12]
1401w4_copy_loop:
1402 ldr r5, [r0], r1
1403 ldr r6, [r0], r1
1404 str r5, [r2], r3
1405 str r6, [r2], r3
1406
1407 sub r4, #2
1408 cmp r4, #0
1409 bne w4_copy_loop
1410
1411 pop {r4, r5, r6}
1412WELS_ASM_FUNC_END
1413
1414
1415WELS_ASM_FUNC_BEGIN PixelAvgWidthEq16_neon
1416 push {r4}
1417 ldr r4, [sp, #4]
1418w16_pix_avg_loop:
1419 vld1.u8 {q0}, [r2]!
1420 vld1.u8 {q1}, [r3]!
1421 vld1.u8 {q2}, [r2]!
1422 vld1.u8 {q3}, [r3]!
1423
1424 vld1.u8 {q4}, [r2]!
1425 vld1.u8 {q5}, [r3]!
1426 vld1.u8 {q6}, [r2]!
1427 vld1.u8 {q7}, [r3]!
1428
1429 AVERAGE_TWO_8BITS d0, d0, d2
1430 AVERAGE_TWO_8BITS d1, d1, d3
1431 vst1.u8 {q0}, [r0], r1
1432
1433 AVERAGE_TWO_8BITS d4, d4, d6
1434 AVERAGE_TWO_8BITS d5, d5, d7
1435 vst1.u8 {q2}, [r0], r1
1436
1437 AVERAGE_TWO_8BITS d8, d8, d10
1438 AVERAGE_TWO_8BITS d9, d9, d11
1439 vst1.u8 {q4}, [r0], r1
1440
1441 AVERAGE_TWO_8BITS d12, d12, d14
1442 AVERAGE_TWO_8BITS d13, d13, d15
1443 vst1.u8 {q6}, [r0], r1
1444
1445 sub r4, #4
1446 cmp r4, #0
1447 bne w16_pix_avg_loop
1448
1449 pop {r4}
1450WELS_ASM_FUNC_END
1451
1452
1453WELS_ASM_FUNC_BEGIN PixelAvgWidthEq8_neon
1454 push {r4, r5}
1455 ldr r4, [sp, #8]
1456 mov r5, #16
1457w8_pix_avg_loop:
1458
1459 vld1.u8 {d0}, [r2], r5
1460 vld1.u8 {d2}, [r3], r5
1461 vld1.u8 {d1}, [r2], r5
1462 vld1.u8 {d3}, [r3], r5
1463
1464 AVERAGE_TWO_8BITS d0, d0, d2
1465 AVERAGE_TWO_8BITS d1, d1, d3
1466 vst1.u8 {d0}, [r0], r1
1467 vst1.u8 {d1}, [r0], r1
1468
1469 vld1.u8 {d4}, [r2], r5
1470 vld1.u8 {d6}, [r3], r5
1471 vld1.u8 {d5}, [r2], r5
1472 vld1.u8 {d7}, [r3], r5
1473
1474 AVERAGE_TWO_8BITS d4, d4, d6
1475 AVERAGE_TWO_8BITS d5, d5, d7
1476 vst1.u8 {d4}, [r0], r1
1477 vst1.u8 {d5}, [r0], r1
1478
1479 sub r4, #4
1480 cmp r4, #0
1481 bne w8_pix_avg_loop
1482
1483 pop {r4, r5}
1484WELS_ASM_FUNC_END
1485
1486
1487WELS_ASM_FUNC_BEGIN PixelAvgWidthEq4_neon
1488 push {r4-r8}
1489 ldr r4, [sp, #20]
1490w4_pix_avg_loop:
1491
1492 ldr r5, [r2]
1493 ldr r6, [r2, #16]
1494 ldr r7, [r3]
1495 ldr r8, [r3, #16]
1496 add r2, #32
1497 add r3, #32
1498
1499 vmov d0, r5, r6
1500 vmov d1, r7, r8
1501 AVERAGE_TWO_8BITS d0, d0, d1
1502 vmov r5, r6, d0
1503
1504 str r5, [r0], r1
1505 str r6, [r0], r1
1506
1507 sub r4, #2
1508 cmp r4, #0
1509 bne w4_pix_avg_loop
1510
1511 pop {r4-r8}
1512WELS_ASM_FUNC_END
1513
1514WELS_ASM_FUNC_BEGIN McChromaWidthEq8_neon
1515 push {r4, r5}
1516 ldr r4, [sp, #8]
1517 ldr r5, [sp, #12]
1518// normal case: {cA*src[x] + cB*src[x+1]} + {cC*src[x+stride] + cD*srcp[x+stride+1]}
1519// we can opti it by adding vert only/ hori only cases, to be continue
1520 vld1.u8 {d31}, [r4] //load A/B/C/D
1521 vld1.u8 {q0}, [r0], r1 //src[x]
1522
1523 vdup.u8 d28, d31[0] //A
1524 vdup.u8 d29, d31[1] //B
1525 vdup.u8 d30, d31[2] //C
1526 vdup.u8 d31, d31[3] //D
1527
1528 vext.u8 d1, d0, d1, #1 //src[x+1]
1529
1530w8_mc_chroma_loop: // each two pxl row
1531 vld1.u8 {q1}, [r0], r1 //src[x+stride]
1532 vld1.u8 {q2}, [r0], r1 //src[x+2*stride]
1533 vext.u8 d3, d2, d3, #1 //src[x+stride+1]
1534 vext.u8 d5, d4, d5, #1 //src[x+2*stride+1]
1535
1536 vmull.u8 q3, d0, d28 //(src[x] * A)
1537 vmlal.u8 q3, d1, d29 //+=(src[x+1] * B)
1538 vmlal.u8 q3, d2, d30 //+=(src[x+stride] * C)
1539 vmlal.u8 q3, d3, d31 //+=(src[x+stride+1] * D)
1540 vrshrn.u16 d6, q3, #6
1541 vst1.u8 d6, [r2], r3
1542
1543 vmull.u8 q3, d2, d28 //(src[x] * A)
1544 vmlal.u8 q3, d3, d29 //+=(src[x+1] * B)
1545 vmlal.u8 q3, d4, d30 //+=(src[x+stride] * C)
1546 vmlal.u8 q3, d5, d31 //+=(src[x+stride+1] * D)
1547 vrshrn.u16 d6, q3, #6
1548 vst1.u8 d6, [r2], r3
1549
1550 vmov q0, q2
1551 sub r5, #2
1552 cmp r5, #0
1553 bne w8_mc_chroma_loop
1554
1555 pop {r4, r5}
1556WELS_ASM_FUNC_END
1557
1558
1559WELS_ASM_FUNC_BEGIN McChromaWidthEq4_neon
1560
1561 push {r4, r5, r6}
1562 ldr r4, [sp, #12]
1563 ldr r6, [sp, #16]
1564// normal case: {cA*src[x] + cB*src[x+1]} + {cC*src[x+stride] + cD*srcp[x+stride+1]}
1565// we can opti it by adding vert only/ hori only cases, to be continue
1566 vld1.u8 {d31}, [r4] //load A/B/C/D
1567
1568 vdup.u8 d28, d31[0] //A
1569 vdup.u8 d29, d31[1] //B
1570 vdup.u8 d30, d31[2] //C
1571 vdup.u8 d31, d31[3] //D
1572
1573w4_mc_chroma_loop: // each two pxl row
1574 vld1.u8 {d0}, [r0], r1 //a::src[x]
1575 vld1.u8 {d2}, [r0], r1 //b::src[x+stride]
1576 vld1.u8 {d4}, [r0] //c::src[x+2*stride]
1577
1578 vshr.u64 d1, d0, #8
1579 vshr.u64 d3, d2, #8
1580 vshr.u64 d5, d4, #8
1581
1582 vmov q3, q1 //b::[0:7]+b::[1~8]
1583 vtrn.32 q0, q1 //d0{a::[0:3]+b::[0:3]}; d1{a::[1:4]+b::[1:4]}
1584 vtrn.32 q3, q2 //d6{b::[0:3]+c::[0:3]}; d7{b::[1:4]+c::[1:4]}
1585
1586 vmull.u8 q1, d0, d28 //(src[x] * A)
1587 vmlal.u8 q1, d1, d29 //+=(src[x+1] * B)
1588 vmlal.u8 q1, d6, d30 //+=(src[x+stride] * C)
1589 vmlal.u8 q1, d7, d31 //+=(src[x+stride+1] * D)
1590
1591 vrshrn.u16 d2, q1, #6
1592 vmov r4, r5, d2
1593 str r4, [r2], r3
1594 str r5, [r2], r3
1595
1596 sub r6, #2
1597 cmp r6, #0
1598 bne w4_mc_chroma_loop
1599
1600 pop {r4, r5, r6}
1601WELS_ASM_FUNC_END
1602#endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t