# HG changeset patch
# User Peter Meerwald
# Date 1316697558 -7200
# Node ID abdcde0129780a508120f363912c774f3954d032
# Parent 05f6ab0a17c060ef80b3fcc2fe403111d37bc703
backup
diff -r 05f6ab0a17c0 -r abdcde012978 kf_bfly4.S
--- a/kf_bfly4.S Wed Sep 21 15:20:58 2011 +0200
+++ b/kf_bfly4.S Thu Sep 22 15:19:18 2011 +0200
@@ -20,69 +20,72 @@
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
+ 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 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
+ vmul.f32 d21, d16, d19
+ // load Fout[m2], *tw2
+ vld1.32 {d14,d15}, [r4]
+ vld1.32 {d12,d13}, [r6]
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
+ vmul.f32 d22, d14, d12
+ vmul.f32 d23, d12, d15
+ // load Fout[m3], *tw3
+ vld1.32 {d18,d19}, [r0]
+ vld1.32 {d16,d17}, [sl]
+ vmls.f32 d22, d15, d13
+ vmla.f32 d23, d14, d13
// C_MUL(scratch[2], Fout[m3], *tw3);
- vld1.32 {d18,d19}, [r0]
- vld1.32 {d16,d17}, [sl]
vmul.f32 d24, d18, d16
+ vmul.f32 d25, d16, d19
+
+ // C_SUB(scratch[1], *Fout, scratch[3]);
+ vld1.32 {d14,d15}, [r2]
+ vsub.f32 q13, q7, q11
+
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
+ vadd.f32 q7, q7, q11
+ // C_ADD(scratch[3], scratch[0], scratch[2]);
+ vadd.f32 q11, q10, q12
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
+ vsub.f32 q9, q7, q11
vst1.32 {d18,d19}, [r4]!
// C_ADDTO(*Fout, scratch[3]);
- vaddq.f32 q8, q8, q11
- vst1.32 {d16,d17}, [r2]!
+ vadd.f32 q7, q7, q11
+ vst1.32 {d14,d15}, [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
+ vsub.f32 q11, q10, q12
// Fout[m].r = scratch[1].r - scratch[3].i;
// Fout[m].i = scratch[1].i + scratch[3].r;
@@ -100,66 +103,61 @@
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
+ vmul.f32 d21, d16, d19
+ // load Fout[m2], *tw2
+ vld1.32 {d14,d15}, [r4]
+ vld1.32 {d12,d13}, [r6]
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
+ vmul.f32 d22, d14, d12
+ vmul.f32 d23, d12, d15
+ // load Fout[m3], *tw3
+ vld1.32 {d18,d19}, [r0]
+ vld1.32 {d16,d17}, [sl]
+ vmls.f32 d22, d15, d13
+ vmla.f32 d23, d14, d13
// C_MUL(scratch[2], Fout[m3], *tw3);
- vld1.32 {d18,d19}, [r0]
- vld1.32 {d16,d17}, [sl]
vmul.f32 d24, d18, d16
+ vmul.f32 d25, d16, d19
+
+ // C_SUB(scratch[1], *Fout, scratch[3]);
+ vld1.32 {d14,d15}, [r2]
+ vsub.f32 q13, q7, q11
+
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
+ vadd.f32 q7, q7, q11
+ // C_ADD(scratch[3], scratch[0], scratch[2]);
+ vadd.f32 q11, q10, q12
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
+ vsub.f32 q9, q7, q11
vst1.32 {d18,d19}, [r4]!
// C_ADDTO(*Fout, scratch[3]);
- vaddq.f32 q8, q8, q11
- vst1.32 {d16,d17}, [r2]!
+ vadd.f32 q7, q7, q11
+ vst1.32 {d14,d15}, [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
+ vsub.f32 q11, q10, q12
// Fout[m].r = scratch[1].r - scratch[3].i;
// Fout[m].i = scratch[1].i + scratch[3].r;
diff -r 05f6ab0a17c0 -r abdcde012978 peck_fft.c
--- a/peck_fft.c Wed Sep 21 15:20:58 2011 +0200
+++ b/peck_fft.c Thu Sep 22 15:19:18 2011 +0200
@@ -294,7 +294,18 @@
kf_bfly2(Fout, fstride, st, m);
break;
case 3: kf_bfly3(Fout, fstride, st, m); break;
- case 4: kf_bfly4(Fout, fstride, st, m); break;
+ case 4:
+ {
+static unsigned counter = 0;
+ armv7_cycles_start();
+ unsigned int t1 = armv7_cycles_read();
+ kf_bfly4(Fout, fstride, st, m);
+ unsigned int t2 = armv7_cycles_read();
+ armv7_cycles_stop();
+ counter++;
+ if (counter > 150 && counter < 160) printf("XX %d\n", t2-t1);
+}
+ break;
case 5: kf_bfly5(Fout, fstride, st, m); break;
default: kf_bfly_generic(Fout, fstride, st, m, p); break;
}
diff -r 05f6ab0a17c0 -r abdcde012978 peck_test.c
--- a/peck_test.c Wed Sep 21 15:20:58 2011 +0200
+++ b/peck_test.c Thu Sep 22 15:19:18 2011 +0200
@@ -67,7 +67,7 @@
if (j == 0) {
for (i = 0; i < 8; i++)
- printf("%d: %f\n", i, *(float*)&res[i] / N);
+ printf("%d: %f %f\n", i, ((float*)&res[i])[0] / N, ((float*)&res[i])[1] / N);
}
}
peck_fftr_free(p);
@@ -75,8 +75,12 @@
peck_fft_cleanup();
for (i = 0; i < N; i++) {
- if (fabs(*(float*)&in[i] - *(float*)&res[i]/N) > 0.00001) {
- fprintf(stderr, "!!!! ERROR !!!! at %d\n", i);
+ if (fabs(((float*)&in[i])[0] - ((float*)&res[i])[0]/N) > 0.00001) {
+ fprintf(stderr, "!!!! ERROR0 !!!! at %d\n", i);
+ exit(EXIT_FAILURE);
+ }
+ if (fabs(((float*)&in[i])[1] - ((float*)&res[i])[1]/N) > 0.00001) {
+ fprintf(stderr, "!!!! ERROR1 !!!! at %d\n", i);
exit(EXIT_FAILURE);
}
}