void ff_imdct_calc_3dn2(MDCTContext *s, FFTSample *output,

                        const FFTSample *input, FFTSample *tmp)

{

    long n8, n4, n2, n;

    x86_reg k;

    const uint16_t *revtab = s->fft.revtab;

    const FFTSample *tcos = s->tcos;

    const FFTSample *tsin = s->tsin;

    const FFTSample *in1, *in2;

    FFTComplex *z = (FFTComplex *)tmp;



    n = 1 << s->nbits;

    n2 = n >> 1;

    n4 = n >> 2;

    n8 = n >> 3;



    /* pre rotation */

    in1 = input;

    in2 = input + n2 - 1;

    for(k = 0; k < n4; k++) {

        // FIXME a single block is faster, but gcc 2.95 and 3.4.x on 32bit can't compile it

        asm volatile(

            "movd       %0, %%mm0 \n\t"

            "movd       %2, %%mm1 \n\t"

            "punpckldq  %1, %%mm0 \n\t"

            "punpckldq  %3, %%mm1 \n\t"

            "movq    %%mm0, %%mm2 \n\t"

            "pfmul   %%mm1, %%mm0 \n\t"

            "pswapd  %%mm1, %%mm1 \n\t"

            "pfmul   %%mm1, %%mm2 \n\t"

            "pfpnacc %%mm2, %%mm0 \n\t"

            ::"m"(in2[-2*k]), "m"(in1[2*k]),

              "m"(tcos[k]), "m"(tsin[k])

        );

        asm volatile(

            "movq    %%mm0, %0    \n\t"

            :"=m"(z[revtab[k]])

        );

    }



    ff_fft_calc(&s->fft, z);



    /* post rotation + reordering */

    for(k = 0; k < n4; k++) {

        asm volatile(

            "movq       %0, %%mm0 \n\t"

            "movd       %1, %%mm1 \n\t"

            "punpckldq  %2, %%mm1 \n\t"

            "movq    %%mm0, %%mm2 \n\t"

            "pfmul   %%mm1, %%mm0 \n\t"

            "pswapd  %%mm1, %%mm1 \n\t"

            "pfmul   %%mm1, %%mm2 \n\t"

            "pfpnacc %%mm2, %%mm0 \n\t"

            "movq    %%mm0, %0    \n\t"

            :"+m"(z[k])

            :"m"(tcos[k]), "m"(tsin[k])

        );

    }



    k = n-8;

    asm volatile("movd %0, %%mm7" ::"r"(1<<31));

    asm volatile(

        "1: \n\t"

        "movq    (%4,%0), %%mm0 \n\t" // z[n8+k]

        "neg %0 \n\t"

        "pswapd -8(%4,%0), %%mm1 \n\t" // z[n8-1-k]

        "movq      %%mm0, %%mm2 \n\t"

        "pxor      %%mm7, %%mm2 \n\t"

        "punpckldq %%mm1, %%mm2 \n\t"

        "pswapd    %%mm2, %%mm3 \n\t"

        "punpckhdq %%mm1, %%mm0 \n\t"

        "pswapd    %%mm0, %%mm4 \n\t"

        "pxor      %%mm7, %%mm0 \n\t"

        "pxor      %%mm7, %%mm4 \n\t"

        "movq      %%mm3, -8(%3,%0) \n\t" // output[n-2-2*k] = { z[n8-1-k].im, -z[n8+k].re }

        "movq      %%mm4, -8(%2,%0) \n\t" // output[n2-2-2*k]= { -z[n8-1-k].re, z[n8+k].im }

        "neg %0 \n\t"

        "movq      %%mm0, (%1,%0) \n\t"   // output[2*k]     = { -z[n8+k].im, z[n8-1-k].re }

        "movq      %%mm2, (%2,%0) \n\t"   // output[n2+2*k]  = { -z[n8+k].re, z[n8-1-k].im }

        "sub $8, %0 \n\t"

        "jge 1b \n\t"

        :"+r"(k)

        :"r"(output), "r"(output+n2), "r"(output+n), "r"(z+n8)

        :"memory"

    );

    asm volatile("femms");

}

