diff --git a/fft-org.c b/fft-org.c index e33de5b..d1f4ca1 100644 --- a/fft-org.c +++ b/fft-org.c @@ -126,6 +126,7 @@ int fix_fft_org(fixed fr[], fixed fi[], int m, int inverse) wr >>= 1; wi >>= 1; } + for(i=m; i +#define FFT_COMBINED_STORE(_fr, _fi, _i, _simd_r, _simd_i) \ + asm ("{" "\n" \ + " fft_simd_store %1, %0, %2" "\n" \ + " nop" "\n" \ + " fft_simd_store %3, %0, %4" "\n" \ + "}" \ + :: "r" (_i), "r" (_fr), "r" (_simd_r), "r" (_fi), "r" (_simd_i)); + /* * fix_fft() - perform fast Fourier transform. * @@ -61,7 +69,7 @@ int fix_fft(fixed fr[], fixed fi[], int m, int inverse) mr = 0; nn = n - 1; scale = 0; - + int mm = m; /* decimation in time - re-order data */ @@ -70,7 +78,7 @@ int fix_fft(fixed fr[], fixed fi[], int m, int inverse) if(m >= nn) break; if(mr <= m) continue; - + tr = fr[m]; fr[m] = fr[mr]; fr[mr] = tr; @@ -96,7 +104,7 @@ int fix_fft(fixed fr[], fixed fi[], int m, int inverse) ++scale; break; } - } + } } else { @@ -110,28 +118,42 @@ int fix_fft(fixed fr[], fixed fi[], int m, int inverse) /* it may not be obvious, but the shift will be performed on each data point exactly once, during this pass. */ istep = l << 1; //step width of current butterfly - + FFT_REG reg; + FFT_REG_SIMD simd_r, simd_i; fixed *reg_s = ((fixed*) ®); - - for(m=0; m