00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "dsputil.h"
00023
00024 static const int p1m1[2] __attribute__((aligned(8))) =
00025 { 0, 1 << 31 };
00026
00027 static const int m1p1[2] __attribute__((aligned(8))) =
00028 { 1 << 31, 0 };
00029
00030 void ff_fft_calc_3dn(FFTContext *s, FFTComplex *z)
00031 {
00032 int ln = s->nbits;
00033 long i, j;
00034 long nblocks, nloops;
00035 FFTComplex *p, *cptr;
00036
00037 asm volatile(
00038
00039 "femms \n\t"
00040 "movq %0, %%mm7 \n\t"
00041 ::"m"(*(s->inverse ? m1p1 : p1m1))
00042 );
00043
00044 i = 8 << ln;
00045 asm volatile(
00046 "1: \n\t"
00047 "sub $32, %0 \n\t"
00048 "movq (%0,%1), %%mm0 \n\t"
00049 "movq 16(%0,%1), %%mm1 \n\t"
00050 "movq 8(%0,%1), %%mm2 \n\t"
00051 "movq 24(%0,%1), %%mm3 \n\t"
00052 "movq %%mm0, %%mm4 \n\t"
00053 "movq %%mm1, %%mm5 \n\t"
00054 "pfadd %%mm2, %%mm0 \n\t"
00055 "pfadd %%mm3, %%mm1 \n\t"
00056 "pfsub %%mm2, %%mm4 \n\t"
00057 "pfsub %%mm3, %%mm5 \n\t"
00058 "movq %%mm0, %%mm2 \n\t"
00059 "punpckldq %%mm5, %%mm6 \n\t"
00060 "punpckhdq %%mm6, %%mm5 \n\t"
00061 "movq %%mm4, %%mm3 \n\t"
00062 "pxor %%mm7, %%mm5 \n\t"
00063 "pfadd %%mm1, %%mm0 \n\t"
00064 "pfadd %%mm5, %%mm4 \n\t"
00065 "pfsub %%mm1, %%mm2 \n\t"
00066 "pfsub %%mm5, %%mm3 \n\t"
00067 "movq %%mm0, (%0,%1) \n\t"
00068 "movq %%mm4, 8(%0,%1) \n\t"
00069 "movq %%mm2, 16(%0,%1) \n\t"
00070 "movq %%mm3, 24(%0,%1) \n\t"
00071 "jg 1b \n\t"
00072 :"+r"(i)
00073 :"r"(z)
00074 );
00075
00076
00077 nblocks = 1 << (ln-3);
00078 nloops = 1 << 2;
00079 cptr = s->exptab1;
00080 do {
00081 p = z;
00082 j = nblocks;
00083 do {
00084 i = nloops*8;
00085 asm volatile(
00086 "1: \n\t"
00087 "sub $16, %0 \n\t"
00088 "movq (%1,%0), %%mm0 \n\t"
00089 "movq 8(%1,%0), %%mm1 \n\t"
00090 "movq (%2,%0), %%mm2 \n\t"
00091 "movq 8(%2,%0), %%mm3 \n\t"
00092 "movq %%mm2, %%mm4 \n\t"
00093 "movq %%mm3, %%mm5 \n\t"
00094 "punpckldq %%mm2, %%mm2 \n\t"
00095 "punpckldq %%mm3, %%mm3 \n\t"
00096 "punpckhdq %%mm4, %%mm4 \n\t"
00097 "punpckhdq %%mm5, %%mm5 \n\t"
00098 "pfmul (%3,%0,2), %%mm2 \n\t"
00099 "pfmul 8(%3,%0,2), %%mm3 \n\t"
00100 "pfmul 16(%3,%0,2), %%mm4 \n\t"
00101 "pfmul 24(%3,%0,2), %%mm5 \n\t"
00102 "pfadd %%mm2, %%mm4 \n\t"
00103 "pfadd %%mm3, %%mm5 \n\t"
00104 "movq %%mm0, %%mm2 \n\t"
00105 "movq %%mm1, %%mm3 \n\t"
00106 "pfadd %%mm4, %%mm0 \n\t"
00107 "pfadd %%mm5, %%mm1 \n\t"
00108 "pfsub %%mm4, %%mm2 \n\t"
00109 "pfsub %%mm5, %%mm3 \n\t"
00110 "movq %%mm0, (%1,%0) \n\t"
00111 "movq %%mm1, 8(%1,%0) \n\t"
00112 "movq %%mm2, (%2,%0) \n\t"
00113 "movq %%mm3, 8(%2,%0) \n\t"
00114 "jg 1b \n\t"
00115 :"+r"(i)
00116 :"r"(p), "r"(p + nloops), "r"(cptr)
00117 );
00118 p += nloops*2;
00119 } while (--j);
00120 cptr += nloops*2;
00121 nblocks >>= 1;
00122 nloops <<= 1;
00123 } while (nblocks != 0);
00124 asm volatile("femms");
00125 }