void ff_celp_lp_synthesis_filterf(float *out, const float *filter_coeffs,

                                  const float* in, int buffer_length,

                                  int filter_length)

{

    int i,n;



#if 0 // Unoptimized code path for improved readability

    for (n = 0; n < buffer_length; n++) {

        out[n] = in[n];

        for (i = 1; i <= filter_length; i++)

            out[n] -= filter_coeffs[i-1] * out[n-i];

    }

#else

    float out0, out1, out2, out3;

    float old_out0, old_out1, old_out2, old_out3;

    float a,b,c;



    a = filter_coeffs[0];

    b = filter_coeffs[1];

    c = filter_coeffs[2];

    b -= filter_coeffs[0] * filter_coeffs[0];

    c -= filter_coeffs[1] * filter_coeffs[0];

    c -= filter_coeffs[0] * b;



    old_out0 = out[-4];

    old_out1 = out[-3];

    old_out2 = out[-2];

    old_out3 = out[-1];

    for (n = 0; n <= buffer_length - 4; n+=4) {

        float tmp0,tmp1,tmp2;

        float val;



        out0 = in[0];

        out1 = in[1];

        out2 = in[2];

        out3 = in[3];



        out0 -= filter_coeffs[2] * old_out1;

        out1 -= filter_coeffs[2] * old_out2;

        out2 -= filter_coeffs[2] * old_out3;



        out0 -= filter_coeffs[1] * old_out2;

        out1 -= filter_coeffs[1] * old_out3;



        out0 -= filter_coeffs[0] * old_out3;



        val = filter_coeffs[3];



        out0 -= val * old_out0;

        out1 -= val * old_out1;

        out2 -= val * old_out2;

        out3 -= val * old_out3;



        for (i = 5; i <= filter_length; i += 2) {

            old_out3 = out[-i];

            val = filter_coeffs[i-1];



            out0 -= val * old_out3;

            out1 -= val * old_out0;

            out2 -= val * old_out1;

            out3 -= val * old_out2;



            old_out2 = out[-i-1];



            val = filter_coeffs[i];



            out0 -= val * old_out2;

            out1 -= val * old_out3;

            out2 -= val * old_out0;

            out3 -= val * old_out1;



            FFSWAP(float, old_out0, old_out2);

            old_out1 = old_out3;

        }



        tmp0 = out0;

        tmp1 = out1;

        tmp2 = out2;



        out3 -= a * tmp2;

        out2 -= a * tmp1;

        out1 -= a * tmp0;



        out3 -= b * tmp1;

        out2 -= b * tmp0;



        out3 -= c * tmp0;





        out[0] = out0;

        out[1] = out1;

        out[2] = out2;

        out[3] = out3;



        old_out0 = out0;

        old_out1 = out1;

        old_out2 = out2;

        old_out3 = out3;



        out += 4;

        in  += 4;

    }



    out -= n;

    in -= n;

    for (; n < buffer_length; n++) {

        out[n] = in[n];

        for (i = 1; i <= filter_length; i++)

            out[n] -= filter_coeffs[i-1] * out[n-i];

    }

#endif

}

void ff_celp_lp_synthesis_filterf(float *out, const float *filter_coeffs,

                                  const float* in, int buffer_length,

                                  int filter_length)

{

    int i,n;



#if 0 

    for (n = 0; n < buffer_length; n++) {

        out[n] = in[n];

        for (i = 1; i <= filter_length; i++)

            out[n] -= filter_coeffs[i-1] * out[n-i];

    }

#else

    float out0, out1, out2, out3;

    float old_out0, old_out1, old_out2, old_out3;

    float a,b,c;



    a = filter_coeffs[0];

    b = filter_coeffs[1];

    c = filter_coeffs[2];

    b -= filter_coeffs[0] * filter_coeffs[0];

    c -= filter_coeffs[1] * filter_coeffs[0];

    c -= filter_coeffs[0] * b;



    old_out0 = out[-4];

    old_out1 = out[-3];

    old_out2 = out[-2];

    old_out3 = out[-1];

    for (n = 0; n <= buffer_length - 4; n+=4) {

        float tmp0,tmp1,tmp2;

        float val;



        out0 = in[0];

        out1 = in[1];

        out2 = in[2];

        out3 = in[3];



        out0 -= filter_coeffs[2] * old_out1;

        out1 -= filter_coeffs[2] * old_out2;

        out2 -= filter_coeffs[2] * old_out3;



        out0 -= filter_coeffs[1] * old_out2;

        out1 -= filter_coeffs[1] * old_out3;



        out0 -= filter_coeffs[0] * old_out3;



        val = filter_coeffs[3];



        out0 -= val * old_out0;

        out1 -= val * old_out1;

        out2 -= val * old_out2;

        out3 -= val * old_out3;



        for (i = 5; i <= filter_length; i += 2) {

            old_out3 = out[-i];

            val = filter_coeffs[i-1];



            out0 -= val * old_out3;

            out1 -= val * old_out0;

            out2 -= val * old_out1;

            out3 -= val * old_out2;



            old_out2 = out[-i-1];



            val = filter_coeffs[i];



            out0 -= val * old_out2;

            out1 -= val * old_out3;

            out2 -= val * old_out0;

            out3 -= val * old_out1;



            FFSWAP(float, old_out0, old_out2);

            old_out1 = old_out3;

        }



        tmp0 = out0;

        tmp1 = out1;

        tmp2 = out2;



        out3 -= a * tmp2;

        out2 -= a * tmp1;

        out1 -= a * tmp0;



        out3 -= b * tmp1;

        out2 -= b * tmp0;



        out3 -= c * tmp0;





        out[0] = out0;

        out[1] = out1;

        out[2] = out2;

        out[3] = out3;



        old_out0 = out0;

        old_out1 = out1;

        old_out2 = out2;

        old_out3 = out3;



        out += 4;

        in  += 4;

    }



    out -= n;

    in -= n;

    for (; n < buffer_length; n++) {

        out[n] = in[n];

        for (i = 1; i <= filter_length; i++)

            out[n] -= filter_coeffs[i-1] * out[n-i];

    }

#endif

}

