[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