Commit 64cd98d5 authored by norvell's avatar norvell
Browse files

Solved one test case in Readme_EVS_dec.txt. fft_fx.c triggers many overflows....

Solved one test case in Readme_EVS_dec.txt. fft_fx.c triggers many overflows. Perhaps all operations should use _o variant
parent 3b7dfbef
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -315,11 +315,19 @@ void edct_16fx(

        L_tmp = L_mult(x[i2],edct_table[i]);/*Q(Qx+16) */
        Lacc = L_mac(L_tmp,*px,*pt);/*Q(Qx+16) */
#ifdef BASOP_NOGLOB
        re2[i] = round_fx(L_shl_o(Lacc, Q_edct, &Overflow)); /* Q(Qx+Q_edct) */
#else
        re2[i] = round_fx(L_shl(Lacc, Q_edct)); /* Q(Qx+Q_edct) */
#endif

        L_tmp = L_mult(*px,edct_table[i]);/*Q(Qx+16) */
        Lacc = L_msu(L_tmp,x[i2],*pt);/*Q(Qx+16) */
#ifdef BASOP_NOGLOB
        im2[i] = round_fx(L_shl_o(Lacc, Q_edct, &Overflow)); /* Q(Qx+Q_edct) */
#else
        im2[i] = round_fx(L_shl(Lacc, Q_edct)); /* Q(Qx+Q_edct) */
#endif

        px -= 2;
        pt--;
@@ -352,7 +360,11 @@ void edct_16fx(
#endif

        tmp = mult_r(re2[i],fact); /*Q(Qx+Q_edct) */
#ifdef BASOP_NOGLOB
        im[i] = add_o(im2[i], tmp, &Overflow); /*Q(Qx+Q_edct) */  move16();
#else
        im[i] = add(im2[i],tmp); /*Q(Qx+Q_edct) */  move16();
#endif
    }

    /* Post-rotate and obtain the output data */
+8 −0
Original line number Diff line number Diff line
@@ -81,6 +81,10 @@ void enhancer_fx(
    Word16 gain_code_hi;
    Word16 pit_sharp, tmp16;
    Word16 excp[L_SUBFR], sc;
#ifdef BASOP_NOGLOB
    Flag Overflow = 0;
#endif


    pit_sharp = gain_pit;
    move16();       /* to remove gcc warning */
@@ -137,7 +141,11 @@ void enhancer_fx(
     *-----------------------------------------------------------*/

    /* tmp = 0.5f * (1.0f - voice_fac) */
#ifdef BASOP_NOGLOB
    tmp = msu_ro(0x40000000, voice_fac, 16384, &Overflow); /*Q15 */ /* 1=unvoiced, 0=voiced */
#else
    tmp = msu_r(0x40000000, voice_fac, 16384); /*Q15 */ /* 1=unvoiced, 0=voiced */
#endif
    /* fac = stab_fac * tmp */
    fac = mult(stab_fac, tmp); /*Q15*/

+188 −29
Original line number Diff line number Diff line
@@ -1712,17 +1712,22 @@ static void cftfsub_16fx(
            j1 = add(j,l);
#ifdef BASOP_NOGLOB
            x0r = sub_o(a[j], a[j1], &Overflow);
            x0i = sub_o(a[j + 1], a[j1 + 1], &Overflow);
#else
            x0r = sub(a[j],a[j1]);
#endif
            x0i = sub(a[j + 1], a[j1 + 1]);
#endif
#ifdef BASOP_NOGLOB
            a[j] = add_o(a[j], a[j1], &Overflow);
#else
            a[j] = add(a[j],a[j1]);
#endif
            move16();
#ifdef BASOP_NOGLOB
            a[j + 1] = add_o(a[j + 1], a[j1 + 1], &Overflow);
#else
            a[j + 1] = add(a[j + 1],a[j1 + 1]);
#endif
            move16();
            a[j1] = x0r;
            move16();
@@ -1748,6 +1753,9 @@ static void cft1st_16fx(
    Word16 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    Word16 tmp;
    Word32 L_tmp;
#ifdef BASOP_NOGLOB
    Flag Overflow = 0;
#endif

    x0r = add(a[0],a[2]);
    x0i = add(a[1],a[3]);
@@ -1887,8 +1895,13 @@ static void cft1st_16fx(

        x0r = add(a[j + 8],a[j + 10]);
        x0i = add(a[j + 9],a[j + 11]);
#ifdef BASOP_NOGLOB
        x1r = sub_o(a[j + 8], a[j + 10], &Overflow);
        x1i = sub_o(a[j + 9], a[j + 11], &Overflow);
#else
        x1r = sub(a[j + 8],a[j + 10]);
        x1i = sub(a[j + 9], a[j + 11]);
#endif
        x2r = add(a[j + 12],a[j + 14]);
        x2i = add(a[j + 13],a[j + 15]);
        x3r = sub(a[j + 12],a[j + 14]);
@@ -1903,7 +1916,11 @@ static void cft1st_16fx(
        tmp = negate(x0r);
        L_tmp = Mult_32_16(wk2i,tmp);/*Q(15+Qx+Q_edct) */
        L_tmp = Msub_32_16(L_tmp,wk2r,x0i); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
        a[j + 12] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
        a[j + 12] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

        tmp = negate(x0i);
        L_tmp = Mult_32_16(wk2i,tmp);/*Q(15+Qx+Q_edct) */
@@ -1918,7 +1935,11 @@ static void cft1st_16fx(

        L_tmp = Mult_32_16(wk1r,x0i);/*Q(15+Qx+Q_edct) */
        L_tmp = Madd_32_16(L_tmp,wk1i,x0r); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
        a[j + 11] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
        a[j + 11] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

        x0r = add(x1r,x3i);
        x0i = sub(x1i,x3r);
@@ -1929,7 +1950,11 @@ static void cft1st_16fx(

        L_tmp = Mult_32_16(wk3r,x0i); /*Q(15+Qx+Q_edct) */
        L_tmp = Madd_32_16(L_tmp,wk3i,x0r); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
        a[j + 15] = round_fx(L_shl_o(L_tmp, 1, &Overflow)); /*Q(Qx+Q_edct) */
#else
        a[j + 15] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif
    }

    return;
@@ -1952,11 +1977,45 @@ static void cftmdl_16fx(
    Word16 tmp, tmp2;
    Word32 L_tmp;
    Word32 L_x0r, L_x0i;
#ifdef BASOP_NOGLOB
    Flag Overflow = 0;
#endif


    m = shl(l, 2);
    move16();
    FOR (j = 0; j < l; j += 2)
    {

#ifdef BASOP_NOGLOB
        j1 = add_o(j, l, &Overflow);
        j2 = add_o(j1, l, &Overflow);
        j3 = add_o(j2, l, &Overflow);
        x0r = add_o(a[j], a[j1], &Overflow);
        x0i = add_o(a[j + 1], a[j1 + 1], &Overflow);
        x1r = sub_o(a[j], a[j1], &Overflow);
        x1i = sub_o(a[j + 1], a[j1 + 1], &Overflow);
        x2r = add_o(a[j2], a[j3], &Overflow);
        x2i = add_o(a[j2 + 1], a[j3 + 1], &Overflow);
        x3r = sub_o(a[j2], a[j3], &Overflow);
        x3i = sub_o(a[j2 + 1], a[j3 + 1], &Overflow);
        a[j] = add_o(x0r, x2r, &Overflow);
        move16();
        a[j + 1] = add_o(x0i, x2i, &Overflow);
        move16();
        a[j2] = sub_o(x0r, x2r, &Overflow);
        move16();
        a[j2 + 1] = sub_o(x0i, x2i, &Overflow);
        move16();
        a[j1] = sub_o(x1r, x3i, &Overflow);
        move16();
        a[j1 + 1] = add_o(x1i, x3r, &Overflow);
        move16();
        a[j3] = add_o(x1r, x3i, &Overflow);
        move16();
        a[j3 + 1] = sub_o(x1i, x3r, &Overflow);
        move16();
#else
        j1 = add(j, l);
        j2 = add(j1, l);
        j3 = add(j2, l);
@@ -1984,6 +2043,7 @@ static void cftmdl_16fx(
        move16();
        a[j3 + 1] = sub(x1i, x3r);
        move16();
#endif        
    }

    wk1r = w[2];
@@ -1996,10 +2056,24 @@ static void cftmdl_16fx(
        j3 = add(j2,l);
        x0r = add(a[j],a[j1]);
        x0i = add(a[j + 1],a[j1 + 1]);
#ifdef BASOP_NOGLOB
        x1r = sub_o(a[j], a[j1], &Overflow);
        x1i = sub_o(a[j + 1], a[j1 + 1], &Overflow);
#else
        x1r = sub(a[j],a[j1]);
        x1i = sub(a[j + 1], a[j1 + 1]);
#endif
        x2r = add(a[j2],a[j3]);
        x2i = add(a[j2 + 1],a[j3 + 1]);
#ifdef BASOP_NOGLOB
        x3r = sub_o(a[j2], a[j3], &Overflow);
        x3i = sub_o(a[j2 + 1], a[j3 + 1], &Overflow);
        a[j] = add_o(x0r, x2r, &Overflow);
        move16();
        a[j + 1] = add_o(x0i, x2i, &Overflow);
        move16();
        a[j2] = sub_o(x2i, x0i, &Overflow);
#else
        x3r = sub(a[j2],a[j3]);
        x3i = sub(a[j2 + 1], a[j3 + 1]);
        a[j] = add(x0r, x2r);
@@ -2007,27 +2081,48 @@ static void cftmdl_16fx(
        a[j + 1] = add(x0i, x2i);
        move16();
        a[j2] = sub(x2i, x0i);
#endif
        move16();
#ifdef BASOP_NOGLOB
        a[j2 + 1] = sub_o(x0r, x2r, &Overflow);
#else
        a[j2 + 1] = sub(x0r,x2r);
#endif
        move16();

        x0r = sub(x1r,x3i);
        x0i = add(x1i,x3r);
#ifdef BASOP_NOGLOB
        tmp = sub_o(x0r, x0i, &Overflow);
#else
        tmp = sub(x0r,x0i);
#endif
        L_tmp = Mult_32_16(wk1r,tmp);/*Q(15+Qx+Q_edct) */
        a[j1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */

#ifdef BASOP_NOGLOB
        tmp = add_o(x0r, x0i, &Overflow);
#else
        tmp = add(x0r,x0i);
#endif
        L_tmp = Mult_32_16(wk1r,tmp); /*Q(15+Qx+Q_edct) */
        a[j1 + 1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */

        x0r = add(x3i,x1r);
        x0i = sub(x3r,x1i);
#ifdef BASOP_NOGLOB
        tmp = sub_o(x0i, x0r, &Overflow);
#else
        tmp = sub(x0i,x0r);
#endif
        L_tmp = Mult_32_16(wk1r,tmp);/*Q(15+Qx+Q_edct) */
        a[j3] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */

#ifdef BASOP_NOGLOB
        tmp = add_o(x0i, x0r, &Overflow);
#else
        tmp = add(x0i,x0r);
#endif
        L_tmp = Mult_32_16(wk1r,tmp); /*Q(15+Qx+Q_edct) */
        a[j3 + 1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
    }
@@ -2061,30 +2156,52 @@ static void cftmdl_16fx(
            x1i = sub(a[j + 1],a[j1 + 1]);
            x2r = add(a[j2],a[j3]);
            x2i = add(a[j2 + 1],a[j3 + 1]);
#ifdef BASOP_NOGLOB
            x3r = sub_o(a[j2], a[j3], &Overflow);
            x3i = sub_o(a[j2 + 1], a[j3 + 1], &Overflow);
#else
            x3r = sub(a[j2],a[j3]);
            x3i = sub(a[j2 + 1], a[j3 + 1]);
#endif
            a[j] = add(x0r,x2r);
            move16();
            a[j + 1] = add(x0i,x2i);
            move16();

#ifdef BASOP_NOGLOB
            x0r = sub_o(x0r, x2r, &Overflow);
            x0i = sub_o(x0i, x2i, &Overflow);
#else
            x0r = sub(x0r,x2r);
            x0i = sub(x0i, x2i);
#endif

            L_tmp = Mult_32_16(wk2r,x0r); /*Q(15+Qx+Q_edct) */
            L_tmp = Msub_32_16(L_tmp,wk2i,x0i); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j2] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j2] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            L_tmp = Mult_32_16(wk2r,x0i); /*Q(15+Qx+Q_edct) */
            L_tmp = Madd_32_16(L_tmp,wk2i,x0r); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j2 + 1] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j2 + 1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            x0r = sub(x1r,x3i);
            x0i = add(x1i,x3r);

            L_tmp = Mult_32_16(wk1r,x0r); /*Q(15+Qx+Q_edct) */
            L_tmp = Msub_32_16(L_tmp,wk1i,x0i); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j1] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            L_tmp = Mult_32_16(wk1r,x0i); /*Q(15+Qx+Q_edct) */
            L_tmp = Madd_32_16(L_tmp,wk1i,x0r); /*Q(15+Qx+Q_edct) */
@@ -2096,11 +2213,19 @@ static void cftmdl_16fx(
            x0i = extract_l(L_x0i);
            L_tmp = Mult_32_16(wk3r,x0r); /*Q(15+Qx+Q_edct) */
            L_tmp = Msub_32_16(L_tmp,wk3i,x0i); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j3] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j3] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            L_tmp = Mult_32_16(wk3r,x0i); /*Q(15+Qx+Q_edct) */
            L_tmp = Madd_32_16(L_tmp,wk3i,x0r); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j3 + 1] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j3 + 1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif
        }

        wk1r = w[k2 + 2];
@@ -2125,47 +2250,81 @@ static void cftmdl_16fx(
            x1i = sub(a[j + 1],a[j1 + 1]);
            x2r = add(a[j2],a[j3]);
            x2i = add(a[j2 + 1],a[j3 + 1]);
#ifdef BASOP_NOGLOB
            x3r = sub_o(a[j2], a[j3], &Overflow);
            x3i = sub_o(a[j2 + 1], a[j3 + 1], &Overflow);
#else
            x3r = sub(a[j2],a[j3]);
            x3i = sub(a[j2 + 1], a[j3 + 1]);
#endif
            a[j] = add(x0r,x2r);
            move16();
            a[j + 1] = add(x0i,x2i);
            move16();

#ifdef BASOP_NOGLOB
            x0r = sub_o(x0r, x2r, &Overflow);
            x0i = sub_o(x0i, x2i, &Overflow);
#else
            x0r = sub(x0r,x2r);
            x0i = sub(x0i, x2i);
#endif

            tmp = negate(x0r);
            L_tmp = Mult_32_16(wk2i,tmp);/*Q(15+Qx+Q_edct) */
            L_tmp = Msub_32_16(L_tmp,wk2r,x0i); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j2] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j2] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            tmp = negate(x0i);
            L_tmp = Mult_32_16(wk2i,tmp);/*Q(15+Qx+Q_edct) */
            L_tmp = Madd_32_16(L_tmp,wk2r,x0r); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j2 + 1] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j2 + 1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            x0r = sub(x1r,x3i);
            x0i = add(x1i,x3r);

            L_tmp = Mult_32_16(wk1r,x0r);/*Q(15+Qx+Q_edct) */
            L_tmp = Msub_32_16(L_tmp,wk1i,x0i); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j1] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            L_tmp = Mult_32_16(wk1r,x0i);/*Q(15+Qx+Q_edct) */
            L_tmp = Madd_32_16(L_tmp,wk1i,x0r); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j1 + 1] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j1 + 1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            x0r = add(x1r,x3i);
            x0i = sub(x1i,x3r);

            L_tmp = Mult_32_16(wk3r,x0r); /*Q(15+Qx+Q_edct) */
            L_tmp = Msub_32_16(L_tmp,wk3i,x0i); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j3] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j3] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif

            L_tmp = Mult_32_16(wk3r,x0i); /*Q(15+Qx+Q_edct) */
            L_tmp = Madd_32_16(L_tmp,wk3i,x0r); /*Q(15+Qx+Q_edct) */
#ifdef BASOP_NOGLOB
            a[j3 + 1] = round_fx_o(L_shl_o(L_tmp, 1, &Overflow), &Overflow); /*Q(Qx+Q_edct) */
#else
            a[j3 + 1] = round_fx(L_shl(L_tmp,1)); /*Q(Qx+Q_edct) */
#endif
        }
    }