void ff_imdct_calc_3dn2(MDCTContext *s, FFTSample *output,

                        const FFTSample *input, FFTSample *tmp)

{

    long n8, n4, n2, n;

    x86_reg k;

    const uint16_t *revtab = s->fft.revtab;

    const FFTSample *tcos = s->tcos;

    const FFTSample *tsin = s->tsin;

    const FFTSample *in1, *in2;

    FFTComplex *z = (FFTComplex *)tmp;



    n = 1 << s->nbits;

    n2 = n >> 1;

    n4 = n >> 2;

    n8 = n >> 3;



    

    in1 = input;

    in2 = input + n2 - 1;

    for(k = 0; k < n4; k++) {

        

        asm volatile(

            "movd       %0, %%mm0 \n\t"

            "movd       %2, %%mm1 \n\t"

            "punpckldq  %1, %%mm0 \n\t"

            "punpckldq  %3, %%mm1 \n\t"

            "movq    %%mm0, %%mm2 \n\t"

            "pfmul   %%mm1, %%mm0 \n\t"

            "pswapd  %%mm1, %%mm1 \n\t"

            "pfmul   %%mm1, %%mm2 \n\t"

            "pfpnacc %%mm2, %%mm0 \n\t"

            ::"m"(in2[-2*k]), "m"(in1[2*k]),

              "m"(tcos[k]), "m"(tsin[k])

        );

        asm volatile(

            "movq    %%mm0, %0    \n\t"

            :"=m"(z[revtab[k]])

        );

    }



    ff_fft_calc(&s->fft, z);



    

    for(k = 0; k < n4; k++) {

        asm volatile(

            "movq       %0, %%mm0 \n\t"

            "movd       %1, %%mm1 \n\t"

            "punpckldq  %2, %%mm1 \n\t"

            "movq    %%mm0, %%mm2 \n\t"

            "pfmul   %%mm1, %%mm0 \n\t"

            "pswapd  %%mm1, %%mm1 \n\t"

            "pfmul   %%mm1, %%mm2 \n\t"

            "pfpnacc %%mm2, %%mm0 \n\t"

            "movq    %%mm0, %0    \n\t"

            :"+m"(z[k])

            :"m"(tcos[k]), "m"(tsin[k])

        );

    }



    k = n-8;

    asm volatile("movd %0, %%mm7" ::"r"(1<<31));

    asm volatile(

        "1: \n\t"

        "movq    (%4,%0), %%mm0 \n\t" 

        "neg %0 \n\t"

        "pswapd -8(%4,%0), %%mm1 \n\t" 

        "movq      %%mm0, %%mm2 \n\t"

        "pxor      %%mm7, %%mm2 \n\t"

        "punpckldq %%mm1, %%mm2 \n\t"

        "pswapd    %%mm2, %%mm3 \n\t"

        "punpckhdq %%mm1, %%mm0 \n\t"

        "pswapd    %%mm0, %%mm4 \n\t"

        "pxor      %%mm7, %%mm0 \n\t"

        "pxor      %%mm7, %%mm4 \n\t"

        "movq      %%mm3, -8(%3,%0) \n\t" 

        "movq      %%mm4, -8(%2,%0) \n\t" 

        "neg %0 \n\t"

        "movq      %%mm0, (%1,%0) \n\t"   

        "movq      %%mm2, (%2,%0) \n\t"   

        "sub $8, %0 \n\t"

        "jge 1b \n\t"

        :"+r"(k)

        :"r"(output), "r"(output+n2), "r"(output+n), "r"(z+n8)

        :"memory"

    );

    asm volatile("femms");

}

void ff_imdct_calc_3dn2(MDCTContext *s, FFTSample *output,                         const FFTSample *input, FFTSample *tmp)     long n8, n4, n2, n;     n8 = n >> 3;     long n8, n4, n2, n;     n8 = n >> 3;     n8 = n >> 3;
void FUNC_0(MDCTContext *VAR_0, FFTSample *VAR_1,

                        const FFTSample *VAR_2, FFTSample *VAR_3)

