summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp9/common/arm/neon/vp9_convolve8_avg_neon.asm24
-rw-r--r--vp9/common/arm/neon/vp9_convolve8_neon.asm16
-rw-r--r--vp9/common/arm/neon/vp9_convolve_neon.c5
-rw-r--r--vp9/common/arm/neon/vp9_mb_lpf_neon.asm161
-rw-r--r--vp9/common/arm/neon/vp9_short_idct4x4_add_neon.asm20
5 files changed, 104 insertions, 122 deletions
diff --git a/vp9/common/arm/neon/vp9_convolve8_avg_neon.asm b/vp9/common/arm/neon/vp9_convolve8_avg_neon.asm
index 437295245..6b20cb9bf 100644
--- a/vp9/common/arm/neon/vp9_convolve8_avg_neon.asm
+++ b/vp9/common/arm/neon/vp9_convolve8_avg_neon.asm
@@ -159,10 +159,10 @@ loop_horiz
; average the new value and the dst value
vrhadd.u8 q1, q1, q3
- vst1.u32 {d2[0]}, [r2], r3
- vst1.u32 {d3[0]}, [r2], r3
- vst1.u32 {d2[1]}, [r2], r3
- vst1.u32 {d3[1]}, [r2], r4
+ vst1.u32 {d2[0]}, [r2@32], r3
+ vst1.u32 {d3[0]}, [r2@32], r3
+ vst1.u32 {d2[1]}, [r2@32], r3
+ vst1.u32 {d3[1]}, [r2@32], r4
vmov q8, q9
vmov d20, d23
@@ -234,10 +234,10 @@ loop_vert
vmovl.u8 q12, d24
vmovl.u8 q13, d26
- vld1.u32 {d6[0]}, [r5], r3
- vld1.u32 {d6[1]}, [r8], r3
- vld1.u32 {d7[0]}, [r5], r3
- vld1.u32 {d7[1]}, [r8], r3
+ vld1.u32 {d6[0]}, [r5@32], r3
+ vld1.u32 {d6[1]}, [r8@32], r3
+ vld1.u32 {d7[0]}, [r5@32], r3
+ vld1.u32 {d7[1]}, [r8@32], r3
pld [r7]
pld [r4]
@@ -276,10 +276,10 @@ loop_vert
sub r5, r5, r3, lsl #1 ; reset for store
sub r8, r8, r3, lsl #1
- vst1.u32 {d2[0]}, [r5], r3
- vst1.u32 {d2[1]}, [r8], r3
- vst1.u32 {d3[0]}, [r5], r3
- vst1.u32 {d3[1]}, [r8], r3
+ vst1.u32 {d2[0]}, [r5@32], r3
+ vst1.u32 {d2[1]}, [r8@32], r3
+ vst1.u32 {d3[0]}, [r5@32], r3
+ vst1.u32 {d3[1]}, [r8@32], r3
vmov q8, q10
vmov d18, d22
diff --git a/vp9/common/arm/neon/vp9_convolve8_neon.asm b/vp9/common/arm/neon/vp9_convolve8_neon.asm
index 667cddb36..45258454c 100644
--- a/vp9/common/arm/neon/vp9_convolve8_neon.asm
+++ b/vp9/common/arm/neon/vp9_convolve8_neon.asm
@@ -148,10 +148,10 @@ loop_horiz
vtrn.32 d2, d3
vtrn.8 d2, d3
- vst1.u32 {d2[0]}, [r2], r3
- vst1.u32 {d3[0]}, [r2], r3
- vst1.u32 {d2[1]}, [r2], r3
- vst1.u32 {d3[1]}, [r2], r4
+ vst1.u32 {d2[0]}, [r2@32], r3
+ vst1.u32 {d3[0]}, [r2@32], r3
+ vst1.u32 {d2[1]}, [r2@32], r3
+ vst1.u32 {d3[1]}, [r2@32], r4
vmov q8, q9
vmov d20, d23
@@ -254,10 +254,10 @@ loop_vert
vqmovn.u16 d2, q1
vqmovn.u16 d3, q2
- vst1.u32 {d2[0]}, [r5], r3
- vst1.u32 {d2[1]}, [r8], r3
- vst1.u32 {d3[0]}, [r5], r3
- vst1.u32 {d3[1]}, [r8], r3
+ vst1.u32 {d2[0]}, [r5@32], r3
+ vst1.u32 {d2[1]}, [r8@32], r3
+ vst1.u32 {d3[0]}, [r5@32], r3
+ vst1.u32 {d3[1]}, [r8@32], r3
vmov q8, q10
vmov d18, d22
diff --git a/vp9/common/arm/neon/vp9_convolve_neon.c b/vp9/common/arm/neon/vp9_convolve_neon.c
index 6e37ff6f9..d8b24bfaf 100644
--- a/vp9/common/arm/neon/vp9_convolve_neon.c
+++ b/vp9/common/arm/neon/vp9_convolve_neon.c
@@ -10,6 +10,7 @@
#include "./vp9_rtcd.h"
#include "vp9/common/vp9_common.h"
+#include "vpx_ports/mem.h"
void vp9_convolve8_neon(const uint8_t *src, ptrdiff_t src_stride,
uint8_t *dst, ptrdiff_t dst_stride,
@@ -19,7 +20,7 @@ void vp9_convolve8_neon(const uint8_t *src, ptrdiff_t src_stride,
/* Given our constraints: w <= 64, h <= 64, taps == 8 we can reduce the
* maximum buffer size to 64 * 64 + 7 (+ 1 to make it divisible by 4).
*/
- uint8_t temp[64 * 72];
+ DECLARE_ALIGNED_ARRAY(8, uint8_t, temp, 64 * 72);
// Account for the vertical phase needing 3 lines prior and 4 lines post
int intermediate_height = h + 7;
@@ -53,7 +54,7 @@ void vp9_convolve8_avg_neon(const uint8_t *src, ptrdiff_t src_stride,
const int16_t *filter_x, int x_step_q4,
const int16_t *filter_y, int y_step_q4,
int w, int h) {
- uint8_t temp[64 * 72];
+ DECLARE_ALIGNED_ARRAY(8, uint8_t, temp, 64 * 72);
int intermediate_height = h + 7;
if (x_step_q4 != 16 || y_step_q4 != 16)
diff --git a/vp9/common/arm/neon/vp9_mb_lpf_neon.asm b/vp9/common/arm/neon/vp9_mb_lpf_neon.asm
index edf5786e3..2e8001b91 100644
--- a/vp9/common/arm/neon/vp9_mb_lpf_neon.asm
+++ b/vp9/common/arm/neon/vp9_mb_lpf_neon.asm
@@ -361,8 +361,6 @@ v_end
vand d16, d20, d19 ; flat && mask
vmov r5, r6, d16
- orrs r5, r5, r6 ; Check for 0
- orreq r7, r7, #1 ; Only do filter branch
; flatmask5(1, p7, p6, p5, p4, p0, q0, q4, q5, q6, q7)
vabd.u8 d22, d3, d7 ; abs(p4 - p0)
@@ -388,10 +386,11 @@ v_end
vmov.u8 d22, #0x80
+ orrs r5, r5, r6 ; Check for 0
+ orreq r7, r7, #1 ; Only do filter branch
+
vand d17, d18, d16 ; flat2 && flat && mask
vmov r5, r6, d17
- orrs r5, r5, r6 ; Check for 0
- orreq r7, r7, #2 ; Only do mbfilter branch
; mbfilter() function
@@ -405,15 +404,10 @@ v_end
vmov.u8 d27, #3
vsub.s8 d28, d23, d24 ; ( qs0 - ps0)
-
vqsub.s8 d29, d25, d26 ; filter = clamp(ps1-qs1)
-
vmull.s8 q15, d28, d27 ; 3 * ( qs0 - ps0)
-
vand d29, d29, d21 ; filter &= hev
-
vaddw.s8 q15, q15, d29 ; filter + 3 * (qs0 - ps0)
-
vmov.u8 d29, #4
; filter = clamp(filter + 3 * ( qs0 - ps0))
@@ -452,37 +446,37 @@ v_end
vaddl.u8 q15, d7, d8 ; op2 = p0 + q0
vmlal.u8 q15, d4, d27 ; op2 = p0 + q0 + p3 * 3
vmlal.u8 q15, d5, d29 ; op2 = p0 + q0 + p3 * 3 + p2 * 2
+ vaddl.u8 q10, d4, d5
vaddw.u8 q15, d6 ; op2=p1 + p0 + q0 + p3 * 3 + p2 *2
+ vaddl.u8 q14, d6, d9
vqrshrn.u16 d18, q15, #3 ; r_op2
- vsubw.u8 q15, d4 ; op1 = op2 - p3
- vsubw.u8 q15, d5 ; op1 -= p2
- vaddw.u8 q15, d6 ; op1 += p1
- vaddw.u8 q15, d9 ; op1 += q1
+ vsub.i16 q15, q10
+ vaddl.u8 q10, d4, d6
+ vadd.i16 q15, q14
+ vaddl.u8 q14, d7, d10
vqrshrn.u16 d19, q15, #3 ; r_op1
- vsubw.u8 q15, d4 ; op0 = op1 - p3
- vsubw.u8 q15, d6 ; op0 -= p1
- vaddw.u8 q15, d7 ; op0 += p0
- vaddw.u8 q15, d10 ; op0 += q2
+ vsub.i16 q15, q10
+ vadd.i16 q15, q14
+ vaddl.u8 q14, d8, d11
vqrshrn.u16 d20, q15, #3 ; r_op0
vsubw.u8 q15, d4 ; oq0 = op0 - p3
vsubw.u8 q15, d7 ; oq0 -= p0
- vaddw.u8 q15, d8 ; oq0 += q0
- vaddw.u8 q15, d11 ; oq0 += q3
+ vadd.i16 q15, q14
+ vaddl.u8 q14, d9, d11
vqrshrn.u16 d21, q15, #3 ; r_oq0
vsubw.u8 q15, d5 ; oq1 = oq0 - p2
vsubw.u8 q15, d8 ; oq1 -= q0
- vaddw.u8 q15, d9 ; oq1 += q1
- vaddw.u8 q15, d11 ; oq1 += q3
+ vadd.i16 q15, q14
+ vaddl.u8 q14, d10, d11
vqrshrn.u16 d22, q15, #3 ; r_oq1
vsubw.u8 q15, d6 ; oq2 = oq0 - p1
vsubw.u8 q15, d9 ; oq2 -= q1
- vaddw.u8 q15, d10 ; oq2 += q2
- vaddw.u8 q15, d11 ; oq2 += q3
+ vadd.i16 q15, q14
vqrshrn.u16 d27, q15, #3 ; r_oq2
; Filter does not set op2 or oq2, so use p2 and q2.
@@ -501,113 +495,104 @@ v_end
; wide_mbfilter flat2 && flat && mask branch
vmov.u8 d16, #7
vaddl.u8 q15, d7, d8 ; op6 = p0 + q0
+ vaddl.u8 q12, d2, d3
+ vaddl.u8 q13, d4, d5
+ vaddl.u8 q14, d1, d6
vmlal.u8 q15, d0, d16 ; op6 += p7 * 3
- vmlal.u8 q15, d1, d29 ; op6 += p6 * 2
- vaddw.u8 q15, d2 ; op6 += p5
- vaddw.u8 q15, d3 ; op6 += p4
- vaddw.u8 q15, d4 ; op6 += p3
- vaddw.u8 q15, d5 ; op6 += p2
- vaddw.u8 q15, d6 ; op6 += p1
+ vadd.i16 q12, q13
+ vadd.i16 q15, q14
+ vaddl.u8 q14, d2, d9
+ vadd.i16 q15, q12
+ vaddl.u8 q12, d0, d1
+ vaddw.u8 q15, d1
+ vaddl.u8 q13, d0, d2
+ vadd.i16 q14, q15, q14
vqrshrn.u16 d16, q15, #4 ; w_op6
- vsubw.u8 q15, d0 ; op5 = op6 - p7
- vsubw.u8 q15, d1 ; op5 -= p6
- vaddw.u8 q15, d2 ; op5 += p5
- vaddw.u8 q15, d9 ; op5 += q1
+ vsub.i16 q15, q14, q12
+ vaddl.u8 q14, d3, d10
vqrshrn.u16 d24, q15, #4 ; w_op5
- vsubw.u8 q15, d0 ; op4 = op5 - p7
- vsubw.u8 q15, d2 ; op4 -= p5
- vaddw.u8 q15, d3 ; op4 += p4
- vaddw.u8 q15, d10 ; op4 += q2
+ vsub.i16 q15, q13
+ vaddl.u8 q13, d0, d3
+ vadd.i16 q15, q14
+ vaddl.u8 q14, d4, d11
vqrshrn.u16 d25, q15, #4 ; w_op4
- vsubw.u8 q15, d0 ; op3 = op4 - p7
- vsubw.u8 q15, d3 ; op3 -= p4
- vaddw.u8 q15, d4 ; op3 += p3
- vaddw.u8 q15, d11 ; op3 += q3
+ vadd.i16 q15, q14
+ vaddl.u8 q14, d0, d4
+ vsub.i16 q15, q13
+ vsub.i16 q14, q15, q14
vqrshrn.u16 d26, q15, #4 ; w_op3
- vsubw.u8 q15, d0 ; op2 = op3 - p7
- vsubw.u8 q15, d4 ; op2 -= p3
- vaddw.u8 q15, d5 ; op2 += p2
+ vaddw.u8 q15, q14, d5 ; op2 += p2
+ vaddl.u8 q14, d0, d5
vaddw.u8 q15, d12 ; op2 += q4
+ vbif d26, d4, d17 ; op3 |= p3 & ~(f2 & f & m)
vqrshrn.u16 d27, q15, #4 ; w_op2
- vbif d27, d18, d17 ; op2 |= t_op2 & ~(f2 & f & m)
-
- vsubw.u8 q15, d0 ; op1 = op2 - p7
- vsubw.u8 q15, d5 ; op1 -= p2
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d0, d6
vaddw.u8 q15, d6 ; op1 += p1
vaddw.u8 q15, d13 ; op1 += q5
+ vbif d27, d18, d17 ; op2 |= t_op2 & ~(f2 & f & m)
vqrshrn.u16 d18, q15, #4 ; w_op1
- vbif d18, d19, d17 ; op1 |= t_op1 & ~(f2 & f & m)
-
- vsubw.u8 q15, d0 ; op0 = op1 - p7
- vsubw.u8 q15, d6 ; op0 -= p1
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d0, d7
vaddw.u8 q15, d7 ; op0 += p0
vaddw.u8 q15, d14 ; op0 += q6
+ vbif d18, d19, d17 ; op1 |= t_op1 & ~(f2 & f & m)
vqrshrn.u16 d19, q15, #4 ; w_op0
- vbif d19, d20, d17 ; op0 |= t_op0 & ~(f2 & f & m)
-
- vsubw.u8 q15, d0 ; oq0 = op0 - p7
- vsubw.u8 q15, d7 ; oq0 -= p0
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d1, d8
vaddw.u8 q15, d8 ; oq0 += q0
vaddw.u8 q15, d15 ; oq0 += q7
+ vbif d19, d20, d17 ; op0 |= t_op0 & ~(f2 & f & m)
vqrshrn.u16 d20, q15, #4 ; w_oq0
- vbif d20, d21, d17 ; oq0 |= t_oq0 & ~(f2 & f & m)
-
- vsubw.u8 q15, d1 ; oq1 = oq0 - p6
- vsubw.u8 q15, d8 ; oq1 -= q0
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d2, d9
vaddw.u8 q15, d9 ; oq1 += q1
+ vaddl.u8 q4, d10, d15
vaddw.u8 q15, d15 ; oq1 += q7
+ vbif d20, d21, d17 ; oq0 |= t_oq0 & ~(f2 & f & m)
vqrshrn.u16 d21, q15, #4 ; w_oq1
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d3, d10
+ vadd.i16 q15, q4
+ vaddl.u8 q4, d11, d15
vbif d21, d22, d17 ; oq1 |= t_oq1 & ~(f2 & f & m)
-
- vsubw.u8 q15, d2 ; oq2 = oq1 - p5
- vsubw.u8 q15, d9 ; oq2 -= q1
- vaddw.u8 q15, d10 ; oq2 += q2
- vaddw.u8 q15, d15 ; oq2 += q7
vqrshrn.u16 d22, q15, #4 ; w_oq2
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d4, d11
+ vadd.i16 q15, q4
+ vaddl.u8 q4, d12, d15
vbif d22, d23, d17 ; oq2 |= t_oq2 & ~(f2 & f & m)
-
- vsubw.u8 q15, d3 ; oq3 = oq2 - p4
- vsubw.u8 q15, d10 ; oq3 -= q2
- vaddw.u8 q15, d11 ; oq3 += q3
- vaddw.u8 q15, d15 ; oq3 += q7
vqrshrn.u16 d23, q15, #4 ; w_oq3
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d5, d12
+ vadd.i16 q15, q4
+ vaddl.u8 q4, d13, d15
vbif d16, d1, d17 ; op6 |= p6 & ~(f2 & f & m)
-
- vsubw.u8 q15, d4 ; oq4 = oq3 - p3
- vsubw.u8 q15, d11 ; oq4 -= q3
- vaddw.u8 q15, d12 ; oq4 += q4
- vaddw.u8 q15, d15 ; oq4 += q7
vqrshrn.u16 d1, q15, #4 ; w_oq4
+ vsub.i16 q15, q14
+ vaddl.u8 q14, d6, d13
+ vadd.i16 q15, q4
+ vaddl.u8 q4, d14, d15
vbif d24, d2, d17 ; op5 |= p5 & ~(f2 & f & m)
-
- vsubw.u8 q15, d5 ; oq5 = oq4 - p2
- vsubw.u8 q15, d12 ; oq5 -= q4
- vaddw.u8 q15, d13 ; oq5 += q5
- vaddw.u8 q15, d15 ; oq5 += q7
vqrshrn.u16 d2, q15, #4 ; w_oq5
+ vsub.i16 q15, q14
vbif d25, d3, d17 ; op4 |= p4 & ~(f2 & f & m)
-
- vsubw.u8 q15, d6 ; oq6 = oq5 - p1
- vsubw.u8 q15, d13 ; oq6 -= q5
- vaddw.u8 q15, d14 ; oq6 += q6
- vaddw.u8 q15, d15 ; oq6 += q7
- vqrshrn.u16 d3, q15, #4 ; w_oq6
-
- vbif d26, d4, d17 ; op3 |= p3 & ~(f2 & f & m)
+ vadd.i16 q15, q4
vbif d23, d11, d17 ; oq3 |= q3 & ~(f2 & f & m)
+ vqrshrn.u16 d3, q15, #4 ; w_oq6
vbif d1, d12, d17 ; oq4 |= q4 & ~(f2 & f & m)
vbif d2, d13, d17 ; oq5 |= q5 & ~(f2 & f & m)
vbif d3, d14, d17 ; oq6 |= q6 & ~(f2 & f & m)
diff --git a/vp9/common/arm/neon/vp9_short_idct4x4_add_neon.asm b/vp9/common/arm/neon/vp9_short_idct4x4_add_neon.asm
index 433032237..adc17fc97 100644
--- a/vp9/common/arm/neon/vp9_short_idct4x4_add_neon.asm
+++ b/vp9/common/arm/neon/vp9_short_idct4x4_add_neon.asm
@@ -81,17 +81,15 @@
; input[1] * cospi_24_64 - input[3] * cospi_8_64;
; input[1] * cospi_8_64 + input[3] * cospi_24_64;
vmull.s16 q15, d17, d22
- vmull.s16 q0, d19, d20
vmull.s16 q1, d17, d20
- vmull.s16 q2, d19, d22
- vsub.s32 q3, q15, q0
- vadd.s32 q8, q1, q2
+ vmlsl.s16 q15, d19, d20
+ vmlal.s16 q1, d19, d22
; dct_const_round_shift
vqrshrn.s32 d26, q13, #14
vqrshrn.s32 d27, q14, #14
- vqrshrn.s32 d29, q3, #14
- vqrshrn.s32 d28, q8, #14
+ vqrshrn.s32 d29, q15, #14
+ vqrshrn.s32 d28, q1, #14
; stage 2
; output[0] = step[0] + step[3];
@@ -132,17 +130,15 @@
; input[1] * cospi_24_64 - input[3] * cospi_8_64;
; input[1] * cospi_8_64 + input[3] * cospi_24_64;
vmull.s16 q15, d17, d22
- vmull.s16 q0, d19, d20
vmull.s16 q1, d17, d20
- vmull.s16 q2, d19, d22
- vsub.s32 q3, q15, q0
- vadd.s32 q8, q1, q2
+ vmlsl.s16 q15, d19, d20
+ vmlal.s16 q1, d19, d22
; dct_const_round_shift
vqrshrn.s32 d26, q13, #14
vqrshrn.s32 d27, q14, #14
- vqrshrn.s32 d29, q3, #14
- vqrshrn.s32 d28, q8, #14
+ vqrshrn.s32 d29, q15, #14
+ vqrshrn.s32 d28, q1, #14
; stage 2
; output[0] = step[0] + step[3];