view kf_bfly4.S @ 10:05f6ab0a17c0

backup
author Peter Meerwald <p.meerwald@bct-electronic.com>
date Wed, 21 Sep 2011 15:20:58 +0200
parents
children abdcde012978
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
	ldr	r2, [r2, #4]
	cmp	r2, #0
	beq	.forward
	mov	r8, r1, asl #4
	mov	r7, r1, asl #5
	add	r1, r1, r1, asl #1
	mov	r1, r1, asl #4
	add	r2, r0, #0
	add	r5, r0, r3, asl #4
	add	r4, r0, r4, asl #4
	add	r0, r0, r6, asl #4
	mov	sl, ip
	mov	r6, ip
.inverse_loop:
    // C_MUL(scratch[0], Fout[m], *tw1);
    vld1.32     {d18,d19}, [r5]
    vld1.32     {d16,d17}, [ip]
	vmul.f32	d20, d18, d16
	vmls.f32	d20, d19, d17
	vmul.f32	d21, d16, d19
	vmla.f32	d21, d18, d17
	
	// C_MUL(scratch[3], Fout[m2], *tw2);
    vld1.32     {d18,d19}, [r4]
    vld1.32     {d16,d17}, [r6]
	vmul.f32	d22, d18, d16
	vmls.f32	d22, d19, d17
	vmul.f32	d23, d16, d19
	vmla.f32	d23, d18, d17

    // C_MUL(scratch[2], Fout[m3], *tw3);
    vld1.32     {d18,d19}, [r0]
    vld1.32     {d16,d17}, [sl]
	vmul.f32	d24, d18, d16
	vmls.f32	d24, d19, d17
	vmul.f32	d25, d16, d19
	vmla.f32	d25, d18, d17

    // C_SUB(scratch[1], *Fout, scratch[3]);
    vld1.32     {d16,d17}, [r2]
    vsubq.f32   q13, q8, q11

    // C_ADDTO(*Fout, scratch[3]);
    vaddq.f32   q8, q8, q11
	vst1.32     {d16,d17}, [r2]
	
    // C_ADD(scratch[3], scratch[0], scratch[2]);
    vaddq.f32   q11, q10, q12
	
    // C_SUB(Fout[m2], *Fout, scratch[3]);
    vsubq.f32   q9, q8, q11
    vst1.32     {d18,d19}, [r4]!
    
    // C_ADDTO(*Fout, scratch[3]);
    vaddq.f32   q8, q8, q11
    vst1.32     {d16,d17}, [r2]!

	add	ip, ip, r8
	add	r6, r6, r7
	add	sl, sl, r1

    // C_SUB(scratch[3], scratch[0], scratch[2]);
    vsubq.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]!
    
    // 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]!

	subs	r3, r3, #1
	bne	.inverse_loop
	b	.done
.forward:
	mov	r8, r1, asl #4
	mov	r7, r1, asl #5
	add	r1, r1, r1, asl #1
	mov	r1, r1, asl #4
	add	r2, r0, #0
	add	r5, r0, r3, asl #4
	add	r4, r0, r4, asl #4
	add	r0, r0, r6, asl #4
	mov	sl, ip
	mov	r6, ip
.forward_loop:
    // C_MUL(scratch[0], Fout[m], *tw1);
    vld1.32     {d18,d19}, [r5]
    vld1.32     {d16,d17}, [ip]
	vmul.f32	d20, d18, d16
	vmls.f32	d20, d19, d17
	vmul.f32	d21, d16, d19
	vmla.f32	d21, d18, d17
	
	// C_MUL(scratch[3], Fout[m2], *tw2);
    vld1.32     {d18,d19}, [r4]
    vld1.32     {d16,d17}, [r6]
	vmul.f32	d22, d18, d16
	vmls.f32	d22, d19, d17
	vmul.f32	d23, d16, d19
	vmla.f32	d23, d18, d17

    // C_MUL(scratch[2], Fout[m3], *tw3);
    vld1.32     {d18,d19}, [r0]
    vld1.32     {d16,d17}, [sl]
	vmul.f32	d24, d18, d16
	vmls.f32	d24, d19, d17
	vmul.f32	d25, d16, d19
	vmla.f32	d25, d18, d17

    // C_SUB(scratch[1], *Fout, scratch[3]);
    vld1.32     {d16,d17}, [r2]
    vsubq.f32   q13, q8, q11

    // C_ADDTO(*Fout, scratch[3]);
    vaddq.f32   q8, q8, q11
	vst1.32     {d16,d17}, [r2]
	
    // C_ADD(scratch[3], scratch[0], scratch[2]);
    vaddq.f32   q11, q10, q12
	
    // C_SUB(Fout[m2], *Fout, scratch[3]);
    vsubq.f32   q9, q8, q11
    vst1.32     {d18,d19}, [r4]!
    
    // C_ADDTO(*Fout, scratch[3]);
    vaddq.f32   q8, q8, q11
    vst1.32     {d16,d17}, [r2]!

	add	ip, ip, r8
	add	r6, r6, r7
	add	sl, sl, r1

    // C_SUB(scratch[3], scratch[0], scratch[2]);
    vsubq.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]!
    
    // 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]!

	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.