Mercurial > hg > peckfft
view kf_bfly4.S @ 12:655dc5c14169
backup
author | Peter Meerwald <p.meerwald@bct-electronic.com> |
---|---|
date | Thu, 22 Sep 2011 16:58:25 +0200 |
parents | abdcde012978 |
children |
line wrap: on
line source
.cpu cortex-a8 .eabi_attribute 27, 3 .fpu neon .eabi_attribute 23, 1 .eabi_attribute 24, 1 .eabi_attribute 25, 1 .eabi_attribute 26, 2 .eabi_attribute 30, 1 .eabi_attribute 18, 4 .text .align 2 .global kf_bfly4 .type kf_bfly4, %function kf_bfly4: .fnstart .cfi_startproc stmfd sp!, {r4, r5, r6, r7, r8, sl} .save {r4, r5, r6, r7, r8, sl} mov r4, r3, asl #1 add r6, r4, r3 add ip, r2, #264 mov r8, r1, asl #4 mov r7, r1, asl #5 add r1, r1, r1, asl #1 ldr r2, [r2, #4] add r5, r0, r3, asl #4 add r4, r0, r4, asl #4 mov r1, r1, asl #4 mov sl, ip cmp r2, #0 beq .forward add r2, r0, #0 add r0, r0, r6, asl #4 mov r6, ip .inverse_loop: // C_MUL(scratch[0], Fout[m], *tw1); vld1.32 {d18,d19}, [r5,:64] vld1.32 {d16,d17}, [ip,:64] vmul.f32 d20, d18, d16 vmul.f32 d21, d16, d19 // load Fout[m2], *tw2 vld1.32 {d14,d15}, [r4,:64] vld1.32 {d12,d13}, [r6,:64] vmls.f32 d20, d19, d17 vmla.f32 d21, d18, d17 // C_MUL(scratch[3], Fout[m2], *tw2); vmul.f32 d22, d14, d12 vmul.f32 d23, d12, d15 // load Fout[m3], *tw3 vld1.32 {d18,d19}, [r0,:64] vld1.32 {d16,d17}, [sl,:64] vmls.f32 d22, d15, d13 vmla.f32 d23, d14, d13 // C_MUL(scratch[2], Fout[m3], *tw3); vmul.f32 d24, d18, d16 vmul.f32 d25, d16, d19 // C_SUB(scratch[1], *Fout, scratch[3]); vld1.32 {d14,d15}, [r2,:64] vsub.f32 q13, q7, q11 vmls.f32 d24, d19, d17 vmla.f32 d25, d18, d17 // C_ADDTO(*Fout, scratch[3]); vadd.f32 q7, q7, q11 // C_ADD(scratch[3], scratch[0], scratch[2]); vadd.f32 q11, q10, q12 vst1.32 {d16,d17}, [r2,:64] // C_SUB(Fout[m2], *Fout, scratch[3]); vsub.f32 q9, q7, q11 vst1.32 {d18,d19}, [r4,:64]! // C_ADDTO(*Fout, scratch[3]); vadd.f32 q7, q7, q11 vst1.32 {d14,d15}, [r2,:64]! add ip, ip, r8 add r6, r6, r7 add sl, sl, r1 // C_SUB(scratch[3], scratch[0], scratch[2]); vsub.f32 q11, q10, q12 // Fout[m].r = scratch[1].r - scratch[3].i; // Fout[m].i = scratch[1].i + scratch[3].r; vsub.f32 d18, d26, d23 vadd.f32 d19, d27, d22 vst1.32 {d18,d19}, [r5,:64]! // Fout[m3].r = scratch[1].r + scratch[3].i; // Fout[m3].i = scratch[1].i - scratch[3].r; vadd.f32 d18, d26, d23 vsub.f32 d19, d27, d22 vst1.32 {d18,d19}, [r0,:64]! subs r3, r3, #1 bne .inverse_loop b .done .forward: add r2, r0, #0 add r0, r0, r6, asl #4 mov r6, ip .forward_loop: // C_MUL(scratch[0], Fout[m], *tw1); vld1.32 {d18,d19}, [r5,:64] vld1.32 {d16,d17}, [ip,:64] vmul.f32 d20, d18, d16 vmul.f32 d21, d16, d19 // load Fout[m2], *tw2 vld1.32 {d14,d15}, [r4,:64] vld1.32 {d12,d13}, [r6,:64] vmls.f32 d20, d19, d17 vmla.f32 d21, d18, d17 // C_MUL(scratch[3], Fout[m2], *tw2); vmul.f32 d22, d14, d12 vmul.f32 d23, d12, d15 // load Fout[m3], *tw3 vld1.32 {d18,d19}, [r0,:64] vld1.32 {d16,d17}, [sl,:64] vmls.f32 d22, d15, d13 vmla.f32 d23, d14, d13 // C_MUL(scratch[2], Fout[m3], *tw3); vmul.f32 d24, d18, d16 vmul.f32 d25, d16, d19 // C_SUB(scratch[1], *Fout, scratch[3]); vld1.32 {d14,d15}, [r2,:64] vsub.f32 q13, q7, q11 vmls.f32 d24, d19, d17 vmla.f32 d25, d18, d17 // C_ADDTO(*Fout, scratch[3]); vadd.f32 q7, q7, q11 // C_ADD(scratch[3], scratch[0], scratch[2]); vadd.f32 q11, q10, q12 vst1.32 {d16,d17}, [r2,:64] // C_SUB(Fout[m2], *Fout, scratch[3]); vsub.f32 q9, q7, q11 vst1.32 {d18,d19}, [r4,:64]! // C_ADDTO(*Fout, scratch[3]); vadd.f32 q7, q7, q11 vst1.32 {d14,d15}, [r2,:64]! add ip, ip, r8 add r6, r6, r7 add sl, sl, r1 // C_SUB(scratch[3], scratch[0], scratch[2]); vsub.f32 q11, q10, q12 // Fout[m].r = scratch[1].r - scratch[3].i; // Fout[m].i = scratch[1].i + scratch[3].r; vadd.f32 d18, d26, d23 vsub.f32 d19, d27, d22 vst1.32 {d18,d19}, [r5,:64]! // Fout[m3].r = scratch[1].r + scratch[3].i; // Fout[m3].i = scratch[1].i - scratch[3].r; vsub.f32 d18, d26, d23 vadd.f32 d19, d27, d22 vst1.32 {d18,d19}, [r0,:64]! subs r3, r3, #1 bne .forward_loop .done: ldmfd sp!, {r4, r5, r6, r7, r8, sl} bx lr .cfi_endproc .fnend .size kf_bfly4, .-kf_bfly4