[5/6] arm: vp9mc: Calculate less unused data in the 4 pixel wide horizontal filter

Message ID 1483359476-4641-5-git-send-email-martin@martin.st
State Committed
Commit fea92a4b57d1c328b1de226a5f213a629ee63754
Headers show

Commit Message

Martin Storsjö Jan. 2, 2017, 12:17 p.m.
Before:                    Cortex A7      A8     A9     A53
vp9_put_8tap_smooth_4h_neon:   378.1   273.2  340.7   229.5
After:
vp9_put_8tap_smooth_4h_neon:   352.1   222.2  290.5   229.5
---
 libavcodec/arm/vp9mc_neon.S | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

Comments

Janne Grunau Feb. 10, 2017, 7:48 p.m. | #1
On 2017-01-02 14:17:55 +0200, Martin Storsjö wrote:
> Before:                    Cortex A7      A8     A9     A53
> vp9_put_8tap_smooth_4h_neon:   378.1   273.2  340.7   229.5
> After:
> vp9_put_8tap_smooth_4h_neon:   352.1   222.2  290.5   229.5
> ---
>  libavcodec/arm/vp9mc_neon.S | 33 ++++++++++++++++++++++-----------
>  1 file changed, 22 insertions(+), 11 deletions(-)
> 
> diff --git a/libavcodec/arm/vp9mc_neon.S b/libavcodec/arm/vp9mc_neon.S
> index a5413a3..8d43ff1 100644
> --- a/libavcodec/arm/vp9mc_neon.S
> +++ b/libavcodec/arm/vp9mc_neon.S
> @@ -209,7 +209,7 @@ endfunc
>  @ Extract a vector from src1-src2 and src4-src5 (src1-src3 and src4-src6
>  @ for size >= 16), and multiply-accumulate into dst1 and dst3 (or
>  @ dst1-dst2 and dst3-dst4 for size >= 16)
> -.macro extmla dst1, dst2, dst3, dst4, src1, src2, src3, src4, src5, src6, offset, size
> +.macro extmla dst1, dst2, dst3, dst4, dst1d, dst3d, src1, src2, src3, src4, src5, src6, offset, size
>          vext.8          q14, \src1, \src2, #(2*\offset)
>          vext.8          q15, \src4, \src5, #(2*\offset)
>  .if \size >= 16
> @@ -219,14 +219,17 @@ endfunc
>          vext.8          q6,  \src5, \src6, #(2*\offset)
>          vmla_lane       \dst2,  q5,  \offset
>          vmla_lane       \dst4,  q6,  \offset
> -.else
> +.elseif \size == 8
>          vmla_lane       \dst1,  q14, \offset
>          vmla_lane       \dst3,  q15, \offset
> +.else
> +        vmla_lane       \dst1d, d28, \offset
> +        vmla_lane       \dst3d, d30, \offset
>  .endif
>  .endm
>  @ The same as above, but don't accumulate straight into the
>  @ destination, but use a temp register and accumulate with saturation.
> -.macro extmulqadd dst1, dst2, dst3, dst4, src1, src2, src3, src4, src5, src6, offset, size
> +.macro extmulqadd dst1, dst2, dst3, dst4, dst1d, dst3d, src1, src2, src3, src4, src5, src6, offset, size
>          vext.8          q14, \src1, \src2, #(2*\offset)
>          vext.8          q15, \src4, \src5, #(2*\offset)
>  .if \size >= 16
> @@ -236,16 +239,24 @@ endfunc
>          vext.8          q6,  \src5, \src6, #(2*\offset)
>          vmul_lane       q5,  q5,  \offset
>          vmul_lane       q6,  q6,  \offset
> -.else
> +.elseif \size == 8
>          vmul_lane       q14, q14, \offset
>          vmul_lane       q15, q15, \offset
> +.else
> +        vmul_lane       d28, d28, \offset
> +        vmul_lane       d30, d30, \offset
>  .endif
> +.if \size == 4
> +        vqadd.s16       \dst1d, \dst1d, d28
> +        vqadd.s16       \dst3d, \dst3d, d30
> +.else
>          vqadd.s16       \dst1,  \dst1,  q14
>          vqadd.s16       \dst3,  \dst3,  q15
>  .if \size >= 16
>          vqadd.s16       \dst2,  \dst2,  q5
>          vqadd.s16       \dst4,  \dst4,  q6
>  .endif
> +.endif
>  .endm
>  
>  
> @@ -309,13 +320,13 @@ function \type\()_8tap_\size\()h_\idx1\idx2
>          vmul.s16        q2,  q9,  d0[0]
>          vmul.s16        q4,  q12, d0[0]
>  .endif
> -        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 1,     \size
> -        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 2,     \size
> -        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, \idx1, \size
> -        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 5,     \size
> -        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 6,     \size
> -        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 7,     \size
> -        extmulqadd      q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, \idx2, \size
> +        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 1,     \size
> +        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 2,     \size
> +        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, \idx1, \size
> +        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 5,     \size
> +        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 6,     \size
> +        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 7,     \size
> +        extmulqadd      q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, \idx2, \size
>  
>          @ Round, shift and saturate
>          vqrshrun.s16    d2,  q1,  #7