{

    long VAR_4, VAR_5, VAR_6, VAR_7;

    x86_reg k;

    const uint16_t *VAR_8 = VAR_0->fft.VAR_8;

    const FFTSample *VAR_9 = VAR_0->VAR_9;

    const FFTSample *VAR_10 = VAR_0->VAR_10;

    const FFTSample *VAR_11, *in2;

    FFTComplex *z = (FFTComplex *)VAR_3;



    VAR_7 = 1 << VAR_0->nbits;

    VAR_6 = VAR_7 >> 1;

    VAR_5 = VAR_7 >> 2;

    VAR_4 = VAR_7 >> 3;



    

    VAR_11 = VAR_2;

    in2 = VAR_2 + VAR_6 - 1;

    for(k = 0; k < VAR_5; k++) {

        

        asm volatile(

            "movd       %0, %%mm0 \VAR_7\t"

            "movd       %2, %%mm1 \VAR_7\t"

            "punpckldq  %1, %%mm0 \VAR_7\t"

            "punpckldq  %3, %%mm1 \VAR_7\t"

            "movq    %%mm0, %%mm2 \VAR_7\t"

            "pfmul   %%mm1, %%mm0 \VAR_7\t"

            "pswapd  %%mm1, %%mm1 \VAR_7\t"

            "pfmul   %%mm1, %%mm2 \VAR_7\t"

            "pfpnacc %%mm2, %%mm0 \VAR_7\t"

            ::"m"(in2[-2*k]), "m"(VAR_11[2*k]),

              "m"(VAR_9[k]), "m"(VAR_10[k])

        );

        asm volatile(

            "movq    %%mm0, %0    \VAR_7\t"

            :"=m"(z[VAR_8[k]])

        );

    }



    ff_fft_calc(&VAR_0->fft, z);



    

    for(k = 0; k < VAR_5; k++) {

        asm volatile(

            "movq       %0, %%mm0 \VAR_7\t"

            "movd       %1, %%mm1 \VAR_7\t"

            "punpckldq  %2, %%mm1 \VAR_7\t"

            "movq    %%mm0, %%mm2 \VAR_7\t"

            "pfmul   %%mm1, %%mm0 \VAR_7\t"

            "pswapd  %%mm1, %%mm1 \VAR_7\t"

            "pfmul   %%mm1, %%mm2 \VAR_7\t"

            "pfpnacc %%mm2, %%mm0 \VAR_7\t"

            "movq    %%mm0, %0    \VAR_7\t"

            :"+m"(z[k])

            :"m"(VAR_9[k]), "m"(VAR_10[k])

        );

    }



    k = VAR_7-8;

    asm volatile("movd %0, %%mm7" ::"r"(1<<31));

    asm volatile(

        "1: \VAR_7\t"

        "movq    (%4,%0), %%mm0 \VAR_7\t" 

        "neg %0 \VAR_7\t"

        "pswapd -8(%4,%0), %%mm1 \VAR_7\t" 

        "movq      %%mm0, %%mm2 \VAR_7\t"

        "pxor      %%mm7, %%mm2 \VAR_7\t"

        "punpckldq %%mm1, %%mm2 \VAR_7\t"

        "pswapd    %%mm2, %%mm3 \VAR_7\t"

        "punpckhdq %%mm1, %%mm0 \VAR_7\t"

        "pswapd    %%mm0, %%mm4 \VAR_7\t"

        "pxor      %%mm7, %%mm0 \VAR_7\t"

        "pxor      %%mm7, %%mm4 \VAR_7\t"

        "movq      %%mm3, -8(%3,%0) \VAR_7\t" 

        "movq      %%mm4, -8(%2,%0) \VAR_7\t" 

        "neg %0 \VAR_7\t"

        "movq      %%mm0, (%1,%0) \VAR_7\t"   

        "movq      %%mm2, (%2,%0) \VAR_7\t"   

        "sub $8, %0 \VAR_7\t"

        "jge 1b \VAR_7\t"

        :"+r"(k)

        :"r"(VAR_1), "r"(VAR_1+VAR_6), "r"(VAR_1+VAR_7), "r"(z+VAR_4)

        :"memory"

    );

    asm volatile("femms");

}

