diff options
author | Martin Storsjö <martin@martin.st> | 2016-12-17 13:09:50 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2017-02-11 00:08:37 +0200 |
commit | fea92a4b57d1c328b1de226a5f213a629ee63754 (patch) | |
tree | f28f5d372238bc0402240bbb50f6670940c2c58d /libavcodec/arm | |
parent | 5e0c2158fbc774f87d3ce4b7b950ba4d42c4a7b8 (diff) | |
download | ffmpeg-fea92a4b57d1c328b1de226a5f213a629ee63754.tar.gz |
arm: vp9mc: Calculate less unused data in the 4 pixel wide horizontal filter
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
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavcodec/arm')
-rw-r--r-- | libavcodec/arm/vp9mc_neon.S | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/libavcodec/arm/vp9mc_neon.S b/libavcodec/arm/vp9mc_neon.S index a5413a3c9f..8d43ff19c3 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 |