void FUNC_0(float *VAR_0, const float *VAR_1,

                                  const float* VAR_2, int VAR_3,

                                  int VAR_4)

{

    int VAR_5,VAR_6;



#if 0 

    for (VAR_6 = 0; VAR_6 < VAR_3; VAR_6++) {

        VAR_0[VAR_6] = VAR_2[VAR_6];

        for (VAR_5 = 1; VAR_5 <= VAR_4; VAR_5++)

            VAR_0[VAR_6] -= VAR_1[VAR_5-1] * VAR_0[VAR_6-VAR_5];

    }

#else

    float VAR_7, VAR_8, VAR_9, VAR_10;

    float VAR_11, VAR_12, VAR_13, VAR_14;

    float VAR_15,VAR_16,VAR_17;



    VAR_15 = VAR_1[0];

    VAR_16 = VAR_1[1];

    VAR_17 = VAR_1[2];

    VAR_16 -= VAR_1[0] * VAR_1[0];

    VAR_17 -= VAR_1[1] * VAR_1[0];

    VAR_17 -= VAR_1[0] * VAR_16;



    VAR_11 = VAR_0[-4];

    VAR_12 = VAR_0[-3];

    VAR_13 = VAR_0[-2];

    VAR_14 = VAR_0[-1];

    for (VAR_6 = 0; VAR_6 <= VAR_3 - 4; VAR_6+=4) {

        float VAR_18,VAR_19,VAR_20;

        float VAR_21;



        VAR_7 = VAR_2[0];

        VAR_8 = VAR_2[1];

        VAR_9 = VAR_2[2];

        VAR_10 = VAR_2[3];



        VAR_7 -= VAR_1[2] * VAR_12;

        VAR_8 -= VAR_1[2] * VAR_13;

        VAR_9 -= VAR_1[2] * VAR_14;



        VAR_7 -= VAR_1[1] * VAR_13;

        VAR_8 -= VAR_1[1] * VAR_14;



        VAR_7 -= VAR_1[0] * VAR_14;



        VAR_21 = VAR_1[3];



        VAR_7 -= VAR_21 * VAR_11;

        VAR_8 -= VAR_21 * VAR_12;

        VAR_9 -= VAR_21 * VAR_13;

        VAR_10 -= VAR_21 * VAR_14;



        for (VAR_5 = 5; VAR_5 <= VAR_4; VAR_5 += 2) {

            VAR_14 = VAR_0[-VAR_5];

            VAR_21 = VAR_1[VAR_5-1];



            VAR_7 -= VAR_21 * VAR_14;

            VAR_8 -= VAR_21 * VAR_11;

            VAR_9 -= VAR_21 * VAR_12;

            VAR_10 -= VAR_21 * VAR_13;



            VAR_13 = VAR_0[-VAR_5-1];



            VAR_21 = VAR_1[VAR_5];



            VAR_7 -= VAR_21 * VAR_13;

            VAR_8 -= VAR_21 * VAR_14;

            VAR_9 -= VAR_21 * VAR_11;

            VAR_10 -= VAR_21 * VAR_12;



            FFSWAP(float, VAR_11, VAR_13);

            VAR_12 = VAR_14;

        }



        VAR_18 = VAR_7;

        VAR_19 = VAR_8;

        VAR_20 = VAR_9;



        VAR_10 -= VAR_15 * VAR_20;

        VAR_9 -= VAR_15 * VAR_19;

        VAR_8 -= VAR_15 * VAR_18;



        VAR_10 -= VAR_16 * VAR_19;

        VAR_9 -= VAR_16 * VAR_18;



        VAR_10 -= VAR_17 * VAR_18;





        VAR_0[0] = VAR_7;

        VAR_0[1] = VAR_8;

        VAR_0[2] = VAR_9;

        VAR_0[3] = VAR_10;



        VAR_11 = VAR_7;

        VAR_12 = VAR_8;

        VAR_13 = VAR_9;

        VAR_14 = VAR_10;



        VAR_0 += 4;

        VAR_2  += 4;

    }



    VAR_0 -= VAR_6;

    VAR_2 -= VAR_6;

    for (; VAR_6 < VAR_3; VAR_6++) {

        VAR_0[VAR_6] = VAR_2[VAR_6];

        for (VAR_5 = 1; VAR_5 <= VAR_4; VAR_5++)

            VAR_0[VAR_6] -= VAR_1[VAR_5-1] * VAR_0[VAR_6-VAR_5];

    }

#endif

}

