[FFmpeg-cvslog] arm: vp9mc: Calculate less unused data in the 4 pixel wide horizontal filter
Martin Storsjö
git at videolan.org
Sat Mar 11 13:53:22 EET 2017
ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Sat Dec 17 13:09:50 2016 +0200| [bff07715904cc02f04eb5c5e171b431eb00f0c3b] | committer: Martin Storsjö
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
This is cherrypicked from libav commit
fea92a4b57d1c328b1de226a5f213a629ee63754.
Signed-off-by: Martin Storsjö <martin at martin.st>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=bff07715904cc02f04eb5c5e171b431eb00f0c3b
---
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 83235ff..bd8cda7 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
@@ -308,13 +319,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
More information about the ffmpeg-cvslog
mailing list