view kf_bfly4.S @ 13:3e85a9101f02 default tip

readme
author Peter Meerwald <p.meerwald@bct-electronic.com>
date Thu, 09 Feb 2012 09:44:39 +0100
parents 655dc5c14169
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

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.