summaryrefslogtreecommitdiff
path: root/libavcodec/arm/vp9mc_neon.S
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/arm/vp9mc_neon.S')
-rw-r--r--libavcodec/arm/vp9mc_neon.S64
1 files changed, 36 insertions, 28 deletions
diff --git a/libavcodec/arm/vp9mc_neon.S b/libavcodec/arm/vp9mc_neon.S
index d3d2c7f96b..bd8cda7c30 100644
--- a/libavcodec/arm/vp9mc_neon.S
+++ b/libavcodec/arm/vp9mc_neon.S
@@ -1,20 +1,20 @@
/*
* Copyright (c) 2016 Google Inc.
*
- * This file is part of Libav.
+ * This file is part of FFmpeg.
*
- * Libav is free software; you can redistribute it and/or
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
- * Libav is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
+ * License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@@ -79,7 +79,7 @@ function ff_vp9_avg32_neon, export=1
vrhadd.u8 q0, q0, q2
vrhadd.u8 q1, q1, q3
subs r12, r12, #1
- vst1.8 {q0, q1}, [r0, :128], r1
+ vst1.8 {q0, q1}, [r0, :128], r1
bne 1b
bx lr
endfunc
@@ -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
@@ -275,8 +286,7 @@ function \type\()_8tap_\size\()h_\idx1\idx2
sub r3, r3, #8
.endif
@ Load the filter vector
- vld1.8 {d0}, [r12,:64]
- vmovl.s8 q0, d0
+ vld1.16 {q0}, [r12,:128]
1:
.if \size >= 16
mov r12, r5
@@ -309,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
@@ -405,10 +415,10 @@ function ff_vp9_\type\()_\filter\()\size\()_h_neon, export=1
ldr r5, [sp, #20]
.endif
movrelx r12, X(ff_vp9_subpel_filters), r6
- add r12, r12, 120*\offset - 8
+ add r12, r12, 256*\offset
cmp r5, #8
- add r12, r12, r5, lsl #3
- mov r5, #\size
+ add r12, r12, r5, lsl #4
+ mov r5, #\size
.if \size >= 16
bge \type\()_8tap_16h_34
b \type\()_8tap_16h_43
@@ -540,10 +550,9 @@ do_8tap_h_filters 4
function \type\()_8tap_8v_\idx1\idx2
sub r2, r2, r3, lsl #1
sub r2, r2, r3
- vld1.8 {d0}, [r12, :64]
- vmovl.s8 q0, d0
+ vld1.16 {q0}, [r12, :128]
1:
- mov r12, r4
+ mov r12, r4
loadl q5, q6, q7
loadl q8, q9, q10, q11
@@ -611,8 +620,7 @@ do_8tap_8v avg, 4, 3
function \type\()_8tap_4v_\idx1\idx2
sub r2, r2, r3, lsl #1
sub r2, r2, r3
- vld1.8 {d0}, [r12, :64]
- vmovl.s8 q0, d0
+ vld1.16 {q0}, [r12, :128]
vld1.32 {d2[]}, [r2], r3
vld1.32 {d3[]}, [r2], r3
@@ -682,8 +690,8 @@ function ff_vp9_\type\()_\filter\()\size\()_v_neon, export=1
ldr r4, [sp, #72]
movrelx r12, X(ff_vp9_subpel_filters), r5
ldr r5, [sp, #80]
- add r12, r12, 120*\offset - 8
- add r12, r12, r5, lsl #3
+ add r12, r12, 256*\offset
+ add r12, r12, r5, lsl #4
cmp r5, #8
mov r5, #\size
.if \size >= 8