diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kf_bfly4.S	Wed Sep 21 15:20:58 2011 +0200
@@ -0,0 +1,184 @@
+	.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.