This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 65d4c5bbe21cfdbd3de79885465d292042c15081 Author: Martin Storsjö <[email protected]> AuthorDate: Tue Apr 7 12:15:20 2026 +0300 Commit: Martin Storsjö <[email protected]> CommitDate: Wed Apr 29 13:53:07 2026 +0300 arm: Reindent asm that used consistent but differing styles The qpel_filter macros in hevcdsp_qpel_neon.S have been manually tweaked to keep reasonable indentation of the comments. --- libavcodec/arm/fmtconvert_vfp.S | 58 +-- libavcodec/arm/h264qpel_neon.S | 12 +- libavcodec/arm/hevcdsp_deblock_neon.S | 650 +++++++++++++++++----------------- libavcodec/arm/hevcdsp_idct_neon.S | 92 ++--- libavcodec/arm/hevcdsp_qpel_neon.S | 330 ++++++++--------- libavcodec/arm/hevcdsp_sao_neon.S | 282 +++++++-------- libavcodec/arm/startcode_armv6.S | 318 ++++++++--------- libavcodec/arm/vp3dsp_neon.S | 612 ++++++++++++++++---------------- 8 files changed, 1177 insertions(+), 1177 deletions(-) diff --git a/libavcodec/arm/fmtconvert_vfp.S b/libavcodec/arm/fmtconvert_vfp.S index b14af454eb..404cae7149 100644 --- a/libavcodec/arm/fmtconvert_vfp.S +++ b/libavcodec/arm/fmtconvert_vfp.S @@ -28,25 +28,25 @@ */ @ void ff_int32_to_float_fmul_array8_vfp(FmtConvertContext *c, float *dst, const int32_t *src, const float *mul, int len) function ff_int32_to_float_fmul_array8_vfp, export=1 - push {lr} - ldr a1, [sp, #4] - subs lr, a1, #3*8 - bcc 50f @ too short to pipeline + push {lr} + ldr a1, [sp, #4] + subs lr, a1, #3*8 + bcc 50f @ too short to pipeline @ Now need to find (len / 8) % 3. The approximation @ x / 24 = (x * 0xAB) >> 12 @ is good for x < 4096, which is true for both AC3 and DCA. - mov a1, #0xAB - ldr ip, =0x03070000 @ RunFast mode, short vectors of length 8, stride 1 - mul a1, lr, a1 - vpush {s16-s31} - mov a1, a1, lsr #12 - add a1, a1, a1, lsl #1 - rsb a1, a1, lr, lsr #3 - cmp a1, #1 - fmrx a1, FPSCR - fmxr FPSCR, ip - beq 11f - blo 10f + mov a1, #0xAB + ldr ip, =0x03070000 @ RunFast mode, short vectors of length 8, stride 1 + mul a1, lr, a1 + vpush {s16-s31} + mov a1, a1, lsr #12 + add a1, a1, a1, lsl #1 + rsb a1, a1, lr, lsr #3 + cmp a1, #1 + fmrx a1, FPSCR + fmxr FPSCR, ip + beq 11f + blo 10f @ Array is (2 + multiple of 3) x 8 floats long @ drop through... vldmia a3!, {s16-s23} @@ -122,9 +122,9 @@ function ff_int32_to_float_fmul_array8_vfp, export=1 vstmia a2!, {s24-s27} vstmia a2!, {s28-s31} - fmxr FPSCR, a1 - vpop {s16-s31} - pop {pc} + fmxr FPSCR, a1 + vpop {s16-s31} + pop {pc} 10: @ Array is (multiple of 3) x 8 floats long vldmia a3!, {s8-s15} @@ -158,9 +158,9 @@ function ff_int32_to_float_fmul_array8_vfp, export=1 b 2b 50: - ldr lr, =0x03070000 @ RunFast mode, short vectors of length 8, stride 1 - fmrx ip, FPSCR - fmxr FPSCR, lr + ldr lr, =0x03070000 @ RunFast mode, short vectors of length 8, stride 1 + fmrx ip, FPSCR + fmxr FPSCR, lr 51: vldmia a3!, {s8-s15} vldmia a4!, {s0} @@ -178,8 +178,8 @@ function ff_int32_to_float_fmul_array8_vfp, export=1 vstmia a2!, {s12-s15} bne 51b - fmxr FPSCR, ip - pop {pc} + fmxr FPSCR, ip + pop {pc} endfunc /** @@ -195,9 +195,9 @@ VFP len .req a3 NOVFP tmp .req a3 NOVFP len .req a4 NOVFP vmov s0, a3 - ldr tmp, =0x03070000 @ RunFast mode, short vectors of length 8, stride 1 - fmrx ip, FPSCR - fmxr FPSCR, tmp + ldr tmp, =0x03070000 @ RunFast mode, short vectors of length 8, stride 1 + fmrx ip, FPSCR + fmxr FPSCR, tmp 1: vldmia a2!, {s8-s15} vcvt.f32.s32 s8, s8 @@ -214,8 +214,8 @@ NOVFP vmov s0, a3 vstmia a1!, {s12-s15} bne 1b - fmxr FPSCR, ip - bx lr + fmxr FPSCR, ip + bx lr endfunc .unreq tmp .unreq len diff --git a/libavcodec/arm/h264qpel_neon.S b/libavcodec/arm/h264qpel_neon.S index 99aeba925f..415fe6caa6 100644 --- a/libavcodec/arm/h264qpel_neon.S +++ b/libavcodec/arm/h264qpel_neon.S @@ -571,8 +571,8 @@ function \type\()_h264_qpel16_hv_lowpass_l2_neon endfunc .endm - h264_qpel16_hv put - h264_qpel16_hv avg + h264_qpel16_hv put + h264_qpel16_hv avg .macro h264_qpel8 type function ff_\type\()_h264_qpel8_mc10_neon, export=1 @@ -760,8 +760,8 @@ function ff_\type\()_h264_qpel8_mc33_neon, export=1 endfunc .endm - h264_qpel8 put - h264_qpel8 avg + h264_qpel8 put + h264_qpel8 avg .macro h264_qpel16 type function ff_\type\()_h264_qpel16_mc10_neon, export=1 @@ -942,5 +942,5 @@ function ff_\type\()_h264_qpel16_mc33_neon, export=1 endfunc .endm - h264_qpel16 put - h264_qpel16 avg + h264_qpel16 put + h264_qpel16 avg diff --git a/libavcodec/arm/hevcdsp_deblock_neon.S b/libavcodec/arm/hevcdsp_deblock_neon.S index 7cb7487ef6..0eae112bce 100644 --- a/libavcodec/arm/hevcdsp_deblock_neon.S +++ b/libavcodec/arm/hevcdsp_deblock_neon.S @@ -23,363 +23,363 @@ #include "neon.S" .macro hevc_loop_filter_chroma_start - ldr r12, [r2] - ldr r3, [r2, #4] - add r2, r3, r12 - cmp r2, #0 - it eq - bxeq lr + ldr r12, [r2] + ldr r3, [r2, #4] + add r2, r3, r12 + cmp r2, #0 + it eq + bxeq lr .endm .macro hevc_loop_filter_chroma_body - vsubl.u8 q3, d4, d2 - vsubl.u8 q11, d18, d19 - vshl.i16 q3, #2 - vadd.i16 q11, q3 - vdup.16 d0, r12 - vdup.16 d1, r3 - vrshr.s16 q11, q11, #3 - vneg.s16 q12, q0 - vmovl.u8 q2, d4 - vmin.s16 q11, q11, q0 - vmax.s16 q11, q11, q12 - vaddw.u8 q1, q11, d2 - vsub.i16 q2, q11 - vqmovun.s16 d2, q1 - vqmovun.s16 d4, q2 + vsubl.u8 q3, d4, d2 + vsubl.u8 q11, d18, d19 + vshl.i16 q3, #2 + vadd.i16 q11, q3 + vdup.16 d0, r12 + vdup.16 d1, r3 + vrshr.s16 q11, q11, #3 + vneg.s16 q12, q0 + vmovl.u8 q2, d4 + vmin.s16 q11, q11, q0 + vmax.s16 q11, q11, q12 + vaddw.u8 q1, q11, d2 + vsub.i16 q2, q11 + vqmovun.s16 d2, q1 + vqmovun.s16 d4, q2 .endm .macro hevc_loop_filter_luma_start - ldr r12, [r3] - ldr r3, [r3, #4] - lsl r3, #16 - orr r3, r12 - cmp r3, #0 - it eq - bxeq lr - lsr r3, #16 + ldr r12, [r3] + ldr r3, [r3, #4] + lsl r3, #16 + orr r3, r12 + cmp r3, #0 + it eq + bxeq lr + lsr r3, #16 .endm .macro hevc_loop_filter_luma_body - vmovl.u8 q8, d16 - vmovl.u8 q9, d18 - vmovl.u8 q10, d20 - vmovl.u8 q11, d22 - vmovl.u8 q12, d24 - vmovl.u8 q13, d26 - vmovl.u8 q14, d28 - vmovl.u8 q15, d30 - - vadd.i16 q7, q9, q11 - vadd.i16 q6, q14, q12 - vsub.i16 q7, q10 - vsub.i16 q6, q13 - vabd.s16 q7, q7, q10 - vabd.s16 q6, q6, q13 - - - vdup.16 q0, r2 - vmov q4, q7 - vmov q5, q6 - vdup.16 d4, r12 - vtrn.16 q7, q4 - vtrn.16 q6, q5 - - vshl.u64 q7, #32 - vshr.u64 q4, #32 - vshl.u64 q6, #32 - vshr.u64 q5, #32 - vshr.u64 q7, #32 - vshr.u64 q6, #32 - vshl.u64 q5, #32 - vshl.u64 q4, #32 - vorr q6, q5 - vorr q7, q4 - vdup.16 d5, r3 - vadd.i16 q5, q7, q6 - - vmov q4, q5 - vmov q3, q5 - vtrn.32 q3, q4 - - vadd.i16 q4, q3 - - vshl.s16 q5, q5, #1 - vcgt.s16 q3, q0, q4 - - vmovn.i16 d6, q3 - vshr.s16 q1, q0, #2 - vmovn.i16 d6, q3 - vcgt.s16 q5, q1, q5 - vmov r7, s12 - cmp r7, #0 - beq bypasswrite - - vpadd.i32 d0, d14, d12 - vpadd.i32 d1, d15, d13 - vmov q4, q2 - vshl.s16 q2, #2 - vshr.s16 q1, q1, #1 - vrhadd.s16 q2, q4 - - vabd.s16 q7, q8, q11 - vaba.s16 q7, q15, q12 - - vmovn.i32 d0, q0 - vmov r5, r6, s0, s1 - vcgt.s16 q6, q1, q7 - vand q5, q5, q6 - vabd.s16 q7, q11, q12 - vcgt.s16 q6, q2, q7 - vand q5, q5, q6 - - vmov q2, q5 - vtrn.s16 q5, q2 - vshr.u64 q2, #32 - vshl.u64 q5, #32 - vshl.u64 q2, #32 - vshr.u64 q5, #32 - vorr q5, q2 - - vmov q2, q5 - vshl.i16 q7, q4, #1 - vtrn.32 q2, q5 - vand q5, q2 - vneg.s16 q6, q7 - vmovn.i16 d4, q5 - vmovn.i16 d4, q2 - vmov r8, s8 - - and r9, r8, r7 - cmp r9, #0 - beq 1f - - vadd.i16 q2, q11, q12 - vadd.i16 q4, q9, q8 - vadd.i16 q1, q2, q10 - vdup.16 d10, r9 - vadd.i16 q0, q1, q9 - vshl.i16 q4, #1 - lsr r9, #16 - vadd.i16 q1, q0 - vrshr.s16 q3, q0, #2 - vadd.i16 q1, q13 - vadd.i16 q4, q0 - vsub.i16 q3, q10 - vrshr.s16 q1, #3 - vrshr.s16 q4, #3 - vmax.s16 q3, q6 - vsub.i16 q1, q11 - vsub.i16 q4, q9 - vmin.s16 q3, q7 - vmax.s16 q4, q6 - vmax.s16 q1, q6 - vadd.i16 q3, q10 - vmin.s16 q4, q7 - vmin.s16 q1, q7 - vdup.16 d11, r9 - vadd.i16 q4, q9 - vadd.i16 q1, q11 - vbit q9, q4, q5 - vadd.i16 q4, q2, q13 - vbit q11, q1, q5 - vadd.i16 q0, q4, q14 - vadd.i16 q2, q15, q14 - vadd.i16 q4, q0 - - vshl.i16 q2, #1 - vadd.i16 q4, q10 - vbit q10, q3, q5 - vrshr.s16 q4, #3 - vadd.i16 q2, q0 - vrshr.s16 q3, q0, #2 - vsub.i16 q4, q12 - vrshr.s16 q2, #3 - vsub.i16 q3, q13 - vmax.s16 q4, q6 - vsub.i16 q2, q14 - vmax.s16 q3, q6 - vmin.s16 q4, q7 - vmax.s16 q2, q6 - vmin.s16 q3, q7 - vadd.i16 q4, q12 - vmin.s16 q2, q7 - vadd.i16 q3, q13 - vbit q12, q4, q5 - vadd.i16 q2, q14 - vbit q13, q3, q5 - vbit q14, q2, q5 + vmovl.u8 q8, d16 + vmovl.u8 q9, d18 + vmovl.u8 q10, d20 + vmovl.u8 q11, d22 + vmovl.u8 q12, d24 + vmovl.u8 q13, d26 + vmovl.u8 q14, d28 + vmovl.u8 q15, d30 + + vadd.i16 q7, q9, q11 + vadd.i16 q6, q14, q12 + vsub.i16 q7, q10 + vsub.i16 q6, q13 + vabd.s16 q7, q7, q10 + vabd.s16 q6, q6, q13 + + + vdup.16 q0, r2 + vmov q4, q7 + vmov q5, q6 + vdup.16 d4, r12 + vtrn.16 q7, q4 + vtrn.16 q6, q5 + + vshl.u64 q7, #32 + vshr.u64 q4, #32 + vshl.u64 q6, #32 + vshr.u64 q5, #32 + vshr.u64 q7, #32 + vshr.u64 q6, #32 + vshl.u64 q5, #32 + vshl.u64 q4, #32 + vorr q6, q5 + vorr q7, q4 + vdup.16 d5, r3 + vadd.i16 q5, q7, q6 + + vmov q4, q5 + vmov q3, q5 + vtrn.32 q3, q4 + + vadd.i16 q4, q3 + + vshl.s16 q5, q5, #1 + vcgt.s16 q3, q0, q4 + + vmovn.i16 d6, q3 + vshr.s16 q1, q0, #2 + vmovn.i16 d6, q3 + vcgt.s16 q5, q1, q5 + vmov r7, s12 + cmp r7, #0 + beq bypasswrite + + vpadd.i32 d0, d14, d12 + vpadd.i32 d1, d15, d13 + vmov q4, q2 + vshl.s16 q2, #2 + vshr.s16 q1, q1, #1 + vrhadd.s16 q2, q4 + + vabd.s16 q7, q8, q11 + vaba.s16 q7, q15, q12 + + vmovn.i32 d0, q0 + vmov r5, r6, s0, s1 + vcgt.s16 q6, q1, q7 + vand q5, q5, q6 + vabd.s16 q7, q11, q12 + vcgt.s16 q6, q2, q7 + vand q5, q5, q6 + + vmov q2, q5 + vtrn.s16 q5, q2 + vshr.u64 q2, #32 + vshl.u64 q5, #32 + vshl.u64 q2, #32 + vshr.u64 q5, #32 + vorr q5, q2 + + vmov q2, q5 + vshl.i16 q7, q4, #1 + vtrn.32 q2, q5 + vand q5, q2 + vneg.s16 q6, q7 + vmovn.i16 d4, q5 + vmovn.i16 d4, q2 + vmov r8, s8 + + and r9, r8, r7 + cmp r9, #0 + beq 1f + + vadd.i16 q2, q11, q12 + vadd.i16 q4, q9, q8 + vadd.i16 q1, q2, q10 + vdup.16 d10, r9 + vadd.i16 q0, q1, q9 + vshl.i16 q4, #1 + lsr r9, #16 + vadd.i16 q1, q0 + vrshr.s16 q3, q0, #2 + vadd.i16 q1, q13 + vadd.i16 q4, q0 + vsub.i16 q3, q10 + vrshr.s16 q1, #3 + vrshr.s16 q4, #3 + vmax.s16 q3, q6 + vsub.i16 q1, q11 + vsub.i16 q4, q9 + vmin.s16 q3, q7 + vmax.s16 q4, q6 + vmax.s16 q1, q6 + vadd.i16 q3, q10 + vmin.s16 q4, q7 + vmin.s16 q1, q7 + vdup.16 d11, r9 + vadd.i16 q4, q9 + vadd.i16 q1, q11 + vbit q9, q4, q5 + vadd.i16 q4, q2, q13 + vbit q11, q1, q5 + vadd.i16 q0, q4, q14 + vadd.i16 q2, q15, q14 + vadd.i16 q4, q0 + + vshl.i16 q2, #1 + vadd.i16 q4, q10 + vbit q10, q3, q5 + vrshr.s16 q4, #3 + vadd.i16 q2, q0 + vrshr.s16 q3, q0, #2 + vsub.i16 q4, q12 + vrshr.s16 q2, #3 + vsub.i16 q3, q13 + vmax.s16 q4, q6 + vsub.i16 q2, q14 + vmax.s16 q3, q6 + vmin.s16 q4, q7 + vmax.s16 q2, q6 + vmin.s16 q3, q7 + vadd.i16 q4, q12 + vmin.s16 q2, q7 + vadd.i16 q3, q13 + vbit q12, q4, q5 + vadd.i16 q2, q14 + vbit q13, q3, q5 + vbit q14, q2, q5 1: - mvn r8, r8 - and r9, r8, r7 - cmp r9, #0 - beq 2f - - vdup.16 q4, r2 - - vdup.16 d10, r9 - lsr r9, #16 - vmov q1, q4 - vdup.16 d11, r9 - vshr.s16 q1, #1 - vsub.i16 q2, q12, q11 - vadd.i16 q4, q1 - vshl.s16 q0, q2, #3 - vshr.s16 q4, #3 - vadd.i16 q2, q0 - vsub.i16 q0, q13, q10 - vsub.i16 q2, q0 - vshl.i16 q0, q0, #1 - vsub.i16 q2, q0 - vshl.s16 q1, q7, 2 - vrshr.s16 q2, q2, #4 - vadd.i16 q1, q7 - vabs.s16 q3, q2 - vshr.s16 q6, q6, #1 - vcgt.s16 q1, q1, q3 - vand q5, q1 - vshr.s16 q7, q7, #1 - vmax.s16 q2, q2, q6 - vmin.s16 q2, q2, q7 - - vshr.s16 q7, q7, #1 - vrhadd.s16 q3, q9, q11 - vneg.s16 q6, q7 - vsub.s16 q3, q10 - vdup.16 d2, r5 - vhadd.s16 q3, q2 - vdup.16 d3, r6 - vmax.s16 q3, q3, q6 - vcgt.s16 q1, q4, q1 - vmin.s16 q3, q3, q7 - vand q1, q5 - vadd.i16 q3, q10 - lsr r5, #16 - lsr r6, #16 - vbit q10, q3, q1 - - vrhadd.s16 q3, q14, q12 - vdup.16 d2, r5 - vsub.s16 q3, q13 - vdup.16 d3, r6 - vhsub.s16 q3, q2 - vcgt.s16 q1, q4, q1 - vmax.s16 q3, q3, q6 - vand q1, q5 - vmin.s16 q3, q3, q7 - vadd.i16 q3, q13 - vbit q13, q3, q1 - vadd.i16 q0, q11, q2 - vsub.i16 q4, q12, q2 - vbit q11, q0, q5 - vbit q12, q4, q5 + mvn r8, r8 + and r9, r8, r7 + cmp r9, #0 + beq 2f + + vdup.16 q4, r2 + + vdup.16 d10, r9 + lsr r9, #16 + vmov q1, q4 + vdup.16 d11, r9 + vshr.s16 q1, #1 + vsub.i16 q2, q12, q11 + vadd.i16 q4, q1 + vshl.s16 q0, q2, #3 + vshr.s16 q4, #3 + vadd.i16 q2, q0 + vsub.i16 q0, q13, q10 + vsub.i16 q2, q0 + vshl.i16 q0, q0, #1 + vsub.i16 q2, q0 + vshl.s16 q1, q7, 2 + vrshr.s16 q2, q2, #4 + vadd.i16 q1, q7 + vabs.s16 q3, q2 + vshr.s16 q6, q6, #1 + vcgt.s16 q1, q1, q3 + vand q5, q1 + vshr.s16 q7, q7, #1 + vmax.s16 q2, q2, q6 + vmin.s16 q2, q2, q7 + + vshr.s16 q7, q7, #1 + vrhadd.s16 q3, q9, q11 + vneg.s16 q6, q7 + vsub.s16 q3, q10 + vdup.16 d2, r5 + vhadd.s16 q3, q2 + vdup.16 d3, r6 + vmax.s16 q3, q3, q6 + vcgt.s16 q1, q4, q1 + vmin.s16 q3, q3, q7 + vand q1, q5 + vadd.i16 q3, q10 + lsr r5, #16 + lsr r6, #16 + vbit q10, q3, q1 + + vrhadd.s16 q3, q14, q12 + vdup.16 d2, r5 + vsub.s16 q3, q13 + vdup.16 d3, r6 + vhsub.s16 q3, q2 + vcgt.s16 q1, q4, q1 + vmax.s16 q3, q3, q6 + vand q1, q5 + vmin.s16 q3, q3, q7 + vadd.i16 q3, q13 + vbit q13, q3, q1 + vadd.i16 q0, q11, q2 + vsub.i16 q4, q12, q2 + vbit q11, q0, q5 + vbit q12, q4, q5 2: - vqmovun.s16 d16, q8 - vqmovun.s16 d18, q9 - vqmovun.s16 d20, q10 - vqmovun.s16 d22, q11 - vqmovun.s16 d24, q12 - vqmovun.s16 d26, q13 - vqmovun.s16 d28, q14 - vqmovun.s16 d30, q15 + vqmovun.s16 d16, q8 + vqmovun.s16 d18, q9 + vqmovun.s16 d20, q10 + vqmovun.s16 d22, q11 + vqmovun.s16 d24, q12 + vqmovun.s16 d26, q13 + vqmovun.s16 d28, q14 + vqmovun.s16 d30, q15 .endm function ff_hevc_v_loop_filter_luma_neon, export=1 hevc_loop_filter_luma_start - push {r5-r11} - vpush {d8-d15} - sub r0, #4 - vld1.8 {d16}, [r0], r1 - vld1.8 {d18}, [r0], r1 - vld1.8 {d20}, [r0], r1 - vld1.8 {d22}, [r0], r1 - vld1.8 {d24}, [r0], r1 - vld1.8 {d26}, [r0], r1 - vld1.8 {d28}, [r0], r1 - vld1.8 {d30}, [r0], r1 - sub r0, r0, r1, lsl #3 - transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30 + push {r5-r11} + vpush {d8-d15} + sub r0, #4 + vld1.8 {d16}, [r0], r1 + vld1.8 {d18}, [r0], r1 + vld1.8 {d20}, [r0], r1 + vld1.8 {d22}, [r0], r1 + vld1.8 {d24}, [r0], r1 + vld1.8 {d26}, [r0], r1 + vld1.8 {d28}, [r0], r1 + vld1.8 {d30}, [r0], r1 + sub r0, r0, r1, lsl #3 + transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30 hevc_loop_filter_luma_body - transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30 - vst1.8 {d16}, [r0], r1 - vst1.8 {d18}, [r0], r1 - vst1.8 {d20}, [r0], r1 - vst1.8 {d22}, [r0], r1 - vst1.8 {d24}, [r0], r1 - vst1.8 {d26}, [r0], r1 - vst1.8 {d28}, [r0], r1 - vst1.8 {d30}, [r0] - vpop {d8-d15} - pop {r5-r11} - bx lr + transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30 + vst1.8 {d16}, [r0], r1 + vst1.8 {d18}, [r0], r1 + vst1.8 {d20}, [r0], r1 + vst1.8 {d22}, [r0], r1 + vst1.8 {d24}, [r0], r1 + vst1.8 {d26}, [r0], r1 + vst1.8 {d28}, [r0], r1 + vst1.8 {d30}, [r0] + vpop {d8-d15} + pop {r5-r11} + bx lr endfunc function ff_hevc_h_loop_filter_luma_neon, export=1 hevc_loop_filter_luma_start - push {r5-r11} - vpush {d8-d15} - sub r0, r0, r1, lsl #2 - vld1.8 {d16}, [r0], r1 - vld1.8 {d18}, [r0], r1 - vld1.8 {d20}, [r0], r1 - vld1.8 {d22}, [r0], r1 - vld1.8 {d24}, [r0], r1 - vld1.8 {d26}, [r0], r1 - vld1.8 {d28}, [r0], r1 - vld1.8 {d30}, [r0], r1 - sub r0, r0, r1, lsl #3 - add r0, r1 + push {r5-r11} + vpush {d8-d15} + sub r0, r0, r1, lsl #2 + vld1.8 {d16}, [r0], r1 + vld1.8 {d18}, [r0], r1 + vld1.8 {d20}, [r0], r1 + vld1.8 {d22}, [r0], r1 + vld1.8 {d24}, [r0], r1 + vld1.8 {d26}, [r0], r1 + vld1.8 {d28}, [r0], r1 + vld1.8 {d30}, [r0], r1 + sub r0, r0, r1, lsl #3 + add r0, r1 hevc_loop_filter_luma_body - vst1.8 {d18}, [r0], r1 - vst1.8 {d20}, [r0], r1 - vst1.8 {d22}, [r0], r1 - vst1.8 {d24}, [r0], r1 - vst1.8 {d26}, [r0], r1 - vst1.8 {d28}, [r0] + vst1.8 {d18}, [r0], r1 + vst1.8 {d20}, [r0], r1 + vst1.8 {d22}, [r0], r1 + vst1.8 {d24}, [r0], r1 + vst1.8 {d26}, [r0], r1 + vst1.8 {d28}, [r0] bypasswrite: - vpop {d8-d15} - pop {r5-r11} - bx lr + vpop {d8-d15} + pop {r5-r11} + bx lr endfunc function ff_hevc_v_loop_filter_chroma_neon, export=1 hevc_loop_filter_chroma_start - sub r0, #4 - vld1.8 {d16}, [r0], r1 - vld1.8 {d17}, [r0], r1 - vld1.8 {d18}, [r0], r1 - vld1.8 {d2}, [r0], r1 - vld1.8 {d4}, [r0], r1 - vld1.8 {d19}, [r0], r1 - vld1.8 {d20}, [r0], r1 - vld1.8 {d21}, [r0], r1 - sub r0, r0, r1, lsl #3 - transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21 + sub r0, #4 + vld1.8 {d16}, [r0], r1 + vld1.8 {d17}, [r0], r1 + vld1.8 {d18}, [r0], r1 + vld1.8 {d2}, [r0], r1 + vld1.8 {d4}, [r0], r1 + vld1.8 {d19}, [r0], r1 + vld1.8 {d20}, [r0], r1 + vld1.8 {d21}, [r0], r1 + sub r0, r0, r1, lsl #3 + transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21 hevc_loop_filter_chroma_body - transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21 - vst1.8 {d16}, [r0], r1 - vst1.8 {d17}, [r0], r1 - vst1.8 {d18}, [r0], r1 - vst1.8 {d2}, [r0], r1 - vst1.8 {d4}, [r0], r1 - vst1.8 {d19}, [r0], r1 - vst1.8 {d20}, [r0], r1 - vst1.8 {d21}, [r0] - bx lr + transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21 + vst1.8 {d16}, [r0], r1 + vst1.8 {d17}, [r0], r1 + vst1.8 {d18}, [r0], r1 + vst1.8 {d2}, [r0], r1 + vst1.8 {d4}, [r0], r1 + vst1.8 {d19}, [r0], r1 + vst1.8 {d20}, [r0], r1 + vst1.8 {d21}, [r0] + bx lr endfunc function ff_hevc_h_loop_filter_chroma_neon, export=1 hevc_loop_filter_chroma_start - sub r0, r0, r1, lsl #1 - vld1.8 {d18}, [r0], r1 - vld1.8 {d2}, [r0], r1 - vld1.8 {d4}, [r0], r1 - vld1.8 {d19}, [r0] - sub r0, r0, r1, lsl #1 + sub r0, r0, r1, lsl #1 + vld1.8 {d18}, [r0], r1 + vld1.8 {d2}, [r0], r1 + vld1.8 {d4}, [r0], r1 + vld1.8 {d19}, [r0] + sub r0, r0, r1, lsl #1 hevc_loop_filter_chroma_body - vst1.8 {d2}, [r0], r1 - vst1.8 {d4}, [r0] - bx lr + vst1.8 {d2}, [r0], r1 + vst1.8 {d4}, [r0] + bx lr endfunc diff --git a/libavcodec/arm/hevcdsp_idct_neon.S b/libavcodec/arm/hevcdsp_idct_neon.S index 28cd4a570f..55df6fa8bb 100644 --- a/libavcodec/arm/hevcdsp_idct_neon.S +++ b/libavcodec/arm/hevcdsp_idct_neon.S @@ -965,59 +965,59 @@ idct_32x32_dc 10 /* uses registers q2 - q9 for temp values */ /* TODO: reorder */ .macro tr4_luma_shift r0, r1, r2, r3, shift - vaddl.s16 q5, \r0, \r2 // c0 = src0 + src2 - vaddl.s16 q2, \r2, \r3 // c1 = src2 + src3 - vsubl.s16 q4, \r0, \r3 // c2 = src0 - src3 - vmull.s16 q6, \r1, d0[0] // c3 = 74 * src1 + vaddl.s16 q5, \r0, \r2 // c0 = src0 + src2 + vaddl.s16 q2, \r2, \r3 // c1 = src2 + src3 + vsubl.s16 q4, \r0, \r3 // c2 = src0 - src3 + vmull.s16 q6, \r1, d0[0] // c3 = 74 * src1 - vaddl.s16 q7, \r0, \r3 // src0 + src3 - vsubw.s16 q7, q7, \r2 // src0 - src2 + src3 - vmul.s32 q7, q7, d0[0] // dst2 = 74 * (src0 - src2 + src3) + vaddl.s16 q7, \r0, \r3 // src0 + src3 + vsubw.s16 q7, q7, \r2 // src0 - src2 + src3 + vmul.s32 q7, q7, d0[0] // dst2 = 74 * (src0 - src2 + src3) - vmul.s32 q8, q5, d0[1] // 29 * c0 - vmul.s32 q9, q2, d1[0] // 55 * c1 - vadd.s32 q8, q9 // 29 * c0 + 55 * c1 - vadd.s32 q8, q6 // dst0 = 29 * c0 + 55 * c1 + c3 + vmul.s32 q8, q5, d0[1] // 29 * c0 + vmul.s32 q9, q2, d1[0] // 55 * c1 + vadd.s32 q8, q9 // 29 * c0 + 55 * c1 + vadd.s32 q8, q6 // dst0 = 29 * c0 + 55 * c1 + c3 - vmul.s32 q2, q2, d0[1] // 29 * c1 - vmul.s32 q9, q4, d1[0] // 55 * c2 - vsub.s32 q9, q2 // 55 * c2 - 29 * c1 - vadd.s32 q9, q6 // dst1 = 55 * c2 - 29 * c1 + c3 + vmul.s32 q2, q2, d0[1] // 29 * c1 + vmul.s32 q9, q4, d1[0] // 55 * c2 + vsub.s32 q9, q2 // 55 * c2 - 29 * c1 + vadd.s32 q9, q6 // dst1 = 55 * c2 - 29 * c1 + c3 - vmul.s32 q5, q5, d1[0] // 55 * c0 - vmul.s32 q4, q4, d0[1] // 29 * c2 - vadd.s32 q5, q4 // 55 * c0 + 29 * c2 - vsub.s32 q5, q6 // dst3 = 55 * c0 + 29 * c2 - c3 + vmul.s32 q5, q5, d1[0] // 55 * c0 + vmul.s32 q4, q4, d0[1] // 29 * c2 + vadd.s32 q5, q4 // 55 * c0 + 29 * c2 + vsub.s32 q5, q6 // dst3 = 55 * c0 + 29 * c2 - c3 - vqrshrn.s32 \r0, q8, \shift - vqrshrn.s32 \r1, q9, \shift - vqrshrn.s32 \r2, q7, \shift - vqrshrn.s32 \r3, q5, \shift + vqrshrn.s32 \r0, q8, \shift + vqrshrn.s32 \r1, q9, \shift + vqrshrn.s32 \r2, q7, \shift + vqrshrn.s32 \r3, q5, \shift .endm .ltorg function ff_hevc_transform_luma_4x4_neon_8, export=1 - vpush {d8-d15} - vld1.16 {q14, q15}, [r0] // coeffs - ldr r3, =0x4a // 74 - vmov.32 d0[0], r3 - ldr r3, =0x1d // 29 - vmov.32 d0[1], r3 - ldr r3, =0x37 // 55 - vmov.32 d1[0], r3 - - tr4_luma_shift d28, d29, d30, d31, #7 - - vtrn.16 d28, d29 - vtrn.16 d30, d31 - vtrn.32 q14, q15 - - tr4_luma_shift d28, d29, d30, d31, #12 - - vtrn.16 d28, d29 - vtrn.16 d30, d31 - vtrn.32 q14, q15 - vst1.16 {q14, q15}, [r0] - vpop {d8-d15} - bx lr + vpush {d8-d15} + vld1.16 {q14, q15}, [r0] // coeffs + ldr r3, =0x4a // 74 + vmov.32 d0[0], r3 + ldr r3, =0x1d // 29 + vmov.32 d0[1], r3 + ldr r3, =0x37 // 55 + vmov.32 d1[0], r3 + + tr4_luma_shift d28, d29, d30, d31, #7 + + vtrn.16 d28, d29 + vtrn.16 d30, d31 + vtrn.32 q14, q15 + + tr4_luma_shift d28, d29, d30, d31, #12 + + vtrn.16 d28, d29 + vtrn.16 d30, d31 + vtrn.32 q14, q15 + vst1.16 {q14, q15}, [r0] + vpop {d8-d15} + bx lr endfunc diff --git a/libavcodec/arm/hevcdsp_qpel_neon.S b/libavcodec/arm/hevcdsp_qpel_neon.S index caa6efa766..0e92ce57be 100644 --- a/libavcodec/arm/hevcdsp_qpel_neon.S +++ b/libavcodec/arm/hevcdsp_qpel_neon.S @@ -24,196 +24,196 @@ #define MAX_PB_SIZE #64 .macro regshuffle_d8 - vmov d16, d17 - vmov d17, d18 - vmov d18, d19 - vmov d19, d20 - vmov d20, d21 - vmov d21, d22 - vmov d22, d23 + vmov d16, d17 + vmov d17, d18 + vmov d18, d19 + vmov d19, d20 + vmov d20, d21 + vmov d21, d22 + vmov d22, d23 .endm .macro regshuffle_q8 - vmov q0, q1 - vmov q1, q2 - vmov q2, q3 - vmov q3, q4 - vmov q4, q5 - vmov q5, q6 - vmov q6, q7 + vmov q0, q1 + vmov q1, q2 + vmov q2, q3 + vmov q3, q4 + vmov q4, q5 + vmov q5, q6 + vmov q6, q7 .endm .macro vextin8 - pld [r2] - vld1.8 {q11}, [r2], r3 - vext.8 d16, d22, d23, #1 - vext.8 d17, d22, d23, #2 - vext.8 d18, d22, d23, #3 - vext.8 d19, d22, d23, #4 - vext.8 d20, d22, d23, #5 - vext.8 d21, d22, d23, #6 - vext.8 d22, d22, d23, #7 + pld [r2] + vld1.8 {q11}, [r2], r3 + vext.8 d16, d22, d23, #1 + vext.8 d17, d22, d23, #2 + vext.8 d18, d22, d23, #3 + vext.8 d19, d22, d23, #4 + vext.8 d20, d22, d23, #5 + vext.8 d21, d22, d23, #6 + vext.8 d22, d22, d23, #7 .endm .macro loadin8 - pld [r2] - vld1.8 {d16}, [r2], r3 - pld [r2] - vld1.8 {d17}, [r2], r3 - pld [r2] - vld1.8 {d18}, [r2], r3 - pld [r2] - vld1.8 {d19}, [r2], r3 - pld [r2] - vld1.8 {d20}, [r2], r3 - pld [r2] - vld1.8 {d21}, [r2], r3 - pld [r2] - vld1.8 {d22}, [r2], r3 - pld [r2] - vld1.8 {d23}, [r2], r3 + pld [r2] + vld1.8 {d16}, [r2], r3 + pld [r2] + vld1.8 {d17}, [r2], r3 + pld [r2] + vld1.8 {d18}, [r2], r3 + pld [r2] + vld1.8 {d19}, [r2], r3 + pld [r2] + vld1.8 {d20}, [r2], r3 + pld [r2] + vld1.8 {d21}, [r2], r3 + pld [r2] + vld1.8 {d22}, [r2], r3 + pld [r2] + vld1.8 {d23}, [r2], r3 .endm .macro qpel_filter_1_32b - vmov.i16 d16, #58 - vmov.i16 d17, #10 - vmull.s16 q9, d6, d16 // 58 * d0 - vmull.s16 q10, d7, d16 // 58 * d1 - vmov.i16 d16, #17 - vmull.s16 q11, d4, d17 // 10 * c0 - vmull.s16 q12, d5, d17 // 10 * c1 - vmov.i16 d17, #5 - vmull.s16 q13, d8, d16 // 17 * e0 - vmull.s16 q14, d9, d16 // 17 * e1 - vmull.s16 q15, d10, d17 // 5 * f0 - vmull.s16 q8, d11, d17 // 5 * f1 - vsub.s32 q9, q11 // 58 * d0 - 10 * c0 - vsub.s32 q10, q12 // 58 * d1 - 10 * c1 - vshll.s16 q11, d2, #2 // 4 * b0 - vshll.s16 q12, d3, #2 // 4 * b1 - vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 - vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 - vsubl.s16 q13, d12, d0 // g0 - a0 - vsubl.s16 q14, d13, d1 // g1 - a1 - vadd.s32 q9, q11 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 - vadd.s32 q10, q12 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 - vsub.s32 q13, q15 // g0 - a0 - 5 * f0 - vsub.s32 q14, q8 // g1 - a1 - 5 * f1 - vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0 - vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1 - vqshrn.s32 d16, q9, #6 - vqshrn.s32 d17, q10, #6 + vmov.i16 d16, #58 + vmov.i16 d17, #10 + vmull.s16 q9, d6, d16 // 58 * d0 + vmull.s16 q10, d7, d16 // 58 * d1 + vmov.i16 d16, #17 + vmull.s16 q11, d4, d17 // 10 * c0 + vmull.s16 q12, d5, d17 // 10 * c1 + vmov.i16 d17, #5 + vmull.s16 q13, d8, d16 // 17 * e0 + vmull.s16 q14, d9, d16 // 17 * e1 + vmull.s16 q15, d10, d17 // 5 * f0 + vmull.s16 q8, d11, d17 // 5 * f1 + vsub.s32 q9, q11 // 58 * d0 - 10 * c0 + vsub.s32 q10, q12 // 58 * d1 - 10 * c1 + vshll.s16 q11, d2, #2 // 4 * b0 + vshll.s16 q12, d3, #2 // 4 * b1 + vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + vsubl.s16 q13, d12, d0 // g0 - a0 + vsubl.s16 q14, d13, d1 // g1 - a1 + vadd.s32 q9, q11 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + vadd.s32 q10, q12 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + vsub.s32 q13, q15 // g0 - a0 - 5 * f0 + vsub.s32 q14, q8 // g1 - a1 - 5 * f1 + vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0 + vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1 + vqshrn.s32 d16, q9, #6 + vqshrn.s32 d17, q10, #6 .endm // input q0 - q7 // output q8 .macro qpel_filter_2_32b - vmov.i32 q8, #11 - vaddl.s16 q9, d6, d8 // d0 + e0 - vaddl.s16 q10, d7, d9 // d1 + e1 - vaddl.s16 q11, d4, d10 // c0 + f0 - vaddl.s16 q12, d5, d11 // c1 + f1 - vmul.s32 q11, q8 // 11 * (c0 + f0) - vmul.s32 q12, q8 // 11 * (c1 + f1) - vmov.i32 q8, #40 - vaddl.s16 q15, d2, d12 // b0 + g0 - vmul.s32 q9, q8 // 40 * (d0 + e0) - vmul.s32 q10, q8 // 40 * (d1 + e1) - vaddl.s16 q8, d3, d13 // b1 + g1 - vaddl.s16 q13, d0, d14 // a0 + h0 - vaddl.s16 q14, d1, d15 // a1 + h1 - vshl.s32 q15, #2 // 4*(b0+g0) - vshl.s32 q8, #2 // 4*(b1+g1) - vadd.s32 q11, q13 // 11 * (c0 + f0) + a0 + h0 - vadd.s32 q12, q14 // 11 * (c1 + f1) + a1 + h1 - vadd.s32 q9, q15 // 40 * (d0 + e0) + 4*(b0+g0) - vadd.s32 q10, q8 // 40 * (d1 + e1) + 4*(b1+g1) - vsub.s32 q9, q11 // 40 * (d0 + e0) + 4*(b0+g0) - (11 * (c0 + f0) + a0 + h0) - vsub.s32 q10, q12 // 40 * (d1 + e1) + 4*(b1+g1) - (11 * (c1 + f1) + a1 + h1) - vqshrn.s32 d16, q9, #6 - vqshrn.s32 d17, q10, #6 + vmov.i32 q8, #11 + vaddl.s16 q9, d6, d8 // d0 + e0 + vaddl.s16 q10, d7, d9 // d1 + e1 + vaddl.s16 q11, d4, d10 // c0 + f0 + vaddl.s16 q12, d5, d11 // c1 + f1 + vmul.s32 q11, q8 // 11 * (c0 + f0) + vmul.s32 q12, q8 // 11 * (c1 + f1) + vmov.i32 q8, #40 + vaddl.s16 q15, d2, d12 // b0 + g0 + vmul.s32 q9, q8 // 40 * (d0 + e0) + vmul.s32 q10, q8 // 40 * (d1 + e1) + vaddl.s16 q8, d3, d13 // b1 + g1 + vaddl.s16 q13, d0, d14 // a0 + h0 + vaddl.s16 q14, d1, d15 // a1 + h1 + vshl.s32 q15, #2 // 4*(b0+g0) + vshl.s32 q8, #2 // 4*(b1+g1) + vadd.s32 q11, q13 // 11 * (c0 + f0) + a0 + h0 + vadd.s32 q12, q14 // 11 * (c1 + f1) + a1 + h1 + vadd.s32 q9, q15 // 40 * (d0 + e0) + 4*(b0+g0) + vadd.s32 q10, q8 // 40 * (d1 + e1) + 4*(b1+g1) + vsub.s32 q9, q11 // 40 * (d0 + e0) + 4*(b0+g0) - (11 * (c0 + f0) + a0 + h0) + vsub.s32 q10, q12 // 40 * (d1 + e1) + 4*(b1+g1) - (11 * (c1 + f1) + a1 + h1) + vqshrn.s32 d16, q9, #6 + vqshrn.s32 d17, q10, #6 .endm .macro qpel_filter_3_32b - vmov.i16 d16, #58 - vmov.i16 d17, #10 - vmull.s16 q9, d8, d16 // 58 * d0 - vmull.s16 q10, d9, d16 // 58 * d1 - vmov.i16 d16, #17 - vmull.s16 q11, d10, d17 // 10 * c0 - vmull.s16 q12, d11, d17 // 10 * c1 - vmov.i16 d17, #5 - vmull.s16 q13, d6, d16 // 17 * e0 - vmull.s16 q14, d7, d16 // 17 * e1 - vmull.s16 q15, d4, d17 // 5 * f0 - vmull.s16 q8, d5, d17 // 5 * f1 - vsub.s32 q9, q11 // 58 * d0 - 10 * c0 - vsub.s32 q10, q12 // 58 * d1 - 10 * c1 - vshll.s16 q11, d12, #2 // 4 * b0 - vshll.s16 q12, d13, #2 // 4 * b1 - vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 - vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 - vsubl.s16 q13, d2, d14 // g0 - a0 - vsubl.s16 q14, d3, d15 // g1 - a1 - vadd.s32 q9, q11 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 - vadd.s32 q10, q12 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 - vsub.s32 q13, q15 // g0 - a0 - 5 * f0 - vsub.s32 q14, q8 // g1 - a1 - 5 * f1 - vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0 - vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1 - vqshrn.s32 d16, q9, #6 - vqshrn.s32 d17, q10, #6 + vmov.i16 d16, #58 + vmov.i16 d17, #10 + vmull.s16 q9, d8, d16 // 58 * d0 + vmull.s16 q10, d9, d16 // 58 * d1 + vmov.i16 d16, #17 + vmull.s16 q11, d10, d17 // 10 * c0 + vmull.s16 q12, d11, d17 // 10 * c1 + vmov.i16 d17, #5 + vmull.s16 q13, d6, d16 // 17 * e0 + vmull.s16 q14, d7, d16 // 17 * e1 + vmull.s16 q15, d4, d17 // 5 * f0 + vmull.s16 q8, d5, d17 // 5 * f1 + vsub.s32 q9, q11 // 58 * d0 - 10 * c0 + vsub.s32 q10, q12 // 58 * d1 - 10 * c1 + vshll.s16 q11, d12, #2 // 4 * b0 + vshll.s16 q12, d13, #2 // 4 * b1 + vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + vsubl.s16 q13, d2, d14 // g0 - a0 + vsubl.s16 q14, d3, d15 // g1 - a1 + vadd.s32 q9, q11 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + vadd.s32 q10, q12 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + vsub.s32 q13, q15 // g0 - a0 - 5 * f0 + vsub.s32 q14, q8 // g1 - a1 - 5 * f1 + vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0 + vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1 + vqshrn.s32 d16, q9, #6 + vqshrn.s32 d17, q10, #6 .endm .macro qpel_filter_1 out=q7 - vmov.u8 d24, #58 - vmov.u8 d25, #10 - vshll.u8 q13, d20, #4 // 16*e - vshll.u8 q14, d21, #2 // 4*f - vmull.u8 \out, d19, d24 // 58*d - vaddw.u8 q13, q13, d20 // 17*e - vmull.u8 q15, d18, d25 // 10*c - vaddw.u8 q14, q14, d21 // 5*f - vsubl.u8 q12, d22, d16 // g - a - vadd.u16 \out, q13 // 58d + 17e - vshll.u8 q13, d17, #2 // 4*b - vadd.u16 q15, q14 // 10*c + 5*f - vadd.s16 q13, q12 // - a + 4*b + g - vsub.s16 \out, q15 // -10*c + 58*d + 17*e -5*f - vadd.s16 \out, q13 // -a + 4*b -10*c + 58*d + 17*e -5*f + vmov.u8 d24, #58 + vmov.u8 d25, #10 + vshll.u8 q13, d20, #4 // 16*e + vshll.u8 q14, d21, #2 // 4*f + vmull.u8 \out, d19, d24 // 58*d + vaddw.u8 q13, q13, d20 // 17*e + vmull.u8 q15, d18, d25 // 10*c + vaddw.u8 q14, q14, d21 // 5*f + vsubl.u8 q12, d22, d16 // g - a + vadd.u16 \out, q13 // 58d + 17e + vshll.u8 q13, d17, #2 // 4*b + vadd.u16 q15, q14 // 10*c + 5*f + vadd.s16 q13, q12 // - a + 4*b + g + vsub.s16 \out, q15 // -10*c + 58*d + 17*e -5*f + vadd.s16 \out, q13 // -a + 4*b -10*c + 58*d + 17*e -5*f .endm .macro qpel_filter_2 out=q7 - vmov.i16 q12, #10 - vmov.i16 q14, #11 - vaddl.u8 q13, d19, d20 // d + e - vaddl.u8 q15, d18, d21 // c + f - vmul.u16 q13, q12 // 10 * (d+e) - vmul.u16 q15, q14 // 11 * ( c + f) - vaddl.u8 \out, d17, d22 // b + g - vaddl.u8 q12, d16, d23 // a + h - vadd.u16 \out, q13 // b + 10 * (d + e) + g - vadd.s16 q12, q15 - vshl.u16 \out, #2 // 4 * (b + 10 * (d + e) + g) - vsub.s16 \out, q12 + vmov.i16 q12, #10 + vmov.i16 q14, #11 + vaddl.u8 q13, d19, d20 // d + e + vaddl.u8 q15, d18, d21 // c + f + vmul.u16 q13, q12 // 10 * (d+e) + vmul.u16 q15, q14 // 11 * ( c + f) + vaddl.u8 \out, d17, d22 // b + g + vaddl.u8 q12, d16, d23 // a + h + vadd.u16 \out, q13 // b + 10 * (d + e) + g + vadd.s16 q12, q15 + vshl.u16 \out, #2 // 4 * (b + 10 * (d + e) + g) + vsub.s16 \out, q12 .endm .macro qpel_filter_3 out=q7 - vmov.u8 d24, #58 - vmov.u8 d25, #10 - vshll.u8 q13, d19, #4 // 16*e - vshll.u8 q14, d18, #2 // 4*f - vmull.u8 \out, d20, d24 // 58*d - vaddw.u8 q13, q13, d19 // 17*e - vmull.u8 q15, d21, d25 // 10*c - vaddw.u8 q14, q14, d18 // 5*f - vsubl.u8 q12, d17, d23 // g - a - vadd.u16 \out, q13 // 58d + 17e - vshll.u8 q13, d22, #2 // 4*b - vadd.u16 q15, q14 // 10*c + 5*f - vadd.s16 q13, q12 // - a + 4*b + g - vsub.s16 \out, q15 // -10*c + 58*d + 17*e -5*f - vadd.s16 \out, q13 // -a + 4*b -10*c + 58*d + 17*e -5*f + vmov.u8 d24, #58 + vmov.u8 d25, #10 + vshll.u8 q13, d19, #4 // 16*e + vshll.u8 q14, d18, #2 // 4*f + vmull.u8 \out, d20, d24 // 58*d + vaddw.u8 q13, q13, d19 // 17*e + vmull.u8 q15, d21, d25 // 10*c + vaddw.u8 q14, q14, d18 // 5*f + vsubl.u8 q12, d17, d23 // g - a + vadd.u16 \out, q13 // 58d + 17e + vshll.u8 q13, d22, #2 // 4*b + vadd.u16 q15, q14 // 10*c + 5*f + vadd.s16 q13, q12 // - a + 4*b + g + vsub.s16 \out, q15 // -10*c + 58*d + 17*e -5*f + vadd.s16 \out, q13 // -a + 4*b -10*c + 58*d + 17*e -5*f .endm .macro hevc_put_qpel_vX_neon_8 filter @@ -740,10 +740,10 @@ function ff_hevc_put_qpel_uw_h3v3_neon_8, export=1 endfunc .macro init_put_pixels - pld [r1] - pld [r1, r2] - mov r12, MAX_PB_SIZE - lsl r12, #1 + pld [r1] + pld [r1, r2] + mov r12, MAX_PB_SIZE + lsl r12, #1 .endm function ff_hevc_put_pixels_w2_neon_8, export=1 diff --git a/libavcodec/arm/hevcdsp_sao_neon.S b/libavcodec/arm/hevcdsp_sao_neon.S index e5695027e4..8727868bcd 100644 --- a/libavcodec/arm/hevcdsp_sao_neon.S +++ b/libavcodec/arm/hevcdsp_sao_neon.S @@ -23,155 +23,155 @@ #include "neon.S" function ff_hevc_sao_band_filter_neon_8, export=1 - push {r4-r10} - ldr r5, [sp, #28] // width - ldr r4, [sp, #32] // height - ldr r8, [sp, #36] // offset_table - vpush {d8-d15} - mov r12, r4 // r12 = height - mov r6, r0 // r6 = r0 = dst - mov r7, r1 // r7 = r1 = src - vldm r8, {q0-q3} - vmov.u16 q15, #1 - vmov.u8 q14, #32 -0: pld [r1] - cmp r5, #4 - beq 4f -8: subs r4, #1 - vld1.8 {d16}, [r1], r3 - vshr.u8 d17, d16, #3 // index = [src>>3] - vshll.u8 q9, d17, #1 // lowIndex = 2*index - vadd.u16 q11, q9, q15 // highIndex = (2*index+1) << 8 - vshl.u16 q10, q11, #8 // q10: highIndex; q9: lowIndex; - vadd.u16 q10, q9 // combine high and low index; + push {r4-r10} + ldr r5, [sp, #28] // width + ldr r4, [sp, #32] // height + ldr r8, [sp, #36] // offset_table + vpush {d8-d15} + mov r12, r4 // r12 = height + mov r6, r0 // r6 = r0 = dst + mov r7, r1 // r7 = r1 = src + vldm r8, {q0-q3} + vmov.u16 q15, #1 + vmov.u8 q14, #32 +0: pld [r1] + cmp r5, #4 + beq 4f +8: subs r4, #1 + vld1.8 {d16}, [r1], r3 + vshr.u8 d17, d16, #3 // index = [src>>3] + vshll.u8 q9, d17, #1 // lowIndex = 2*index + vadd.u16 q11, q9, q15 // highIndex = (2*index+1) << 8 + vshl.u16 q10, q11, #8 // q10: highIndex; q9: lowIndex; + vadd.u16 q10, q9 // combine high and low index; // Look-up Table Round 1; index range: 0-15 - vtbx.8 d24, {q0-q1}, d20 - vtbx.8 d25, {q0-q1}, d21 + vtbx.8 d24, {q0-q1}, d20 + vtbx.8 d25, {q0-q1}, d21 // Look-up Table Round 2; index range: 16-31 - vsub.u8 q10, q14 // Look-up with 8bit - vtbx.8 d24, {q2-q3}, d20 - vtbx.8 d25, {q2-q3}, d21 - vaddw.u8 q13, q12, d16 - vqmovun.s16 d8, q13 - vst1.8 d8, [r0], r2 - bne 8b - subs r5, #8 - beq 99f - mov r4, r12 - add r6, #8 - mov r0, r6 - add r7, #8 - mov r1, r7 - b 0b -4: subs r4, #1 - vld1.32 {d16[0]}, [r1], r3 - vshr.u8 d17, d16, #3 // src>>3 - vshll.u8 q9, d17, #1 // lowIndex = 2*index - vadd.u16 q11, q9, q15 // highIndex = (2*index+1) << 8 - vshl.u16 q10, q11, #8 // q10: highIndex; q9: lowIndex; - vadd.u16 q10, q9 // combine high and low index; + vsub.u8 q10, q14 // Look-up with 8bit + vtbx.8 d24, {q2-q3}, d20 + vtbx.8 d25, {q2-q3}, d21 + vaddw.u8 q13, q12, d16 + vqmovun.s16 d8, q13 + vst1.8 d8, [r0], r2 + bne 8b + subs r5, #8 + beq 99f + mov r4, r12 + add r6, #8 + mov r0, r6 + add r7, #8 + mov r1, r7 + b 0b +4: subs r4, #1 + vld1.32 {d16[0]}, [r1], r3 + vshr.u8 d17, d16, #3 // src>>3 + vshll.u8 q9, d17, #1 // lowIndex = 2*index + vadd.u16 q11, q9, q15 // highIndex = (2*index+1) << 8 + vshl.u16 q10, q11, #8 // q10: highIndex; q9: lowIndex; + vadd.u16 q10, q9 // combine high and low index; // Look-up Table Round 1; index range: 0-15 - vtbx.8 d24, {q0-q1}, d20 - vtbx.8 d25, {q0-q1}, d21 + vtbx.8 d24, {q0-q1}, d20 + vtbx.8 d25, {q0-q1}, d21 // Look-up Table Round 2; index range: 16-32 - vsub.u8 q10, q14 // Look-up with 8bit - vtbx.8 d24, {q2-q3}, d20 - vtbx.8 d25, {q2-q3}, d21 - vaddw.u8 q13, q12, d16 + vsub.u8 q10, q14 // Look-up with 8bit + vtbx.8 d24, {q2-q3}, d20 + vtbx.8 d25, {q2-q3}, d21 + vaddw.u8 q13, q12, d16 vqmovun.s16 d14, q13 - vst1.32 d14[0], [r0], r2 - bne 4b - b 99f + vst1.32 d14[0], [r0], r2 + bne 4b + b 99f 99: - vpop {d8-d15} - pop {r4-r10} - bx lr + vpop {d8-d15} + pop {r4-r10} + bx lr endfunc function ff_hevc_sao_edge_filter_neon_8, export=1 - push {r4-r11} - ldr r5, [sp, #32] // width - ldr r4, [sp, #36] // height - ldr r8, [sp, #40] // a_stride - ldr r9, [sp, #44] // b_stride - ldr r10, [sp, #48] // sao_offset_val - ldr r11, [sp, #52] // edge_idx - vpush {d8-d15} - mov r12, r4 // r12 = height - mov r6, r0 // r6 = r0 = dst - mov r7, r1 // r7 = r1 = src - vld1.8 {d0}, [r11] // edge_idx table load in d0 5x8bit - vld1.16 {q1}, [r10] // sao_offset_val table load in q1, 5x16bit - vmov.u8 d1, #2 - vmov.u16 q2, #1 -0: mov r10, r1 - add r10, r8 // src[x + a_stride] - mov r11, r1 - add r11, r9 // src[x + b_stride] - pld [r1] - cmp r5, #4 - beq 4f -8: subs r4, #1 - vld1.8 {d16}, [r1], r3 // src[x] 8x8bit - vld1.8 {d17}, [r10], r3 // src[x + a_stride] - vld1.8 {d18}, [r11], r3 // src[x + b_stride] - vcgt.u8 d8, d16, d17 - vshr.u8 d9, d8, #7 - vclt.u8 d8, d16, d17 - vadd.u8 d8, d9 // diff0 - vcgt.u8 d10, d16, d18 - vshr.u8 d11, d10, #7 - vclt.u8 d10, d16, d18 - vadd.u8 d10, d11 // diff1 - vadd.s8 d8, d10 - vadd.s8 d8, d1 - vtbx.8 d9, {d0}, d8 // offset_val - vshll.u8 q6, d9, #1 // lowIndex - vadd.u16 q7, q6, q2 - vshl.u16 q10, q7, #8 // highIndex - vadd.u16 q10, q6 // combine lowIndex and highIndex, offset_val - vtbx.8 d22, {q1}, d20 - vtbx.8 d23, {q1}, d21 - vaddw.u8 q12, q11, d16 - vqmovun.s16 d26, q12 - vst1.8 d26, [r0], r2 - bne 8b - subs r5, #8 - beq 99f - mov r4, r12 - add r6, #8 - mov r0, r6 - add r7, #8 - mov r1, r7 - b 0b -4: subs r4, #1 - vld1.32 {d16[0]}, [r1], r3 - vld1.32 {d17[0]}, [r10], r3 // src[x + a_stride] - vld1.32 {d18[0]}, [r11], r3 // src[x + b_stride] - vcgt.u8 d8, d16, d17 - vshr.u8 d9, d8, #7 - vclt.u8 d8, d16, d17 - vadd.u8 d8, d9 // diff0 - vcgt.u8 d10, d16, d18 - vshr.u8 d11, d10, #7 - vclt.u8 d10, d16, d18 - vadd.u8 d10, d11 // diff1 - vadd.s8 d8, d10 - vadd.s8 d8, d1 - vtbx.8 d9, {d0}, d8 // offset_val - vshll.u8 q6, d9, #1 // lowIndex - vadd.u16 q7, q6, q2 - vshl.u16 q10, q7, #8 // highIndex - vadd.u16 q10, q6 // combine lowIndex and highIndex, offset_val - vtbx.8 d22, {q1}, d20 - vtbx.8 d23, {q1}, d21 - vaddw.u8 q12, q11, d16 - vqmovun.s16 d26, q12 - vst1.32 d26[0], [r0], r2 - bne 4b - b 99f + push {r4-r11} + ldr r5, [sp, #32] // width + ldr r4, [sp, #36] // height + ldr r8, [sp, #40] // a_stride + ldr r9, [sp, #44] // b_stride + ldr r10, [sp, #48] // sao_offset_val + ldr r11, [sp, #52] // edge_idx + vpush {d8-d15} + mov r12, r4 // r12 = height + mov r6, r0 // r6 = r0 = dst + mov r7, r1 // r7 = r1 = src + vld1.8 {d0}, [r11] // edge_idx table load in d0 5x8bit + vld1.16 {q1}, [r10] // sao_offset_val table load in q1, 5x16bit + vmov.u8 d1, #2 + vmov.u16 q2, #1 +0: mov r10, r1 + add r10, r8 // src[x + a_stride] + mov r11, r1 + add r11, r9 // src[x + b_stride] + pld [r1] + cmp r5, #4 + beq 4f +8: subs r4, #1 + vld1.8 {d16}, [r1], r3 // src[x] 8x8bit + vld1.8 {d17}, [r10], r3 // src[x + a_stride] + vld1.8 {d18}, [r11], r3 // src[x + b_stride] + vcgt.u8 d8, d16, d17 + vshr.u8 d9, d8, #7 + vclt.u8 d8, d16, d17 + vadd.u8 d8, d9 // diff0 + vcgt.u8 d10, d16, d18 + vshr.u8 d11, d10, #7 + vclt.u8 d10, d16, d18 + vadd.u8 d10, d11 // diff1 + vadd.s8 d8, d10 + vadd.s8 d8, d1 + vtbx.8 d9, {d0}, d8 // offset_val + vshll.u8 q6, d9, #1 // lowIndex + vadd.u16 q7, q6, q2 + vshl.u16 q10, q7, #8 // highIndex + vadd.u16 q10, q6 // combine lowIndex and highIndex, offset_val + vtbx.8 d22, {q1}, d20 + vtbx.8 d23, {q1}, d21 + vaddw.u8 q12, q11, d16 + vqmovun.s16 d26, q12 + vst1.8 d26, [r0], r2 + bne 8b + subs r5, #8 + beq 99f + mov r4, r12 + add r6, #8 + mov r0, r6 + add r7, #8 + mov r1, r7 + b 0b +4: subs r4, #1 + vld1.32 {d16[0]}, [r1], r3 + vld1.32 {d17[0]}, [r10], r3 // src[x + a_stride] + vld1.32 {d18[0]}, [r11], r3 // src[x + b_stride] + vcgt.u8 d8, d16, d17 + vshr.u8 d9, d8, #7 + vclt.u8 d8, d16, d17 + vadd.u8 d8, d9 // diff0 + vcgt.u8 d10, d16, d18 + vshr.u8 d11, d10, #7 + vclt.u8 d10, d16, d18 + vadd.u8 d10, d11 // diff1 + vadd.s8 d8, d10 + vadd.s8 d8, d1 + vtbx.8 d9, {d0}, d8 // offset_val + vshll.u8 q6, d9, #1 // lowIndex + vadd.u16 q7, q6, q2 + vshl.u16 q10, q7, #8 // highIndex + vadd.u16 q10, q6 // combine lowIndex and highIndex, offset_val + vtbx.8 d22, {q1}, d20 + vtbx.8 d23, {q1}, d21 + vaddw.u8 q12, q11, d16 + vqmovun.s16 d26, q12 + vst1.32 d26[0], [r0], r2 + bne 4b + b 99f 99: - vpop {d8-d15} - pop {r4-r11} - bx lr + vpop {d8-d15} + pop {r4-r11} + bx lr endfunc diff --git a/libavcodec/arm/startcode_armv6.S b/libavcodec/arm/startcode_armv6.S index a46f009375..3685b506c6 100644 --- a/libavcodec/arm/startcode_armv6.S +++ b/libavcodec/arm/startcode_armv6.S @@ -38,204 +38,204 @@ TMP3 .req lr #define PRELOAD_DISTANCE 4 .macro innerloop4 - ldr DAT0, [PTR], #4 - subs SIZE, SIZE, #4 @ C flag survives rest of macro - sub TMP0, DAT0, PATTERN, lsr #14 - bic TMP0, TMP0, DAT0 - ands TMP0, TMP0, PATTERN + ldr DAT0, [PTR], #4 + subs SIZE, SIZE, #4 @ C flag survives rest of macro + sub TMP0, DAT0, PATTERN, lsr #14 + bic TMP0, TMP0, DAT0 + ands TMP0, TMP0, PATTERN .endm .macro innerloop16 decrement, do_preload - ldmia PTR!, {DAT0,DAT1,DAT2,DAT3} + ldmia PTR!, {DAT0,DAT1,DAT2,DAT3} .ifnc "\do_preload","" - pld [PTR, #PRELOAD_DISTANCE*32] + pld [PTR, #PRELOAD_DISTANCE*32] .endif .ifnc "\decrement","" - subs SIZE, SIZE, #\decrement @ C flag survives rest of macro + subs SIZE, SIZE, #\decrement @ C flag survives rest of macro .endif - sub TMP0, DAT0, PATTERN, lsr #14 - sub TMP1, DAT1, PATTERN, lsr #14 - bic TMP0, TMP0, DAT0 - bic TMP1, TMP1, DAT1 - sub TMP2, DAT2, PATTERN, lsr #14 - sub TMP3, DAT3, PATTERN, lsr #14 - ands TMP0, TMP0, PATTERN - bic TMP2, TMP2, DAT2 - it eq - andseq TMP1, TMP1, PATTERN - bic TMP3, TMP3, DAT3 - itt eq - andseq TMP2, TMP2, PATTERN - andseq TMP3, TMP3, PATTERN + sub TMP0, DAT0, PATTERN, lsr #14 + sub TMP1, DAT1, PATTERN, lsr #14 + bic TMP0, TMP0, DAT0 + bic TMP1, TMP1, DAT1 + sub TMP2, DAT2, PATTERN, lsr #14 + sub TMP3, DAT3, PATTERN, lsr #14 + ands TMP0, TMP0, PATTERN + bic TMP2, TMP2, DAT2 + it eq + andseq TMP1, TMP1, PATTERN + bic TMP3, TMP3, DAT3 + itt eq + andseq TMP2, TMP2, PATTERN + andseq TMP3, TMP3, PATTERN .endm /* int ff_startcode_find_candidate_armv6(const uint8_t *buf, int size) */ function ff_startcode_find_candidate_armv6, export=1 - push {v1-v6,lr} - mov PTR, BUF + push {v1-v6,lr} + mov PTR, BUF @ Ensure there are at least (PRELOAD_DISTANCE+2) complete cachelines to go @ before using code that does preloads - cmp SIZE, #(PRELOAD_DISTANCE+3)*32 - 1 - blo 60f + cmp SIZE, #(PRELOAD_DISTANCE+3)*32 - 1 + blo 60f @ Get to word-alignment, 1 byte at a time - tst PTR, #3 - beq 2f -1: ldrb DAT0, [PTR], #1 - sub SIZE, SIZE, #1 - teq DAT0, #0 - beq 90f - tst PTR, #3 - bne 1b + tst PTR, #3 + beq 2f +1: ldrb DAT0, [PTR], #1 + sub SIZE, SIZE, #1 + teq DAT0, #0 + beq 90f + tst PTR, #3 + bne 1b 2: @ Get to 4-word alignment, 1 word at a time - ldr PATTERN, =0x80008000 - setend be - tst PTR, #12 - beq 4f + ldr PATTERN, =0x80008000 + setend be + tst PTR, #12 + beq 4f 3: innerloop4 - bne 91f - tst PTR, #12 - bne 3b + bne 91f + tst PTR, #12 + bne 3b 4: @ Get to cacheline (8-word) alignment - tst PTR, #16 - beq 5f - innerloop16 16 - bne 93f + tst PTR, #16 + beq 5f + innerloop16 16 + bne 93f 5: @ Check complete cachelines, with preloading @ We need to stop when there are still (PRELOAD_DISTANCE+1) @ complete cachelines to go - sub SIZE, SIZE, #(PRELOAD_DISTANCE+2)*32 -6: innerloop16 , do_preload - bne 93f - innerloop16 32 - bne 93f - bcs 6b + sub SIZE, SIZE, #(PRELOAD_DISTANCE+2)*32 +6: innerloop16 , do_preload + bne 93f + innerloop16 32 + bne 93f + bcs 6b @ Preload trailing part-cacheline, if any - tst SIZE, #31 - beq 7f - pld [PTR, #(PRELOAD_DISTANCE+1)*32] + tst SIZE, #31 + beq 7f + pld [PTR, #(PRELOAD_DISTANCE+1)*32] @ Check remaining data without doing any more preloads. First @ do in chunks of 4 words: -7: adds SIZE, SIZE, #(PRELOAD_DISTANCE+2)*32 - 16 - bmi 9f -8: innerloop16 16 - bne 93f - bcs 8b +7: adds SIZE, SIZE, #(PRELOAD_DISTANCE+2)*32 - 16 + bmi 9f +8: innerloop16 16 + bne 93f + bcs 8b @ Then in words: -9: adds SIZE, SIZE, #16 - 4 - bmi 11f +9: adds SIZE, SIZE, #16 - 4 + bmi 11f 10: innerloop4 - bne 91f - bcs 10b -11: setend le + bne 91f + bcs 10b +11: setend le @ Check second byte of final halfword - ldrb DAT0, [PTR, #-1] - teq DAT0, #0 - beq 90f + ldrb DAT0, [PTR, #-1] + teq DAT0, #0 + beq 90f @ Check any remaining bytes - tst SIZE, #3 - beq 13f -12: ldrb DAT0, [PTR], #1 - sub SIZE, SIZE, #1 - teq DAT0, #0 - beq 90f - tst SIZE, #3 - bne 12b + tst SIZE, #3 + beq 13f +12: ldrb DAT0, [PTR], #1 + sub SIZE, SIZE, #1 + teq DAT0, #0 + beq 90f + tst SIZE, #3 + bne 12b @ No candidate found -13: sub RESULT, PTR, BUF - b 99f +13: sub RESULT, PTR, BUF + b 99f 60: @ Small buffer - simply check by looping over bytes - subs SIZE, SIZE, #1 - bcc 99f -61: ldrb DAT0, [PTR], #1 - subs SIZE, SIZE, #1 - teq DAT0, #0 - beq 90f - bcs 61b + subs SIZE, SIZE, #1 + bcc 99f +61: ldrb DAT0, [PTR], #1 + subs SIZE, SIZE, #1 + teq DAT0, #0 + beq 90f + bcs 61b @ No candidate found - sub RESULT, PTR, BUF - b 99f + sub RESULT, PTR, BUF + b 99f 90: @ Found a candidate at the preceding byte - sub RESULT, PTR, BUF - sub RESULT, RESULT, #1 - b 99f + sub RESULT, PTR, BUF + sub RESULT, RESULT, #1 + b 99f 91: @ Found a candidate somewhere in the preceding 4 bytes - sub RESULT, PTR, BUF - sub RESULT, RESULT, #4 - sub TMP0, DAT0, #0x20000 - bics TMP0, TMP0, DAT0 - itt pl - ldrbpl DAT0, [PTR, #-3] - addpl RESULT, RESULT, #2 - bpl 92f - teq RESULT, #0 - beq 98f @ don't look back a byte if found at first byte in buffer - ldrb DAT0, [PTR, #-5] -92: teq DAT0, #0 - it eq - subeq RESULT, RESULT, #1 - b 98f + sub RESULT, PTR, BUF + sub RESULT, RESULT, #4 + sub TMP0, DAT0, #0x20000 + bics TMP0, TMP0, DAT0 + itt pl + ldrbpl DAT0, [PTR, #-3] + addpl RESULT, RESULT, #2 + bpl 92f + teq RESULT, #0 + beq 98f @ don't look back a byte if found at first byte in buffer + ldrb DAT0, [PTR, #-5] +92: teq DAT0, #0 + it eq + subeq RESULT, RESULT, #1 + b 98f 93: @ Found a candidate somewhere in the preceding 16 bytes - sub RESULT, PTR, BUF - sub RESULT, RESULT, #16 - teq TMP0, #0 - beq 95f @ not in first 4 bytes - sub TMP0, DAT0, #0x20000 - bics TMP0, TMP0, DAT0 - itt pl - ldrbpl DAT0, [PTR, #-15] - addpl RESULT, RESULT, #2 - bpl 94f - teq RESULT, #0 - beq 98f @ don't look back a byte if found at first byte in buffer - ldrb DAT0, [PTR, #-17] -94: teq DAT0, #0 - it eq - subeq RESULT, RESULT, #1 - b 98f -95: add RESULT, RESULT, #4 - teq TMP1, #0 - beq 96f @ not in next 4 bytes - sub TMP1, DAT1, #0x20000 - bics TMP1, TMP1, DAT1 - itee mi - ldrbmi DAT0, [PTR, #-13] - ldrbpl DAT0, [PTR, #-11] - addpl RESULT, RESULT, #2 - teq DAT0, #0 - it eq - subeq RESULT, RESULT, #1 - b 98f -96: add RESULT, RESULT, #4 - teq TMP2, #0 - beq 97f @ not in next 4 bytes - sub TMP2, DAT2, #0x20000 - bics TMP2, TMP2, DAT2 - itee mi - ldrbmi DAT0, [PTR, #-9] - ldrbpl DAT0, [PTR, #-7] - addpl RESULT, RESULT, #2 - teq DAT0, #0 - it eq - subeq RESULT, RESULT, #1 - b 98f -97: add RESULT, RESULT, #4 - sub TMP3, DAT3, #0x20000 - bics TMP3, TMP3, DAT3 - itee mi - ldrbmi DAT0, [PTR, #-5] - ldrbpl DAT0, [PTR, #-3] - addpl RESULT, RESULT, #2 - teq DAT0, #0 - it eq - subeq RESULT, RESULT, #1 + sub RESULT, PTR, BUF + sub RESULT, RESULT, #16 + teq TMP0, #0 + beq 95f @ not in first 4 bytes + sub TMP0, DAT0, #0x20000 + bics TMP0, TMP0, DAT0 + itt pl + ldrbpl DAT0, [PTR, #-15] + addpl RESULT, RESULT, #2 + bpl 94f + teq RESULT, #0 + beq 98f @ don't look back a byte if found at first byte in buffer + ldrb DAT0, [PTR, #-17] +94: teq DAT0, #0 + it eq + subeq RESULT, RESULT, #1 + b 98f +95: add RESULT, RESULT, #4 + teq TMP1, #0 + beq 96f @ not in next 4 bytes + sub TMP1, DAT1, #0x20000 + bics TMP1, TMP1, DAT1 + itee mi + ldrbmi DAT0, [PTR, #-13] + ldrbpl DAT0, [PTR, #-11] + addpl RESULT, RESULT, #2 + teq DAT0, #0 + it eq + subeq RESULT, RESULT, #1 + b 98f +96: add RESULT, RESULT, #4 + teq TMP2, #0 + beq 97f @ not in next 4 bytes + sub TMP2, DAT2, #0x20000 + bics TMP2, TMP2, DAT2 + itee mi + ldrbmi DAT0, [PTR, #-9] + ldrbpl DAT0, [PTR, #-7] + addpl RESULT, RESULT, #2 + teq DAT0, #0 + it eq + subeq RESULT, RESULT, #1 + b 98f +97: add RESULT, RESULT, #4 + sub TMP3, DAT3, #0x20000 + bics TMP3, TMP3, DAT3 + itee mi + ldrbmi DAT0, [PTR, #-5] + ldrbpl DAT0, [PTR, #-3] + addpl RESULT, RESULT, #2 + teq DAT0, #0 + it eq + subeq RESULT, RESULT, #1 @ drop through to 98f -98: setend le -99: pop {v1-v6,pc} +98: setend le +99: pop {v1-v6,pc} endfunc .unreq RESULT diff --git a/libavcodec/arm/vp3dsp_neon.S b/libavcodec/arm/vp3dsp_neon.S index 2942d488f5..892a444e2f 100644 --- a/libavcodec/arm/vp3dsp_neon.S +++ b/libavcodec/arm/vp3dsp_neon.S @@ -33,233 +33,233 @@ endconst #define xC7S1 d1[2] .macro vp3_loop_filter - vsubl.u8 q3, d18, d17 - vsubl.u8 q2, d16, d19 - vadd.i16 q1, q3, q3 - vadd.i16 q2, q2, q3 - vadd.i16 q0, q1, q2 - vrshr.s16 q0, q0, #3 - vmovl.u8 q9, d18 - vdup.u16 q15, r2 + vsubl.u8 q3, d18, d17 + vsubl.u8 q2, d16, d19 + vadd.i16 q1, q3, q3 + vadd.i16 q2, q2, q3 + vadd.i16 q0, q1, q2 + vrshr.s16 q0, q0, #3 + vmovl.u8 q9, d18 + vdup.u16 q15, r2 - vabs.s16 q1, q0 - vshr.s16 q0, q0, #15 - vqsub.u16 q2, q15, q1 - vqsub.u16 q3, q2, q1 - vsub.i16 q1, q2, q3 - veor q1, q1, q0 - vsub.i16 q0, q1, q0 + vabs.s16 q1, q0 + vshr.s16 q0, q0, #15 + vqsub.u16 q2, q15, q1 + vqsub.u16 q3, q2, q1 + vsub.i16 q1, q2, q3 + veor q1, q1, q0 + vsub.i16 q0, q1, q0 - vaddw.u8 q2, q0, d17 - vsub.i16 q3, q9, q0 - vqmovun.s16 d0, q2 - vqmovun.s16 d1, q3 + vaddw.u8 q2, q0, d17 + vsub.i16 q3, q9, q0 + vqmovun.s16 d0, q2 + vqmovun.s16 d1, q3 .endm function ff_vp3_v_loop_filter_neon, export=1 - sub ip, r0, r1 - sub r0, r0, r1, lsl #1 - vld1.64 {d16}, [r0,:64], r1 - vld1.64 {d17}, [r0,:64], r1 - vld1.64 {d18}, [r0,:64], r1 - vld1.64 {d19}, [r0,:64], r1 - ldrb r2, [r2, #129*4] + sub ip, r0, r1 + sub r0, r0, r1, lsl #1 + vld1.64 {d16}, [r0,:64], r1 + vld1.64 {d17}, [r0,:64], r1 + vld1.64 {d18}, [r0,:64], r1 + vld1.64 {d19}, [r0,:64], r1 + ldrb r2, [r2, #129*4] - vp3_loop_filter + vp3_loop_filter - vst1.64 {d0}, [ip,:64], r1 - vst1.64 {d1}, [ip,:64], r1 - bx lr + vst1.64 {d0}, [ip,:64], r1 + vst1.64 {d1}, [ip,:64], r1 + bx lr endfunc function ff_vp3_h_loop_filter_neon, export=1 - sub ip, r0, #1 - sub r0, r0, #2 - vld1.32 {d16[]}, [r0], r1 - vld1.32 {d17[]}, [r0], r1 - vld1.32 {d18[]}, [r0], r1 - vld1.32 {d19[]}, [r0], r1 - vld1.32 {d16[1]}, [r0], r1 - vld1.32 {d17[1]}, [r0], r1 - vld1.32 {d18[1]}, [r0], r1 - vld1.32 {d19[1]}, [r0], r1 - ldrb r2, [r2, #129*4] + sub ip, r0, #1 + sub r0, r0, #2 + vld1.32 {d16[]}, [r0], r1 + vld1.32 {d17[]}, [r0], r1 + vld1.32 {d18[]}, [r0], r1 + vld1.32 {d19[]}, [r0], r1 + vld1.32 {d16[1]}, [r0], r1 + vld1.32 {d17[1]}, [r0], r1 + vld1.32 {d18[1]}, [r0], r1 + vld1.32 {d19[1]}, [r0], r1 + ldrb r2, [r2, #129*4] - vtrn.8 d16, d17 - vtrn.8 d18, d19 - vtrn.16 d16, d18 - vtrn.16 d17, d19 + vtrn.8 d16, d17 + vtrn.8 d18, d19 + vtrn.16 d16, d18 + vtrn.16 d17, d19 - vp3_loop_filter + vp3_loop_filter - vtrn.8 d0, d1 + vtrn.8 d0, d1 - vst1.16 {d0[0]}, [ip], r1 - vst1.16 {d1[0]}, [ip], r1 - vst1.16 {d0[1]}, [ip], r1 - vst1.16 {d1[1]}, [ip], r1 - vst1.16 {d0[2]}, [ip], r1 - vst1.16 {d1[2]}, [ip], r1 - vst1.16 {d0[3]}, [ip], r1 - vst1.16 {d1[3]}, [ip], r1 - bx lr + vst1.16 {d0[0]}, [ip], r1 + vst1.16 {d1[0]}, [ip], r1 + vst1.16 {d0[1]}, [ip], r1 + vst1.16 {d1[1]}, [ip], r1 + vst1.16 {d0[2]}, [ip], r1 + vst1.16 {d1[2]}, [ip], r1 + vst1.16 {d0[3]}, [ip], r1 + vst1.16 {d1[3]}, [ip], r1 + bx lr endfunc function vp3_idct_start_neon - vpush {d8-d15} - vmov.i16 q4, #0 - vmov.i16 q5, #0 - movrel r3, vp3_idct_constants - vld1.64 {d0-d1}, [r3,:128] - vld1.64 {d16-d19}, [r2,:128] - vst1.64 {q4-q5}, [r2,:128]! - vld1.64 {d20-d23}, [r2,:128] - vst1.64 {q4-q5}, [r2,:128]! - vld1.64 {d24-d27}, [r2,:128] - vst1.64 {q4-q5}, [r2,:128]! - vadd.s16 q1, q8, q12 - vsub.s16 q8, q8, q12 - vld1.64 {d28-d31}, [r2,:128] - vst1.64 {q4-q5}, [r2,:128]! + vpush {d8-d15} + vmov.i16 q4, #0 + vmov.i16 q5, #0 + movrel r3, vp3_idct_constants + vld1.64 {d0-d1}, [r3,:128] + vld1.64 {d16-d19}, [r2,:128] + vst1.64 {q4-q5}, [r2,:128]! + vld1.64 {d20-d23}, [r2,:128] + vst1.64 {q4-q5}, [r2,:128]! + vld1.64 {d24-d27}, [r2,:128] + vst1.64 {q4-q5}, [r2,:128]! + vadd.s16 q1, q8, q12 + vsub.s16 q8, q8, q12 + vld1.64 {d28-d31}, [r2,:128] + vst1.64 {q4-q5}, [r2,:128]! vp3_idct_core_neon: - vmull.s16 q2, d18, xC1S7 // (ip[1] * C1) << 16 - vmull.s16 q3, d19, xC1S7 - vmull.s16 q4, d2, xC4S4 // ((ip[0] + ip[4]) * C4) << 16 - vmull.s16 q5, d3, xC4S4 - vmull.s16 q6, d16, xC4S4 // ((ip[0] - ip[4]) * C4) << 16 - vmull.s16 q7, d17, xC4S4 - vshrn.s32 d4, q2, #16 - vshrn.s32 d5, q3, #16 - vshrn.s32 d6, q4, #16 - vshrn.s32 d7, q5, #16 - vshrn.s32 d8, q6, #16 - vshrn.s32 d9, q7, #16 - vadd.s16 q12, q1, q3 // E = (ip[0] + ip[4]) * C4 - vadd.s16 q8, q8, q4 // F = (ip[0] - ip[4]) * C4 - vadd.s16 q1, q2, q9 // ip[1] * C1 + vmull.s16 q2, d18, xC1S7 // (ip[1] * C1) << 16 + vmull.s16 q3, d19, xC1S7 + vmull.s16 q4, d2, xC4S4 // ((ip[0] + ip[4]) * C4) << 16 + vmull.s16 q5, d3, xC4S4 + vmull.s16 q6, d16, xC4S4 // ((ip[0] - ip[4]) * C4) << 16 + vmull.s16 q7, d17, xC4S4 + vshrn.s32 d4, q2, #16 + vshrn.s32 d5, q3, #16 + vshrn.s32 d6, q4, #16 + vshrn.s32 d7, q5, #16 + vshrn.s32 d8, q6, #16 + vshrn.s32 d9, q7, #16 + vadd.s16 q12, q1, q3 // E = (ip[0] + ip[4]) * C4 + vadd.s16 q8, q8, q4 // F = (ip[0] - ip[4]) * C4 + vadd.s16 q1, q2, q9 // ip[1] * C1 - vmull.s16 q2, d30, xC1S7 // (ip[7] * C1) << 16 - vmull.s16 q3, d31, xC1S7 - vmull.s16 q4, d30, xC7S1 // (ip[7] * C7) << 16 - vmull.s16 q5, d31, xC7S1 - vmull.s16 q6, d18, xC7S1 // (ip[1] * C7) << 16 - vmull.s16 q7, d19, xC7S1 - vshrn.s32 d4, q2, #16 - vshrn.s32 d5, q3, #16 - vshrn.s32 d6, q4, #16 // ip[7] * C7 - vshrn.s32 d7, q5, #16 - vshrn.s32 d8, q6, #16 // ip[1] * C7 - vshrn.s32 d9, q7, #16 - vadd.s16 q2, q2, q15 // ip[7] * C1 - vadd.s16 q9, q1, q3 // A = ip[1] * C1 + ip[7] * C7 - vsub.s16 q15, q4, q2 // B = ip[1] * C7 - ip[7] * C1 + vmull.s16 q2, d30, xC1S7 // (ip[7] * C1) << 16 + vmull.s16 q3, d31, xC1S7 + vmull.s16 q4, d30, xC7S1 // (ip[7] * C7) << 16 + vmull.s16 q5, d31, xC7S1 + vmull.s16 q6, d18, xC7S1 // (ip[1] * C7) << 16 + vmull.s16 q7, d19, xC7S1 + vshrn.s32 d4, q2, #16 + vshrn.s32 d5, q3, #16 + vshrn.s32 d6, q4, #16 // ip[7] * C7 + vshrn.s32 d7, q5, #16 + vshrn.s32 d8, q6, #16 // ip[1] * C7 + vshrn.s32 d9, q7, #16 + vadd.s16 q2, q2, q15 // ip[7] * C1 + vadd.s16 q9, q1, q3 // A = ip[1] * C1 + ip[7] * C7 + vsub.s16 q15, q4, q2 // B = ip[1] * C7 - ip[7] * C1 - vmull.s16 q2, d22, xC5S3 // (ip[3] * C5) << 16 - vmull.s16 q3, d23, xC5S3 - vmull.s16 q4, d22, xC3S5 // (ip[3] * C3) << 16 - vmull.s16 q5, d23, xC3S5 - vmull.s16 q6, d26, xC5S3 // (ip[5] * C5) << 16 - vmull.s16 q7, d27, xC5S3 - vshrn.s32 d4, q2, #16 - vshrn.s32 d5, q3, #16 - vshrn.s32 d6, q4, #16 - vshrn.s32 d7, q5, #16 - vshrn.s32 d8, q6, #16 - vshrn.s32 d9, q7, #16 - vadd.s16 q3, q3, q11 // ip[3] * C3 - vadd.s16 q4, q4, q13 // ip[5] * C5 - vadd.s16 q1, q2, q11 // ip[3] * C5 - vadd.s16 q11, q3, q4 // C = ip[3] * C3 + ip[5] * C5 + vmull.s16 q2, d22, xC5S3 // (ip[3] * C5) << 16 + vmull.s16 q3, d23, xC5S3 + vmull.s16 q4, d22, xC3S5 // (ip[3] * C3) << 16 + vmull.s16 q5, d23, xC3S5 + vmull.s16 q6, d26, xC5S3 // (ip[5] * C5) << 16 + vmull.s16 q7, d27, xC5S3 + vshrn.s32 d4, q2, #16 + vshrn.s32 d5, q3, #16 + vshrn.s32 d6, q4, #16 + vshrn.s32 d7, q5, #16 + vshrn.s32 d8, q6, #16 + vshrn.s32 d9, q7, #16 + vadd.s16 q3, q3, q11 // ip[3] * C3 + vadd.s16 q4, q4, q13 // ip[5] * C5 + vadd.s16 q1, q2, q11 // ip[3] * C5 + vadd.s16 q11, q3, q4 // C = ip[3] * C3 + ip[5] * C5 - vmull.s16 q2, d26, xC3S5 // (ip[5] * C3) << 16 - vmull.s16 q3, d27, xC3S5 - vmull.s16 q4, d20, xC2S6 // (ip[2] * C2) << 16 - vmull.s16 q5, d21, xC2S6 - vmull.s16 q6, d28, xC6S2 // (ip[6] * C6) << 16 - vmull.s16 q7, d29, xC6S2 - vshrn.s32 d4, q2, #16 - vshrn.s32 d5, q3, #16 - vshrn.s32 d6, q4, #16 - vshrn.s32 d7, q5, #16 - vshrn.s32 d8, q6, #16 // ip[6] * C6 - vshrn.s32 d9, q7, #16 - vadd.s16 q2, q2, q13 // ip[5] * C3 - vadd.s16 q3, q3, q10 // ip[2] * C2 - vsub.s16 q13, q2, q1 // D = ip[5] * C3 - ip[3] * C5 - vsub.s16 q1, q9, q11 // (A - C) - vadd.s16 q11, q9, q11 // Cd = A + C - vsub.s16 q9, q15, q13 // (B - D) - vadd.s16 q13, q15, q13 // Dd = B + D - vadd.s16 q15, q3, q4 // G = ip[2] * C2 + ip[6] * C6 + vmull.s16 q2, d26, xC3S5 // (ip[5] * C3) << 16 + vmull.s16 q3, d27, xC3S5 + vmull.s16 q4, d20, xC2S6 // (ip[2] * C2) << 16 + vmull.s16 q5, d21, xC2S6 + vmull.s16 q6, d28, xC6S2 // (ip[6] * C6) << 16 + vmull.s16 q7, d29, xC6S2 + vshrn.s32 d4, q2, #16 + vshrn.s32 d5, q3, #16 + vshrn.s32 d6, q4, #16 + vshrn.s32 d7, q5, #16 + vshrn.s32 d8, q6, #16 // ip[6] * C6 + vshrn.s32 d9, q7, #16 + vadd.s16 q2, q2, q13 // ip[5] * C3 + vadd.s16 q3, q3, q10 // ip[2] * C2 + vsub.s16 q13, q2, q1 // D = ip[5] * C3 - ip[3] * C5 + vsub.s16 q1, q9, q11 // (A - C) + vadd.s16 q11, q9, q11 // Cd = A + C + vsub.s16 q9, q15, q13 // (B - D) + vadd.s16 q13, q15, q13 // Dd = B + D + vadd.s16 q15, q3, q4 // G = ip[2] * C2 + ip[6] * C6 - vmull.s16 q2, d2, xC4S4 // ((A - C) * C4) << 16 - vmull.s16 q3, d3, xC4S4 - vmull.s16 q4, d28, xC2S6 // (ip[6] * C2) << 16 - vmull.s16 q5, d29, xC2S6 - vmull.s16 q6, d20, xC6S2 // (ip[2] * C6) << 16 - vmull.s16 q7, d21, xC6S2 - vshrn.s32 d4, q2, #16 - vshrn.s32 d5, q3, #16 - vshrn.s32 d6, q4, #16 - vshrn.s32 d7, q5, #16 - vshrn.s32 d8, q6, #16 // ip[2] * C6 - vmull.s16 q5, d18, xC4S4 // ((B - D) * C4) << 16 - vmull.s16 q6, d19, xC4S4 - vshrn.s32 d9, q7, #16 - vadd.s16 q3, q3, q14 // ip[6] * C2 - vadd.s16 q10, q1, q2 // Ad = (A - C) * C4 - vsub.s16 q14, q4, q3 // H = ip[2] * C6 - ip[6] * C2 - bx lr + vmull.s16 q2, d2, xC4S4 // ((A - C) * C4) << 16 + vmull.s16 q3, d3, xC4S4 + vmull.s16 q4, d28, xC2S6 // (ip[6] * C2) << 16 + vmull.s16 q5, d29, xC2S6 + vmull.s16 q6, d20, xC6S2 // (ip[2] * C6) << 16 + vmull.s16 q7, d21, xC6S2 + vshrn.s32 d4, q2, #16 + vshrn.s32 d5, q3, #16 + vshrn.s32 d6, q4, #16 + vshrn.s32 d7, q5, #16 + vshrn.s32 d8, q6, #16 // ip[2] * C6 + vmull.s16 q5, d18, xC4S4 // ((B - D) * C4) << 16 + vmull.s16 q6, d19, xC4S4 + vshrn.s32 d9, q7, #16 + vadd.s16 q3, q3, q14 // ip[6] * C2 + vadd.s16 q10, q1, q2 // Ad = (A - C) * C4 + vsub.s16 q14, q4, q3 // H = ip[2] * C6 - ip[6] * C2 + bx lr endfunc .macro VP3_IDCT_END type function vp3_idct_end_\type\()_neon .ifc \type, col - vdup.16 q0, r3 - vadd.s16 q12, q12, q0 - vadd.s16 q8, q8, q0 + vdup.16 q0, r3 + vadd.s16 q12, q12, q0 + vadd.s16 q8, q8, q0 .endif - vshrn.s32 d2, q5, #16 - vshrn.s32 d3, q6, #16 - vadd.s16 q2, q12, q15 // Gd = E + G - vadd.s16 q9, q1, q9 // (B - D) * C4 - vsub.s16 q12, q12, q15 // Ed = E - G - vsub.s16 q3, q8, q10 // Fd = F - Ad - vadd.s16 q10, q8, q10 // Add = F + Ad - vadd.s16 q4, q9, q14 // Hd = Bd + H - vsub.s16 q14, q9, q14 // Bdd = Bd - H - vadd.s16 q8, q2, q11 // [0] = Gd + Cd - vsub.s16 q15, q2, q11 // [7] = Gd - Cd - vadd.s16 q9, q10, q4 // [1] = Add + Hd - vsub.s16 q10, q10, q4 // [2] = Add - Hd - vadd.s16 q11, q12, q13 // [3] = Ed + Dd - vsub.s16 q12, q12, q13 // [4] = Ed - Dd + vshrn.s32 d2, q5, #16 + vshrn.s32 d3, q6, #16 + vadd.s16 q2, q12, q15 // Gd = E + G + vadd.s16 q9, q1, q9 // (B - D) * C4 + vsub.s16 q12, q12, q15 // Ed = E - G + vsub.s16 q3, q8, q10 // Fd = F - Ad + vadd.s16 q10, q8, q10 // Add = F + Ad + vadd.s16 q4, q9, q14 // Hd = Bd + H + vsub.s16 q14, q9, q14 // Bdd = Bd - H + vadd.s16 q8, q2, q11 // [0] = Gd + Cd + vsub.s16 q15, q2, q11 // [7] = Gd - Cd + vadd.s16 q9, q10, q4 // [1] = Add + Hd + vsub.s16 q10, q10, q4 // [2] = Add - Hd + vadd.s16 q11, q12, q13 // [3] = Ed + Dd + vsub.s16 q12, q12, q13 // [4] = Ed - Dd .ifc \type, row - vtrn.16 q8, q9 + vtrn.16 q8, q9 .endif - vadd.s16 q13, q3, q14 // [5] = Fd + Bdd - vsub.s16 q14, q3, q14 // [6] = Fd - Bdd + vadd.s16 q13, q3, q14 // [5] = Fd + Bdd + vsub.s16 q14, q3, q14 // [6] = Fd - Bdd .ifc \type, row // 8x8 transpose - vtrn.16 q10, q11 - vtrn.16 q12, q13 - vtrn.16 q14, q15 - vtrn.32 q8, q10 - vtrn.32 q9, q11 - vtrn.32 q12, q14 - vtrn.32 q13, q15 - vswp d17, d24 - vswp d19, d26 - vadd.s16 q1, q8, q12 - vswp d21, d28 - vsub.s16 q8, q8, q12 - vswp d23, d30 + vtrn.16 q10, q11 + vtrn.16 q12, q13 + vtrn.16 q14, q15 + vtrn.32 q8, q10 + vtrn.32 q9, q11 + vtrn.32 q12, q14 + vtrn.32 q13, q15 + vswp d17, d24 + vswp d19, d26 + vadd.s16 q1, q8, q12 + vswp d21, d28 + vsub.s16 q8, q8, q12 + vswp d23, d30 .endif - bx lr + bx lr endfunc .endm @@ -267,129 +267,129 @@ VP3_IDCT_END row VP3_IDCT_END col function ff_vp3_idct_put_neon, export=1 - mov ip, lr - bl vp3_idct_start_neon - bl vp3_idct_end_row_neon - mov r3, #8 - add r3, r3, #2048 // convert signed pixel to unsigned - bl vp3_idct_core_neon - bl vp3_idct_end_col_neon - mov lr, ip - vpop {d8-d15} + mov ip, lr + bl vp3_idct_start_neon + bl vp3_idct_end_row_neon + mov r3, #8 + add r3, r3, #2048 // convert signed pixel to unsigned + bl vp3_idct_core_neon + bl vp3_idct_end_col_neon + mov lr, ip + vpop {d8-d15} - vqshrun.s16 d0, q8, #4 - vqshrun.s16 d1, q9, #4 - vqshrun.s16 d2, q10, #4 - vqshrun.s16 d3, q11, #4 - vst1.64 {d0}, [r0,:64], r1 - vqshrun.s16 d4, q12, #4 - vst1.64 {d1}, [r0,:64], r1 - vqshrun.s16 d5, q13, #4 - vst1.64 {d2}, [r0,:64], r1 - vqshrun.s16 d6, q14, #4 - vst1.64 {d3}, [r0,:64], r1 - vqshrun.s16 d7, q15, #4 - vst1.64 {d4}, [r0,:64], r1 - vst1.64 {d5}, [r0,:64], r1 - vst1.64 {d6}, [r0,:64], r1 - vst1.64 {d7}, [r0,:64], r1 - bx lr + vqshrun.s16 d0, q8, #4 + vqshrun.s16 d1, q9, #4 + vqshrun.s16 d2, q10, #4 + vqshrun.s16 d3, q11, #4 + vst1.64 {d0}, [r0,:64], r1 + vqshrun.s16 d4, q12, #4 + vst1.64 {d1}, [r0,:64], r1 + vqshrun.s16 d5, q13, #4 + vst1.64 {d2}, [r0,:64], r1 + vqshrun.s16 d6, q14, #4 + vst1.64 {d3}, [r0,:64], r1 + vqshrun.s16 d7, q15, #4 + vst1.64 {d4}, [r0,:64], r1 + vst1.64 {d5}, [r0,:64], r1 + vst1.64 {d6}, [r0,:64], r1 + vst1.64 {d7}, [r0,:64], r1 + bx lr endfunc function ff_vp3_idct_add_neon, export=1 - mov ip, lr - bl vp3_idct_start_neon - bl vp3_idct_end_row_neon - mov r3, #8 - bl vp3_idct_core_neon - bl vp3_idct_end_col_neon - mov lr, ip - vpop {d8-d15} - mov r2, r0 + mov ip, lr + bl vp3_idct_start_neon + bl vp3_idct_end_row_neon + mov r3, #8 + bl vp3_idct_core_neon + bl vp3_idct_end_col_neon + mov lr, ip + vpop {d8-d15} + mov r2, r0 - vld1.64 {d0}, [r0,:64], r1 - vshr.s16 q8, q8, #4 - vld1.64 {d1}, [r0,:64], r1 - vshr.s16 q9, q9, #4 - vld1.64 {d2}, [r0,:64], r1 - vaddw.u8 q8, q8, d0 - vld1.64 {d3}, [r0,:64], r1 - vaddw.u8 q9, q9, d1 - vld1.64 {d4}, [r0,:64], r1 - vshr.s16 q10, q10, #4 - vld1.64 {d5}, [r0,:64], r1 - vshr.s16 q11, q11, #4 - vld1.64 {d6}, [r0,:64], r1 - vqmovun.s16 d0, q8 - vld1.64 {d7}, [r0,:64], r1 - vqmovun.s16 d1, q9 - vaddw.u8 q10, q10, d2 - vaddw.u8 q11, q11, d3 - vshr.s16 q12, q12, #4 - vshr.s16 q13, q13, #4 - vqmovun.s16 d2, q10 - vqmovun.s16 d3, q11 - vaddw.u8 q12, q12, d4 - vaddw.u8 q13, q13, d5 - vshr.s16 q14, q14, #4 - vshr.s16 q15, q15, #4 - vst1.64 {d0}, [r2,:64], r1 - vqmovun.s16 d4, q12 - vst1.64 {d1}, [r2,:64], r1 - vqmovun.s16 d5, q13 - vst1.64 {d2}, [r2,:64], r1 - vaddw.u8 q14, q14, d6 - vst1.64 {d3}, [r2,:64], r1 - vaddw.u8 q15, q15, d7 - vst1.64 {d4}, [r2,:64], r1 - vqmovun.s16 d6, q14 - vst1.64 {d5}, [r2,:64], r1 - vqmovun.s16 d7, q15 - vst1.64 {d6}, [r2,:64], r1 - vst1.64 {d7}, [r2,:64], r1 - bx lr + vld1.64 {d0}, [r0,:64], r1 + vshr.s16 q8, q8, #4 + vld1.64 {d1}, [r0,:64], r1 + vshr.s16 q9, q9, #4 + vld1.64 {d2}, [r0,:64], r1 + vaddw.u8 q8, q8, d0 + vld1.64 {d3}, [r0,:64], r1 + vaddw.u8 q9, q9, d1 + vld1.64 {d4}, [r0,:64], r1 + vshr.s16 q10, q10, #4 + vld1.64 {d5}, [r0,:64], r1 + vshr.s16 q11, q11, #4 + vld1.64 {d6}, [r0,:64], r1 + vqmovun.s16 d0, q8 + vld1.64 {d7}, [r0,:64], r1 + vqmovun.s16 d1, q9 + vaddw.u8 q10, q10, d2 + vaddw.u8 q11, q11, d3 + vshr.s16 q12, q12, #4 + vshr.s16 q13, q13, #4 + vqmovun.s16 d2, q10 + vqmovun.s16 d3, q11 + vaddw.u8 q12, q12, d4 + vaddw.u8 q13, q13, d5 + vshr.s16 q14, q14, #4 + vshr.s16 q15, q15, #4 + vst1.64 {d0}, [r2,:64], r1 + vqmovun.s16 d4, q12 + vst1.64 {d1}, [r2,:64], r1 + vqmovun.s16 d5, q13 + vst1.64 {d2}, [r2,:64], r1 + vaddw.u8 q14, q14, d6 + vst1.64 {d3}, [r2,:64], r1 + vaddw.u8 q15, q15, d7 + vst1.64 {d4}, [r2,:64], r1 + vqmovun.s16 d6, q14 + vst1.64 {d5}, [r2,:64], r1 + vqmovun.s16 d7, q15 + vst1.64 {d6}, [r2,:64], r1 + vst1.64 {d7}, [r2,:64], r1 + bx lr endfunc function ff_vp3_idct_dc_add_neon, export=1 - ldrsh r12, [r2] - mov r3, r0 - add r12, r12, #15 - vdup.16 q15, r12 - mov r12, #0 - strh r12, [r2] - vshr.s16 q15, q15, #5 + ldrsh r12, [r2] + mov r3, r0 + add r12, r12, #15 + vdup.16 q15, r12 + mov r12, #0 + strh r12, [r2] + vshr.s16 q15, q15, #5 - vld1.8 {d0}, [r0,:64], r1 - vld1.8 {d1}, [r0,:64], r1 - vld1.8 {d2}, [r0,:64], r1 - vaddw.u8 q8, q15, d0 - vld1.8 {d3}, [r0,:64], r1 - vaddw.u8 q9, q15, d1 - vld1.8 {d4}, [r0,:64], r1 - vaddw.u8 q10, q15, d2 - vld1.8 {d5}, [r0,:64], r1 - vaddw.u8 q11, q15, d3 - vld1.8 {d6}, [r0,:64], r1 - vaddw.u8 q12, q15, d4 - vld1.8 {d7}, [r0,:64], r1 - vaddw.u8 q13, q15, d5 - vqmovun.s16 d0, q8 - vaddw.u8 q14, q15, d6 - vqmovun.s16 d1, q9 - vaddw.u8 q15, q15, d7 - vqmovun.s16 d2, q10 - vst1.8 {d0}, [r3,:64], r1 - vqmovun.s16 d3, q11 - vst1.8 {d1}, [r3,:64], r1 - vqmovun.s16 d4, q12 - vst1.8 {d2}, [r3,:64], r1 - vqmovun.s16 d5, q13 - vst1.8 {d3}, [r3,:64], r1 - vqmovun.s16 d6, q14 - vst1.8 {d4}, [r3,:64], r1 - vqmovun.s16 d7, q15 - vst1.8 {d5}, [r3,:64], r1 - vst1.8 {d6}, [r3,:64], r1 - vst1.8 {d7}, [r3,:64], r1 - bx lr + vld1.8 {d0}, [r0,:64], r1 + vld1.8 {d1}, [r0,:64], r1 + vld1.8 {d2}, [r0,:64], r1 + vaddw.u8 q8, q15, d0 + vld1.8 {d3}, [r0,:64], r1 + vaddw.u8 q9, q15, d1 + vld1.8 {d4}, [r0,:64], r1 + vaddw.u8 q10, q15, d2 + vld1.8 {d5}, [r0,:64], r1 + vaddw.u8 q11, q15, d3 + vld1.8 {d6}, [r0,:64], r1 + vaddw.u8 q12, q15, d4 + vld1.8 {d7}, [r0,:64], r1 + vaddw.u8 q13, q15, d5 + vqmovun.s16 d0, q8 + vaddw.u8 q14, q15, d6 + vqmovun.s16 d1, q9 + vaddw.u8 q15, q15, d7 + vqmovun.s16 d2, q10 + vst1.8 {d0}, [r3,:64], r1 + vqmovun.s16 d3, q11 + vst1.8 {d1}, [r3,:64], r1 + vqmovun.s16 d4, q12 + vst1.8 {d2}, [r3,:64], r1 + vqmovun.s16 d5, q13 + vst1.8 {d3}, [r3,:64], r1 + vqmovun.s16 d6, q14 + vst1.8 {d4}, [r3,:64], r1 + vqmovun.s16 d7, q15 + vst1.8 {d5}, [r3,:64], r1 + vst1.8 {d6}, [r3,:64], r1 + vst1.8 {d7}, [r3,:64], r1 + bx lr endfunc _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
