[x264-devel] [PATCH 1/1] arm: optimize luma intra deblock neon asm

Martin Storsjö martin at martin.st
Mon Aug 31 21:47:16 CEST 2015


On Mon, 31 Aug 2015, Janne Grunau wrote:

> 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

This should be q15, right?

The rest of it looks good, thanks! I'll repost it with this squashed when 
I get to benchmarking it in the same setup as the rest, hopefully within a 
few days.

// Martin


More information about the x264-devel mailing list