• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
35#include "arm_arch_common_macro.S"
36
37.macro JMP_IF_128BITS_IS_ZERO arg0, arg1, arg2
38    vorr.s16    \arg2, \arg0, \arg1
39    vmov        r3, r2, \arg2
40    orr         r3, r3, r2
41    cmp         r3, #0
42.endm
43
44.macro MASK_MATRIX arg0, arg1, arg2, arg3, arg4, arg5, arg6
45    vabd.u8 \arg6, \arg1, \arg2
46    vcgt.u8 \arg6, \arg4, \arg6
47
48    vabd.u8 \arg4, \arg0, \arg1
49    vclt.u8 \arg4, \arg4, \arg5
50    vand.u8 \arg6, \arg6, \arg4
51
52    vabd.u8 \arg4, \arg3, \arg2
53    vclt.u8 \arg4, \arg4, \arg5
54    vand.u8 \arg6, \arg6, \arg4
55.endm
56
57.macro DIFF_LUMA_LT4_P1_Q1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
58    vmov.i8 \arg9, #128
59    vrhadd.u8   \arg8, \arg2, \arg3
60    vhadd.u8    \arg8, \arg0, \arg8
61    vsub.s8 \arg8, \arg8, \arg9
62    vsub.s8 \arg9, \arg1, \arg9
63    vqsub.s8    \arg8, \arg8, \arg9
64    vmax.s8 \arg8, \arg8, \arg5
65    vmin.s8 \arg8, \arg8, \arg6
66    vabd.u8 \arg9, \arg0, \arg2
67    vclt.u8 \arg9, \arg9, \arg4
68    vand.s8 \arg8, \arg8, \arg9
69    vand.s8 \arg8, \arg8, \arg7
70    vadd.u8 \arg8, \arg1, \arg8
71    vabs.s8 \arg9, \arg9
72.endm
73
74.macro DIFF_LUMA_LT4_P0_Q0 arg0, arg1, arg2, arg3, arg4, arg5, arg6
75    vsubl.u8    \arg5, \arg0, \arg3
76    vsubl.u8    \arg6, \arg2, \arg1
77    vshl.s16    \arg6, \arg6, #2
78    vadd.s16    \arg5, \arg5, \arg6
79    vqrshrn.s16     \arg4, \arg5, #3
80.endm
81
82
83.macro DIFF_LUMA_EQ4_P2P1P0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7
84    vaddl.u8    q4, \arg1, \arg2
85    vaddl.u8    q5, \arg3, \arg4
86    vadd.u16    q5, q4, q5
87
88    vaddl.u8    q4, \arg0, \arg1
89    vshl.u16    q4, q4, #1
90    vadd.u16    q4, q5, q4
91
92    vrshrn.u16      \arg0, q5, #2
93    vrshrn.u16      \arg7, q4, #3
94
95    vshl.u16    q5, q5, #1
96    vsubl.u8    q4, \arg5, \arg1
97    vadd.u16    q5, q4,q5
98
99    vaddl.u8    q4, \arg2, \arg5
100    vaddw.u8    q4, q4, \arg2
101    vaddw.u8    q4, q4, \arg3
102
103    vrshrn.u16      d10,q5, #3
104    vrshrn.u16      d8, q4, #2
105    vbsl.u8     \arg6, d10, d8
106.endm
107
108.macro DIFF_LUMA_EQ4_MASK arg0, arg1, arg2, arg3
109    vmov    \arg3, \arg2
110    vbsl.u8 \arg3, \arg0, \arg1
111.endm
112
113.macro DIFF_CHROMA_EQ4_P0Q0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
114    vaddl.u8    \arg4, \arg0, \arg3
115    vaddw.u8    \arg5, \arg4, \arg1
116    vaddw.u8    \arg6, \arg4, \arg2
117    vaddw.u8    \arg5, \arg5, \arg0
118    vaddw.u8    \arg6, \arg6, \arg3
119    vrshrn.u16      \arg7, \arg5, #2
120    vrshrn.u16      \arg8, \arg6, #2
121.endm
122
123.macro LOAD_CHROMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
124    vld4.u8 {\arg0[\arg8],\arg1[\arg8],\arg2[\arg8],\arg3[\arg8]}, [r0], r2
125    vld4.u8 {\arg4[\arg8],\arg5[\arg8],\arg6[\arg8],\arg7[\arg8]}, [r1], r2
126.endm
127
128.macro STORE_CHROMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
129    vst4.u8 {\arg0[\arg8],\arg1[\arg8],\arg2[\arg8],\arg3[\arg8]}, [r0], r2
130    vst4.u8 {\arg4[\arg8],\arg5[\arg8],\arg6[\arg8],\arg7[\arg8]}, [r1], r2
131.endm
132
133.macro LOAD_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6
134    vld3.u8 {\arg0[\arg6],\arg1[\arg6],\arg2[\arg6]}, [r2], r1
135    vld3.u8 {\arg3[\arg6],\arg4[\arg6],\arg5[\arg6]}, [r0], r1
136.endm
137
138.macro STORE_LUMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5
139    vst4.u8 {\arg0[\arg4],\arg1[\arg4],\arg2[\arg4],\arg3[\arg4]}, [r0], r1
140    vst4.u8 {\arg0[\arg5],\arg1[\arg5],\arg2[\arg5],\arg3[\arg5]}, [r2], r1
141.endm
142
143.macro STORE_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6
144    vst3.u8 {\arg0[\arg6],\arg1[\arg6],\arg2[\arg6]}, [r3], r1
145    vst3.u8 {\arg3[\arg6],\arg4[\arg6],\arg5[\arg6]}, [r0], r1
146.endm
147
148.macro EXTRACT_DELTA_INTO_TWO_PART arg0, arg1
149    vcge.s8 \arg1, \arg0, #0
150    vand    \arg1, \arg0, \arg1
151    vsub.s8 \arg0, \arg1, \arg0
152.endm
153
154WELS_ASM_FUNC_BEGIN DeblockLumaLt4V_neon
155    vpush   {q4-q7}
156    vdup.u8 q11, r2
157    vdup.u8 q9, r3
158
159    add         r2, r1, r1, lsl #1
160    sub         r2, r0, r2
161    vld1.u8 {q0}, [r2], r1
162    vld1.u8 {q3}, [r0], r1
163    vld1.u8 {q1}, [r2], r1
164    vld1.u8 {q4}, [r0], r1
165    vld1.u8 {q2}, [r2]
166    vld1.u8 {q5}, [r0]
167    sub         r2, r2, r1
168
169    ldr         r3, [sp, #64]
170    vld1.s8 {d31}, [r3]
171    vdup.s8 d28, d31[0]
172    vdup.s8 d30, d31[1]
173    vdup.s8 d29, d31[2]
174    vdup.s8 d31, d31[3]
175    vtrn.32 d28, d30
176    vtrn.32 d29, d31
177    vcge.s8 q10, q14, #0
178
179    MASK_MATRIX q1, q2, q3, q4, q11, q9, q15
180    vand.u8 q10, q10, q15
181
182    veor        q15, q15
183    vsub.i8 q15,q15,q14
184
185    DIFF_LUMA_LT4_P1_Q1 q0, q1, q2, q3, q9, q15, q14, q10, q6, q12
186    vst1.u8 {q6}, [r2], r1
187
188    DIFF_LUMA_LT4_P1_Q1 q5, q4, q3, q2, q9, q15, q14, q10, q7, q13
189
190    vabs.s8 q12, q12
191    vabs.s8 q13, q13
192    vadd.u8 q14,q14,q12
193    vadd.u8 q14,q14,q13
194    veor        q15, q15
195    vsub.i8 q15,q15,q14
196
197    DIFF_LUMA_LT4_P0_Q0 d2, d4, d6, d8, d16, q12, q13
198    DIFF_LUMA_LT4_P0_Q0 d3, d5, d7, d9, d17, q12, q13
199    vmax.s8 q8, q8, q15
200    vmin.s8 q8, q8, q14
201    vand.s8 q8, q8, q10
202    EXTRACT_DELTA_INTO_TWO_PART q8, q9
203    vqadd.u8    q2, q2, q9
204    vqsub.u8    q2, q2, q8
205    vst1.u8 {q2}, [r2], r1
206    vqsub.u8    q3, q3, q9
207    vqadd.u8    q3, q3, q8
208    vst1.u8 {q3}, [r2]  , r1
209    vst1.u8 {q7}, [r2]
210
211    vpop    {q4-q7}
212WELS_ASM_FUNC_END
213
214
215WELS_ASM_FUNC_BEGIN DeblockLumaEq4V_neon
216    vpush   {q4-q7}
217
218    vdup.u8 q5, r2
219    vdup.u8 q4, r3
220
221    sub         r3, r0, r1, lsl #2
222    vld1.u8 {q8},  [r3], r1
223    vld1.u8 {q12}, [r0], r1
224    vld1.u8 {q9},  [r3], r1
225    vld1.u8 {q13}, [r0], r1
226    vld1.u8 {q10}, [r3], r1
227    vld1.u8 {q14}, [r0], r1
228    vld1.u8 {q11}, [r3]
229    vld1.u8 {q15}, [r0]
230    sub         r3, r3, r1  , lsl #1
231
232    MASK_MATRIX q10, q11, q12, q13, q5, q4, q6
233
234    mov         r2, r2, lsr #2
235    add         r2, r2, #2
236    vdup.u8 q5, r2
237    vabd.u8 q0, q11, q12
238    vclt.u8 q7, q0, q5
239
240    vabd.u8 q1, q9, q11
241    vclt.u8 q1, q1, q4
242    vand.s8 q1, q1, q7
243
244    vabd.u8 q2, q14,q12
245    vclt.u8 q2, q2, q4
246    vand.s8 q2, q2, q7
247    vand.u8 q7, q7, q6
248
249    vmov        q3, q1
250
251    DIFF_LUMA_EQ4_P2P1P0        d16, d18, d20, d22, d24, d26, d2, d0
252    DIFF_LUMA_EQ4_P2P1P0        d17, d19, d21, d23, d25, d27, d3, d1
253
254    vand.u8 q3, q7, q3
255    DIFF_LUMA_EQ4_MASK  q0, q9, q3, q4
256    vst1.u8 {q4}, [r3], r1
257    DIFF_LUMA_EQ4_MASK  q8,q10, q3, q4
258    vst1.u8 {q4}, [r3], r1
259    DIFF_LUMA_EQ4_MASK  q1,q11, q6, q4
260    vst1.u8 {q4}, [r3], r1
261
262    vmov        q0, q2
263    DIFF_LUMA_EQ4_P2P1P0        d30, d28, d26, d24, d22, d20, d4, d6
264    DIFF_LUMA_EQ4_P2P1P0        d31, d29, d27, d25, d23, d21, d5, d7
265
266    vand.u8 q0, q7, q0
267    DIFF_LUMA_EQ4_MASK  q2,  q12, q6, q4
268    vst1.u8 {q4}, [r3], r1
269    DIFF_LUMA_EQ4_MASK  q15, q13, q0, q4
270    vst1.u8 {q4}, [r3], r1
271    DIFF_LUMA_EQ4_MASK  q3,  q14, q0, q4
272    vst1.u8 {q4}, [r3], r1
273
274    vpop    {q4-q7}
275WELS_ASM_FUNC_END
276
277
278WELS_ASM_FUNC_BEGIN DeblockLumaLt4H_neon
279    vpush   {q4-q7}
280
281    vdup.u8 q11, r2
282    vdup.u8 q9, r3
283
284    sub         r2, r0, #3
285    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 0
286    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 1
287    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 2
288    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 3
289    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 4
290    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 5
291    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 6
292    LOAD_LUMA_DATA_3        d0, d1, d2, d6, d7, d8, 7
293
294    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 0
295    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 1
296    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 2
297    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 3
298    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 4
299    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 5
300    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 6
301    LOAD_LUMA_DATA_3        d3, d4, d5, d9, d10, d11, 7
302
303    vswp        d1, d2
304    vswp        d3, d4
305    vswp        d1, d4
306    vswp        d7, d8
307    vswp        d9, d10
308    vswp        d7, d10
309
310    sub         r0, r0, r1, lsl #4
311
312    ldr         r3, [sp, #64]
313    vld1.s8 {d31}, [r3]
314    vdup.s8 d28, d31[0]
315    vdup.s8 d30, d31[1]
316    vdup.s8 d29, d31[2]
317    vdup.s8 d31, d31[3]
318    vtrn.32 d28, d30
319    vtrn.32 d29, d31
320    vcge.s8 q10, q14, #0
321
322    MASK_MATRIX q1, q2, q3, q4, q11, q9, q15
323    vand.u8 q10, q10, q15
324
325    veor        q15, q15
326    vsub.i8 q15,q15,q14
327
328    DIFF_LUMA_LT4_P1_Q1 q0, q1, q2, q3, q9, q15, q14, q10, q6, q12
329    DIFF_LUMA_LT4_P1_Q1 q5, q4, q3, q2, q9, q15, q14, q10, q7, q13
330
331    vabs.s8 q12, q12
332    vabs.s8 q13, q13
333    vadd.u8 q14,q14,q12
334    vadd.u8 q14,q14,q13
335    veor        q15, q15
336    vsub.i8 q15,q15,q14
337
338    DIFF_LUMA_LT4_P0_Q0 d2, d4, d6, d8, d16, q12, q13
339    DIFF_LUMA_LT4_P0_Q0 d3, d5, d7, d9, d17, q12, q13
340    vmax.s8 q8, q8, q15
341    vmin.s8 q8, q8, q14
342    vand.s8 q8, q8, q10
343    EXTRACT_DELTA_INTO_TWO_PART q8, q9
344    vqadd.u8    q2, q2, q9
345    vqsub.u8    q2, q2, q8
346
347    vqsub.u8    q3, q3, q9
348    vqadd.u8    q3, q3, q8
349
350    sub     r0, #2
351    add     r2, r0, r1
352    lsl     r1, #1
353
354    vmov        q1, q6
355    vmov        q4, q7
356
357    vswp        q2, q3
358    vswp        d3, d6
359    vswp        d5, d8
360
361    STORE_LUMA_DATA_4       d2, d3, d4, d5, 0, 1
362    STORE_LUMA_DATA_4       d2, d3, d4, d5, 2, 3
363    STORE_LUMA_DATA_4       d2, d3, d4, d5, 4, 5
364    STORE_LUMA_DATA_4       d2, d3, d4, d5, 6, 7
365
366    STORE_LUMA_DATA_4       d6, d7, d8, d9, 0, 1
367    STORE_LUMA_DATA_4       d6, d7, d8, d9, 2, 3
368    STORE_LUMA_DATA_4       d6, d7, d8, d9, 4, 5
369    STORE_LUMA_DATA_4       d6, d7, d8, d9, 6, 7
370
371    vpop    {q4-q7}
372WELS_ASM_FUNC_END
373
374
375WELS_ASM_FUNC_BEGIN DeblockLumaEq4H_neon
376    vpush   {q4-q7}
377    vdup.u8 q5, r2
378    vdup.u8 q4, r3
379
380    sub         r3, r0, #4              //  pix -= 4
381
382    vld1.u8 {d16}, [r3], r1
383    vld1.u8 {d17}, [r3], r1
384    vld1.u8 {d18}, [r3], r1
385    vld1.u8 {d19}, [r3], r1
386    vld1.u8 {d20}, [r3], r1
387    vld1.u8 {d21}, [r3], r1
388    vld1.u8 {d22}, [r3], r1
389    vld1.u8 {d23}, [r3], r1
390    vld1.u8 {d24}, [r3], r1
391    vld1.u8 {d25}, [r3], r1
392    vld1.u8 {d26}, [r3], r1
393    vld1.u8 {d27}, [r3], r1
394    vld1.u8 {d28}, [r3], r1
395    vld1.u8 {d29}, [r3], r1
396    vld1.u8 {d30}, [r3], r1
397    vld1.u8 {d31}, [r3], r1
398
399    vtrn.u32    d16, d20
400    vtrn.u32    d17, d21
401    vtrn.u32    d18, d22
402    vtrn.u32    d19, d23
403    vtrn.u32    d24, d28
404    vtrn.u32    d25, d29
405    vtrn.u32    d26, d30
406    vtrn.u32    d27, d31
407
408    vtrn.u16    d16, d18
409    vtrn.u16    d17, d19
410    vtrn.u16    d20, d22
411    vtrn.u16    d21, d23
412    vtrn.u16    d24, d26
413    vtrn.u16    d25, d27
414    vtrn.u16    d28, d30
415    vtrn.u16    d29, d31
416
417    vtrn.u8 d16, d17
418    vtrn.u8 d18, d19
419    vtrn.u8 d20, d21
420    vtrn.u8 d22, d23
421    vtrn.u8 d24, d25
422    vtrn.u8 d26, d27
423    vtrn.u8 d28, d29
424    vtrn.u8 d30, d31
425
426    vswp    d17, d24
427    vswp    d19, d26
428    vswp    d21, d28
429    vswp    d23, d30
430
431    vswp    q12, q9
432    vswp    q14, q11
433
434    vswp    q12, q10
435    vswp    q13, q11
436
437    MASK_MATRIX q10, q11, q12, q13, q5, q4, q6
438
439    mov         r2, r2, lsr #2
440    add         r2, r2, #2
441    vdup.u8 q5, r2
442    vabd.u8 q0, q11, q12
443    vclt.u8 q7, q0, q5
444
445    vabd.u8 q1, q9, q11
446    vclt.u8 q1, q1, q4
447    vand.s8 q1, q1, q7
448
449    vabd.u8 q2, q14,q12
450    vclt.u8 q2, q2, q4
451    vand.s8 q2, q2, q7
452    vand.u8 q7, q7, q6
453
454    vmov        q3, q1
455
456    DIFF_LUMA_EQ4_P2P1P0        d16, d18, d20, d22, d24, d26, d2, d0
457    DIFF_LUMA_EQ4_P2P1P0        d17, d19, d21, d23, d25, d27, d3, d1
458
459    vand.u8 q3, q7, q3
460    DIFF_LUMA_EQ4_MASK  q0, q9, q3, q4
461    vmov        q9, q4
462    vbsl.u8 q3, q8, q10
463    DIFF_LUMA_EQ4_MASK  q1,q11, q6, q8
464
465    vand.u8 q7, q7, q2
466
467    DIFF_LUMA_EQ4_P2P1P0        d30, d28, d26, d24, d22, d20, d4, d0
468    DIFF_LUMA_EQ4_P2P1P0        d31, d29, d27, d25, d23, d21, d5, d1
469
470    vbsl.u8 q6, q2, q12
471    DIFF_LUMA_EQ4_MASK  q15, q13, q7, q4
472
473    vbsl.u8 q7, q0, q14
474
475    vmov        q5, q6
476    vmov        q2, q9
477    vmov        q6, q4
478    vmov        q4, q8
479
480    vswp    d8, d6
481    vswp    d5, d7
482    vswp    d5, d8
483    vswp    d14, d12
484    vswp    d11, d13
485    vswp    d11, d14
486
487    sub     r3, r0, #3
488    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,0
489    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,1
490    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,2
491    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,3
492    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,4
493    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,5
494    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,6
495    STORE_LUMA_DATA_3       d4,d5,d6,d10,d11,d12,7
496
497    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,0
498    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,1
499    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,2
500    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,3
501    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,4
502    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,5
503    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,6
504    STORE_LUMA_DATA_3       d7,d8,d9,d13,d14,d15,7
505
506    vpop    {q4-q7}
507WELS_ASM_FUNC_END
508
509
510WELS_ASM_FUNC_BEGIN DeblockChromaLt4V_neon
511    vdup.u8 q11, r3
512    ldr         r3, [sp, #0]
513
514    sub         r0, r0, r2  , lsl #1
515    sub         r1, r1, r2, lsl #1
516    vdup.u8     q9, r3
517    ldr         r3, [sp, #4]
518
519    vld1.u8 {d0}, [r0], r2
520    vld1.u8 {d1}, [r1], r2
521    vld1.u8 {d2}, [r0], r2
522    vld1.u8 {d3}, [r1], r2
523    vld1.u8 {d4}, [r0], r2
524    vld1.u8 {d5}, [r1], r2
525    vld1.u8 {d6}, [r0]
526    vld1.u8 {d7}, [r1]
527
528    sub         r0, r0, r2, lsl #1
529    sub         r1, r1, r2, lsl #1
530
531    vld1.s8 {d31}, [r3]
532    vmovl.u8    q14,d31
533    vshl.u64    d29,d28,#8
534    vorr        d28,d29
535    vmov        d29, d28
536    veor        q15, q15
537    vsub.i8 q15,q15,q14
538
539    MASK_MATRIX q0, q1, q2, q3, q11, q9, q10
540
541    DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d16, q12, q13
542    DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d17, q12, q13
543    vmax.s8 q8, q8, q15
544    vmin.s8 q8, q8, q14
545
546    vand.s8 q8, q8, q10
547    vcge.s8 q14, q14, #0
548    vand.s8 q8, q8, q14
549    EXTRACT_DELTA_INTO_TWO_PART q8, q10
550    vqadd.u8    q1, q1, q10
551    vqsub.u8    q1, q1, q8
552    vst1.u8 {d2}, [r0], r2
553    vst1.u8 {d3}, [r1], r2
554    vqsub.u8    q2, q2, q10
555    vqadd.u8    q2, q2, q8
556    vst1.u8 {d4}, [r0]
557    vst1.u8 {d5}, [r1]
558
559WELS_ASM_FUNC_END
560
561
562WELS_ASM_FUNC_BEGIN DeblockChromaEq4V_neon
563    vpush   {q4-q5}
564
565    vdup.u8 q11, r3
566    ldr         r3, [sp, #32]
567
568    sub         r0, r0, r2  , lsl #1
569    sub         r1, r1, r2, lsl #1
570    vdup.u8 q9, r3
571    vld1.u8 {d0}, [r0], r2      //  q0::p1
572    vld1.u8 {d1}, [r1], r2
573    vld1.u8 {d2}, [r0], r2      //  q1::p0
574    vld1.u8 {d3}, [r1], r2
575    vld1.u8 {d4}, [r0], r2      //  q2::q0
576    vld1.u8 {d5}, [r1], r2
577    vld1.u8 {d6}, [r0]              //  q3::q1
578    vld1.u8 {d7}, [r1]
579
580    sub         r0, r0, r2, lsl #1  //  pix = [-1*src_stride]
581    sub         r1, r1, r2, lsl #1
582
583    MASK_MATRIX q0, q1, q2, q3, q11, q9, q10
584
585    vmov            q11, q10
586
587    DIFF_CHROMA_EQ4_P0Q0        d0, d2, d4, d6, q4, q5, q8, d30, d0     // Cb::p0' q0'
588    DIFF_CHROMA_EQ4_P0Q0        d1, d3, d5, d7, q12, q13, q14, d31, d1  // Cr::p0' q0'
589
590    vbsl.u8 q10, q15, q1
591    vst1.u8 {d20}, [r0], r2
592    vst1.u8 {d21}, [r1], r2
593
594    vbsl.u8 q11, q0, q2
595    vst1.u8 {d22}, [r0]
596    vst1.u8 {d23}, [r1]
597
598    vpop    {q4-q5}
599WELS_ASM_FUNC_END
600
601WELS_ASM_FUNC_BEGIN DeblockChromaLt4H_neon
602
603    vdup.u8 q11, r3
604    ldr         r3, [sp, #0]
605
606    sub         r0, r0, #2
607    vdup.u8 q9, r3
608    ldr         r3, [sp, #4]
609    sub         r1, r1, #2
610    vld1.s8 {d31}, [r3]
611
612    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 0
613    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 1
614    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 2
615    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 3
616    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 4
617    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 5
618    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 6
619    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 7
620    vswp        q1, q2
621    vswp        d1, d2
622    vswp        d6, d5
623
624    vmovl.u8    q14, d31
625    vshl.u64    d29,d28,#8
626    vorr        d28,d29
627    vmov        d29, d28
628    veor        q15, q15
629    vsub.i8 q15,q15,q14
630
631    MASK_MATRIX q0, q1, q2, q3, q11, q9, q10
632
633    DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d16, q12, q13
634    DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d17, q12, q13
635    vmax.s8 q8, q8, q15
636    vmin.s8 q8, q8, q14
637
638    vand.s8 q8, q8, q10
639    vcge.s8 q14, q14, #0
640    vand.s8 q8, q8, q14
641    EXTRACT_DELTA_INTO_TWO_PART q8, q10
642    vqadd.u8    q1, q1, q10
643    vqsub.u8    q1, q1, q8
644    vqsub.u8    q2, q2, q10
645    vqadd.u8    q2, q2, q8
646
647    sub         r0, r0, r2, lsl #3
648    sub         r1, r1, r2, lsl #3
649    vswp        d1, d2
650    vswp        d6, d5
651    vswp        q1, q2
652
653    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0
654    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1
655    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2
656    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3
657    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4
658    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5
659    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6
660    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7
661
662WELS_ASM_FUNC_END
663
664WELS_ASM_FUNC_BEGIN DeblockChromaEq4H_neon
665    vpush   {q4-q5}
666    vdup.u8 q11, r3
667    ldr         r3, [sp, #32]
668
669    sub         r0, r0, #2
670    sub         r1, r1, #2
671
672    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 0
673    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 1
674    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 2
675    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 3
676    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 4
677    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 5
678    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 6
679    LOAD_CHROMA_DATA_4  d0, d1, d2, d3, d4, d5, d6, d7, 7
680    vswp        q1, q2
681    vswp        d1, d2
682    vswp        d6, d5
683
684    vdup.u8 q9, r3
685    MASK_MATRIX q0, q1, q2, q3, q11, q9, q10
686    vmov            q11, q10
687
688    DIFF_CHROMA_EQ4_P0Q0        d0, d2, d4, d6, q8, q9, q12, d8, d10
689    DIFF_CHROMA_EQ4_P0Q0        d1, d3, d5, d7, q13, q14, q15, d9, d11
690
691    vbsl.u8 q10, q4, q1
692    vbsl.u8 q11, q5, q2
693    sub         r0, r0, r2, lsl #3  //  pix: 0th row    [-2]
694    sub         r1, r1, r2, lsl #3
695
696    vmov        q1, q10
697    vmov        q2, q11
698    vswp        d1, d2
699    vswp        d6, d5
700    vswp        q1, q2
701    //  Cb:d0d1d2d3, Cr:d4d5d6d7
702    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0
703    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1
704    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2
705    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3
706    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4
707    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5
708    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6
709    STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7
710
711    vpop    {q4-q5}
712WELS_ASM_FUNC_END
713
714
715WELS_ASM_FUNC_BEGIN WelsNonZeroCount_neon
716    mov       r1, #1
717    vdup.8    q2, r1
718    vld1.64   {d0,d1,d2}, [r0]
719    vmin.s8   q0, q0, q2
720    vmin.s8   d2, d2, d4
721    vst1.64   {d0,d1,d2}, [r0]
722WELS_ASM_FUNC_END
723
724.macro BS_NZC_CHECK  arg0, arg1, arg2, arg3, arg4
725    vld1.8   {d0,d1}, [\arg0]
726    /* Arrenge the input data --- TOP */
727    ands     r6, \arg1, #2
728    beq      bs_nzc_check_jump0
729
730    sub      r6, \arg0, \arg2, lsl #4
731    sub      r6, r6, \arg2, lsl #3
732    add      r6, #12
733    vld1.32  d3[1], [r6]
734
735bs_nzc_check_jump0:
736    vext.8   q1, q1, q0, #12
737    vadd.u8  \arg3, q0, q1
738
739
740    /* Arrenge the input data --- LEFT */
741    ands     r6, \arg1, #1
742    beq      bs_nzc_check_jump1
743
744    sub      r6, \arg0, #21
745    add      r7, r6, #4
746    vld1.8   d3[4], [r6]
747    add      r6, r7, #4
748    vld1.8   d3[5], [r7]
749    add      r7, r6, #4
750    vld1.8   d3[6], [r6]
751    vld1.8   d3[7], [r7]
752
753bs_nzc_check_jump1:
754    vzip.8   d0, d1
755    vzip.8   d0, d1
756    vext.8   q1, q1, q0, #12
757    vadd.u8  \arg4, q0, q1
758.endm
759
760.macro BS_COMPARE_MV  arg0, arg1, arg2, arg3, arg4, arg5, arg6 //in: $0,$1(const),$2(const),$3(const),$4(const); out:$5, $6
761    mov       r6, #4
762    vabd.s16  q8, \arg0, \arg1
763    vabd.s16  q9, \arg1, \arg2
764    vdup.s16  \arg0, r6
765    vabd.s16  q10, \arg2, \arg3
766    vabd.s16  q11, \arg3, \arg4
767
768    vcge.s16  q8, \arg0
769    vcge.s16  q9, \arg0
770    vcge.s16  q10, \arg0
771    vcge.s16  q11, \arg0
772
773    vpadd.i16 d16, d16, d17
774    vpadd.i16 d17, d18, d19
775    vpadd.i16 d18, d20, d21
776    vpadd.i16 d19, d22, d23
777
778    vaddhn.i16  \arg5, q8, q8
779    vaddhn.i16  \arg6, q9, q9
780.endm
781
782.macro BS_MV_CHECK  arg0, arg1, arg2, arg3, arg4, arg5, arg6
783    vldm   \arg0, {q0,q1,q2,q3}
784
785    /* Arrenge the input data --- TOP */
786    ands     r6, \arg1, #2
787    beq      bs_mv_check_jump0
788
789    sub      r6, \arg0, \arg2, lsl #6
790    add      r6, #48
791    vld1.8   {d8, d9}, [r6]
792
793bs_mv_check_jump0:
794    BS_COMPARE_MV  q4, q0, q1, q2, q3, \arg3, \arg4
795
796    /* Arrenge the input data --- LEFT */
797    ands     r6, \arg1, #1
798    beq      bs_mv_check_jump1
799
800    sub      r6, \arg0, #52
801    add      r7, r6, #16
802    vld1.32   d8[0], [r6]
803    add      r6, r7, #16
804    vld1.32   d8[1], [r7]
805    add      r7, r6, #16
806    vld1.32   d9[0], [r6]
807    vld1.32   d9[1], [r7]
808
809bs_mv_check_jump1:
810    vzip.32   q0, q2
811    vzip.32   q1, q3
812    vzip.32   q0, q1
813    vzip.32   q2, q3
814    BS_COMPARE_MV  q4, q0, q1, q2, q3, \arg5, \arg6
815.endm
816
817
818WELS_ASM_FUNC_BEGIN DeblockingBSCalcEnc_neon
819
820    stmdb sp!, {r5-r7}
821    vpush {q4}
822
823    ldr  r5, [sp, #28]  //Save BS to r5
824
825    /* Checking the nzc status */
826    BS_NZC_CHECK r0, r2, r3, q14, q15 //q14,q15 save the nzc status
827
828    /* For checking bS[I] = 2 */
829    mov      r6, #2
830    vcgt.s8  q14, q14, #0
831    vdup.u8  q0, r6
832    vcgt.s8  q15, q15, #0
833
834    vand.u8  q14, q14, q0 //q14 save the nzc check result all the time --- for dir is top
835    vand.u8  q15, q15, q0 //q15 save the nzc check result all the time --- for dir is left
836
837    /* Checking the mv status*/
838    BS_MV_CHECK r1, r2, r3, d24, d25, d26, d27//q12, q13 save the mv status
839
840    /* For checking bS[I] = 1 */
841    mov      r6, #1
842    vdup.u8  q0, r6
843
844    vand.u8  q12, q12, q0 //q12 save the nzc check result all the time --- for dir is top
845    vand.u8  q13, q13, q0 //q13 save the nzc check result all the time --- for dir is left
846
847
848    /* Check bS[I] is '1' or '2' */
849    vmax.u8 q1, q12, q14
850    vmax.u8 q0, q13, q15
851
852    //vstm r5, {q0, q1}
853    vst1.32 {q0, q1}, [r5]
854    vpop {q4}
855    ldmia sp!, {r5-r7}
856WELS_ASM_FUNC_END
857#endif
858