void FUNC_0(MDCTContext *VAR_0, FFTSample *VAR_1,
const FFTSample *VAR_2, FFTSample *VAR_3)
{ long VAR_4, VAR_5, VAR_6, VAR_7; x86_reg k; const uint16_t *VAR_8 = VAR_0->fft.VAR_8; const FFTSample *VAR_9 = VAR_0->VAR_9; const FFTSample *VAR_10 = VAR_0->VAR_10; const FFTSample *VAR_11, *in2; FFTComplex *z = (FFTComplex *)VAR_3; VAR_7 = 1 << VAR_0->nbits; VAR_6 = VAR_7 >> 1; VAR_5 = VAR_7 >> 2; VAR_4 = VAR_7 >> 3; VAR_11 = VAR_2; in2 = VAR_2 + VAR_6 - 1; for(k = 0; k < VAR_5; k++) { asm volatile(
"movd       %0, %%mm0 \VAR_7\t"
"movd       %2, %%mm1 \VAR_7\t"
"punpckldq  %1, %%mm0 \VAR_7\t"
"punpckldq  %3, %%mm1 \VAR_7\t"
"movq    %%mm0, %%mm2 \VAR_7\t"
"pfmul   %%mm1, %%mm0 \VAR_7\t"
"pswapd  %%mm1, %%mm1 \VAR_7\t"
"pfmul   %%mm1, %%mm2 \VAR_7\t"
"pfpnacc %%mm2, %%mm0 \VAR_7\t"
::"m"(in2[-2*k]), "m"(VAR_11[2*k]),
"m"(VAR_9[k]), "m"(VAR_10[k])
); asm volatile(
"movq    %%mm0, %0    \VAR_7\t"
:"=m"(z[VAR_8[k]])
); } ff_fft_calc(&VAR_0->fft, z); for(k = 0; k < VAR_5; k++) { asm volatile(
"movq       %0, %%mm0 \VAR_7\t"
"movd       %1, %%mm1 \VAR_7\t"
"punpckldq  %2, %%mm1 \VAR_7\t"
"movq    %%mm0, %%mm2 \VAR_7\t"
"pfmul   %%mm1, %%mm0 \VAR_7\t"
"pswapd  %%mm1, %%mm1 \VAR_7\t"
"pfmul   %%mm1, %%mm2 \VAR_7\t"
"pfpnacc %%mm2, %%mm0 \VAR_7\t"
"movq    %%mm0, %0    \VAR_7\t"
:"+m"(z[k])
:"m"(VAR_9[k]), "m"(VAR_10[k])
); } k = VAR_7-8; asm volatile("movd %0, %%mm7" ::"r"(1<<31)); asm volatile(
"1: \VAR_7\t"
"movq    (%4,%0), %%mm0 \VAR_7\t"
"neg %0 \VAR_7\t"
"pswapd -8(%4,%0), %%mm1 \VAR_7\t"
"movq      %%mm0, %%mm2 \VAR_7\t"
"pxor      %%mm7, %%mm2 \VAR_7\t"
"punpckldq %%mm1, %%mm2 \VAR_7\t"
"pswapd    %%mm2, %%mm3 \VAR_7\t"
"punpckhdq %%mm1, %%mm0 \VAR_7\t"
"pswapd    %%mm0, %%mm4 \VAR_7\t"
"pxor      %%mm7, %%mm0 \VAR_7\t"
"pxor      %%mm7, %%mm4 \VAR_7\t"
"movq      %%mm3, -8(%3,%0) \VAR_7\t"
"movq      %%mm4, -8(%2,%0) \VAR_7\t"
"neg %0 \VAR_7\t"
"movq      %%mm0, (%1,%0) \VAR_7\t"
"movq      %%mm2, (%2,%0) \VAR_7\t"
"sub $8, %0 \VAR_7\t"
"jge 1b \VAR_7\t"
:"+r"(k)
:"r"(VAR_1), "r"(VAR_1+VAR_6), "r"(VAR_1+VAR_7), "r"(z+VAR_4)
:"memory"
); asm volatile("femms"); }