# 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); } }