diff options
Diffstat (limited to 'libavcodec/arm')
-rw-r--r-- | libavcodec/arm/vp9itxfm_neon.S | 246 |
1 files changed, 120 insertions, 126 deletions
diff --git a/libavcodec/arm/vp9itxfm_neon.S b/libavcodec/arm/vp9itxfm_neon.S index 8dc4bbfa55..bed502eba2 100644 --- a/libavcodec/arm/vp9itxfm_neon.S +++ b/libavcodec/arm/vp9itxfm_neon.S @@ -1185,58 +1185,51 @@ function idct32x32_dc_add_neon endfunc .macro idct32_end - butterfly d16, d5, d4, d5 @ d16 = t16a, d5 = t19a + butterfly d16, d9, d8, d9 @ d16 = t16a, d9 = t19a butterfly d17, d20, d23, d20 @ d17 = t17, d20 = t18 - butterfly d18, d6, d7, d6 @ d18 = t23a, d6 = t20a + butterfly d18, d10, d11, d10 @ d18 = t23a, d10 = t20a butterfly d19, d21, d22, d21 @ d19 = t22, d21 = t21 - butterfly d4, d28, d28, d30 @ d4 = t24a, d28 = t27a + butterfly d8, d28, d28, d30 @ d8 = t24a, d28 = t27a butterfly d23, d26, d25, d26 @ d23 = t25, d26 = t26 - butterfly d7, d29, d29, d31 @ d7 = t31a, d29 = t28a + butterfly d11, d29, d29, d31 @ d11 = t31a, d29 = t28a butterfly d22, d27, d24, d27 @ d22 = t30, d27 = t29 mbutterfly d27, d20, d0[1], d0[2], q12, q15 @ d27 = t18a, d20 = t29a - mbutterfly d29, d5, d0[1], d0[2], q12, q15 @ d29 = t19, d5 = t28 - mbutterfly d28, d6, d0[1], d0[2], q12, q15, neg=1 @ d28 = t27, d6 = t20 + mbutterfly d29, d9, d0[1], d0[2], q12, q15 @ d29 = t19, d9 = t28 + mbutterfly d28, d10, d0[1], d0[2], q12, q15, neg=1 @ d28 = t27, d10 = t20 mbutterfly d26, d21, d0[1], d0[2], q12, q15, neg=1 @ d26 = t26a, d21 = t21a - butterfly d31, d24, d7, d4 @ d31 = t31, d24 = t24 + butterfly d31, d24, d11, d8 @ d31 = t31, d24 = t24 butterfly d30, d25, d22, d23 @ d30 = t30a, d25 = t25a butterfly_r d23, d16, d16, d18 @ d23 = t23, d16 = t16 butterfly_r d22, d17, d17, d19 @ d22 = t22a, d17 = t17a butterfly d18, d21, d27, d21 @ d18 = t18, d21 = t21 - butterfly_r d27, d28, d5, d28 @ d27 = t27a, d28 = t28a - butterfly d4, d26, d20, d26 @ d4 = t29, d26 = t26 - butterfly d19, d20, d29, d6 @ d19 = t19a, d20 = t20 - vmov d29, d4 @ d29 = t29 - - mbutterfly0 d27, d20, d27, d20, d4, d6, q2, q3 @ d27 = t27, d20 = t20 - mbutterfly0 d26, d21, d26, d21, d4, d6, q2, q3 @ d26 = t26a, d21 = t21a - mbutterfly0 d25, d22, d25, d22, d4, d6, q2, q3 @ d25 = t25, d22 = t22 - mbutterfly0 d24, d23, d24, d23, d4, d6, q2, q3 @ d24 = t24a, d23 = t23a + butterfly_r d27, d28, d9, d28 @ d27 = t27a, d28 = t28a + butterfly d8, d26, d20, d26 @ d8 = t29, d26 = t26 + butterfly d19, d20, d29, d10 @ d19 = t19a, d20 = t20 + vmov d29, d8 @ d29 = t29 + + mbutterfly0 d27, d20, d27, d20, d8, d10, q4, q5 @ d27 = t27, d20 = t20 + mbutterfly0 d26, d21, d26, d21, d8, d10, q4, q5 @ d26 = t26a, d21 = t21a + mbutterfly0 d25, d22, d25, d22, d8, d10, q4, q5 @ d25 = t25, d22 = t22 + mbutterfly0 d24, d23, d24, d23, d8, d10, q4, q5 @ d24 = t24a, d23 = t23a bx lr .endm function idct32_odd - movrel r12, idct_coeffs - add r12, r12, #32 - vld1.16 {q0-q1}, [r12,:128] - - mbutterfly d16, d31, d0[0], d0[1], q2, q3 @ d16 = t16a, d31 = t31a - mbutterfly d24, d23, d0[2], d0[3], q2, q3 @ d24 = t17a, d23 = t30a - mbutterfly d20, d27, d1[0], d1[1], q2, q3 @ d20 = t18a, d27 = t29a - mbutterfly d28, d19, d1[2], d1[3], q2, q3 @ d28 = t19a, d19 = t28a - mbutterfly d18, d29, d2[0], d2[1], q2, q3 @ d18 = t20a, d29 = t27a - mbutterfly d26, d21, d2[2], d2[3], q2, q3 @ d26 = t21a, d21 = t26a - mbutterfly d22, d25, d3[0], d3[1], q2, q3 @ d22 = t22a, d25 = t25a - mbutterfly d30, d17, d3[2], d3[3], q2, q3 @ d30 = t23a, d17 = t24a - - sub r12, r12, #32 - vld1.16 {q0}, [r12,:128] - - butterfly d4, d24, d16, d24 @ d4 = t16, d24 = t17 - butterfly d5, d20, d28, d20 @ d5 = t19, d20 = t18 - butterfly d6, d26, d18, d26 @ d6 = t20, d26 = t21 - butterfly d7, d22, d30, d22 @ d7 = t23, d22 = t22 + mbutterfly d16, d31, d4[0], d4[1], q4, q5 @ d16 = t16a, d31 = t31a + mbutterfly d24, d23, d4[2], d4[3], q4, q5 @ d24 = t17a, d23 = t30a + mbutterfly d20, d27, d5[0], d5[1], q4, q5 @ d20 = t18a, d27 = t29a + mbutterfly d28, d19, d5[2], d5[3], q4, q5 @ d28 = t19a, d19 = t28a + mbutterfly d18, d29, d6[0], d6[1], q4, q5 @ d18 = t20a, d29 = t27a + mbutterfly d26, d21, d6[2], d6[3], q4, q5 @ d26 = t21a, d21 = t26a + mbutterfly d22, d25, d7[0], d7[1], q4, q5 @ d22 = t22a, d25 = t25a + mbutterfly d30, d17, d7[2], d7[3], q4, q5 @ d30 = t23a, d17 = t24a + + butterfly d8, d24, d16, d24 @ d8 = t16, d24 = t17 + butterfly d9, d20, d28, d20 @ d9 = t19, d20 = t18 + butterfly d10, d26, d18, d26 @ d10 = t20, d26 = t21 + butterfly d11, d22, d30, d22 @ d11 = t23, d22 = t22 butterfly d28, d25, d17, d25 @ d28 = t24, d25 = t25 butterfly d30, d21, d29, d21 @ d30 = t27, d21 = t26 butterfly d29, d23, d31, d23 @ d29 = t31, d23 = t30 @@ -1250,26 +1243,19 @@ function idct32_odd endfunc function idct32_odd_half - movrel r12, idct_coeffs - add r12, r12, #32 - vld1.16 {q0-q1}, [r12,:128] - - mbutterfly_h1 d16, d31, d0[0], d0[1], q2, q3 @ d16 = t16a, d31 = t31a - mbutterfly_h2 d24, d23, d0[2], d0[3], q2, q3 @ d24 = t17a, d23 = t30a - mbutterfly_h1 d20, d27, d1[0], d1[1], q2, q3 @ d20 = t18a, d27 = t29a - mbutterfly_h2 d28, d19, d1[2], d1[3], q2, q3 @ d28 = t19a, d19 = t28a - mbutterfly_h1 d18, d29, d2[0], d2[1], q2, q3 @ d18 = t20a, d29 = t27a - mbutterfly_h2 d26, d21, d2[2], d2[3], q2, q3 @ d26 = t21a, d21 = t26a - mbutterfly_h1 d22, d25, d3[0], d3[1], q2, q3 @ d22 = t22a, d25 = t25a - mbutterfly_h2 d30, d17, d3[2], d3[3], q2, q3 @ d30 = t23a, d17 = t24a - - sub r12, r12, #32 - vld1.16 {q0}, [r12,:128] - - butterfly d4, d24, d16, d24 @ d4 = t16, d24 = t17 - butterfly d5, d20, d28, d20 @ d5 = t19, d20 = t18 - butterfly d6, d26, d18, d26 @ d6 = t20, d26 = t21 - butterfly d7, d22, d30, d22 @ d7 = t23, d22 = t22 + mbutterfly_h1 d16, d31, d4[0], d4[1], q4, q5 @ d16 = t16a, d31 = t31a + mbutterfly_h2 d24, d23, d4[2], d4[3], q4, q5 @ d24 = t17a, d23 = t30a + mbutterfly_h1 d20, d27, d5[0], d5[1], q4, q5 @ d20 = t18a, d27 = t29a + mbutterfly_h2 d28, d19, d5[2], d5[3], q4, q5 @ d28 = t19a, d19 = t28a + mbutterfly_h1 d18, d29, d6[0], d6[1], q4, q5 @ d18 = t20a, d29 = t27a + mbutterfly_h2 d26, d21, d6[2], d6[3], q4, q5 @ d26 = t21a, d21 = t26a + mbutterfly_h1 d22, d25, d7[0], d7[1], q4, q5 @ d22 = t22a, d25 = t25a + mbutterfly_h2 d30, d17, d7[2], d7[3], q4, q5 @ d30 = t23a, d17 = t24a + + butterfly d8, d24, d16, d24 @ d8 = t16, d24 = t17 + butterfly d9, d20, d28, d20 @ d9 = t19, d20 = t18 + butterfly d10, d26, d18, d26 @ d10 = t20, d26 = t21 + butterfly d11, d22, d30, d22 @ d11 = t23, d22 = t22 butterfly d28, d25, d17, d25 @ d28 = t24, d25 = t25 butterfly d30, d21, d29, d21 @ d30 = t27, d21 = t26 butterfly d29, d23, d31, d23 @ d29 = t31, d23 = t30 @@ -1284,45 +1270,38 @@ function idct32_odd_half endfunc function idct32_odd_quarter - movrel r12, idct_coeffs - add r12, r12, #32 - vld1.16 {q0-q1}, [r12,:128] - - vmull.s16 q2, d16, d0[0] - vmull.s16 q14, d19, d1[3] - vmull.s16 q15, d16, d0[1] - vmull.s16 q11, d17, d3[2] - vmull.s16 q3, d17, d3[3] - vmull.s16 q13, d19, d1[2] - vmull.s16 q10, d18, d2[0] - vmull.s16 q12, d18, d2[1] - - sub r12, r12, #32 - vld1.16 {q0}, [r12,:128] + vmull.s16 q4, d16, d4[0] + vmull.s16 q14, d19, d5[3] + vmull.s16 q15, d16, d4[1] + vmull.s16 q11, d17, d7[2] + vmull.s16 q5, d17, d7[3] + vmull.s16 q13, d19, d5[2] + vmull.s16 q10, d18, d6[0] + vmull.s16 q12, d18, d6[1] vneg.s32 q14, q14 - vneg.s32 q3, q3 + vneg.s32 q5, q5 - vrshrn.s32 d4, q2, #14 - vrshrn.s32 d5, q14, #14 + vrshrn.s32 d8, q4, #14 + vrshrn.s32 d9, q14, #14 vrshrn.s32 d29, q15, #14 vrshrn.s32 d28, q11, #14 - vrshrn.s32 d7, q3, #14 + vrshrn.s32 d11, q5, #14 vrshrn.s32 d31, q13, #14 - vrshrn.s32 d6, q10, #14 + vrshrn.s32 d10, q10, #14 vrshrn.s32 d30, q12, #14 - mbutterfly_l q8, q9, d29, d4, d0[3], d1[0] - mbutterfly_l q13, q10, d31, d5, d0[3], d1[0] + mbutterfly_l q8, q9, d29, d8, d0[3], d1[0] + mbutterfly_l q13, q10, d31, d9, d0[3], d1[0] vrshrn.s32 d23, q8, #14 vrshrn.s32 d24, q9, #14 vneg.s32 q10, q10 vrshrn.s32 d27, q13, #14 vrshrn.s32 d20, q10, #14 - mbutterfly_l q8, q9, d30, d6, d1[1], d1[2] + mbutterfly_l q8, q9, d30, d10, d1[1], d1[2] vrshrn.s32 d21, q8, #14 vrshrn.s32 d26, q9, #14 - mbutterfly_l q8, q9, d28, d7, d1[1], d1[2] + mbutterfly_l q8, q9, d28, d11, d1[1], d1[2] vrshrn.s32 d25, q8, #14 vneg.s32 q9, q9 vrshrn.s32 d22, q9, #14 @@ -1343,8 +1322,11 @@ endfunc function idct32_1d_4x32_pass1\suffix\()_neon push {lr} - movrel r12, idct_coeffs - vld1.16 {q0-q1}, [r12,:128] + @ idct16 clobbers q2-q3 (since it doesn't clobber q4-q7 at all + @ when doing the normal 16x16 idct), so move the idct32_odd coeffs + @ to q4-q5 + vmov q4, q2 + vmov q5, q3 @ Double stride of the input, since we only read every other line mov r12, #128 @@ -1372,6 +1354,11 @@ function idct32_1d_4x32_pass1\suffix\()_neon bl idct16\suffix + @ Move the idct32_odd coeffs back into q2-q3 for idct32_odd; + @ the constants for a vmul with a lane must be in q0-q3. + vmov q2, q4 + vmov q3, q5 + @ Do four 4x4 transposes. Originally, d16-d31 contain the @ 16 rows. Afterwards, d16-d19, d20-d23, d24-d27, d28-d31 @ contain the transposed 4x4 blocks. @@ -1407,24 +1394,24 @@ function idct32_1d_4x32_pass1\suffix\()_neon .endif add r2, r2, #64 - vmov.s16 d4, #0 + vmov.s16 d8, #0 @ d16 = IN(1), d17 = IN(3) ... d31 = IN(31) .ifb \suffix .irp i, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 vld1.16 {d\i}, [r2,:64] - vst1.16 {d4}, [r2,:64], r12 + vst1.16 {d8}, [r2,:64], r12 .endr .endif .ifc \suffix,_quarter .irp i, 16, 17, 18, 19 vld1.16 {d\i}, [r2,:64] - vst1.16 {d4}, [r2,:64], r12 + vst1.16 {d8}, [r2,:64], r12 .endr .endif .ifc \suffix,_half .irp i, 16, 17, 18, 19, 20, 21, 22, 23 vld1.16 {d\i}, [r2,:64] - vst1.16 {d4}, [r2,:64], r12 + vst1.16 {d8}, [r2,:64], r12 .endr .endif @@ -1437,15 +1424,15 @@ function idct32_1d_4x32_pass1\suffix\()_neon @ from the output. .macro store_rev a, b, c, d .irp i, \a, \b, \c, \d - vld1.16 {d4}, [r0,:64] - vadd.s16 d4, d4, d\i - vst1.16 {d4}, [r0,:64]! + vld1.16 {d8}, [r0,:64] + vadd.s16 d8, d8, d\i + vst1.16 {d8}, [r0,:64]! vrev64.16 d\i, d\i .endr .irp i, \d, \c, \b, \a - vld1.16 {d4}, [r0,:64] - vsub.s16 d4, d4, d\i - vst1.16 {d4}, [r0,:64]! + vld1.16 {d8}, [r0,:64] + vsub.s16 d8, d8, d\i + vst1.16 {d8}, [r0,:64]! .endr .endm @@ -1466,8 +1453,8 @@ endfunc @ r2 = src (temp buffer) function idct32_1d_4x32_pass2\suffix\()_neon push {lr} - movrel r12, idct_coeffs - vld1.16 {q0-q1}, [r12,:128] + vmov q4, q2 + vmov q5, q3 mov r12, #128 @ d16 = IN(0), d17 = IN(2) ... d31 = IN(30) @@ -1492,6 +1479,9 @@ function idct32_1d_4x32_pass2\suffix\()_neon bl idct16\suffix + vmov q2, q4 + vmov q3, q5 + .irp i, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 vst1.16 {d\i}, [r2,:64], r12 .endr @@ -1524,38 +1514,38 @@ function idct32_1d_4x32_pass2\suffix\()_neon mov r12, #128 .macro load_acc_store a, b, c, d, neg=0 - vld1.16 {d4}, [r2,:64], r12 - vld1.16 {d5}, [r2,:64], r12 + vld1.16 {d8}, [r2,:64], r12 + vld1.16 {d9}, [r2,:64], r12 .if \neg == 0 - vadd.s16 d4, d4, d\a - vld1.16 {d6}, [r2,:64], r12 - vadd.s16 d5, d5, d\b - vld1.16 {d7}, [r2,:64], r12 - vadd.s16 d6, d6, d\c - vadd.s16 d7, d7, d\d + vadd.s16 d8, d8, d\a + vld1.16 {d10}, [r2,:64], r12 + vadd.s16 d9, d9, d\b + vld1.16 {d11}, [r2,:64], r12 + vadd.s16 d10, d10, d\c + vadd.s16 d11, d11, d\d .else - vsub.s16 d4, d4, d\a - vld1.16 {d6}, [r2,:64], r12 - vsub.s16 d5, d5, d\b - vld1.16 {d7}, [r2,:64], r12 - vsub.s16 d6, d6, d\c - vsub.s16 d7, d7, d\d + vsub.s16 d8, d8, d\a + vld1.16 {d10}, [r2,:64], r12 + vsub.s16 d9, d9, d\b + vld1.16 {d11}, [r2,:64], r12 + vsub.s16 d10, d10, d\c + vsub.s16 d11, d11, d\d .endif - vld1.32 {d2[]}, [r0,:32], r1 - vld1.32 {d2[1]}, [r0,:32], r1 - vrshr.s16 q2, q2, #6 - vld1.32 {d3[]}, [r0,:32], r1 - vrshr.s16 q3, q3, #6 - vld1.32 {d3[1]}, [r0,:32], r1 + vld1.32 {d12[]}, [r0,:32], r1 + vld1.32 {d12[1]}, [r0,:32], r1 + vrshr.s16 q4, q4, #6 + vld1.32 {d13[]}, [r0,:32], r1 + vrshr.s16 q5, q5, #6 + vld1.32 {d13[1]}, [r0,:32], r1 sub r0, r0, r1, lsl #2 - vaddw.u8 q2, q2, d2 - vaddw.u8 q3, q3, d3 - vqmovun.s16 d4, q2 - vqmovun.s16 d5, q3 - vst1.32 {d4[0]}, [r0,:32], r1 - vst1.32 {d4[1]}, [r0,:32], r1 - vst1.32 {d5[0]}, [r0,:32], r1 - vst1.32 {d5[1]}, [r0,:32], r1 + vaddw.u8 q4, q4, d12 + vaddw.u8 q5, q5, d13 + vqmovun.s16 d8, q4 + vqmovun.s16 d9, q5 + vst1.32 {d8[0]}, [r0,:32], r1 + vst1.32 {d8[1]}, [r0,:32], r1 + vst1.32 {d9[0]}, [r0,:32], r1 + vst1.32 {d9[1]}, [r0,:32], r1 .endm load_acc_store 31, 30, 29, 28 load_acc_store 27, 26, 25, 24 @@ -1584,7 +1574,7 @@ function ff_vp9_idct_idct_32x32_add_neon, export=1 cmp r3, #1 beq idct32x32_dc_add_neon push {r4-r8,lr} - vpush {q4-q7} + vpush {q4-q6} movrel r8, min_eob_idct_idct_32 + 2 @ Align the stack, allocate a temp buffer @@ -1598,6 +1588,10 @@ A and r7, sp, #15 mov r5, r1 mov r6, r2 + movrel r12, idct_coeffs + vld1.16 {q0-q1}, [r12,:128]! + vld1.16 {q2-q3}, [r12,:128] + cmp r3, #34 ble idct32x32_quarter_add_neon cmp r3, #135 @@ -1636,7 +1630,7 @@ A and r7, sp, #15 .endr add sp, sp, r7 - vpop {q4-q7} + vpop {q4-q6} pop {r4-r8,pc} endfunc @@ -1668,7 +1662,7 @@ function idct32x32_quarter_add_neon .endr add sp, sp, r7 - vpop {q4-q7} + vpop {q4-q6} pop {r4-r8,pc} endfunc @@ -1706,6 +1700,6 @@ function idct32x32_half_add_neon .endr add sp, sp, r7 - vpop {q4-q7} + vpop {q4-q6} pop {r4-r8,pc} endfunc |