ok

Janne

Patch

diff --git a/libavcodec/arm/vp9mc_neon.S b/libavcodec/arm/vp9mc_neon.S
index a5413a3..8d43ff1 100644
--- a/libavcodec/arm/vp9mc_neon.S
+++ b/libavcodec/arm/vp9mc_neon.S
@@ -209,7 +209,7 @@  endfunc
 @ Extract a vector from src1-src2 and src4-src5 (src1-src3 and src4-src6
 @ for size >= 16), and multiply-accumulate into dst1 and dst3 (or
 @ dst1-dst2 and dst3-dst4 for size >= 16)
-.macro extmla dst1, dst2, dst3, dst4, src1, src2, src3, src4, src5, src6, offset, size
+.macro extmla dst1, dst2, dst3, dst4, dst1d, dst3d, src1, src2, src3, src4, src5, src6, offset, size
         vext.8          q14, \src1, \src2, #(2*\offset)
         vext.8          q15, \src4, \src5, #(2*\offset)
 .if \size >= 16
@@ -219,14 +219,17 @@  endfunc
         vext.8          q6,  \src5, \src6, #(2*\offset)
         vmla_lane       \dst2,  q5,  \offset
         vmla_lane       \dst4,  q6,  \offset
-.else
+.elseif \size == 8
         vmla_lane       \dst1,  q14, \offset
         vmla_lane       \dst3,  q15, \offset
+.else
+        vmla_lane       \dst1d, d28, \offset
+        vmla_lane       \dst3d, d30, \offset
 .endif
 .endm
 @ The same as above, but don't accumulate straight into the
 @ destination, but use a temp register and accumulate with saturation.
-.macro extmulqadd dst1, dst2, dst3, dst4, src1, src2, src3, src4, src5, src6, offset, size
+.macro extmulqadd dst1, dst2, dst3, dst4, dst1d, dst3d, src1, src2, src3, src4, src5, src6, offset, size
         vext.8          q14, \src1, \src2, #(2*\offset)
         vext.8          q15, \src4, \src5, #(2*\offset)
 .if \size >= 16
@@ -236,16 +239,24 @@  endfunc
         vext.8          q6,  \src5, \src6, #(2*\offset)
         vmul_lane       q5,  q5,  \offset
         vmul_lane       q6,  q6,  \offset
-.else
+.elseif \size == 8
         vmul_lane       q14, q14, \offset
         vmul_lane       q15, q15, \offset
+.else
+        vmul_lane       d28, d28, \offset
+        vmul_lane       d30, d30, \offset
 .endif
+.if \size == 4
+        vqadd.s16       \dst1d, \dst1d, d28
+        vqadd.s16       \dst3d, \dst3d, d30
+.else
         vqadd.s16       \dst1,  \dst1,  q14
         vqadd.s16       \dst3,  \dst3,  q15
 .if \size >= 16
         vqadd.s16       \dst2,  \dst2,  q5
         vqadd.s16       \dst4,  \dst4,  q6
 .endif
+.endif
 .endm
 
 
@@ -309,13 +320,13 @@  function \type\()_8tap_\size\()h_\idx1\idx2
         vmul.s16        q2,  q9,  d0[0]
         vmul.s16        q4,  q12, d0[0]
 .endif
-        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 1,     \size
-        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 2,     \size
-        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, \idx1, \size
-        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 5,     \size
-        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 6,     \size
-        extmla          q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, 7,     \size
-        extmulqadd      q1,  q2,  q3,  q4,  q8,  q9,  q10,  q11, q12, q13, \idx2, \size
+        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 1,     \size
+        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 2,     \size
+        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, \idx1, \size
+        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 5,     \size
+        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 6,     \size
+        extmla          q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, 7,     \size
+        extmulqadd      q1,  q2,  q3,  q4,  d2,  d6,  q8,  q9,  q10, q11, q12, q13, \idx2, \size
 
         @ Round, shift and saturate
         vqrshrun.s16    d2,  q1,  #7