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−
201−WELS_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−
209−w16_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}
230−WELS_ASM_FUNC_END
231−
232−
233−WELS_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−
241−w8_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}
259−WELS_ASM_FUNC_END
260−
261−
262−WELS_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−
270−w4_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}
297−WELS_ASM_FUNC_END
298−
299−
300−WELS_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−
308−w16_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}
329−WELS_ASM_FUNC_END
330−
331−
332−WELS_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−
340−w8_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}
358−WELS_ASM_FUNC_END
359−
360−
361−WELS_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−
369−w4_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}
396−WELS_ASM_FUNC_END
397−
398−
399−WELS_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−
407−w16_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}
428−WELS_ASM_FUNC_END
429−
430−
431−WELS_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−
439−w8_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}
457−WELS_ASM_FUNC_END
458−
459−
460−WELS_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−
468−w4_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}
495−WELS_ASM_FUNC_END
496−
497−
498−WELS_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−
516−w16_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}
577−WELS_ASM_FUNC_END
578−
579−
580−WELS_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−
600−w8_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}
631−WELS_ASM_FUNC_END
632−
633−
634−WELS_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−
657−w4_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}
690−WELS_ASM_FUNC_END
691−
692−
693−WELS_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−
711−w16_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}
772−WELS_ASM_FUNC_END
773−
774−
775−WELS_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−
795−w8_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}
826−WELS_ASM_FUNC_END
827−
828−
829−WELS_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−
852−w4_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}
885−WELS_ASM_FUNC_END
886−
887−
888−WELS_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−
906−w16_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}
967−WELS_ASM_FUNC_END
968−
969−
970−WELS_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−
990−w8_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}
1021−WELS_ASM_FUNC_END
1022−
1023−
1024−WELS_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−
1047−w4_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}
1080−WELS_ASM_FUNC_END
1081−
1082−
1083−WELS_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−
1106−w16_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}
1192−WELS_ASM_FUNC_END
1193−
1194−
1195−WELS_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−
1218−w8_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}
1274−WELS_ASM_FUNC_END
1275−
1276−
1277−WELS_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−
1300−w4_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}
1363−WELS_ASM_FUNC_END
1364−
1365−
1366−WELS_ASM_FUNC_BEGIN McCopyWidthEq16_neon
1367− push {r4}
1368− ldr r4, [sp, #4]
1369−w16_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}
1379−WELS_ASM_FUNC_END
1380−
1381−
1382−WELS_ASM_FUNC_BEGIN McCopyWidthEq8_neon
1383− push {r4}
1384− ldr r4, [sp, #4]
1385−w8_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}
1395−WELS_ASM_FUNC_END
1396−
1397−
1398−WELS_ASM_FUNC_BEGIN McCopyWidthEq4_neon
1399− push {r4, r5, r6}
1400− ldr r4, [sp, #12]
1401−w4_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}
1412−WELS_ASM_FUNC_END
1413−
1414−
1415−WELS_ASM_FUNC_BEGIN PixelAvgWidthEq16_neon
1416− push {r4}
1417− ldr r4, [sp, #4]
1418−w16_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}
1450−WELS_ASM_FUNC_END
1451−
1452−
1453−WELS_ASM_FUNC_BEGIN PixelAvgWidthEq8_neon
1454− push {r4, r5}
1455− ldr r4, [sp, #8]
1456− mov r5, #16
1457−w8_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}
1484−WELS_ASM_FUNC_END
1485−
1486−
1487−WELS_ASM_FUNC_BEGIN PixelAvgWidthEq4_neon
1488− push {r4-r8}
1489− ldr r4, [sp, #20]
1490−w4_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}
1512−WELS_ASM_FUNC_END
1513−
1514−WELS_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−
1530−w8_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}
1556−WELS_ASM_FUNC_END
1557−
1558−
1559−WELS_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−
1573−w4_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}
1601−WELS_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