mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-08-09 17:39:08 +00:00
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.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
vmov q4, q5
|
||||
vmov q3, q5
|
||||
vtrn.32 q3, q4
|
||||
|
||||
vadd.i16 q4, q3
|
||||
vadd.i16 q4, q3
|
||||
|
||||
vshl.s16 q5, q5, #1
|
||||
vcgt.s16 q3, q0, q4
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
mvn r8, r8
|
||||
and r9, r8, r7
|
||||
cmp r9, #0
|
||||
beq 2f
|
||||
|
||||
vdup.16 q4, r2
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
@@ -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
|
||||
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
|
||||
tr4_luma_shift d28, d29, d30, d31, #7
|
||||
|
||||
vtrn.16 d28, d29
|
||||
vtrn.16 d30, d31
|
||||
vtrn.32 q14, q15
|
||||
vtrn.16 d28, d29
|
||||
vtrn.16 d30, d31
|
||||
vtrn.32 q14, q15
|
||||
|
||||
tr4_luma_shift d28, d29, d30, d31, #12
|
||||
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
|
||||
vtrn.16 d28, d29
|
||||
vtrn.16 d30, d31
|
||||
vtrn.32 q14, q15
|
||||
vst1.16 {q14, q15}, [r0]
|
||||
vpop {d8-d15}
|
||||
bx lr
|
||||
endfunc
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user