/*! * \copy * Copyright (c) 2013, Cisco Systems * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_NEON .text #include "arm_arch_common_macro.S" #ifdef APPLE_IOS .macro JMP_IF_128BITS_IS_ZERO vorr.s16 $2, $0, $1 vmov r3, r2, $2 orr r3, r3, r2 cmp r3, #0 .endm .macro MASK_MATRIX vabd.u8 $6, $1, $2 vcgt.u8 $6, $4, $6 vabd.u8 $4, $0, $1 vclt.u8 $4, $4, $5 vand.u8 $6, $6, $4 vabd.u8 $4, $3, $2 vclt.u8 $4, $4, $5 vand.u8 $6, $6, $4 .endm .macro DIFF_LUMA_LT4_P1_Q1 vabd.u8 $9, $0, $2 vclt.u8 $9, $9, $4 vrhadd.u8 $8, $2, $3 vhadd.u8 $8, $0, $8 vsub.s8 $8, $8, $1 vmax.s8 $8, $8, $5 vmin.s8 $8, $8, $6 vand.s8 $8, $8, $9 vand.s8 $8, $8, $7 vadd.u8 $8, $1, $8 vabs.s8 $9, $9 .endm .macro DIFF_LUMA_LT4_P0_Q0 vsubl.u8 $5, $0, $3 vsubl.u8 $6, $2, $1 vshl.s16 $6, $6, #2 vadd.s16 $5, $5, $6 vrshrn.s16 $4, $5, #3 .endm .macro DIFF_LUMA_EQ4_P2P1P0 vaddl.u8 q4, $1, $2 vaddl.u8 q5, $3, $4 vadd.u16 q5, q4, q5 vaddl.u8 q4, $0, $1 vshl.u16 q4, q4, #1 vadd.u16 q4, q5, q4 vrshrn.u16 $0, q5, #2 vrshrn.u16 $7, q4, #3 vshl.u16 q5, q5, #1 vsubl.u8 q4, $5, $1 vadd.u16 q5, q4,q5 vaddl.u8 q4, $2, $5 vaddw.u8 q4, q4, $2 vaddw.u8 q4, q4, $3 vrshrn.u16 d10,q5, #3 vrshrn.u16 d8, q4, #2 vbsl.u8 $6, d10, d8 .endm .macro DIFF_LUMA_EQ4_MASK vmov $3, $2 vbsl.u8 $3, $0, $1 .endm .macro DIFF_CHROMA_EQ4_P0Q0 vaddl.u8 $4, $0, $3 vaddw.u8 $5, $4, $1 vaddw.u8 $6, $4, $2 vaddw.u8 $5, $5, $0 vaddw.u8 $6, $6, $3 vrshrn.u16 $7, $5, #2 vrshrn.u16 $8, $6, #2 .endm .macro LORD_CHROMA_DATA_4 vld4.u8 {$0[$8],$1[$8],$2[$8],$3[$8]}, [r0], r2 vld4.u8 {$4[$8],$5[$8],$6[$8],$7[$8]}, [r1], r2 .endm .macro STORE_CHROMA_DATA_4 vst4.u8 {$0[$8],$1[$8],$2[$8],$3[$8]}, [r0], r2 vst4.u8 {$4[$8],$5[$8],$6[$8],$7[$8]}, [r1], r2 .endm .macro LORD_LUMA_DATA_3 vld3.u8 {$0[$6],$1[$6],$2[$6]}, [r2], r1 vld3.u8 {$3[$6],$4[$6],$5[$6]}, [r0], r1 .endm .macro STORE_LUMA_DATA_4 vst4.u8 {$0[$4],$1[$4],$2[$4],$3[$4]}, [r0], r1 vst4.u8 {$0[$5],$1[$5],$2[$5],$3[$5]}, [r2], r1 .endm .macro LORD_LUMA_DATA_4 vld4.u8 {$0[$8],$1[$8],$2[$8],$3[$8]}, [r3], r1 vld4.u8 {$4[$8],$5[$8],$6[$8],$7[$8]}, [r0], r1 .endm .macro STORE_LUMA_DATA_3 vst3.u8 {$0[$6],$1[$6],$2[$6]}, [r3], r1 vst3.u8 {$3[$6],$4[$6],$5[$6]}, [r0], r1 .endm .macro EXTRACT_DELTA_INTO_TWO_PART vcge.s8 $1, $0, #0 vand $1, $0, $1 vsub.s8 $0, $1, $0 .endm #else .macro JMP_IF_128BITS_IS_ZERO arg0, arg1, arg2 vorr.s16 \arg2, \arg0, \arg1 vmov r3, r2, \arg2 orr r3, r3, r2 cmp r3, #0 .endm .macro MASK_MATRIX arg0, arg1, arg2, arg3, arg4, arg5, arg6 vabd.u8 \arg6, \arg1, \arg2 vcgt.u8 \arg6, \arg4, \arg6 vabd.u8 \arg4, \arg0, \arg1 vclt.u8 \arg4, \arg4, \arg5 vand.u8 \arg6, \arg6, \arg4 vabd.u8 \arg4, \arg3, \arg2 vclt.u8 \arg4, \arg4, \arg5 vand.u8 \arg6, \arg6, \arg4 .endm .macro DIFF_LUMA_LT4_P1_Q1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 vabd.u8 \arg9, \arg0, \arg2 vclt.u8 \arg9, \arg9, \arg4 vrhadd.u8 \arg8, \arg2, \arg3 vhadd.u8 \arg8, \arg0, \arg8 vsub.s8 \arg8, \arg8, \arg1 vmax.s8 \arg8, \arg8, \arg5 vmin.s8 \arg8, \arg8, \arg6 vand.s8 \arg8, \arg8, \arg9 vand.s8 \arg8, \arg8, \arg7 vadd.u8 \arg8, \arg1, \arg8 vabs.s8 \arg9, \arg9 .endm .macro DIFF_LUMA_LT4_P0_Q0 arg0, arg1, arg2, arg3, arg4, arg5, arg6 vsubl.u8 \arg5, \arg0, \arg3 vsubl.u8 \arg6, \arg2, \arg1 vshl.s16 \arg6, \arg6, #2 vadd.s16 \arg5, \arg5, \arg6 vrshrn.s16 \arg4, \arg5, #3 .endm .macro DIFF_LUMA_EQ4_P2P1P0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 vaddl.u8 q4, \arg1, \arg2 vaddl.u8 q5, \arg3, \arg4 vadd.u16 q5, q4, q5 vaddl.u8 q4, \arg0, \arg1 vshl.u16 q4, q4, #1 vadd.u16 q4, q5, q4 vrshrn.u16 \arg0, q5, #2 vrshrn.u16 \arg7, q4, #3 vshl.u16 q5, q5, #1 vsubl.u8 q4, \arg5, \arg1 vadd.u16 q5, q4,q5 vaddl.u8 q4, \arg2, \arg5 vaddw.u8 q4, q4, \arg2 vaddw.u8 q4, q4, \arg3 vrshrn.u16 d10,q5, #3 vrshrn.u16 d8, q4, #2 vbsl.u8 \arg6, d10, d8 .endm .macro DIFF_LUMA_EQ4_MASK arg0, arg1, arg2, arg3 vmov \arg3, \arg2 vbsl.u8 \arg3, \arg0, \arg1 .endm .macro DIFF_CHROMA_EQ4_P0Q0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 vaddl.u8 \arg4, \arg0, \arg3 vaddw.u8 \arg5, \arg4, \arg1 vaddw.u8 \arg6, \arg4, \arg2 vaddw.u8 \arg5, \arg5, \arg0 vaddw.u8 \arg6, \arg6, \arg3 vrshrn.u16 \arg7, \arg5, #2 vrshrn.u16 \arg8, \arg6, #2 .endm .macro LORD_CHROMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 vld4.u8 {\arg0[\arg8],\arg1[\arg8],\arg2[\arg8],\arg3[\arg8]}, [r0], r2 vld4.u8 {\arg4[\arg8],\arg5[\arg8],\arg6[\arg8],\arg7[\arg8]}, [r1], r2 .endm .macro STORE_CHROMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 vst4.u8 {\arg0[\arg8],\arg1[\arg8],\arg2[\arg8],\arg3[\arg8]}, [r0], r2 vst4.u8 {\arg4[\arg8],\arg5[\arg8],\arg6[\arg8],\arg7[\arg8]}, [r1], r2 .endm .macro LORD_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6 vld3.u8 {\arg0[\arg6],\arg1[\arg6],\arg2[\arg6]}, [r2], r1 vld3.u8 {\arg3[\arg6],\arg4[\arg6],\arg5[\arg6]}, [r0], r1 .endm .macro STORE_LUMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5 vst4.u8 {\arg0[\arg4],\arg1[\arg4],\arg2[\arg4],\arg3[\arg4]}, [r0], r1 vst4.u8 {\arg0[\arg5],\arg1[\arg5],\arg2[\arg5],\arg3[\arg5]}, [r2], r1 .endm .macro LORD_LUMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 vld4.u8 {\arg0[\arg8],\arg1[\arg8],\arg2[\arg8],\arg3[\arg8]}, [r3], r1 vld4.u8 {\arg4[\arg8],\arg5[\arg8],\arg6[\arg8],\arg7[\arg8]}, [r0], r1 .endm .macro STORE_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6 vst3.u8 {\arg0[\arg6],\arg1[\arg6],\arg2[\arg6]}, [r3], r1 vst3.u8 {\arg3[\arg6],\arg4[\arg6],\arg5[\arg6]}, [r0], r1 .endm .macro EXTRACT_DELTA_INTO_TWO_PART arg0, arg1 vcge.s8 \arg1, \arg0, #0 vand \arg1, \arg0, \arg1 vsub.s8 \arg0, \arg1, \arg0 .endm #endif WELS_ASM_FUNC_BEGIN DeblockLumaLt4V_neon vdup.u8 q11, r2 vdup.u8 q9, r3 add r2, r1, r1, lsl #1 sub r2, r0, r2 vld1.u8 {q0}, [r2], r1 vld1.u8 {q3}, [r0], r1 vld1.u8 {q1}, [r2], r1 vld1.u8 {q4}, [r0], r1 vld1.u8 {q2}, [r2] vld1.u8 {q5}, [r0] sub r2, r2, r1 ldr r3, [sp, #0] vld1.s8 {d31}, [r3] vdup.s8 d28, d31[0] vdup.s8 d30, d31[1] vdup.s8 d29, d31[2] vdup.s8 d31, d31[3] vtrn.32 d28, d30 vtrn.32 d29, d31 vcge.s8 q10, q14, #0 MASK_MATRIX q1, q2, q3, q4, q11, q9, q15 vand.u8 q10, q10, q15 veor q15, q15 vsub.i8 q15,q15,q14 DIFF_LUMA_LT4_P1_Q1 q0, q1, q2, q3, q9, q15, q14, q10, q6, q12 vst1.u8 {q6}, [r2], r1 DIFF_LUMA_LT4_P1_Q1 q5, q4, q3, q2, q9, q15, q14, q10, q7, q13 vabs.s8 q12, q12 vabs.s8 q13, q13 vadd.u8 q14,q14,q12 vadd.u8 q14,q14,q13 veor q15, q15 vsub.i8 q15,q15,q14 DIFF_LUMA_LT4_P0_Q0 d2, d4, d6, d8, d16, q12, q13 DIFF_LUMA_LT4_P0_Q0 d3, d5, d7, d9, d17, q12, q13 vmax.s8 q8, q8, q15 vmin.s8 q8, q8, q14 vand.s8 q8, q8, q10 EXTRACT_DELTA_INTO_TWO_PART q8, q9 vqadd.u8 q2, q2, q9 vqsub.u8 q2, q2, q8 vst1.u8 {q2}, [r2], r1 vqsub.u8 q3, q3, q9 vqadd.u8 q3, q3, q8 vst1.u8 {q3}, [r2] , r1 vst1.u8 {q7}, [r2] WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN DeblockLumaEq4V_neon vdup.u8 q5, r2 vdup.u8 q4, r3 sub r3, r0, r1, lsl #2 vld1.u8 {q8}, [r3], r1 vld1.u8 {q12}, [r0], r1 vld1.u8 {q9}, [r3], r1 vld1.u8 {q13}, [r0], r1 vld1.u8 {q10}, [r3], r1 vld1.u8 {q14}, [r0], r1 vld1.u8 {q11}, [r3] vld1.u8 {q15}, [r0] sub r3, r3, r1 , lsl #1 MASK_MATRIX q10, q11, q12, q13, q5, q4, q6 mov r2, r2, lsr #2 add r2, r2, #2 vdup.u8 q5, r2 vabd.u8 q0, q11, q12 vclt.u8 q7, q0, q5 vabd.u8 q1, q9, q11 vclt.u8 q1, q1, q4 vand.s8 q1, q1, q7 vabd.u8 q2, q14,q12 vclt.u8 q2, q2, q4 vand.s8 q2, q2, q7 vand.u8 q7, q7, q6 vmov q3, q1 DIFF_LUMA_EQ4_P2P1P0 d16, d18, d20, d22, d24, d26, d2, d0 DIFF_LUMA_EQ4_P2P1P0 d17, d19, d21, d23, d25, d27, d3, d1 vand.u8 q3, q7, q3 DIFF_LUMA_EQ4_MASK q0, q9, q3, q4 vst1.u8 {q4}, [r3], r1 DIFF_LUMA_EQ4_MASK q8,q10, q3, q4 vst1.u8 {q4}, [r3], r1 DIFF_LUMA_EQ4_MASK q1,q11, q6, q4 vst1.u8 {q4}, [r3], r1 vmov q0, q2 DIFF_LUMA_EQ4_P2P1P0 d30, d28, d26, d24, d22, d20, d4, d6 DIFF_LUMA_EQ4_P2P1P0 d31, d29, d27, d25, d23, d21, d5, d7 vand.u8 q0, q7, q0 DIFF_LUMA_EQ4_MASK q2, q12, q6, q4 vst1.u8 {q4}, [r3], r1 DIFF_LUMA_EQ4_MASK q15, q13, q0, q4 vst1.u8 {q4}, [r3], r1 DIFF_LUMA_EQ4_MASK q3, q14, q0, q4 vst1.u8 {q4}, [r3], r1 WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN DeblockLumaLt4H_neon vdup.u8 q11, r2 vdup.u8 q9, r3 sub r2, r0, #3 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 0 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 1 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 2 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 3 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 4 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 5 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 6 LORD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 7 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 0 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 1 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 2 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 3 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 4 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 5 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 6 LORD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 7 vswp d1, d2 vswp d3, d4 vswp d1, d4 vswp d7, d8 vswp d9, d10 vswp d7, d10 sub r0, r0, r1, lsl #4 ldr r3, [sp, #0] vld1.s8 {d31}, [r3] vdup.s8 d28, d31[0] vdup.s8 d30, d31[1] vdup.s8 d29, d31[2] vdup.s8 d31, d31[3] vtrn.32 d28, d30 vtrn.32 d29, d31 vcge.s8 q10, q14, #0 MASK_MATRIX q1, q2, q3, q4, q11, q9, q15 vand.u8 q10, q10, q15 veor q15, q15 vsub.i8 q15,q15,q14 DIFF_LUMA_LT4_P1_Q1 q0, q1, q2, q3, q9, q15, q14, q10, q6, q12 DIFF_LUMA_LT4_P1_Q1 q5, q4, q3, q2, q9, q15, q14, q10, q7, q13 vabs.s8 q12, q12 vabs.s8 q13, q13 vadd.u8 q14,q14,q12 vadd.u8 q14,q14,q13 veor q15, q15 vsub.i8 q15,q15,q14 DIFF_LUMA_LT4_P0_Q0 d2, d4, d6, d8, d16, q12, q13 DIFF_LUMA_LT4_P0_Q0 d3, d5, d7, d9, d17, q12, q13 vmax.s8 q8, q8, q15 vmin.s8 q8, q8, q14 vand.s8 q8, q8, q10 EXTRACT_DELTA_INTO_TWO_PART q8, q9 vqadd.u8 q2, q2, q9 vqsub.u8 q2, q2, q8 vqsub.u8 q3, q3, q9 vqadd.u8 q3, q3, q8 sub r0, #2 add r2, r0, r1 lsl r1, #1 vmov q1, q6 vmov q4, q7 vswp q2, q3 vswp d3, d6 vswp d5, d8 STORE_LUMA_DATA_4 d2, d3, d4, d5, 0, 1 STORE_LUMA_DATA_4 d2, d3, d4, d5, 2, 3 STORE_LUMA_DATA_4 d2, d3, d4, d5, 4, 5 STORE_LUMA_DATA_4 d2, d3, d4, d5, 6, 7 STORE_LUMA_DATA_4 d6, d7, d8, d9, 0, 1 STORE_LUMA_DATA_4 d6, d7, d8, d9, 2, 3 STORE_LUMA_DATA_4 d6, d7, d8, d9, 4, 5 STORE_LUMA_DATA_4 d6, d7, d8, d9, 6, 7 WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN DeblockLumaEq4H_neon vdup.u8 q5, r2 vdup.u8 q4, r3 sub r3, r0, #4 // pix -= 4 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,0 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,1 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,2 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,3 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,4 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,5 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,6 LORD_LUMA_DATA_4 d16,d17,d18,d19,d24,d25,d26,d27,7 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,0 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,1 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,2 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,3 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,4 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,5 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,6 LORD_LUMA_DATA_4 d20,d21,d22,d23,d28,d29,d30,d31,7 vswp q9, q10 vswp d17,d18 vswp d21,d22 vswp q13,q14 vswp d25,d26 vswp d29,d30 sub r0, r0, r1 , lsl #4 MASK_MATRIX q10, q11, q12, q13, q5, q4, q6 mov r2, r2, lsr #2 add r2, r2, #2 vdup.u8 q5, r2 vabd.u8 q0, q11, q12 vclt.u8 q7, q0, q5 vabd.u8 q1, q9, q11 vclt.u8 q1, q1, q4 vand.s8 q1, q1, q7 vabd.u8 q2, q14,q12 vclt.u8 q2, q2, q4 vand.s8 q2, q2, q7 vand.u8 q7, q7, q6 vmov q3, q1 DIFF_LUMA_EQ4_P2P1P0 d16, d18, d20, d22, d24, d26, d2, d0 DIFF_LUMA_EQ4_P2P1P0 d17, d19, d21, d23, d25, d27, d3, d1 vand.u8 q3, q7, q3 DIFF_LUMA_EQ4_MASK q0, q9, q3, q4 vmov q9, q4 vbsl.u8 q3, q8, q10 DIFF_LUMA_EQ4_MASK q1,q11, q6, q8 vand.u8 q7, q7, q2 DIFF_LUMA_EQ4_P2P1P0 d30, d28, d26, d24, d22, d20, d4, d0 DIFF_LUMA_EQ4_P2P1P0 d31, d29, d27, d25, d23, d21, d5, d1 vbsl.u8 q6, q2, q12 DIFF_LUMA_EQ4_MASK q15, q13, q7, q4 vbsl.u8 q7, q0, q14 vmov q5, q6 vmov q2, q9 vmov q6, q4 vmov q4, q8 vswp d8, d6 vswp d5, d7 vswp d5, d8 vswp d14, d12 vswp d11, d13 vswp d11, d14 sub r3, r0, #3 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,0 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,1 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,2 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,3 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,4 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,5 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,6 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,7 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,0 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,1 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,2 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,3 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,4 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,5 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,6 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,7 WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN DeblockChromaLt4V_neon vdup.u8 q11, r3 ldr r3, [sp, #0] sub r0, r0, r2 , lsl #1 sub r1, r1, r2, lsl #1 vdup.u8 q9, r3 ldr r3, [sp, #4] vld1.u8 {d0}, [r0], r2 vld1.u8 {d1}, [r1], r2 vld1.u8 {d2}, [r0], r2 vld1.u8 {d3}, [r1], r2 vld1.u8 {d4}, [r0], r2 vld1.u8 {d5}, [r1], r2 vld1.u8 {d6}, [r0] vld1.u8 {d7}, [r1] sub r0, r0, r2, lsl #1 sub r1, r1, r2, lsl #1 vld1.s8 {d15}, [r3] vmovl.u8 q6, d15 vshl.u64 d13,d12,#8 vorr d12,d13 vmov d13, d12 veor q7, q7 vsub.i8 q7,q7,q6 MASK_MATRIX q0, q1, q2, q3, q11, q9, q5 DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d8, q12, q13 DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d9, q12, q13 vmax.s8 q4, q4, q7 vmin.s8 q4, q4, q6 vand.s8 q4, q4, q5 vcge.s8 q6, q6, #0 vand.s8 q4, q4, q6 EXTRACT_DELTA_INTO_TWO_PART q4, q5 vqadd.u8 q1, q1, q5 vqsub.u8 q1, q1, q4 vst1.u8 {d2}, [r0], r2 vst1.u8 {d3}, [r1], r2 vqsub.u8 q2, q2, q5 vqadd.u8 q2, q2, q4 vst1.u8 {d4}, [r0] vst1.u8 {d5}, [r1] WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN DeblockChromaEq4V_neon vdup.u8 q11, r3 ldr r3, [sp, #0] sub r0, r0, r2 , lsl #1 sub r1, r1, r2, lsl #1 vdup.u8 q9, r3 vld1.u8 {d0}, [r0], r2 // q0::p1 vld1.u8 {d1}, [r1], r2 vld1.u8 {d2}, [r0], r2 // q1::p0 vld1.u8 {d3}, [r1], r2 vld1.u8 {d4}, [r0], r2 // q2::q0 vld1.u8 {d5}, [r1], r2 vld1.u8 {d6}, [r0] // q3::q1 vld1.u8 {d7}, [r1] sub r0, r0, r2, lsl #1 // pix = [-1*src_stride] sub r1, r1, r2, lsl #1 MASK_MATRIX q0, q1, q2, q3, q11, q9, q10 vmov q11, q10 DIFF_CHROMA_EQ4_P0Q0 d0, d2, d4, d6, q4, q5, q6, d14, d0 // Cb::p0' q0' DIFF_CHROMA_EQ4_P0Q0 d1, d3, d5, d7, q12, q13, q14, d15, d1 // Cr::p0' q0' vbsl.u8 q10, q7, q1 vst1.u8 {d20}, [r0], r2 vst1.u8 {d21}, [r1], r2 vbsl.u8 q11, q0, q2 vst1.u8 {d22}, [r0] vst1.u8 {d23}, [r1] WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN DeblockChromaLt4H_neon vdup.u8 q11, r3 ldr r3, [sp, #0] sub r0, r0, #2 vdup.u8 q9, r3 ldr r3, [sp, #4] sub r1, r1, #2 vld1.s8 {d15}, [r3] LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 vswp q1, q2 vswp d1, d2 vswp d6, d5 vmovl.u8 q6, d15 vshl.u64 d13,d12,#8 vorr d12,d13 vmov d13, d12 veor q7, q7 vsub.i8 q7,q7,q6 MASK_MATRIX q0, q1, q2, q3, q11, q9, q5 DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d8, q12, q13 DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d9, q12, q13 vmax.s8 q4, q4, q7 vmin.s8 q4, q4, q6 vand.s8 q4, q4, q5 vcge.s8 q6, q6, #0 vand.s8 q4, q4, q6 EXTRACT_DELTA_INTO_TWO_PART q4, q5 vqadd.u8 q1, q1, q5 vqsub.u8 q1, q1, q4 vqsub.u8 q2, q2, q5 vqadd.u8 q2, q2, q4 sub r0, r0, r2, lsl #3 sub r1, r1, r2, lsl #3 vswp d1, d2 vswp d6, d5 vswp q1, q2 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN DeblockChromaEq4H_neon vdup.u8 q11, r3 ldr r3, [sp, #0] sub r0, r0, #2 sub r1, r1, #2 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 LORD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 vswp q1, q2 vswp d1, d2 vswp d6, d5 vdup.u8 q9, r3 MASK_MATRIX q0, q1, q2, q3, q11, q9, q10 vmov q11, q10 DIFF_CHROMA_EQ4_P0Q0 d0, d2, d4, d6, q8, q9, q12, d8, d10 DIFF_CHROMA_EQ4_P0Q0 d1, d3, d5, d7, q13, q14, q15, d9, d11 vbsl.u8 q10, q4, q1 vbsl.u8 q11, q5, q2 sub r0, r0, r2, lsl #3 // pix: 0th row [-2] sub r1, r1, r2, lsl #3 vmov q1, q10 vmov q2, q11 vswp d1, d2 vswp d6, d5 vswp q1, q2 // Cb:d0d1d2d3, Cr:d4d5d6d7 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 WELS_ASM_FUNC_END WELS_ASM_FUNC_BEGIN enc_avc_non_zero_count_neon vld1.64 {d0-d2}, [r0] vceq.s8 q0, q0, #0 vceq.s8 d2, d2, #0 vmvn q0, q0 vmvn d2, d2 vabs.s8 q0, q0 vabs.s8 d2, d2 vst1.64 {d0-d2}, [r0] WELS_ASM_FUNC_END #endif