|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function ff_imdct_half_neon, export=1 |
|
push {r4-r8,lr} |
|
|
|
mov r12, #1 |
|
ldr lr, [r0, #20] |
|
ldr r4, [r0, #24] |
|
ldr r3, [r0, #8] |
|
lsl r12, r12, lr |
|
lsr lr, r12, #2 |
|
add r7, r2, r12, lsl #1 |
|
mov r12, #-16 |
|
sub r7, r7, #16 |
|
|
|
vld2.32 {d16-d17},[r7,:128],r12 |
|
vld2.32 {d0-d1}, [r2,:128]! |
|
vrev64.32 d17, d17 |
|
vld2.32 {d2,d3}, [r4,:128]! |
|
vmul.f32 d6, d17, d2 |
|
vmul.f32 d7, d0, d2 |
|
1: |
|
subs lr, lr, #2 |
|
ldr r6, [r3], #4 |
|
vmul.f32 d4, d0, d3 |
|
vmul.f32 d5, d17, d3 |
|
vsub.f32 d4, d6, d4 |
|
vadd.f32 d5, d5, d7 |
|
uxth r8, r6, ror #16 |
|
uxth r6, r6 |
|
add r8, r1, r8, lsl #3 |
|
add r6, r1, r6, lsl #3 |
|
beq 1f |
|
vld2.32 {d16-d17},[r7,:128],r12 |
|
vld2.32 {d0-d1}, [r2,:128]! |
|
vrev64.32 d17, d17 |
|
vld2.32 {d2,d3}, [r4,:128]! |
|
vmul.f32 d6, d17, d2 |
|
vmul.f32 d7, d0, d2 |
|
vst2.32 {d4[0],d5[0]}, [r6,:64] |
|
vst2.32 {d4[1],d5[1]}, [r8,:64] |
|
b 1b |
|
1: |
|
vst2.32 {d4[0],d5[0]}, [r6,:64] |
|
vst2.32 {d4[1],d5[1]}, [r8,:64] |
|
|
|
mov r4, r0 |
|
mov r6, r1 |
|
bl ff_fft_calc_neon |
|
|
|
mov r12, #1 |
|
ldr lr, [r4, #20] |
|
ldr r4, [r4, #24] |
|
lsl r12, r12, lr |
|
lsr lr, r12, #3 |
|
|
|
add r4, r4, lr, lsl #3 |
|
add r6, r6, lr, lsl #3 |
|
sub r1, r4, #16 |
|
sub r3, r6, #16 |
|
|
|
mov r7, #-16 |
|
mov r8, r6 |
|
mov r0, r3 |
|
|
|
vld2.32 {d0-d1}, [r3,:128], r7 |
|
vld2.32 {d20-d21},[r6,:128]! |
|
vld2.32 {d16,d18},[r1,:128], r7 |
|
1: |
|
subs lr, lr, #2 |
|
vmul.f32 d7, d0, d18 |
|
vld2.32 {d17,d19},[r4,:128]! |
|
vmul.f32 d4, d1, d18 |
|
vmul.f32 d5, d21, d19 |
|
vmul.f32 d6, d20, d19 |
|
vmul.f32 d22, d1, d16 |
|
vmul.f32 d23, d21, d17 |
|
vmul.f32 d24, d0, d16 |
|
vmul.f32 d25, d20, d17 |
|
vadd.f32 d7, d7, d22 |
|
vadd.f32 d6, d6, d23 |
|
vsub.f32 d4, d4, d24 |
|
vsub.f32 d5, d5, d25 |
|
beq 1f |
|
vld2.32 {d0-d1}, [r3,:128], r7 |
|
vld2.32 {d20-d21},[r6,:128]! |
|
vld2.32 {d16,d18},[r1,:128], r7 |
|
vrev64.32 q3, q3 |
|
vst2.32 {d4,d6}, [r0,:128], r7 |
|
vst2.32 {d5,d7}, [r8,:128]! |
|
b 1b |
|
1: |
|
vrev64.32 q3, q3 |
|
vst2.32 {d4,d6}, [r0,:128] |
|
vst2.32 {d5,d7}, [r8,:128] |
|
|
|
pop {r4-r8,pc} |
|
endfunc |
|
|
|
function ff_imdct_calc_neon, export=1 |
|
push {r4-r6,lr} |
|
|
|
ldr r3, [r0, #20] |
|
mov r4, #1 |
|
mov r5, r1 |
|
lsl r4, r4, r3 |
|
add r1, r1, r4 |
|
|
|
bl X(ff_imdct_half_neon) |
|
|
|
add r0, r5, r4, lsl #2 |
|
add r1, r5, r4, lsl #1 |
|
sub r0, r0, #8 |
|
sub r2, r1, #16 |
|
mov r3, #-16 |
|
mov r6, #-8 |
|
vmov.i32 d30, #1<<31 |
|
1: |
|
vld1.32 {d0-d1}, [r2,:128], r3 |
|
pld [r0, #-16] |
|
vrev64.32 q0, q0 |
|
vld1.32 {d2-d3}, [r1,:128]! |
|
veor d4, d1, d30 |
|
pld [r2, #-16] |
|
vrev64.32 q1, q1 |
|
veor d5, d0, d30 |
|
vst1.32 {d2}, [r0,:64], r6 |
|
vst1.32 {d3}, [r0,:64], r6 |
|
vst1.32 {d4-d5}, [r5,:128]! |
|
subs r4, r4, #16 |
|
bgt 1b |
|
|
|
pop {r4-r6,pc} |
|
endfunc |
|
|
|
function ff_mdct_calc_neon, export=1 |
|
push {r4-r10,lr} |
|
|
|
mov r12, #1 |
|
ldr lr, [r0, #20] |
|
ldr r4, [r0, #24] |
|
ldr r3, [r0, #8] |
|
lsl lr, r12, lr |
|
add r7, r2, lr |
|
sub r9, r7, #16 |
|
add r2, r7, lr, lsl #1 |
|
add r8, r9, lr, lsl #1 |
|
add r5, r4, lr, lsl #1 |
|
sub r5, r5, #16 |
|
sub r3, r3, #4 |
|
mov r12, #-16 |
|
|
|
vld2.32 {d16,d18},[r9,:128],r12 |
|
vld2.32 {d17,d19},[r8,:128],r12 |
|
vld2.32 {d0, d2}, [r7,:128]! |
|
vrev64.32 q9, q9 |
|
vld2.32 {d1, d3}, [r2,:128]! |
|
vsub.f32 d0, d18, d0 |
|
vld2.32 {d20,d21},[r4,:128]! |
|
vrev64.32 q1, q1 |
|
vld2.32 {d30,d31},[r5,:128],r12 |
|
vadd.f32 d1, d1, d19 |
|
vsub.f32 d16, d16, d2 |
|
vadd.f32 d17, d17, d3 |
|
1: |
|
vmul.f32 d7, d0, d21 |
|
A ldr r10, [r3, lr, lsr #1] |
|
T lsr r10, lr, #1 |
|
T ldr r10, [r3, r10] |
|
vmul.f32 d6, d1, d20 |
|
ldr r6, [r3, #4]! |
|
vmul.f32 d4, d1, d21 |
|
vmul.f32 d5, d0, d20 |
|
vmul.f32 d24, d16, d30 |
|
vmul.f32 d25, d17, d31 |
|
vmul.f32 d22, d16, d31 |
|
vmul.f32 d23, d17, d30 |
|
subs lr, lr, #16 |
|
vsub.f32 d6, d6, d7 |
|
vadd.f32 d7, d4, d5 |
|
vsub.f32 d24, d25, d24 |
|
vadd.f32 d25, d22, d23 |
|
beq 1f |
|
mov r12, #-16 |
|
vld2.32 {d16,d18},[r9,:128],r12 |
|
vld2.32 {d17,d19},[r8,:128],r12 |
|
vneg.f32 d7, d7 |
|
vld2.32 {d0, d2}, [r7,:128]! |
|
vrev64.32 q9, q9 |
|
vld2.32 {d1, d3}, [r2,:128]! |
|
vsub.f32 d0, d18, d0 |
|
vld2.32 {d20,d21},[r4,:128]! |
|
vrev64.32 q1, q1 |
|
vld2.32 {d30,d31},[r5,:128],r12 |
|
vadd.f32 d1, d1, d19 |
|
vsub.f32 d16, d16, d2 |
|
vadd.f32 d17, d17, d3 |
|
uxth r12, r6, ror #16 |
|
uxth r6, r6 |
|
add r12, r1, r12, lsl #3 |
|
add r6, r1, r6, lsl #3 |
|
vst2.32 {d6[0],d7[0]}, [r6,:64] |
|
vst2.32 {d6[1],d7[1]}, [r12,:64] |
|
uxth r6, r10, ror #16 |
|
uxth r10, r10 |
|
add r6 , r1, r6, lsl #3 |
|
add r10, r1, r10, lsl #3 |
|
vst2.32 {d24[0],d25[0]},[r10,:64] |
|
vst2.32 {d24[1],d25[1]},[r6,:64] |
|
b 1b |
|
1: |
|
vneg.f32 d7, d7 |
|
uxth r12, r6, ror #16 |
|
uxth r6, r6 |
|
add r12, r1, r12, lsl #3 |
|
add r6, r1, r6, lsl #3 |
|
vst2.32 {d6[0],d7[0]}, [r6,:64] |
|
vst2.32 {d6[1],d7[1]}, [r12,:64] |
|
uxth r6, r10, ror #16 |
|
uxth r10, r10 |
|
add r6 , r1, r6, lsl #3 |
|
add r10, r1, r10, lsl #3 |
|
vst2.32 {d24[0],d25[0]},[r10,:64] |
|
vst2.32 {d24[1],d25[1]},[r6,:64] |
|
|
|
mov r4, r0 |
|
mov r6, r1 |
|
bl ff_fft_calc_neon |
|
|
|
mov r12, #1 |
|
ldr lr, [r4, #20] |
|
ldr r4, [r4, #24] |
|
lsl r12, r12, lr |
|
lsr lr, r12, #3 |
|
|
|
add r4, r4, lr, lsl #3 |
|
add r6, r6, lr, lsl #3 |
|
sub r1, r4, #16 |
|
sub r3, r6, #16 |
|
|
|
mov r7, #-16 |
|
mov r8, r6 |
|
mov r0, r3 |
|
|
|
vld2.32 {d0-d1}, [r3,:128], r7 |
|
vld2.32 {d20-d21},[r6,:128]! |
|
vld2.32 {d16,d18},[r1,:128], r7 |
|
1: |
|
subs lr, lr, #2 |
|
vmul.f32 d7, d0, d18 |
|
vld2.32 {d17,d19},[r4,:128]! |
|
vmul.f32 d4, d1, d18 |
|
vmul.f32 d5, d21, d19 |
|
vmul.f32 d6, d20, d19 |
|
vmul.f32 d24, d0, d16 |
|
vmul.f32 d25, d20, d17 |
|
vmul.f32 d22, d21, d17 |
|
vmul.f32 d23, d1, d16 |
|
vadd.f32 d4, d4, d24 |
|
vadd.f32 d5, d5, d25 |
|
vsub.f32 d6, d22, d6 |
|
vsub.f32 d7, d23, d7 |
|
vneg.f32 q2, q2 |
|
beq 1f |
|
vld2.32 {d0-d1}, [r3,:128], r7 |
|
vld2.32 {d20-d21},[r6,:128]! |
|
vld2.32 {d16,d18},[r1,:128], r7 |
|
vrev64.32 q3, q3 |
|
vst2.32 {d4,d6}, [r0,:128], r7 |
|
vst2.32 {d5,d7}, [r8,:128]! |
|
b 1b |
|
1: |
|
vrev64.32 q3, q3 |
|
vst2.32 {d4,d6}, [r0,:128] |
|
vst2.32 {d5,d7}, [r8,:128] |
|
|
|
pop {r4-r10,pc} |
|
endfunc |
|
|