void FUNC_0(float *VAR_0, const float *VAR_1,
const float* VAR_2, int VAR_3,
int VAR_4)
{ int VAR_5,VAR_6; #if 0
for (VAR_6 = 0; VAR_6 < VAR_3; VAR_6++) { VAR_0[VAR_6] = VAR_2[VAR_6]; for (VAR_5 = 1; VAR_5 <= VAR_4; VAR_5++) VAR_0[VAR_6] -= VAR_1[VAR_5-1] * VAR_0[VAR_6-VAR_5]; } #else
float VAR_7, VAR_8, VAR_9, VAR_10; float VAR_11, VAR_12, VAR_13, VAR_14; float VAR_15,VAR_16,VAR_17; VAR_15 = VAR_1[0]; VAR_16 = VAR_1[1]; VAR_17 = VAR_1[2]; VAR_16 -= VAR_1[0] * VAR_1[0]; VAR_17 -= VAR_1[1] * VAR_1[0]; VAR_17 -= VAR_1[0] * VAR_16; VAR_11 = VAR_0[-4]; VAR_12 = VAR_0[-3]; VAR_13 = VAR_0[-2]; VAR_14 = VAR_0[-1]; for (VAR_6 = 0; VAR_6 <= VAR_3 - 4; VAR_6+=4) { float VAR_18,VAR_19,VAR_20; float VAR_21; VAR_7 = VAR_2[0]; VAR_8 = VAR_2[1]; VAR_9 = VAR_2[2]; VAR_10 = VAR_2[3]; VAR_7 -= VAR_1[2] * VAR_12; VAR_8 -= VAR_1[2] * VAR_13; VAR_9 -= VAR_1[2] * VAR_14; VAR_7 -= VAR_1[1] * VAR_13; VAR_8 -= VAR_1[1] * VAR_14; VAR_7 -= VAR_1[0] * VAR_14; VAR_21 = VAR_1[3]; VAR_7 -= VAR_21 * VAR_11; VAR_8 -= VAR_21 * VAR_12; VAR_9 -= VAR_21 * VAR_13; VAR_10 -= VAR_21 * VAR_14; for (VAR_5 = 5; VAR_5 <= VAR_4; VAR_5 += 2) { VAR_14 = VAR_0[-VAR_5]; VAR_21 = VAR_1[VAR_5-1]; VAR_7 -= VAR_21 * VAR_14; VAR_8 -= VAR_21 * VAR_11; VAR_9 -= VAR_21 * VAR_12; VAR_10 -= VAR_21 * VAR_13; VAR_13 = VAR_0[-VAR_5-1]; VAR_21 = VAR_1[VAR_5]; VAR_7 -= VAR_21 * VAR_13; VAR_8 -= VAR_21 * VAR_14; VAR_9 -= VAR_21 * VAR_11; VAR_10 -= VAR_21 * VAR_12; FFSWAP(float, VAR_11, VAR_13); VAR_12 = VAR_14; } VAR_18 = VAR_7; VAR_19 = VAR_8; VAR_20 = VAR_9; VAR_10 -= VAR_15 * VAR_20; VAR_9 -= VAR_15 * VAR_19; VAR_8 -= VAR_15 * VAR_18; VAR_10 -= VAR_16 * VAR_19; VAR_9 -= VAR_16 * VAR_18; VAR_10 -= VAR_17 * VAR_18; VAR_0[0] = VAR_7; VAR_0[1] = VAR_8; VAR_0[2] = VAR_9; VAR_0[3] = VAR_10; VAR_11 = VAR_7; VAR_12 = VAR_8; VAR_13 = VAR_9; VAR_14 = VAR_10; VAR_0 += 4; VAR_2  += 4; } VAR_0 -= VAR_6; VAR_2 -= VAR_6; for (; VAR_6 < VAR_3; VAR_6++) { VAR_0[VAR_6] = VAR_2[VAR_6]; for (VAR_5 = 1; VAR_5 <= VAR_4; VAR_5++) VAR_0[VAR_6] -= VAR_1[VAR_5-1] * VAR_0[VAR_6-VAR_5]; } #endif
}