[x264-devel] [PATCH 3/4] x264_intra_sad_x3_8x8c_neon

Måns Rullgård mans at mansr.com
Tue Jan 31 02:01:13 CET 2012


George Stephanos <gaf.stephanos at gmail.com> writes:

> ---
>  common/arm/pixel-a.S |  127 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  common/arm/pixel.h   |    1 +
>  common/pixel.c       |    1 +
>  3 files changed, 129 insertions(+), 0 deletions(-)
>
> diff --git a/common/arm/pixel-a.S b/common/arm/pixel-a.S
> index ece299c..8e9b5b1 100644
> --- a/common/arm/pixel-a.S
> +++ b/common/arm/pixel-a.S
> @@ -1364,3 +1364,130 @@ function x264_intra_sad_x3_8x8_neon
>      bx          lr
>  .endfunc
>
> +function x264_intra_sad_x3_8x8c_neon
> +    push        {r4, lr}
> +    vmov.i8     q2, #0
> +    vmov.i8     q8, #0
> +    vmov.i8     q10, #0
> +    vmov.i8     q11, #0
> +    add         r2, #8
> +    sub         lr, r1, #FDEC_STRIDE
> +    mov         r3, #FENC_STRIDE
> +    vld1.8      {d0}, [lr]
> +    mov         r4, #FDEC_STRIDE
> +    sub         lr, r1, #1
> +
> +    vld1.8      {d24}, [r0], r3
> +    vld1.8      {d19[0]}, [lr], r4

Use a load to all lanes here,

> +    vabal.u8    q2, d0, d24
> +    vdup.8      d18, d19[0]

and avoid the need for a vdup here.

> +    vaddw.u8    q8, d19
> +    vabal.u8    q10, d18, d24

[...]

> +    vadd.u16    d20, d21
> +    vadd.u16    d4, d5
> +    vshr.u64    d21, d20, #32
> +    vshr.u64    d5, d4, #32
> +    vadd.u16    d20, d21
> +    vadd.u16    d4, d5
> +    vshr.u64    d21, d20, #16
> +    vshr.u64    d5, d4, #16
> +    vmovl.u8    q3, d0
> +    vadd.u16    d20, d21
> +    vshr.u64    q9, q3, #32
> +    vadd.u16    d4, d5
> +    vadd.u16    q3, q9
> +    vst1.16     {d4[0]}, [r2]
> +    vshr.u64    q9, q3, #16
> +    sub         r2, #4
> +    vadd.u16    q3, q9

VPADD

> +    vst1.16     {d20[0]}, [r2]

These stores can be aligned.

> +    vadd.u16    d3, d7, d22
> +    vadd.u16    d0, d6, d16
> +    vrshr.u16   d1, d7, #2
> +    vrshr.u16   d3, #3
> +    vrshr.u16   d0, #3
> +    vrshr.u16   d2, d22, #2
> +    vdup.8      d1, d1[0]
> +    vdup.8      d3, d3[0]
> +    vdup.8      d0, d0[0]
> +    vdup.8      d2, d2[0]
> +
> +    vmov.i8     q10, #0
> +    vmov.i8     q11, #0

Drop those VMOVs and use VABDL for the first step below.

> +    vext.8      d0, d0, d1, #4
> +    vext.8      d1, d2, d3, #4
> +
> +    vabal.u8    q11, d0, d24
> +    vabal.u8    q10, d0, d25
> +    vabal.u8    q11, d0, d26
> +    vabal.u8    q10, d0, d27
> +    vabal.u8    q11, d1, d28
> +    vabal.u8    q10, d1, d29
> +    vabal.u8    q11, d1, d30
> +    vabal.u8    q10, d1, d31
> +
> +    sub         r2, #4
> +    vadd.u16    q11, q10
> +    vadd.u16    d22, d23
> +    vshr.u64    d23, d22, #32
> +    vadd.u16    d22, d23
> +    vshr.u64    d23, d22, #16
> +    vadd.u16    d22, d23

VPADD

> +    vst1.16     {d22[0]}, [r2]
> +
> +    pop        {r4, pc}
> +.endfunc

-- 
Måns Rullgård
mans at mansr.com


More information about the x264-devel mailing list