ref: 0e0c8b556937d2f9d9d8994f75156c2555210c5a
parent: eb889c95e0f1389af99ba4534f8cc19a4de0198b
author: dongzhang <[email protected]>
date: Wed Jun 4 07:04:25 EDT 2014
add arm 64 deblock code and Unit Test code
--- a/codec/build/iOS/common/common.xcodeproj/project.pbxproj
+++ b/codec/build/iOS/common/common.xcodeproj/project.pbxproj
@@ -22,6 +22,7 @@
F0B204F918FD23BF005DA23F /* copy_mb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F0B204F818FD23BF005DA23F /* copy_mb.cpp */; };
F556A8241906673900E156A8 /* arm_arch64_common_macro.S in Sources */ = {isa = PBXBuildFile; fileRef = F556A8221906673900E156A8 /* arm_arch64_common_macro.S */; };
F556A8251906673900E156A8 /* expand_picture_aarch64_neon.S in Sources */ = {isa = PBXBuildFile; fileRef = F556A8231906673900E156A8 /* expand_picture_aarch64_neon.S */; };
+ F5AC94FF193EB7D800F58154 /* deblocking_aarch64_neon.S in Sources */ = {isa = PBXBuildFile; fileRef = F5AC94FE193EB7D800F58154 /* deblocking_aarch64_neon.S */; };
F5B8D82D190757290037849A /* mc_aarch64_neon.S in Sources */ = {isa = PBXBuildFile; fileRef = F5B8D82C190757290037849A /* mc_aarch64_neon.S */; };
FAABAA1818E9354A00D4186F /* sad_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAABAA1718E9354A00D4186F /* sad_common.cpp */; };
/* End PBXBuildFile section */
@@ -69,6 +70,7 @@
F0B204F818FD23BF005DA23F /* copy_mb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = copy_mb.cpp; sourceTree = "<group>"; };
F556A8221906673900E156A8 /* arm_arch64_common_macro.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = arm_arch64_common_macro.S; path = arm64/arm_arch64_common_macro.S; sourceTree = "<group>"; };
F556A8231906673900E156A8 /* expand_picture_aarch64_neon.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = expand_picture_aarch64_neon.S; path = arm64/expand_picture_aarch64_neon.S; sourceTree = "<group>"; };
+ F5AC94FE193EB7D800F58154 /* deblocking_aarch64_neon.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = deblocking_aarch64_neon.S; path = arm64/deblocking_aarch64_neon.S; sourceTree = "<group>"; };
F5B8D82C190757290037849A /* mc_aarch64_neon.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = mc_aarch64_neon.S; path = arm64/mc_aarch64_neon.S; sourceTree = "<group>"; };
FAABAA1618E9353F00D4186F /* sad_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sad_common.h; sourceTree = "<group>"; };
FAABAA1718E9354A00D4186F /* sad_common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sad_common.cpp; sourceTree = "<group>"; };
@@ -175,6 +177,7 @@
F556A81D1906669F00E156A8 /* arm64 */ = {
isa = PBXGroup;
children = (
+ F5AC94FE193EB7D800F58154 /* deblocking_aarch64_neon.S */,
F5B8D82C190757290037849A /* mc_aarch64_neon.S */,
F556A8221906673900E156A8 /* arm_arch64_common_macro.S */,
F556A8231906673900E156A8 /* expand_picture_aarch64_neon.S */,
@@ -236,6 +239,7 @@
F5B8D82D190757290037849A /* mc_aarch64_neon.S in Sources */,
4C3406C918D96EA600DFA14A /* arm_arch_common_macro.S in Sources */,
F556A8241906673900E156A8 /* arm_arch64_common_macro.S in Sources */,
+ F5AC94FF193EB7D800F58154 /* deblocking_aarch64_neon.S in Sources */,
4C3406CE18D96EA600DFA14A /* crt_util_safe_x.cpp in Sources */,
4C3406CF18D96EA600DFA14A /* deblocking_common.cpp in Sources */,
4C3406D018D96EA600DFA14A /* logging.cpp in Sources */,
--- a/codec/build/iOS/dec/welsdec/welsdec.xcodeproj/project.pbxproj
+++ b/codec/build/iOS/dec/welsdec/welsdec.xcodeproj/project.pbxproj
@@ -460,6 +460,7 @@
"$(SRCROOT)/../../../../common/arm",
);
IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
@@ -494,6 +495,7 @@
"$(SRCROOT)/../../../../common/arm",
);
IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
--- /dev/null
+++ b/codec/common/arm64/deblocking_aarch64_neon.S
@@ -1,0 +1,1116 @@
+/*!
+* \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_AARCH64
+.text
+
+#include "arm_arch64_common_macro.S"
+#ifdef __APPLE__
+
+.macro MASK_MATRIX
+ uabd $6.16b, $1.16b, $2.16b
+ cmhi $6.16b, $4.16b, $6.16b
+
+ uabd $4.16b, $0.16b, $1.16b
+ cmhi $4.16b, $5.16b, $4.16b
+ and $6.16b, $6.16b, $4.16b
+
+ uabd $4.16b, $3.16b, $2.16b
+ cmhi $4.16b, $5.16b, $4.16b
+ and $6.16b, $6.16b, $4.16b
+.endm
+
+.macro DIFF_LUMA_LT4_P1_Q1 //(Use Tmp v23, v24)
+ //v0, v1, v2, v3, v17(beta), v18(-Tc0), v6(Tc0), v7(flag), v19, v20
+ urhadd $8.16b, $2.16b, $3.16b
+ uhadd $8.16b, $0.16b, $8.16b
+ usubl $9.8h, $8.8b, $1.8b
+ sqxtn $9.8b, $9.8h
+ usubl2 $8.8h, $8.16b, $1.16b
+ sqxtn2 $9.16b, $8.8h
+ smax $8.16b, $9.16b, $5.16b
+//
+ smin $8.16b, $8.16b, $6.16b
+ uabd $9.16b, $0.16b, $2.16b
+ cmhi $9.16b, $4.16b, $9.16b
+ and $8.16b, $8.16b, $9.16b
+ and $8.16b, $8.16b, $7.16b
+ add $8.16b, $1.16b, $8.16b
+ abs $9.16b, $9.16b
+.endm
+
+.macro DIFF_LUMA_LT4_P0_Q0_1
+ usubl $5.8h, $0.8b, $3.8b
+ usubl $6.8h, $2.8b, $1.8b
+ shl $6.8h, $6.8h, #2
+ add $5.8h, $5.8h, $6.8h
+ sqrshrn $4.8b, $5.8h, #3
+.endm
+
+.macro DIFF_LUMA_LT4_P0_Q0_2
+ usubl2 $5.8h, $0.16b, $3.16b
+ usubl2 $6.8h, $2.16b, $1.16b
+ shl $6.8h, $6.8h, #2
+ add $5.8h, $5.8h, $6.8h
+ sqrshrn2 $4.16b, $5.8h, #3
+.endm
+
+.macro EXTRACT_DELTA_INTO_TWO_PART
+ cmge $1.16b, $0.16b, #0
+ and $1.16b, $0.16b, $1.16b
+ sub $0.16b, $1.16b, $0.16b
+.endm
+
+.macro DIFF_LUMA_EQ4_P2P1P0_1
+ uaddl $8.8h, $1.8b, $2.8b
+ uaddl $9.8h, $3.8b, $4.8b
+ add $9.8h, $9.8h, $8.8h
+
+ uaddl $8.8h, $0.8b, $1.8b
+ shl $8.8h, $8.8h, #1
+ add $8.8h, $9.8h, $8.8h
+
+ rshrn $0.8b, $9.8h, #2
+ rshrn $7.8b, $8.8h, #3
+ shl $9.8h, $9.8h, #1
+ usubl $8.8h, $5.8b, $1.8b
+ add $9.8h, $8.8h, $9.8h
+
+ uaddl $8.8h, $2.8b, $5.8b
+ uaddw $8.8h, $8.8h, $2.8b
+ uaddw $8.8h, $8.8h, $3.8b
+
+ rshrn $9.8b, $9.8h, #3
+ rshrn $8.8b, $8.8h, #2
+ bsl $6.8b, $9.8b, $8.8b
+.endm
+
+.macro DIFF_LUMA_EQ4_P2P1P0_2
+ uaddl2 $8.8h, $1.16b, $2.16b
+ uaddl2 $9.8h, $3.16b, $4.16b
+ add $9.8h, $9.8h, $8.8h
+
+ uaddl2 $8.8h, $0.16b, $1.16b
+ shl $8.8h, $8.8h, #1
+ add $8.8h, $9.8h, $8.8h
+
+ rshrn2 $0.16b, $9.8h, #2
+ rshrn2 $7.16b, $8.8h, #3
+ shl $9.8h, $9.8h, #1
+ usubl2 $8.8h, $5.16b, $1.16b
+ add $9.8h, $8.8h, $9.8h
+
+ uaddl2 $8.8h, $2.16b, $5.16b
+ uaddw2 $8.8h, $8.8h, $2.16b
+ uaddw2 $8.8h, $8.8h, $3.16b
+
+ rshrn2 $9.16b, $9.8h, #3
+ rshrn2 $8.16b, $8.8h, #2
+ bsl $6.16b, $9.16b, $8.16b
+.endm
+
+
+.macro DIFF_CHROMA_EQ4_P0Q0_1
+ uaddl $4.8h, $0.8b, $3.8b
+ shl $4.8h, $4.8h, #1
+ usubl $5.8h, $1.8b, $3.8b
+ add $5.8h, $5.8h, $4.8h
+ rshrn $6.8b, $5.8h, #2
+ usubl $5.8h, $2.8b, $0.8b
+ add $5.8h, $5.8h, $4.8h
+ rshrn $7.8b, $5.8h, #2
+.endm
+
+.macro DIFF_CHROMA_EQ4_P0Q0_2
+ uaddl2 $4.8h, $0.16b, $3.16b
+ shl $4.8h, $4.8h, #1
+ usubl2 $5.8h, $1.16b, $3.16b
+ add $5.8h, $5.8h, $4.8h
+ rshrn2 $6.16b, $5.8h, #2
+ usubl2 $5.8h, $2.16b, $0.16b
+ add $5.8h, $5.8h, $4.8h
+ rshrn2 $7.16b, $5.8h, #2
+.endm
+
+.macro DIFF_LUMA_EQ4_MASK
+ mov.16b $3, $2
+ bsl $3.16b, $0.16b, $1.16b
+.endm
+
+.macro LOAD_LUMA_DATA_3
+ ld3 {$0.b, $1.b, $2.b} [$6], [x2], x1
+ ld3 {$3.b, $4.b, $5.b} [$6], [x0], x1
+.endm
+
+.macro LOAD_LUMA_DATA_4
+ ld4 {$0.b, $1.b, $2.b, $3.b} [$8], [x3], x1
+ ld4 {$4.b, $5.b, $6.b, $7.b} [$8], [x0], x1
+.endm
+
+.macro STORE_LUMA_DATA_4
+ st4 {$0.b, $1.b, $2.b, $3.b} [$4], [x0], x1
+ st4 {$0.b, $1.b, $2.b, $3.b} [$5], [x2], x1
+.endm
+
+.macro STORE_LUMA_DATA_3
+ st3 {$0.b, $1.b, $2.b} [$6], [x3], x1
+ st3 {$3.b, $4.b, $5.b} [$6], [x0], x1
+.endm
+
+.macro LOAD_CHROMA_DATA_4
+ ld4 {$0.b, $1.b, $2.b, $3.b} [$5], [$4], x2
+.endm
+
+.macro STORE_CHROMA_DATA_2
+ st2 {$0.b, $1.b} [$3], [$2], x2
+.endm
+
+.macro ZERO_JUMP_END
+ mov $1, $0.d[0]
+ mov $2, $0.d[1]
+ orr $1, $1, $2
+ cbz $1, $3
+.endm
+
+.macro BS_NZC_CHECK
+ ld1 {v0.16b}, [$0]
+ //Arrange the input data --- TOP
+ ands x6, $1, #2
+ cbz x6, bs_nzc_check_jump0
+ sub x6, $0, $2, lsl #4
+ sub x6, x6, $2, lsl #3
+ add x6, x6, #12
+ ld1 {v1.s} [3], [x6]
+
+ bs_nzc_check_jump0:
+ ext.16b v1, v1, v0, #12
+ add $3.16b, v0.16b, v1.16b
+
+ // Arrange the input data --- LEFT
+ ands x6, $1, #1
+ cbz x6, bs_nzc_check_jump1
+
+ sub x6, $0, #21
+ add x7, x6, #4
+ ld1 {v1.b} [12], [x6]
+ add x6, x7, #4
+ ld1 {v1.b} [13], [x7]
+ add x7, x6, #4
+ ld1 {v1.b} [14], [x6]
+ ld1 {v1.b} [15], [x7]
+
+bs_nzc_check_jump1:
+ ins v2.d[0], v0.d[1]
+ zip1 v0.16b, v0.16b, v2.16b
+ ins v2.d[0], v0.d[1]
+ zip1 v0.16b, v0.16b, v2.16b
+ ext.16b v1, v1, v0, #12
+ add $4.16b, v0.16b, v1.16b
+.endm
+
+.macro BS_COMPARE_MV //in: $0,$1(const),$2(const),$3(const),$4(const); out:$5
+ mov w6, #4
+ sabd v20.8h, $0.8h, $1.8h
+ sabd v21.8h, $1.8h, $2.8h
+ dup $0.8h, w6
+ sabd v22.8h, $2.8h, $3.8h
+ sabd v23.8h, $3.8h, $4.8h
+
+ cmge v20.8h, v20.8h, $0.8h
+ cmge v21.8h, v21.8h, $0.8h
+ cmge v22.8h, v22.8h, $0.8h
+ cmge v23.8h, v23.8h, $0.8h
+
+ addp v20.8h, v20.8h, v21.8h
+ addp v21.8h, v22.8h, v23.8h
+
+ addhn $5.8b, v20.8h, v20.8h
+ addhn2 $5.16b, v21.8h, v21.8h
+.endm
+
+.macro BS_MV_CHECK
+ ldp q0, q1, [$0], #32
+ ldp q2, q3, [$0]
+ sub $0, $0, #32
+ // Arrenge the input data --- TOP
+ ands x6, $1, #2
+ cbz x6, bs_mv_check_jump0
+ sub x6, $0, $2, lsl #6
+ add x6, x6, #48
+ ld1 {v4.16b}, [x6]
+bs_mv_check_jump0:
+ BS_COMPARE_MV v4, v0, v1, v2, v3, $3
+ // Arrange the input data --- LEFT
+ ands x6, $1, #1
+ cbz x6, bs_mv_check_jump1
+ sub x6, $0, #52
+ add x7, x6, #16
+ ld1 {v4.s} [0], [x6]
+ add x6, x7, #16
+ ld1 {v4.s} [1], [x7]
+ add x7, x6, #16
+ ld1 {v4.s} [2], [x6]
+ ld1 {v4.s} [3], [x7]
+bs_mv_check_jump1:
+ zip1 $5.4s, v0.4s, v2.4s
+ zip2 $6.4s, v0.4s, v2.4s
+ zip1 v0.4s, v1.4s, v3.4s
+ zip2 v2.4s, v1.4s, v3.4s
+ zip2 v1.4s, $5.4s, v0.4s
+ zip1 v0.4s, $5.4s, v0.4s
+ zip2 v3.4s, $6.4s, v2.4s
+ zip1 v2.4s, $6.4s, v2.4s
+ BS_COMPARE_MV v4, v0, v1, v2, v3, $4
+.endm
+
+#else
+
+.macro MASK_MATRIX arg0, arg1, arg2, arg3, arg4, arg5, arg6
+ uabd \arg6.16b, \arg1.16b, \arg2.16b
+ cmhi \arg6.16b, \arg4.16b, \arg6.16b
+
+ uabd \arg4.16b, \arg0.16b, \arg1.16b
+ cmhi \arg4.16b, \arg5.16b, \arg4.16b
+ and \arg6.16b, \arg6.16b, \arg4.16b
+
+ uabd \arg4.16b, \arg3.16b, \arg2.16b
+ cmhi \arg4.16b, \arg5.16b, \arg4.16b
+ and \arg6.16b, \arg6.16b, \arg4.16b
+.endm
+
+.macro DIFF_LUMA_LT4_P1_Q1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
+ //v0, v1, v2, v3, v17(beta), v18(-Tc0), v6(Tc0), v7(flag), v19, v20
+ urhadd \arg8.16b, \arg2.16b, \arg3.16b
+ uhadd \arg8.16b, \arg0.16b, \arg8.16b
+ usubl \arg9.8h, \arg8.8b, \arg1.8b
+ sqxtn \arg9.8b, \arg9.8h
+ usubl2 \arg8.8h, \arg8.16b, \arg1.16b
+ sqxtn2 \arg9.16b, \arg8.8h
+ smax \arg8.16b, \arg9.16b, \arg5.16b
+ //
+ smin \arg8.16b, \arg8.16b, \arg6.16b
+ uabd \arg9.16b, \arg0.16b, \arg2.16b
+ cmhi \arg9.16b, \arg4.16b, \arg9.16b
+ and \arg8.16b, \arg8.16b, \arg9.16b
+ and \arg8.16b, \arg8.16b, \arg7.16b
+ add \arg8.16b, \arg1.16b, \arg8.16b
+ abs \arg9.16b, \arg9.16b
+.endm
+
+.macro DIFF_LUMA_LT4_P0_Q0_1 arg0, arg1, arg2, arg3, arg4, arg5, arg6
+ usubl \arg5.8h, \arg0.8b, \arg3.8b
+ usubl \arg6.8h, \arg2.8b, \arg1.8b
+ shl \arg6.8h, \arg6.8h, #2
+ add \arg5.8h, \arg5.8h, \arg6.8h
+ sqrshrn \arg4.8b, \arg5.8h, #3
+.endm
+
+.macro DIFF_LUMA_LT4_P0_Q0_2 arg0, arg1, arg2, arg3, arg4, arg5, arg6
+ usubl2 \arg5.8h, \arg0.16b, \arg3.16b
+ usubl2 \arg6.8h, \arg2.16b, \arg1.16b
+ shl \arg6.8h, \arg6.8h, #2
+ add \arg5.8h, \arg5.8h, \arg6.8h
+ sqrshrn2 \arg4.16b, \arg5.8h, #3
+.endm
+
+.macro EXTRACT_DELTA_INTO_TWO_PART arg0, arg1
+ cmge \arg1.16b, \arg0.16b, #0
+ and \arg1.16b, \arg0.16b, \arg1.16b
+ sub \arg0.16b, \arg1.16b, \arg0.16b
+.endm
+
+.macro DIFF_LUMA_EQ4_P2P1P0_1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
+ uaddl \arg8.8h, \arg1.8b, \arg2.8b
+ uaddl \arg9.8h, \arg3.8b, \arg4.8b
+ add \arg9.8h, \arg9.8h, \arg8.8h
+
+ uaddl \arg8.8h, \arg0.8b, \arg1.8b
+ shl \arg8.8h, \arg8.8h, #1
+ add \arg8.8h, \arg9.8h, \arg8.8h
+
+ rshrn \arg0.8b, \arg9.8h, #2
+ rshrn \arg7.8b, \arg8.8h, #3
+ shl \arg9.8h, \arg9.8h, #1
+ usubl \arg8.8h, \arg5.8b, \arg1.8b
+ add \arg9.8h, \arg8.8h, \arg9.8h
+
+ uaddl \arg8.8h, \arg2.8b, \arg5.8b
+ uaddw \arg8.8h, \arg8.8h, \arg2.8b
+ uaddw \arg8.8h, \arg8.8h, \arg3.8b
+
+ rshrn \arg9.8b, \arg9.8h, #3
+ rshrn \arg8.8b, \arg8.8h, #2
+ bsl \arg6.8b, \arg9.8b, \arg8.8b
+.endm
+
+.macro DIFF_LUMA_EQ4_P2P1P0_2 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
+ uaddl2 \arg8.8h, \arg1.16b, \arg2.16b
+ uaddl2 \arg9.8h, \arg3.16b, \arg4.16b
+ add \arg9.8h, \arg9.8h, \arg8.8h
+
+ uaddl2 \arg8.8h, \arg0.16b, \arg1.16b
+ shl \arg8.8h, \arg8.8h, #1
+ add \arg8.8h, \arg9.8h, \arg8.8h
+
+ rshrn2 \arg0.16b, \arg9.8h, #2
+ rshrn2 \arg7.16b, \arg8.8h, #3
+ shl \arg9.8h, \arg9.8h, #1
+ usubl2 \arg8.8h, \arg5.16b, \arg1.16b
+ add \arg9.8h, \arg8.8h, \arg9.8h
+
+ uaddl2 \arg8.8h, \arg2.16b, \arg5.16b
+ uaddw2 \arg8.8h, \arg8.8h, \arg2.16b
+ uaddw2 \arg8.8h, \arg8.8h, \arg3.16b
+
+ rshrn2 \arg9.16b, \arg9.8h, #3
+ rshrn2 \arg8.16b, \arg8.8h, #2
+ bsl \arg6.16b, \arg9.16b, \arg8.16b
+.endm
+
+
+.macro DIFF_CHROMA_EQ4_P0Q0_1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7
+ uaddl \arg4.8h, \arg0.8b, \arg3.8b
+ shl \arg4.8h, \arg4.8h, #1
+ usubl \arg5.8h, \arg1.8b, \arg3.8b
+ add \arg5.8h, \arg5.8h, \arg4.8h
+ rshrn \arg6.8b, \arg5.8h, #2
+ usubl \arg5.8h, \arg2.8b, \arg0.8b
+ add \arg5.8h, \arg5.8h, \arg4.8h
+ rshrn \arg7.8b, \arg5.8h, #2
+.endm
+
+.macro DIFF_CHROMA_EQ4_P0Q0_2 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7
+ uaddl2 \arg4.8h, \arg0.16b, \arg3.16b
+ shl \arg4.8h, \arg4.8h, #1
+ usubl2 \arg5.8h, \arg1.16b, \arg3.16b
+ add \arg5.8h, \arg5.8h, \arg4.8h
+ rshrn2 \arg6.16b, \arg5.8h, #2
+ usubl2 \arg5.8h, \arg2.16b, \arg0.16b
+ add \arg5.8h, \arg5.8h, \arg4.8h
+ rshrn2 \arg7.16b, \arg5.8h, #2
+.endm
+
+.macro DIFF_LUMA_EQ4_MASK arg0, arg1, arg2, arg3
+ mov.16b \arg3, \arg2
+ bsl \arg3.16b, \arg0.16b, \arg1.16b
+.endm
+
+.macro LOAD_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6
+ ld3 {\arg0.b, \arg1.b, \arg2.b} [\arg6], [x2], x1
+ ld3 {\arg3.b, \arg4.b, \arg5.b} [\arg6], [x0], x1
+.endm
+
+.macro LOAD_LUMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
+ ld4 {\arg0.b, \arg1.b, \arg2.b, \arg3.b} [\arg8], [x3], x1
+ ld4 {\arg4.b, \arg5.b, \arg6.b, \arg7.b} [\arg8], [x0], x1
+.endm
+
+.macro STORE_LUMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5
+ st4 {\arg0.b, \arg1.b, \arg2.b, \arg3.b} [\arg4], [x0], x1
+ st4 {\arg0.b, \arg1.b, \arg2.b, \arg3.b} [\arg5], [x2], x1
+.endm
+
+.macro STORE_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6
+ st3 {\arg0.b, \arg1.b, \arg2.b} [\arg6], [x3], x1
+ st3 {\arg3.b, \arg4.b, \arg5.b} [\arg6], [x0], x1
+.endm
+
+.macro LOAD_CHROMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5
+ ld4 {\arg0.b, \arg1.b, \arg2.b, \arg3.b} [\arg5], [\arg4], x2
+.endm
+
+.macro STORE_CHROMA_DATA_2 arg0, arg1, arg2, arg3
+ st2 {\arg0.b, \arg1.b} [\arg3], [\arg2], x2
+.endm
+
+.macro ZERO_JUMP_END arg0, arg1, arg2, arg3
+ mov \arg1, \arg0.d[0]
+ mov \arg2, \arg0.d[1]
+ orr \arg1, \arg1, \arg2
+ cbz \arg1, \arg3
+.endm
+
+.macro BS_NZC_CHECK arg0, arg1, arg2, arg3, arg4
+ ld1 {v0.16b}, [\arg0]
+ //Arrange the input data --- TOP
+ ands x6, \arg1, #2
+ cbz x6, bs_nzc_check_jump0
+ sub x6, \arg0, \arg2, lsl #4
+ sub x6, x6, \arg2, lsl #3
+ add x6, x6, #12
+ ld1 {v1.s} [3], [x6]
+
+bs_nzc_check_jump0:
+ ext.16b v1, v1, v0, #12
+ add \arg3.16b, v0.16b, v1.16b
+
+ // Arrange the input data --- LEFT
+ ands x6, \arg1, #1
+ cbz x6, bs_nzc_check_jump1
+
+ sub x6, \arg0, #21
+ add x7, x6, #4
+ ld1 {v1.b} [12], [x6]
+ add x6, x7, #4
+ ld1 {v1.b} [13], [x7]
+ add x7, x6, #4
+ ld1 {v1.b} [14], [x6]
+ ld1 {v1.b} [15], [x7]
+
+bs_nzc_check_jump1:
+ ins v2.d[0], v0.d[1]
+ zip1 v0.16b, v0.16b, v2.16b
+ ins v2.d[0], v0.d[1]
+ zip1 v0.16b, v0.16b, v2.16b
+ ext.16b v1, v1, v0, #12
+ add \arg4.16b, v0.16b, v1.16b
+.endm
+
+.macro BS_COMPARE_MV arg0, arg1, arg2, arg3, arg4, arg5
+ //in: \arg0,\arg1(const),\arg2(const),\arg3(const),\arg4(const); out:\arg5
+ mov w6, #4
+ sabd v20.8h, \arg0.8h, \arg1.8h
+ sabd v21.8h, \arg1.8h, \arg2.8h
+ dup \arg0.8h, w6
+ sabd v22.8h, \arg2.8h, \arg3.8h
+ sabd v23.8h, \arg3.8h, \arg4.8h
+
+ cmge v20.8h, v20.8h, \arg0.8h
+ cmge v21.8h, v21.8h, \arg0.8h
+ cmge v22.8h, v22.8h, \arg0.8h
+ cmge v23.8h, v23.8h, \arg0.8h
+
+ addp v20.8h, v20.8h, v21.8h
+ addp v21.8h, v22.8h, v23.8h
+
+ addhn \arg5.8b, v20.8h, v20.8h
+ addhn2 \arg5.16b, v21.8h, v21.8h
+.endm
+
+.macro BS_MV_CHECK arg0, arg1, arg2, arg3, arg4, arg5, arg6
+ ldp q0, q1, [\arg0], #32
+ ldp q2, q3, [\arg0]
+ sub \arg0, \arg0, #32
+ // Arrenge the input data --- TOP
+ ands x6, \arg1, #2
+ cbz x6, bs_mv_check_jump0
+ sub x6, \arg0, \arg2, lsl #6
+ add x6, x6, #48
+ ld1 {v4.16b}, [x6]
+bs_mv_check_jump0:
+ BS_COMPARE_MV v4, v0, v1, v2, v3, \arg3
+ // Arrange the input data --- LEFT
+ ands x6, \arg1, #1
+ cbz x6, bs_mv_check_jump1
+ sub x6, \arg0, #52
+ add x7, x6, #16
+ ld1 {v4.s} [0], [x6]
+ add x6, x7, #16
+ ld1 {v4.s} [1], [x7]
+ add x7, x6, #16
+ ld1 {v4.s} [2], [x6]
+ ld1 {v4.s} [3], [x7]
+bs_mv_check_jump1:
+ zip1 \arg5.4s, v0.4s, v2.4s
+ zip2 \arg6.4s, v0.4s, v2.4s
+ zip1 v0.4s, v1.4s, v3.4s
+ zip2 v2.4s, v1.4s, v3.4s
+ zip2 v1.4s, \arg5.4s, v0.4s
+ zip1 v0.4s, \arg5.4s, v0.4s
+ zip2 v3.4s, \arg6.4s, v2.4s
+ zip1 v2.4s, \arg6.4s, v2.4s
+ BS_COMPARE_MV v4, v0, v1, v2, v3, \arg4
+.endm
+#endif
+
+WELS_ASM_ARCH64_FUNC_BEGIN WelsNonZeroCount_AArch64_neon
+ ld1 {v0.8b, v1.8b, v2.8b}, [x0]
+ ins v0.d[1], v1.d[0]
+ uzp1 v0.2d, v0.2d, v1.2d
+ cmeq v0.16b, v0.16b, #0
+ cmeq v2.8b, v2.8b, #0
+ mvn v0.16b, v0.16b
+ mvn v2.8b, v2.8b
+ abs v0.16b, v0.16b
+ abs v2.8b, v2.8b
+ ins v1.d[0], v0.d[1]
+ st1 {v0.8b, v1.8b, v2.8b}, [x0]
+WELS_ASM_ARCH64_FUNC_END
+
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockLumaLt4V_AArch64_neon //uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* tc
+ dup v16.16b, w2 //alpha
+ dup v17.16b, w3 //beta
+ add x2, x1, x1, lsl #1
+ sub x2, x0, x2
+ movi v23.16b, #128
+ ld1 {v0.16b}, [x2], x1
+ ld1 {v1.16b}, [x2], x1
+ ld1 {v2.16b}, [x2]
+ ld1 {v3.16b}, [x0], x1
+ ld1 {v4.16b}, [x0], x1
+ ld1 {v5.16b}, [x0]
+ sub x2, x2, x1
+ ld4r {v18.8b, v19.8b, v20.8b, v21.8b}, [x4]
+ trn1 v18.2s, v18.2s, v19.2s
+ trn1 v20.2s, v20.2s, v21.2s
+ trn1 v6.2d, v18.2d, v20.2d // iTc0: 0000, 1111, 2222, 3333
+ cmge v7.16b, v6.16b, #0 // iTc0 Flag
+
+ MASK_MATRIX v1, v2, v3, v4, v16, v17, v18
+ and v7.16b, v7.16b, v18.16b // need filter flag
+
+ ZERO_JUMP_END v7, x3, x4, DeblockLumaLt4V_AArch64_neon_end
+
+ eor v18.16b, v18.16b, v18.16b
+ sub v18.16b, v18.16b, v6.16b // -iTc0: 0000, 1111, 2222, 3333
+
+ DIFF_LUMA_LT4_P1_Q1 v0, v1, v2, v3, v17, v18, v6, v7, v19, v20
+ st1 {v19.16b}, [x2], x1
+
+ DIFF_LUMA_LT4_P1_Q1 v5, v4, v3, v2, v17, v18, v6, v7, v21, v22
+
+ abs v20.16b, v20.16b
+ abs v22.16b, v22.16b
+ add v6.16b, v6.16b, v20.16b
+ add v6.16b, v6.16b, v22.16b
+ eor v18.16b, v18.16b, v18.16b
+ sub v18.16b, v18.16b, v6.16b
+
+ DIFF_LUMA_LT4_P0_Q0_1 v1, v2, v3, v4, v19, v20, v22
+ DIFF_LUMA_LT4_P0_Q0_2 v1, v2, v3, v4, v19, v20, v22
+
+ smax v19.16b, v19.16b, v18.16b
+ smin v19.16b, v19.16b, v6.16b
+ and v19.16b, v19.16b, v7.16b
+
+ EXTRACT_DELTA_INTO_TWO_PART v19, v20
+ uqadd v2.16b, v2.16b, v20.16b
+ uqsub v2.16b, v2.16b, v19.16b
+ st1 {v2.16b}, [x2], x1
+ uqsub v3.16b, v3.16b, v20.16b
+ uqadd v3.16b, v3.16b, v19.16b
+ st1 {v3.16b}, [x2], x1
+ st1 {v21.16b}, [x2]
+DeblockLumaLt4V_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockLumaEq4V_AArch64_neon
+ dup v16.16b, w2 //alpha
+ dup v17.16b, w3 //beta
+ sub x3, x0, x1, lsl #2
+
+ ld1 {v0.16b}, [x3], x1
+ ld1 {v4.16b}, [x0], x1
+ ld1 {v1.16b}, [x3], x1
+ ld1 {v5.16b}, [x0], x1
+ ld1 {v2.16b}, [x3], x1
+ ld1 {v6.16b}, [x0], x1
+ ld1 {v3.16b}, [x3]
+ ld1 {v7.16b}, [x0]
+
+ sub x3, x3, x1, lsl #1
+ MASK_MATRIX v2, v3, v4, v5, v16, v17, v18
+ lsr w2, w2, #2
+ add w2, w2, #2
+ dup v16.16b, w2 //((alpha >> 2) + 2)
+ uabd v19.16b, v3.16b, v4.16b
+ cmhi v20.16b, v16.16b, v19.16b //iDetaP0Q0 < ((iAlpha >> 2) + 2)
+
+ uabd v21.16b, v1.16b, v3.16b
+ cmhi v21.16b, v17.16b, v21.16b //bDetaP2P0
+ and v21.16b, v21.16b, v20.16b //(iDetaP0Q0 < ((iAlpha >> 2) + 2))&&bDetaP2P0
+
+ uabd v22.16b, v6.16b, v4.16b
+ cmhi v22.16b, v17.16b, v22.16b //bDetaQ2Q0
+ and v22.16b, v22.16b, v20.16b //(iDetaP0Q0 < ((iAlpha >> 2) + 2))&&bDetaQ2Q0
+ and v20.16b, v20.16b, v18.16b //(iDetaP0Q0 < iAlpha) && bDetaP1P0 && bDetaQ1Q0&&(iDetaP0Q0 < ((iAlpha >> 2) + 2))
+
+ mov.16b v23, v21
+ mov.16b v24, v21
+
+ mov.16b v25, v0
+ DIFF_LUMA_EQ4_P2P1P0_1 v0, v1, v2, v3, v4, v5, v23, v19, v17, v16
+ DIFF_LUMA_EQ4_P2P1P0_2 v25, v1, v2, v3, v4, v5, v24, v19, v17, v16
+ ins v0.d[1], v25.d[1]
+ ins v23.d[1], v24.d[1]
+ and v21.16b, v20.16b, v21.16b
+ DIFF_LUMA_EQ4_MASK v19, v1, v21, v17
+ st1 {v17.16b}, [x3], x1
+ DIFF_LUMA_EQ4_MASK v0, v2, v21, v17
+ st1 {v17.16b}, [x3], x1
+ DIFF_LUMA_EQ4_MASK v23, v3, v18, v17
+ st1 {v17.16b}, [x3], x1
+
+
+ mov.16b v23, v22
+ mov.16b v24, v22
+ mov.16b v25, v7
+ DIFF_LUMA_EQ4_P2P1P0_1 v7, v6, v5, v4, v3, v2, v23, v19, v17, v16
+ DIFF_LUMA_EQ4_P2P1P0_2 v25, v6, v5, v4, v3, v2, v24, v19, v17, v16
+ ins v7.d[1], v25.d[1]
+ ins v23.d[1], v24.d[1]
+ and v22.16b, v20.16b, v22.16b
+ DIFF_LUMA_EQ4_MASK v23, v4, v18, v17
+ st1 {v17.16b}, [x3], x1
+ DIFF_LUMA_EQ4_MASK v7, v5, v22, v17
+ st1 {v17.16b}, [x3], x1
+ DIFF_LUMA_EQ4_MASK v19, v6, v22, v17
+ st1 {v17.16b}, [x3], x1
+DeblockLumaEq4V_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockLumaLt4H_AArch64_neon //uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* tc
+ dup v16.16b, w2 //alpha
+ dup v17.16b, w3 //beta
+ sub x2, x0, #3
+ movi v23.16b, #128
+
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 0
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 1
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 2
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 3
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 4
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 5
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 6
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 7
+
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 8
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 9
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 10
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 11
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 12
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 13
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 14
+ LOAD_LUMA_DATA_3 v0, v1, v2, v3, v4, v5, 15
+
+ sub x0, x0, x1, lsl #4
+
+ ld4r {v18.8b, v19.8b, v20.8b, v21.8b}, [x4]
+ trn1 v18.2s, v18.2s, v19.2s
+ trn1 v20.2s, v20.2s, v21.2s
+ trn1 v6.2d, v18.2d, v20.2d // iTc0: 0000, 1111, 2222, 3333
+ cmge v7.16b, v6.16b, #0 // iTc0 Flag
+
+ MASK_MATRIX v1, v2, v3, v4, v16, v17, v18
+ and v7.16b, v7.16b, v18.16b // need filter flag
+
+ ZERO_JUMP_END v7, x3, x4, DeblockLumaLt4H_AArch64_neon_end
+
+ eor v18.16b, v18.16b, v18.16b
+ sub v18.16b, v18.16b, v6.16b // -iTc0: 0000, 1111, 2222, 3333
+
+ DIFF_LUMA_LT4_P1_Q1 v0, v1, v2, v3, v17, v18, v6, v7, v19, v20 //Use Tmp v23,v24
+ mov.16b v25, v19
+
+ DIFF_LUMA_LT4_P1_Q1 v5, v4, v3, v2, v17, v18, v6, v7, v21, v22 //Use Tmp v23,v24
+
+ abs v20.16b, v20.16b
+ abs v22.16b, v22.16b
+ add v6.16b, v6.16b, v20.16b
+ add v6.16b, v6.16b, v22.16b
+ eor v18.16b, v18.16b, v18.16b
+ sub v18.16b, v18.16b, v6.16b
+
+ DIFF_LUMA_LT4_P0_Q0_1 v1, v2, v3, v4, v19, v20, v22
+ DIFF_LUMA_LT4_P0_Q0_2 v1, v2, v3, v4, v19, v20, v22
+
+ smax v19.16b, v19.16b, v18.16b
+ smin v19.16b, v19.16b, v6.16b
+ and v19.16b, v19.16b, v7.16b
+
+ EXTRACT_DELTA_INTO_TWO_PART v19, v20
+ uqadd v2.16b, v2.16b, v20.16b
+ uqsub v2.16b, v2.16b, v19.16b
+ mov.16b v26, v2
+ uqsub v3.16b, v3.16b, v20.16b
+ uqadd v3.16b, v3.16b, v19.16b
+ mov.16b v27, v3
+ mov.16b v28, v21
+
+ sub x0, x0, #2
+ add x2, x0, x1
+ lsl x1, x1, #1
+
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 0, 1
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 2, 3
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 4, 5
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 6, 7
+
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 8, 9
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 10, 11
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 12, 13
+ STORE_LUMA_DATA_4 v25, v26, v27, v28, 14, 15
+DeblockLumaLt4H_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockLumaEq4H_AArch64_neon
+ dup v16.16b, w2 //alpha
+ dup v17.16b, w3 //beta
+ sub x3, x0, #4
+
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 0
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 1
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 2
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 3
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 4
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 5
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 6
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 7
+
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 8
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 9
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 10
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 11
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 12
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 13
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 14
+ LOAD_LUMA_DATA_4 v0, v1, v2, v3, v4, v5, v6, v7, 15
+
+ sub x0, x0, x1, lsl #4
+ sub x3, x0, #3
+ MASK_MATRIX v2, v3, v4, v5, v16, v17, v18
+
+ ZERO_JUMP_END v18, x4, x5, DeblockLumaEq4H_AArch64_neon_end
+
+ lsr w2, w2, #2
+ add w2, w2, #2
+ dup v16.16b, w2 //((alpha >> 2) + 2)
+ uabd v19.16b, v3.16b, v4.16b
+ cmhi v20.16b, v16.16b, v19.16b //iDetaP0Q0 < ((iAlpha >> 2) + 2)
+
+ uabd v21.16b, v1.16b, v3.16b
+ cmhi v21.16b, v17.16b, v21.16b //bDetaP2P0
+ and v21.16b, v21.16b, v20.16b //(iDetaP0Q0 < ((iAlpha >> 2) + 2))&&bDetaP2P0
+
+ uabd v22.16b, v6.16b, v4.16b
+ cmhi v22.16b, v17.16b, v22.16b //bDetaQ2Q0
+ and v22.16b, v22.16b, v20.16b //(iDetaP0Q0 < ((iAlpha >> 2) + 2))&&bDetaQ2Q0
+ and v20.16b, v20.16b, v18.16b //(iDetaP0Q0 < iAlpha) && bDetaP1P0 && bDetaQ1Q0&&(iDetaP0Q0 < ((iAlpha >> 2) + 2))
+
+ mov.16b v23, v21
+ mov.16b v24, v21
+
+ mov.16b v25, v0
+ DIFF_LUMA_EQ4_P2P1P0_1 v0, v1, v2, v3, v4, v5, v23, v19, v17, v16
+ DIFF_LUMA_EQ4_P2P1P0_2 v25, v1, v2, v3, v4, v5, v24, v19, v17, v16
+ ins v0.d[1], v25.d[1]
+ ins v23.d[1], v24.d[1]
+ and v21.16b, v20.16b, v21.16b
+ DIFF_LUMA_EQ4_MASK v19, v1, v21, v17
+ mov.16b v26, v17
+ DIFF_LUMA_EQ4_MASK v0, v2, v21, v17
+ mov.16b v27, v17
+ DIFF_LUMA_EQ4_MASK v23, v3, v18, v17
+ mov.16b v28, v17
+
+
+ mov.16b v23, v22
+ mov.16b v24, v22
+ mov.16b v25, v7
+ DIFF_LUMA_EQ4_P2P1P0_1 v7, v6, v5, v4, v3, v2, v23, v19, v17, v16
+ DIFF_LUMA_EQ4_P2P1P0_2 v25, v6, v5, v4, v3, v2, v24, v19, v17, v16
+ ins v7.d[1], v25.d[1]
+ ins v23.d[1], v24.d[1]
+ and v22.16b, v20.16b, v22.16b
+ DIFF_LUMA_EQ4_MASK v23, v4, v18, v17
+ mov.16b v29, v17
+ DIFF_LUMA_EQ4_MASK v7, v5, v22, v17
+ mov.16b v30, v17
+ DIFF_LUMA_EQ4_MASK v19, v6, v22, v17
+ mov.16b v31, v17
+
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 0
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 1
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 2
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 3
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 4
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 5
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 6
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 7
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 8
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 9
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 10
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 11
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 12
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 13
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 14
+ STORE_LUMA_DATA_3 v26, v27, v28, v29, v30, v31, 15
+DeblockLumaEq4H_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockChromaLt4V_AArch64_neon //uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iAlpha, int32_t iBeta, int8_t* pTc
+ dup v16.16b, w3 //alpha
+ dup v17.16b, w4 //beta
+ lsl x3, x2, #1
+ sub x6, x0, x3 //pPixCb-2*Stride
+ sub x7, x1, x3 //pPixCr-2*Stride
+
+ ld1 {v0.d} [0], [x6], x2
+ ld1 {v1.d} [0], [x6]
+ ld1 {v2.d} [0], [x0], x2
+ ld1 {v3.d} [0], [x0]
+ ld1 {v0.d} [1], [x7], x2
+ ld1 {v1.d} [1], [x7]
+ ld1 {v2.d} [1], [x1], x2
+ ld1 {v3.d} [1], [x1]
+
+ ld4r {v18.8b, v19.8b, v20.8b, v21.8b}, [x5]
+ trn1 v18.4h, v18.4h, v19.4h //0011,0011,
+ trn1 v20.4h, v20.4h, v21.4h //2233,2233
+ zip1 v6.4s, v18.4s, v20.4s //iTc0: 0011,2233,0011,2233
+ cmgt v7.16b, v6.16b, #0 // iTc0 Flag
+
+ MASK_MATRIX v0, v1, v2, v3, v16, v17, v18
+ and v7.16b, v7.16b, v18.16b // need filter flag
+
+ ZERO_JUMP_END v7, x4, x5, DeblockChromaLt4V_AArch64_neon_end
+
+ eor v18.16b, v18.16b, v18.16b
+ sub v18.16b, v18.16b, v6.16b //-iTc0: 0011,2233,0011,2233
+
+ DIFF_LUMA_LT4_P0_Q0_1 v0, v1, v2, v3, v19, v20, v22
+ DIFF_LUMA_LT4_P0_Q0_2 v0, v1, v2, v3, v19, v20, v22
+
+ smax v19.16b, v19.16b, v18.16b
+ smin v19.16b, v19.16b, v6.16b
+ and v19.16b, v19.16b, v7.16b
+
+ EXTRACT_DELTA_INTO_TWO_PART v19, v20
+ uqadd v1.16b, v1.16b, v20.16b
+ uqsub v1.16b, v1.16b, v19.16b
+ st1 {v1.d} [0], [x6], x2
+ st1 {v1.d} [1], [x7], x2
+ uqsub v2.16b, v2.16b, v20.16b
+ uqadd v2.16b, v2.16b, v19.16b
+ st1 {v2.d} [0], [x6]
+ st1 {v2.d} [1], [x7]
+DeblockChromaLt4V_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockChromaLt4H_AArch64_neon //uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iAlpha, int32_t iBeta, int8_t* pTc
+ dup v16.16b, w3 //alpha
+ dup v17.16b, w4 //beta
+ sub x6, x0, #2 //pPixCb-2
+ sub x7, x1, #2 //pPixCr-2
+
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 0
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 1
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 2
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 3
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 4
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 5
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 6
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 7
+
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 8
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 9
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 10
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 11
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 12
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 13
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 14
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 15
+
+ sub x0, x0, #1
+ sub x1, x1, #1
+
+ ld4r {v18.8b, v19.8b, v20.8b, v21.8b}, [x5]
+ trn1 v18.4h, v18.4h, v19.4h //0011,0011,
+ trn1 v20.4h, v20.4h, v21.4h //2233,2233
+ zip1 v6.4s, v18.4s, v20.4s //iTc0: 0011,2233,0011,2233
+ cmgt v7.16b, v6.16b, #0 // iTc0 Flag
+
+ MASK_MATRIX v0, v1, v2, v3, v16, v17, v18
+ and v7.16b, v7.16b, v18.16b // need filter flag
+
+ ZERO_JUMP_END v7, x4, x5, DeblockChromaLt4H_AArch64_neon_end
+ eor v18.16b, v18.16b, v18.16b
+ sub v18.16b, v18.16b, v6.16b //-iTc0: 0011,2233,0011,2233
+
+ DIFF_LUMA_LT4_P0_Q0_1 v0, v1, v2, v3, v19, v20, v22
+ DIFF_LUMA_LT4_P0_Q0_2 v0, v1, v2, v3, v19, v20, v22
+
+ smax v19.16b, v19.16b, v18.16b
+ smin v19.16b, v19.16b, v6.16b
+ and v19.16b, v19.16b, v7.16b
+
+ EXTRACT_DELTA_INTO_TWO_PART v19, v20
+ uqadd v1.16b, v1.16b, v20.16b
+ uqsub v1.16b, v1.16b, v19.16b
+ uqsub v2.16b, v2.16b, v20.16b
+ uqadd v2.16b, v2.16b, v19.16b
+
+ STORE_CHROMA_DATA_2 v1, v2, x0, 0
+ STORE_CHROMA_DATA_2 v1, v2, x0, 1
+ STORE_CHROMA_DATA_2 v1, v2, x0, 2
+ STORE_CHROMA_DATA_2 v1, v2, x0, 3
+ STORE_CHROMA_DATA_2 v1, v2, x0, 4
+ STORE_CHROMA_DATA_2 v1, v2, x0, 5
+ STORE_CHROMA_DATA_2 v1, v2, x0, 6
+ STORE_CHROMA_DATA_2 v1, v2, x0, 7
+
+ STORE_CHROMA_DATA_2 v1, v2, x1, 8
+ STORE_CHROMA_DATA_2 v1, v2, x1, 9
+ STORE_CHROMA_DATA_2 v1, v2, x1, 10
+ STORE_CHROMA_DATA_2 v1, v2, x1, 11
+ STORE_CHROMA_DATA_2 v1, v2, x1, 12
+ STORE_CHROMA_DATA_2 v1, v2, x1, 13
+ STORE_CHROMA_DATA_2 v1, v2, x1, 14
+ STORE_CHROMA_DATA_2 v1, v2, x1, 15
+DeblockChromaLt4H_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockChromaEq4V_AArch64_neon //uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iAlpha, int32_t iBeta
+ dup v16.16b, w3 //alpha
+ dup v17.16b, w4 //beta
+ lsl x3, x2, #1
+ sub x6, x0, x3 //pPixCb-2*Stride
+ sub x7, x1, x3 //pPixCr-2*Stride
+
+ ld1 {v0.d} [0], [x6], x2
+ ld1 {v1.d} [0], [x6]
+ ld1 {v2.d} [0], [x0], x2
+ ld1 {v3.d} [0], [x0]
+ ld1 {v0.d} [1], [x7], x2
+ ld1 {v1.d} [1], [x7]
+ ld1 {v2.d} [1], [x1], x2
+ ld1 {v3.d} [1], [x1]
+
+ MASK_MATRIX v0, v1, v2, v3, v16, v17, v7
+
+ ZERO_JUMP_END v7, x3, x4, DeblockChromaEq4V_AArch64_neon_end
+
+ DIFF_CHROMA_EQ4_P0Q0_1 v0, v1, v2, v3, v18, v19, v20, v21
+ DIFF_CHROMA_EQ4_P0Q0_2 v0, v1, v2, v3, v18, v19, v20, v21
+
+ mov.16b v6, v7
+ bsl v6.16b, v20.16b, v1.16b
+ bsl v7.16b, v21.16b, v2.16b
+
+ st1 {v6.d} [0], [x6], x2
+ st1 {v6.d} [1], [x7], x2
+
+ st1 {v7.d} [0], [x6]
+ st1 {v7.d} [1], [x7]
+DeblockChromaEq4V_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockChromaEq4H_AArch64_neon //uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iAlpha, int32_t iBeta
+ dup v16.16b, w3 //alpha
+ dup v17.16b, w4 //beta
+
+ sub x6, x0, #2 //pPixCb-2
+ sub x7, x1, #2 //pPixCr-2
+
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 0
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 1
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 2
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 3
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 4
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 5
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 6
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x6, 7
+
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 8
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 9
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 10
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 11
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 12
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 13
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 14
+ LOAD_CHROMA_DATA_4 v0, v1, v2, v3, x7, 15
+ sub x0, x0, #1
+ sub x1, x1, #1
+
+ MASK_MATRIX v0, v1, v2, v3, v16, v17, v7
+
+ ZERO_JUMP_END v7, x3, x4, DeblockChromaEq4H_AArch64_neon_end
+
+ DIFF_CHROMA_EQ4_P0Q0_1 v0, v1, v2, v3, v18, v19, v20, v21
+ DIFF_CHROMA_EQ4_P0Q0_2 v0, v1, v2, v3, v18, v19, v20, v21
+
+ mov.16b v6, v7
+ bsl v6.16b, v20.16b, v1.16b
+ bsl v7.16b, v21.16b, v2.16b
+
+ STORE_CHROMA_DATA_2 v6, v7, x0, 0
+ STORE_CHROMA_DATA_2 v6, v7, x0, 1
+ STORE_CHROMA_DATA_2 v6, v7, x0, 2
+ STORE_CHROMA_DATA_2 v6, v7, x0, 3
+ STORE_CHROMA_DATA_2 v6, v7, x0, 4
+ STORE_CHROMA_DATA_2 v6, v7, x0, 5
+ STORE_CHROMA_DATA_2 v6, v7, x0, 6
+ STORE_CHROMA_DATA_2 v6, v7, x0, 7
+
+ STORE_CHROMA_DATA_2 v6, v7, x1, 8
+ STORE_CHROMA_DATA_2 v6, v7, x1, 9
+ STORE_CHROMA_DATA_2 v6, v7, x1, 10
+ STORE_CHROMA_DATA_2 v6, v7, x1, 11
+ STORE_CHROMA_DATA_2 v6, v7, x1, 12
+ STORE_CHROMA_DATA_2 v6, v7, x1, 13
+ STORE_CHROMA_DATA_2 v6, v7, x1, 14
+ STORE_CHROMA_DATA_2 v6, v7, x1, 15
+ DeblockChromaEq4H_AArch64_neon_end:
+WELS_ASM_ARCH64_FUNC_END
+
+
+WELS_ASM_ARCH64_FUNC_BEGIN DeblockingBSCalcEnc_AArch64_neon
+ // Checking the nzc status
+ BS_NZC_CHECK x0, x2, x3, v16, v17 //v16,v17 save the nzc status
+ // For checking bS[I] = 2
+ movi v0.16b, #0
+ cmgt v16.16b, v16.16b, v0.16b
+ cmgt v17.16b, v17.16b, v0.16b
+ movi v0.16b, #2
+
+ and v16.16b, v16.16b, v0.16b //v16 save the nzc check result all the time --- for dir is top
+ and v17.16b, v17.16b, v0.16b //v17 save the nzc check result all the time --- for dir is left
+
+ // Checking the mv status
+ BS_MV_CHECK x1, x2, x3, v18, v19, v5 , v6 //v18, v19 save the mv status
+ // For checking bS[I] = 1
+ movi v0.16b, #1
+ and v18.16b, v18.16b, v0.16b //v18 save the nzc check result all the time --- for dir is top
+ and v19.16b, v19.16b, v0.16b //v19 save the nzc check result all the time --- for dir is left
+ // Check bS[I] is '1' or '2'
+ umax v1.16b, v18.16b, v16.16b
+ umax v0.16b, v19.16b, v17.16b
+ st1 {v0.16b, v1.16b}, [x4]
+WELS_ASM_ARCH64_FUNC_END
+
+
+#endif
--- a/codec/common/inc/deblocking_common.h
+++ b/codec/common/inc/deblocking_common.h
@@ -50,6 +50,18 @@
void DeblockChromaEq4H_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta);
#endif
+#if defined(HAVE_NEON_AARCH64)
+void DeblockLumaLt4V_AArch64_neon (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* pTc);
+void DeblockLumaEq4V_AArch64_neon (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta);
+void DeblockLumaLt4H_AArch64_neon (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* pTc);
+void DeblockLumaEq4H_AArch64_neon (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta);
+void DeblockChromaLt4V_AArch64_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta,
+ int8_t* pTC);
+void DeblockChromaEq4V_AArch64_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta);
+void DeblockChromaLt4H_AArch64_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta,
+ int8_t* pTC);
+void DeblockChromaEq4H_AArch64_neon (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta);
+#endif
#if defined(__cplusplus)
}
#endif//__cplusplus
--- a/codec/common/targets.mk
+++ b/codec/common/targets.mk
@@ -39,6 +39,7 @@
ifeq ($(ASM_ARCH), arm64)
COMMON_ASM_ARM64_SRCS=\
+ $(COMMON_SRCDIR)/arm64/deblocking_aarch64_neon.S\
$(COMMON_SRCDIR)/arm64/expand_picture_aarch64_neon.S\
$(COMMON_SRCDIR)/arm64/mc_aarch64_neon.S\
--- a/codec/decoder/core/src/deblocking.cpp
+++ b/codec/decoder/core/src/deblocking.cpp
@@ -732,6 +732,20 @@
pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_neon;
}
#endif
+
+#if defined(HAVE_NEON_AARCH64)
+ if (iCpu & WELS_CPU_NEON) {
+ pFunc->pfLumaDeblockingLT4Ver = DeblockLumaLt4V_AArch64_neon;
+ pFunc->pfLumaDeblockingEQ4Ver = DeblockLumaEq4V_AArch64_neon;
+ pFunc->pfLumaDeblockingLT4Hor = DeblockLumaLt4H_AArch64_neon;
+ pFunc->pfLumaDeblockingEQ4Hor = DeblockLumaEq4H_AArch64_neon;
+
+ pFunc->pfChromaDeblockingLT4Ver = DeblockChromaLt4V_AArch64_neon;
+ pFunc->pfChromaDeblockingEQ4Ver = DeblockChromaEq4V_AArch64_neon;
+ pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_AArch64_neon;
+ pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_AArch64_neon;
+ }
+#endif
}
} // namespace WelsDec
--- a/codec/encoder/core/inc/deblocking.h
+++ b/codec/encoder/core/inc/deblocking.h
@@ -69,6 +69,10 @@
void DeblockingBSCalcEnc_neon (int8_t* pNzc, SMVUnitXY* pMv, int32_t iBoundryFlag, int32_t iMbStride,
uint8_t (*pBS)[4][4]);
#endif
+#if defined(HAVE_NEON_AARCH64)
+void WelsNonZeroCount_AArch64_neon (int8_t* pNonZeroCount);
+void DeblockingBSCalcEnc_AArch64_neon (int8_t* pNzc, SMVUnitXY* pMv, int32_t iBoundryFlag, int32_t iMbStride, uint8_t (*pBS)[4][4]);
+#endif
#if defined(__cplusplus)
}
#endif//__cplusplus
--- a/codec/encoder/core/src/deblocking.cpp
+++ b/codec/encoder/core/src/deblocking.cpp
@@ -573,6 +573,27 @@
}
#endif
+#if defined(HAVE_NEON_AARCH64) && defined(SINGLE_REF_FRAME)
+void DeblockingBSCalc_AArch64_neon (SWelsFuncPtrList* pFunc, SMB* pCurMb, uint8_t uiBS[2][4][4], Mb_Type uiCurMbType,
+ int32_t iMbStride, int32_t iLeftFlag, int32_t iTopFlag) {
+ DeblockingBSCalcEnc_AArch64_neon (pCurMb->pNonZeroCount, pCurMb->sMv, pCurMb->uiNeighborAvail, iMbStride, uiBS);
+ if (iLeftFlag) {
+ if (IS_INTRA ((pCurMb - 1)->uiMbType)) {
+ * (uint32_t*)uiBS[0][0] = 0x04040404;
+ }
+ } else {
+ * (uint32_t*)uiBS[0][0] = 0;
+ }
+ if (iTopFlag) {
+ if (IS_INTRA ((pCurMb - iMbStride)->uiMbType)) {
+ * (uint32_t*)uiBS[1][0] = 0x04040404;
+ }
+ } else {
+ * (uint32_t*)uiBS[1][0] = 0;
+ }
+}
+#endif
+
void DeblockingBSCalc_c (SWelsFuncPtrList* pFunc, SMB* pCurMb, uint8_t uiBS[2][4][4], Mb_Type uiCurMbType,
int32_t iMbStride, int32_t iLeftFlag, int32_t iTopFlag) {
if (iLeftFlag) {
@@ -765,6 +786,11 @@
*pfSetNZCZero = WelsNonZeroCount_neon;
}
#endif
+#ifdef HAVE_NEON_AARCH64
+ if (iCpu & WELS_CPU_NEON) {
+ *pfSetNZCZero = WelsNonZeroCount_AArch64_neon;
+ }
+#endif
}
void DeblockingInit (DeblockingFunc* pFunc, int32_t iCpu) {
@@ -810,6 +836,24 @@
pFunc->pfDeblockingBSCalc = DeblockingBSCalc_neon;
#endif
}
+#endif
+
+#if defined(HAVE_NEON_AARCH64)
+ if (iCpu & WELS_CPU_NEON) {
+ pFunc->pfLumaDeblockingLT4Ver = DeblockLumaLt4V_AArch64_neon;
+ pFunc->pfLumaDeblockingEQ4Ver = DeblockLumaEq4V_AArch64_neon;
+ pFunc->pfLumaDeblockingLT4Hor = DeblockLumaLt4H_AArch64_neon;
+ pFunc->pfLumaDeblockingEQ4Hor = DeblockLumaEq4H_AArch64_neon;
+
+ pFunc->pfChromaDeblockingLT4Ver = DeblockChromaLt4V_AArch64_neon;
+ pFunc->pfChromaDeblockingEQ4Ver = DeblockChromaEq4V_AArch64_neon;
+ pFunc->pfChromaDeblockingLT4Hor = DeblockChromaLt4H_AArch64_neon;
+ pFunc->pfChromaDeblockingEQ4Hor = DeblockChromaEq4H_AArch64_neon;
+
+#if defined(SINGLE_REF_FRAME)
+ pFunc->pfDeblockingBSCalc = DeblockingBSCalc_AArch64_neon;
+#endif
+ }
#endif
}
--- a/test/decoder/DecUT_Deblock.cpp
+++ b/test/decoder/DecUT_Deblock.cpp
@@ -127,3 +127,20 @@
GENERATE_CHROMA_UT (ChromaEq4V_neon, DeblockChromaEq4V_neon_wrap, DeblockChromaEq4V_c_wrap, WELS_CPU_NEON, 0)
GENERATE_CHROMA_UT (ChromaEq4H_neon, DeblockChromaEq4H_neon_wrap, DeblockChromaEq4H_c_wrap, WELS_CPU_NEON, 1)
#endif
+
+#if defined(HAVE_NEON_AARCH64)
+WRAP_LUMA_FUNC (DeblockLumaEq4V_AArch64_neon)
+WRAP_LUMA_FUNC (DeblockLumaEq4H_AArch64_neon)
+WRAP_CHROMA_FUNC (DeblockChromaEq4V_AArch64_neon)
+WRAP_CHROMA_FUNC (DeblockChromaEq4H_AArch64_neon)
+
+GENERATE_LUMA_UT (LumaLt4V_AArch64_neon, DeblockLumaLt4V_AArch64_neon, DeblockLumaLt4V_c, WELS_CPU_NEON, 0)
+GENERATE_LUMA_UT (LumaLt4H_AArch64_neon, DeblockLumaLt4H_AArch64_neon, DeblockLumaLt4H_c, WELS_CPU_NEON, 1)
+GENERATE_LUMA_UT (LumaEq4V_AArch64_neon, DeblockLumaEq4V_AArch64_neon_wrap, DeblockLumaEq4V_c_wrap, WELS_CPU_NEON, 0)
+GENERATE_LUMA_UT (LumaEq4H_AArch64_neon, DeblockLumaEq4H_AArch64_neon_wrap, DeblockLumaEq4H_c_wrap, WELS_CPU_NEON, 1)
+
+GENERATE_CHROMA_UT (ChromaLt4V_AArch64_neon, DeblockChromaLt4V_AArch64_neon, DeblockChromaLt4V_c, WELS_CPU_NEON, 0)
+GENERATE_CHROMA_UT (ChromaLt4H_AArch64_neon, DeblockChromaLt4H_AArch64_neon, DeblockChromaLt4H_c, WELS_CPU_NEON, 1)
+GENERATE_CHROMA_UT (ChromaEq4V_AArch64_neon, DeblockChromaEq4V_AArch64_neon_wrap, DeblockChromaEq4V_c_wrap, WELS_CPU_NEON, 0)
+GENERATE_CHROMA_UT (ChromaEq4H_AArch64_neon, DeblockChromaEq4H_AArch64_neon_wrap, DeblockChromaEq4H_c_wrap, WELS_CPU_NEON, 1)
+#endif