+16 −0
Original line number Diff line number Diff line
@@ -158,6 +158,10 @@ Word16 frame_energy_fx( /* o : Frame energy in
    const Word16 *pt1;
    Word16 tmp16, exp1, exp2, tmp1, tmp2;
    Word16 len, enern;
#ifdef BASOP_NOGLOB
    Flag Overflow = 0;
#endif


    /* len = (0.5f * (pitch[2]/64.0 + pitch[3]/64.0) + 0.5f) */
    len = mult_r(add(pitch[2], pitch[3]), 256);
@@ -191,14 +195,26 @@ Word16 frame_energy_fx( /* o : Frame energy in

    /*add ld(2^exp1)=exp1 but check format, first*/
    tmp16=sub(sub(15,norm_s(exp1)),5); /*factor to shift Ltmp and exp1 with (shr) to avoid overflows when adding*/
#ifdef BASOP_NOGLOB
    Ltmp = L_shr_o(Ltmp, tmp16, &Overflow); /*Q25, tmp16*/
#else
    Ltmp= L_shr(Ltmp,tmp16); /*Q25, tmp16*/
#endif
    exp2 = shr(exp1,tmp16);  /*Q0 , tmp16*/
#ifdef BASOP_NOGLOB
    Ltmp = L_add_o(Ltmp, L_shl(L_deposit_l(exp2), 25), &Overflow); /*Q25, tmp16, normalized*/
#else
    Ltmp = L_add(Ltmp,L_shl(L_deposit_l(exp2),25)); /*Q25, tmp16, normalized*/
#endif

    /*make 10*log10 out of log2*/
    Ltmp = Mpy_32_16_1(Ltmp,LG10); /*Q25,tmp16 * Q13 = Q23, tmp16*/
    *frame_ener = extract_h(L_shl(Ltmp,add(tmp16,1)));/*Q8*/                    move16();
#ifdef BASOP_NOGLOB
    enern = sub_o(*frame_ener, lp_speech, &Overflow); /*Q8*/
#else
    enern = sub( *frame_ener  ,lp_speech); /*Q8*/
#endif

    return enern;
}
+7 −0
Original line number Diff line number Diff line
@@ -177,6 +177,9 @@ void hq_lr_dec_fx(
    Word16 beta_fx;/*Q14 1.05f; */
    Word16 adjustFlag;
    Word16 bw_low, bw_high;
#ifdef BASOP_NOGLOB
    Flag Overflow = 0;
#endif

    HQ_DEC_HANDLE hHQ_core = st_fx->hHQ_core;

@@ -499,7 +502,11 @@ void hq_lr_dec_fx(
                {
                    L_tmp = Mult_32_16(Ep_tmp_fx[i],sub(bands_fx,lowband));/*Q(13+0-15 = -2) */
                    tmp = Calc_inv(L_shl(L_tmp,14), &exp);
#ifdef BASOP_NOGLOB
                    L_tmp = L_shl_o(Mult_32_16(Ep_avrg_fx, tmp), sub(14, exp), &Overflow);/*Q(13+exp-15 +14-exp+2 = 14) */
#else
                    L_tmp = L_shl(Mult_32_16(Ep_avrg_fx,tmp),sub(14,exp));/*Q(13+exp-15 +14-exp+2 = 14) */
#endif
                    L_tmp =L_max(L_tmp,16384); /*14 */
                    tmp=extract_l(L_min(L_tmp,beta_fx)); /*14 */
                    alpha_fx=shl(mult(alpha_fx,tmp),1);/*14+14-15 +1=14 */
Loading