[x264-devel] [PATCH 1/1] arm: optimize luma intra deblock neon asm
Janne Grunau
janne-x264 at jannau.net
Mon Aug 31 00:55:58 CEST 2015
Hi Martin,
hopefully faster luma intra deblock. Pushes only if_1 and if_2 onto the
stack and then calculates first the p0'-p2' values and then q0'-q2'
values. There is some overhead due to the splitted calculations but
hopefully less then spilling registers onto the stack.
As for the other patches, feel free to squash it.
Janne
---8<---
---
common/arm/deblock-a.S | 206 +++++++++++++++++++++++--------------------------
1 file changed, 97 insertions(+), 109 deletions(-)
diff --git a/common/arm/deblock-a.S b/common/arm/deblock-a.S
index 6434bc7..8d8d807 100644
--- a/common/arm/deblock-a.S
+++ b/common/arm/deblock-a.S
@@ -195,16 +195,6 @@ function x264_deblock_h_luma_neon
bx lr
endfunc
-.macro vpush_a regs, size
- sub sp, sp, \size
- vst1.8 \regs, [sp, :128]
-.endm
-
-.macro vld_sp regs, temp, off
- add \temp, sp, \off
- vld1.8 \regs, [\temp, :128]
-.endm
-
.macro h264_loop_filter_luma_intra
vdup.8 q14, r2 @ alpha
vdup.8 q15, r3 @ beta
@@ -218,36 +208,19 @@ endfunc
vmov.u8 q13, #2
vshr.u8 q14, q14, #2 @ alpha >> 2
vadd.u8 q14, q14, q13 @ (alpha >> 2) + 2
- vclt.u8 q4, q4, q14 @ < (alpha >> 2) + 2 if_2
+ vclt.u8 q13, q4, q14 @ < (alpha >> 2) + 2 if_2
vand q7, q7, q5
- vand q7, q7, q6 @ if_1
- vshrn.u16 d24, q7, #4
- vrev64.32 d25, d24
- vorr d24, d24, d25
- vmov.32 r3, d24[0]
- cmp r3, #0
+ vand q12, q7, q6 @ if_1
+ vshrn.u16 d28, q12, #4
+ vrev64.32 d29, d28
+ vorr d28, d28, d29
+ vmov.32 r2, d28[0]
+ cmp r2, #0
beq 9f
- vabd.u8 q5, q10, q8 @ abs(p2 - p0)
- vabd.u8 q6, q2, q0 @ abs(q2 - q0)
- vclt.u8 q5, q5, q15 @ < beta if_3
- vclt.u8 q6, q6, q15 @ < beta if_4
-
- vand q12, q4, q5 @ if_2 && if_3
- vand q13, q4, q6 @ if_2 && if_4
-
- vmvn q14, q12
- vmvn q15, q13
-
- vand q14, q14, q7 @ if_1 && !(if_2 && if_3)
- vand q15, q15, q7 @ if_1 && !(if_2 && if_4)
-
- vand q12, q12, q7 @ if_1 && if_2 && if_3
- vand q13, q13, q7 @ if_1 && if_2 && if_4
-
- vpush_a {q14-q15}, #32
- vpush_a {q12-q13}, #32
+ sub sp, sp, #32
+ vst1.8 {q12-q13}, [sp,:128]
vshll.u8 q4, d18, #1 @ 2*p1
vshll.u8 q5, d19, #1
@@ -258,86 +231,101 @@ endfunc
vrshrn.u16 d24, q4, #2
vrshrn.u16 d25, q5, #2
- vshll.u8 q6, d2, #1 @ 2*q1
- vshll.u8 q7, d3, #1
- vaddw.u8 q6, q6, d0 @ 2*q1 + q0
+ vaddl.u8 q6, d20, d16 @ p2 + p0
+ vaddl.u8 q7, d21, d17
+ vaddw.u8 q6, q6, d0 @ p2 + p0 + q0
vaddw.u8 q7, q7, d1
- vaddw.u8 q6, q6, d18 @ 2*q1 + q0 + p1
- vaddw.u8 q7, q7, d19
- vrshrn.u16 d26, q6, #2
- vrshrn.u16 d27, q7, #2
- vpush_a {q12-q13}, #32
-
- vaddl.u8 q14, d20, d16 @ p2 + p0
- vaddl.u8 q15, d21, d17
- vaddw.u8 q14, q14, d0 @ p2 + p0 + q0
- vaddw.u8 q15, q15, d1
- vadd.u16 q4, q4, q14 @ p2 + 2*p1 + 2*p0 + q0 + q1
- vadd.u16 q5, q5, q15
+ vadd.u16 q4, q4, q6 @ p2 + 2*p1 + 2*p0 + q0 + q1
+ vadd.u16 q5, q5, q7
vaddw.u8 q4, q4, d0 @ p2 + 2*p1 + 2*p0 + 2*q0 + q1
vaddw.u8 q5, q5, d1
- vrshrn.u16 d8, q4, #3 @ p0'_2
- vrshrn.u16 d9, q5, #3
- vaddw.u8 q14, q14, d18 @ p2 + p1 + p0 + q0
- vaddw.u8 q15, q15, d19
- vrshrn.u16 d10, q14, #2 @ p1'_2
- vrshrn.u16 d11, q15, #2
- vpush_a {q4-q5}, #32
+ vrshrn.u16 d26, q4, #3 @ p0'_2
+ vrshrn.u16 d27, q5, #3
+ vaddw.u8 q6, q6, d18 @ p2 + p1 + p0 + q0
+ vaddw.u8 q7, q7, d19
+ vrshrn.u16 d28, q6, #2 @ p1'_2
+ vrshrn.u16 d29, q7, #2
vaddl.u8 q4, d22, d20 @ p3 + p2
vaddl.u8 q5, d23, d21
vshl.u16 q4, q4, #1 @ 2*p3 + 2*p2
vshl.u16 q5, q5, #1
- vadd.u16 q4, q4, q14 @ 2*p3 + 3*p2 + p1 + p0 + q0
- vadd.u16 q5, q5, q15
- vrshrn.u16 d28, q4, #3 @ p2'_2
- vrshrn.u16 d29, q5, #3
- vpush_a {q14}, #16
-
- vaddl.u8 q14, d4, d0 @ q2 + q0
- vaddl.u8 q15, d5, d1
- vaddw.u8 q14, q14, d16 @ q2 + q0 + p0
- vaddw.u8 q15, q15, d17
- vadd.u16 q6, q6, q14 @ q2 + 2*q1 + 2*q0 + p0 + p1
- vadd.u16 q7, q7, q15
- vaddw.u8 q6, q6, d16 @ q2 + 2*q1 + 2*q0 + 2*p0 + p1
- vaddw.u8 q7, q7, d17
- vrshrn.u16 d12, q6, #3 @ q0'_2
- vrshrn.u16 d13, q7, #3
- vaddw.u8 q14, q14, d2 @ q2 + q1 + q0 + p0
- vaddw.u8 q15, q15, d3
- vrshrn.u16 d14, q14, #2 @ q1'_2
- vrshrn.u16 d15, q15, #2
- vpush_a {q6-q7}, #32
- vaddl.u8 q6, d6, d4 @ q3 + q2
- vaddl.u8 q7, d7, d5
- vshl.u16 q6, q6, #1 @ 2*q3 + 2*q2
- vshl.u16 q7, q7, #1
- vadd.u16 q6, q6, q14 @ 2*q3 + 3*q2 + q1 + q0 + p0
- vadd.u16 q7, q7, q15
- vrshrn.u16 d28, q6, #3 @ q2'_2
- vrshrn.u16 d29, q7, #3
- vpush_a {q14}, #16
-
- vld_sp {q4-q5}, r2, #96
- vld_sp {q14-q15}, r2, #160
- vbit q8, q4, q14
- vbit q0, q5, q15
-
- vld_sp {q12-q13}, r2, #128
-
- vld_sp {q4-q5}, r2, #64
- vld_sp {q6}, r2, #48
- vbit q8, q4, q12
- vbit q9, q5, q12
- vbit q10, q6, q12
-
- vld_sp {q4-q5}, r2, #16
- vld_sp {q6}, r2, #0
- vbit q0, q4, q13
- vbit q1, q5, q13
- vbit q2, q6, q13
-
- add sp, sp, #192
+ vadd.u16 q4, q4, q6 @ 2*p3 + 3*p2 + p1 + p0 + q0
+ vadd.u16 q5, q5, q7
+ vrshrn.u16 d30, q4, #3 @ p2'_2
+ vrshrn.u16 d31, q5, #3
+
+ vdup.8 q4, r3 @ beta
+ vabd.u8 q5, q10, q8 @ abs(p2 - p0)
+ vld1.8 {q6-q7}, [sp,:128] @ if_1, if_2
+ vclt.u8 q5, q5, q4 @ < beta if_3
+
+ vand q7, q7, q5 @ if_2 && if_3
+ vmvn q4, q7
+ vand q7, q7, q6 @ if_1 && if_2 && if_3
+ vand q6, q4, q6 @ if_1 && !(if_2 && if_3)
+
+ @ copy p0 to q11 so it can be clobbered
+ vbit q10, q15, q7
+ vmov q15, q8
+ vbit q8, q12, q6
+
+ @ wait for q9 to clobber
+ vshll.u8 q4, d2, #1 @ 2*q1
+ vshll.u8 q5, d3, #1
+
+ vbit q8, q12, q6
+
+ vaddw.u8 q4, q4, d0 @ 2*q1 + q0
+ vaddw.u8 q5, q5, d1
+
+ vbit q8, q13, q7
+
+ vaddw.u8 q4, q4, d18 @ 2*q1 + q0 + p1
+ vaddw.u8 q5, q5, d19
+
+ vbit q9, q14, q7
+
+ vrshrn.u16 d24, q4, #2
+ vrshrn.u16 d25, q5, #2
+
+ vaddl.u8 q6, d4, d0 @ q2 + q0
+ vaddl.u8 q7, d5, d1
+ vaddw.u8 q6, q6, d30 @ q2 + q0 + p0
+ vaddw.u8 q7, q7, d31
+ vadd.u16 q4, q4, q6 @ q2 + 2*q1 + 2*q0 + p0 + p1
+ vadd.u16 q5, q5, q7
+ vaddw.u8 q4, q4, d30 @ q2 + 2*q1 + 2*q0 + 2*p0 + p1
+ vaddw.u8 q5, q5, d31
+ vrshrn.u16 d26, q4, #3 @ q0'_2
+ vrshrn.u16 d27, q5, #3
+ vaddw.u8 q6, q6, d2 @ q2 + q1 + q0 + p0
+ vaddw.u8 q7, q7, d3
+ vrshrn.u16 d28, q6, #2 @ q1'_2
+ vrshrn.u16 d29, q7, #2
+ vaddl.u8 q4, d6, d4 @ q3 + q2
+ vaddl.u8 q5, d7, d5
+ vshl.u16 q4, q4, #1 @ 2*q3 + 2*q2
+ vshl.u16 q5, q5, #1
+ vadd.u16 q4, q4, q6 @ 2*q3 + 3*q2 + q1 + q0 + p0
+ vadd.u16 q5, q5, q7
+ vrshrn.u16 d30, q4, #3 @ q2'_2
+ vrshrn.u16 d31, q5, #3
+
+ vdup.8 q4, r3 @ beta
+ vabd.u8 q5, q2, q0 @ abs(q2 - q0)
+ vld1.8 {q6-q7}, [sp,:128]! @ if_1, if_2
+ vclt.u8 q5, q5, q4 @ < beta if_4
+
+ vand q7, q7, q5 @ if_2 && if_4
+ vmvn q4, q7
+ vand q7, q6, q7 @ if_1 && if_2 && if_4
+ vand q6, q6, q4 @ if_1 && !(if_2 && if_4)
+
+ vbit q0, q12, q6
+ vbit q1, q14, q7
+ vbit q0, q13, q7
+ vbit q2, q15, q7
+
.endm
function x264_deblock_v_luma_intra_neon
--
2.5.0
More information about the x264-devel
mailing list