diff --git a/lib_com/cldfb_evs_fx.c b/lib_com/cldfb_evs_fx.c index 51c9ee6f9568dbc05a9f19927fa53fa7bfcca3f2..710ecf121251dfda9e387da641d629d451268a6d 100644 --- a/lib_com/cldfb_evs_fx.c +++ b/lib_com/cldfb_evs_fx.c @@ -1329,7 +1329,11 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) { FOR( j = 20; j < numberBandsM; j++ ) { +#ifdef ISSUE_1799_replace_L_shr_o + nrg = L_add_o( nrg, L_shr_sat( energyValues[k][j], s ), &Overflow ); +#else nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); +#endif } } @@ -1352,7 +1356,11 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) { FOR( j = 20; j < numberBandsM; j++ ) { +#ifdef ISSUE_1799_replace_L_shr_o + nrg = L_add_o( nrg, L_shr_sat( energyValues[k][j], s ), &Overflow ); +#else nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); +#endif } } diff --git a/lib_com/cldfb_fx.c b/lib_com/cldfb_fx.c index 886a2375869ec18af770ba6a8a86b1e74641980f..43e94a068c21733308ee22a9fb93f83efe4ec201 100644 --- a/lib_com/cldfb_fx.c +++ b/lib_com/cldfb_fx.c @@ -1590,7 +1590,11 @@ static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead, /*!< o: Q(*sf_e { FOR( j = 20; j < numberBandsM; j++ ) { +#ifdef ISSUE_1799_replace_L_shr_o + nrg = L_add_o( nrg, L_shr_sat( energyValues[k][j], s ), &Overflow ); +#else nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); +#endif } } @@ -1613,7 +1617,11 @@ static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead, /*!< o: Q(*sf_e { FOR( j = 20; j < numberBandsM; j++ ) { +#ifdef ISSUE_1799_replace_L_shr_o + nrg = L_add_o( nrg, L_shr_sat( energyValues[k][j], s ), &Overflow ); +#else nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); +#endif } } diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c index e335e943511d142b8a5a164981d00825edc9bb01..00ce93218f4d3a5682d13d549729e3a5cb9e7445 100644 --- a/lib_com/cng_exc_fx.c +++ b/lib_com/cng_exc_fx.c @@ -904,7 +904,11 @@ void cng_params_upd_fx( tmpv = shl( *pt_exc2, scale ); L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); pt_exc2++; - L_ener = L_add_o( L_ener, L_shr_o( L_tmp, 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ +#ifdef ISSUE_1799_replace_L_shr_o + L_ener = L_add_o( L_ener, L_shr_sat( L_tmp, 7 ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ +#else + L_ener = L_add_o( L_ener, L_shr_o( L_tmp, 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ +#endif } } ELSE /* L_FRAME16k */ @@ -917,10 +921,18 @@ void cng_params_upd_fx( tmpv = shl( *pt_exc2, scale ); L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); pt_exc2++; +#ifdef ISSUE_1799_replace_L_shr_o + L_ener = L_add_o( L_ener, L_shr_sat( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7 ), &Overflow ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ +#else L_ener = L_add_o( L_ener, L_shr_o( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ +#endif } } - L_ener = L_shr_o( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ), &Overflow ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ +#ifdef ISSUE_1799_replace_L_shr_o + L_ener = L_shr_sat( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ) ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ +#else + L_ener = L_shr_o( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ), &Overflow ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ +#endif /* update the circular buffer of old energies */ ho_ener_circ[*ho_circ_ptr] = L_ener; @@ -1082,7 +1094,11 @@ void cng_params_upd_ivas_fx( tmpv = shl( *pt_exc2, scale ); L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); pt_exc2++; - L_ener = L_add_o( L_ener, L_shr_o( L_tmp, 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ +#ifdef ISSUE_1799_replace_L_shr_o + L_ener = L_add_o( L_ener, L_shr_sat( L_tmp, 7 ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ +#else + L_ener = L_add_o( L_ener, L_shr_o( L_tmp, 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+1) ,division by L_frame done here */ +#endif } } ELSE /* L_FRAME16k */ @@ -1095,10 +1111,18 @@ void cng_params_upd_ivas_fx( tmpv = shl( *pt_exc2, scale ); L_tmp = L_mac0_o( L_tmp, tmpv, tmpv, &Overflow ); pt_exc2++; +#ifdef ISSUE_1799_replace_L_shr_o + L_ener = L_add_o( L_ener, L_shr_sat( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7 ), &Overflow ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ +#else L_ener = L_add_o( L_ener, L_shr_o( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7, &Overflow ), &Overflow ); /* Q(2*(Q_exc+scale)+15+1-16+1) ,division by L_frame done here */ +#endif } } - L_ener = L_shr_o( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ), &Overflow ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ +#ifdef ISSUE_1799_replace_L_shr_o + L_ener = L_shr_sat( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ) ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ +#else + L_ener = L_shr_o( L_ener, sub( shl( add( Q_exc, scale ), 1 ), 5 ), &Overflow ); /* Q6 (2*(Q_exc+scale)+1-2*(Q_exc+scale)+5) */ +#endif /* update the circular buffer of old energies */ ho_ener_circ[*ho_circ_ptr] = L_ener; @@ -1137,7 +1161,11 @@ void cng_params_upd_ivas_fx( L_tmp = L_add_o( L_tmp, L_tmp, &Overflow ); /* 2*Q_exc+1 */ L_tmp = Mult_32_16( L_tmp, 128 ); /* 2*Q_exc+1 */ tmp = add( add( Q_exc, Q_exc ), 1 ); +#ifdef ISSUE_1799_replace_L_shr_o + sp[i] = L_shr_sat( L_tmp, sub( tmp, 6 ) ); +#else sp[i] = L_shr_o( L_tmp, sub( tmp, 6 ), &Overflow ); +#endif move32(); /* Q6 */ ptR++; ptI--; diff --git a/lib_com/edct_fx.c b/lib_com/edct_fx.c index 1b303d2856fda4a014caf1cee1775de7064e2294..c30ed4a57c1bdfd74e2a6ea43449b5e8bddcd4aa 100644 --- a/lib_com/edct_fx.c +++ b/lib_com/edct_fx.c @@ -502,14 +502,22 @@ void edct_16fx( { i2 = shl( i, 1 ); - L_tmp = L_mult( re[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ - Lacc = L_mac_o( L_tmp, im[i], *pt, &Overflow ); /*Q(Qx+Q_edct+16) */ + L_tmp = L_mult( re[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ + Lacc = L_mac_o( L_tmp, im[i], *pt, &Overflow ); /*Q(Qx+Q_edct+16) */ +#ifdef ISSUE_1799_replace_L_shr_o + y[i2] = round_fx_o( L_shr_sat( Lacc, Q_edct ), &Overflow ); /* Q(Qx) */ +#else y[i2] = round_fx_o( L_shr_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx) */ +#endif move16(); L_tmp = L_mult( re[i], edct_table[sub( shr( length, 1 ), add( 1, i ) )] ); /*Q(Qx+Q_edct+16) */ Lacc = L_msu( L_tmp, im[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ - *py = round_fx_o( L_shr_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx) */ +#ifdef ISSUE_1799_replace_L_shr_o + *py = round_fx_o( L_shr_sat( Lacc, Q_edct ), &Overflow ); /* Q(Qx) */ +#else + *py = round_fx_o( L_shr_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx) */ +#endif move16(); py -= 2; diff --git a/lib_com/frame_ener_fx.c b/lib_com/frame_ener_fx.c index 68fdf33c3a2db5ba8703f436ddc1e1043d17eef4..f3dbe52bda5e7738bdd04a41f8d2902e9abcc027 100644 --- a/lib_com/frame_ener_fx.c +++ b/lib_com/frame_ener_fx.c @@ -276,8 +276,12 @@ Word16 frame_energy_fx( /* o : Frame energy in Q8 exp1 = sub( 15 + exp1, tmp2 ); /*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*/ - Ltmp = L_shr_o( Ltmp, tmp16, &Overflow ); /*Q25, tmp16*/ + tmp16 = sub( sub( 15, norm_s( exp1 ) ), 5 ); /*factor to shift Ltmp and exp1 with (shr) to avoid overflows when adding*/ +#ifdef ISSUE_1799_replace_L_shr_o + Ltmp = L_shr_sat( Ltmp, tmp16 ); /*Q25, tmp16*/ +#else + Ltmp = L_shr_o( Ltmp, tmp16, &Overflow ); /*Q25, tmp16*/ +#endif exp2 = shr( exp1, tmp16 ); /*Q0 , tmp16*/ Ltmp = L_add_o( Ltmp, L_shl( L_deposit_l( exp2 ), 25 ), &Overflow ); /*Q25, tmp16, normalized*/ diff --git a/lib_com/hp50_fx.c b/lib_com/hp50_fx.c index 4a055e0733df912583fd38b86930508aa0187031..0e412f70d6e618f6ea2154250a2a92640c7deadb 100644 --- a/lib_com/hp50_fx.c +++ b/lib_com/hp50_fx.c @@ -212,13 +212,29 @@ void hp20( Word16 signal[], /* i/o: signal to filter any * IF( prescale != prescaleOld ) { diff = sub( prescale, prescaleOld ); +#ifdef ISSUE_1799_replace_L_shr_o + mem[0] = L_shr_sat( mem[0], diff ); +#else mem[0] = L_shr_o( mem[0], diff, &Overflow ); +#endif move32(); +#ifdef ISSUE_1799_replace_L_shr_o + mem[1] = L_shr_sat( mem[1], diff ); +#else mem[1] = L_shr_o( mem[1], diff, &Overflow ); +#endif move32(); +#ifdef ISSUE_1799_replace_L_shr_o + mem[2] = L_shr_sat( mem[2], diff ); +#else mem[2] = L_shr_o( mem[2], diff, &Overflow ); +#endif move32(); +#ifdef ISSUE_1799_replace_L_shr_o + mem[3] = L_shr_sat( mem[3], diff ); +#else mem[3] = L_shr_o( mem[3], diff, &Overflow ); +#endif move32(); mem[4] = L_deposit_l( prescale ); } @@ -325,13 +341,29 @@ void hp20_fx_32( prescale = s_min( 3, sub( 1 + HP20_COEFF_SCALE, prescale ) ); diff = sub( prescale, prescaleOld ); +#ifdef ISSUE_1799_replace_L_shr_o + mem_fx[0] = L_shr_sat( mem_fx[0], diff ); +#else mem_fx[0] = L_shr_o( mem_fx[0], diff, &Overflow ); +#endif move32(); +#ifdef ISSUE_1799_replace_L_shr_o + mem_fx[1] = L_shr_sat( mem_fx[1], diff ); +#else mem_fx[1] = L_shr_o( mem_fx[1], diff, &Overflow ); +#endif move32(); +#ifdef ISSUE_1799_replace_L_shr_o + mem_fx[2] = L_shr_sat( mem_fx[2], diff ); +#else mem_fx[2] = L_shr_o( mem_fx[2], diff, &Overflow ); +#endif move32(); +#ifdef ISSUE_1799_replace_L_shr_o + mem_fx[3] = L_shr_sat( mem_fx[3], diff ); +#else mem_fx[3] = L_shr_o( mem_fx[3], diff, &Overflow ); +#endif move32(); mem_fx[4] = L_deposit_l( prescale_current_frame ); move32(); diff --git a/lib_com/hq2_noise_inject_fx.c b/lib_com/hq2_noise_inject_fx.c index fdd0d6d7183761b85034098b8c32a9ccca1d3d9b..db1099809b92786326e95362ef54bbdcbc7c9341 100644 --- a/lib_com/hq2_noise_inject_fx.c +++ b/lib_com/hq2_noise_inject_fx.c @@ -467,7 +467,11 @@ void hq2_noise_inject_fx( } L_tmp = Mult_32_16( Ep_fx[k], fac_fx ); /*Q(Q_Ep_fx[k]+12-15 = Q_Ep_fx[k]-3) */ +#ifdef ISSUE_1799_replace_L_shr_o + ni_gain_fx[k] = L_shr_sat( L_tmp, sub( Q_Ep_fx[k], 20 ) ); +#else ni_gain_fx[k] = L_shr_o( L_tmp, sub( Q_Ep_fx[k], 20 ), &Overflow ); +#endif move32(); /*Q17 */ } ELSE diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index b4838e0c13dad83770c707f56da1f34bc835367b..ea5e51cefa7b2eea7aef7f8fcf7f36c3ba244d26 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -1800,18 +1800,27 @@ void a2rc_fx( const Word16 *a, /* i: can be any Q */ L_tmp1 = L_mac_o( L_tmp1, tmp, f_fx[n], &Overflow ); /* denom*f[j]+km*denom*f[n] in Q28 (floating with exp) */ L_tmp2 = L_mult( denom_mant, f_fx[n] ); /* denom*f[n]. Q15*Q12 = Q28 (floating with exp) */ L_tmp2 = L_mac_o( L_tmp2, tmp, f_fx[j], &Overflow ); /* denom*f[n]+km*denom*f[j] in Q28 (floating with exp) */ - L_tmp1 = L_shr_o( L_tmp1, exp, &Overflow ); /* bringing to true Q28 */ - L_tmp2 = L_shr_o( L_tmp2, exp, &Overflow ); /* bringing to true Q28 */ - f_fx[j] = round_fx_o( L_tmp1, &Overflow ); /* extracting in q_a */ - f_fx[n] = round_fx_o( L_tmp2, &Overflow ); /* extracting in q_a */ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp1 = L_shr_sat( L_tmp1, exp ); /* bringing to true Q28 */ + L_tmp2 = L_shr_sat( L_tmp2, exp ); /* bringing to true Q28 */ +#else + L_tmp1 = L_shr_o( L_tmp1, exp, &Overflow ); /* bringing to true Q28 */ + L_tmp2 = L_shr_o( L_tmp2, exp, &Overflow ); /* bringing to true Q28 */ +#endif + f_fx[j] = round_fx_o( L_tmp1, &Overflow ); /* extracting in q_a */ + f_fx[n] = round_fx_o( L_tmp2, &Overflow ); /* extracting in q_a */ } IF( m & 1 ) { L_tmp1 = L_mult( denom_mant, f_fx[j] ); /* denom*f[j]. Q15*Q12 = Q28 (floating with exp) */ L_tmp1 = L_mac_o( L_tmp1, tmp, f_fx[j], &Overflow ); /* denom*f[j]+km*denom*f[j] in Q28 (floating with exp) */ - L_tmp1 = L_shr_o( L_tmp1, exp, &Overflow ); /* bringing to true Q28 */ - f_fx[j] = round_fx_o( L_tmp1, &Overflow ); /* extracting in q_a */ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp1 = L_shr_sat( L_tmp1, exp ); /* bringing to true Q28 */ +#else + L_tmp1 = L_shr_o( L_tmp1, exp, &Overflow ); /* bringing to true Q28 */ +#endif + f_fx[j] = round_fx_o( L_tmp1, &Overflow ); /* extracting in q_a */ move16(); } } @@ -2317,7 +2326,7 @@ Word16 lsf_stab_fx( /* o : LP filter stability Q15*/ #ifdef ISSUE_1796_replace_shl_o tmp = shl_sat( tmp, 1 ); /* Q14 -> Q15 with saturation */ #else - tmp = shl_o( tmp, 1, &Overflow ); /* Q14 -> Q15 with saturation */ + tmp = shl_o( tmp, 1, &Overflow ); /* Q14 -> Q15 with saturation */ #endif tmp = s_max( tmp, 0 ); diff --git a/lib_com/lsp_conv_poly_fx.c b/lib_com/lsp_conv_poly_fx.c index fe6ac4f7ccaa0657f9b093934977a88c2d514f36..2e989cfbf5b9d819257cd086c85f48fc955c21d6 100644 --- a/lib_com/lsp_conv_poly_fx.c +++ b/lib_com/lsp_conv_poly_fx.c @@ -427,7 +427,11 @@ static Word32 inv_pow( } tmp = div_s( (Word16) ( ( 1 << 14 ) - 1 ), tmp ); exp1 = add( exp1, exp2 ); +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_shr_sat( tmp, sub( 31, exp1 ) ); /* result in Q15 */ +#else L_tmp = L_shr_o( tmp, sub( 31, exp1 ), &Overflow ); /* result in Q15 */ +#endif return ( L_tmp ); } diff --git a/lib_com/options.h b/lib_com/options.h index b2bb8e4050b90cc73afc38bdc8f652dd061940ed..14fd30ac5d21519cf9e29de257505950a2263986 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,7 +82,8 @@ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ #define FIX_1762_COMPILER_ISSUE_NEW /* FhG: fix compiler issues with W_mac_32_32() + ONE_IN_Q30 */ -#define ISSUE_1796_replace_shl_o /*FhG: replace shl_ro by overflow-free alternatives - BE*/ +#define ISSUE_1796_replace_shl_o /* FhG: replace shl_ro by overflow-free alternatives - BE*/ +#define ISSUE_1799_replace_L_shr_o /* FhG: replace by non-overflow-alternative - BE */ #define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index 0c6e30547dec0b7c37cca0d02480050530c94716..138fbd705dd25eca9a3b8d79254ad4a5e6fea359 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -595,7 +595,12 @@ Word32 calc_tilt_bwe_fx( /* o : Tilt in Q24 tmp1 = mult_ro( *ptr++, 8192 /*0.25 in Q15 */, &Overflow ); /* Divide by 4 */ L_ener = L_mac0_o( L_ener, tmp1, tmp1, &Overflow ); } +#ifdef ISSUE_1799_replace_L_shr_o + /*Overflow will never happen because exp2 is always positive*/ + L_ener = L_shr( L_ener, exp2 ); +#else L_ener = L_shr_o( L_ener, exp2, &Overflow ); +#endif L_temp = L_add_o( L_ener_tot, L_ener, &Overflow ); IF( Overflow != 0 ) { diff --git a/lib_com/syn_filt_fx.c b/lib_com/syn_filt_fx.c index 7724e596ceff1bf8a71b8d057f628c0dbb248dcc..e0315bbcb1c0c0a733b4f84404beaab10fab1bd3 100644 --- a/lib_com/syn_filt_fx.c +++ b/lib_com/syn_filt_fx.c @@ -480,7 +480,11 @@ void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[] *-----------------------------------------------------------------------*/ mem += m; /*move32();*/ +#ifdef ISSUE_1799_replace_L_shr_o + a0 = L_shr_sat( a[0], shift ); /* input / 2^shift */ +#else a0 = L_shr_o( a[0], shift, &Overflow ); /* input / 2^shift */ +#endif /*-----------------------------------------------------------------------* * Do the filtering diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 6771c144c0619a63a5b99112c8dc87871b4ff74f..5e116a286b3e84a2a49b9d36f51595cffa065ff5 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -3300,8 +3300,12 @@ Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) temp = mult_ro( *signal++, 16384, &Overflow ); L_temp = L_mac0_o( L_temp, temp, temp, &Overflow ); } - +#ifdef ISSUE_1799_replace_L_shr_o + /*Overfloe will never happen because temp2 is always positive*/ + L_temp = L_shr( L_temp, temp2 ); +#else L_temp = L_shr_o( L_temp, temp2, &Overflow ); +#endif /* Here we try the addition just to check if we can sum the energy of the small (8 Iterations) loop with the total energy calculated so far without an overflow. diff --git a/lib_dec/LD_music_post_filter_fx.c b/lib_dec/LD_music_post_filter_fx.c index e3323060b67f3739402e8def26f25461c6ae08e5..4c3fa372892f8ac06b81c987492a58e36e01eb4c 100644 --- a/lib_dec/LD_music_post_filter_fx.c +++ b/lib_dec/LD_music_post_filter_fx.c @@ -599,7 +599,11 @@ static void spectrum_mod_dct_fx( Ltmp = L_mult( tmpN, m_binE ); /*2*Qdct+e_binE+9*/ e_binE = sub( add( e_tmp, e_binE ), 15 ); - Ltmp = L_shr_o( Ltmp, e_binE, &Overflow ); /*2*Qdct+9*/ +#ifdef ISSUE_1799_replace_L_shr_o + Ltmp = L_shr_sat( Ltmp, e_binE ); /*2*Qdct+9*/ +#else + Ltmp = L_shr_o( Ltmp, e_binE, &Overflow ); /*2*Qdct+9*/ +#endif Lgain = L_add_o( Ltmp, Lshift, &Overflow ); /*Saturation can occure here result in Q30*/ } @@ -928,7 +932,7 @@ static Word16 norm_lfe( #ifdef ISSUE_1796_replace_shl_o tmp16 = shl_sat( tmp16, exp3 ); /* Result in Q12 */ #else - tmp16 = shl_o( tmp16, exp3, &Overflow ); /* Result in Q12 */ + tmp16 = shl_o( tmp16, exp3, &Overflow ); /* Result in Q12 */ #endif return tmp16; diff --git a/lib_dec/pvq_decode_fx.c b/lib_dec/pvq_decode_fx.c index 649840f55ce2f942b1a2a5acfbfe16c21a456f4c..c9ed050a2c2c8f542636bc0822c76817e5e4975a 100644 --- a/lib_dec/pvq_decode_fx.c +++ b/lib_dec/pvq_decode_fx.c @@ -103,7 +103,11 @@ void pvq_decode_fx( Mpy_32_16_ss( L_isqrt, shl( y[i], shift_num ), &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *2*/ Mpy_32_16_ss( L_tmp, neg_gain_norm, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *Q15 *2*/ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_shr_sat( L_tmp, shift_tot ); +#else L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); +#endif xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15 , array move */ move16(); } diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 6f2dad29a9ba35f015b77718962fb5a161479556..eeaf56969dbba0b3388d2cf6e4dbae7ee979bd72 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -297,7 +297,11 @@ void bw_detect_fx( FOR( i = 0; i < BWD_TOTAL_WIDTH; i++ ) { +#ifdef ISSUE_1799_replace_L_shr_o + spect[i] = round_fx_o( L_shr_sat( spect32[i], Q_dct ), &Overflow ); +#else spect[i] = round_fx_o( L_shr_o( spect32[i], Q_dct, &Overflow ), &Overflow ); +#endif move16(); } Q_dct = -2; diff --git a/lib_enc/energy_fx.c b/lib_enc/energy_fx.c index 0168e52b11bbbd0c077eeb15366ba2ea3059130b..cc0001d4a7a1684d0a3329f4fa577272a6151d04 100644 --- a/lib_enc/energy_fx.c +++ b/lib_enc/energy_fx.c @@ -42,8 +42,10 @@ void est_energy_fx( const Word16 *Nregion_index; Word32 *sb_power = enerBuffer; Word32 Ltmp32 = 0; +#ifndef ISSUE_1799_replace_L_shr_o #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; +#endif #endif move32(); SNR_sb_num = SNR_SUB_BAND_NUM[bandwidth - CLDFBVAD_NB_ID]; @@ -125,7 +127,11 @@ void est_energy_fx( tmpspec_amp = L_shl( sb_power[j], s16MaxCoefNorm ); /* sb_power_Q + s16MaxCoefNorm */ s32CopyPower = L_add( s32CopyPower, tmpspec_amp ); } +#ifdef ISSUE_1799_replace_L_shr_o + frame_sb_energy[i] = L_shr_sat( s32CopyPower, s16MaxCoefNorm ); /* sb_power_Q */ +#else frame_sb_energy[i] = L_shr_o( s32CopyPower, s16MaxCoefNorm, &Overflow ); /* sb_power_Q */ +#endif move32(); } diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c index 17a3a2b2bdd5a712859c291e392e308e47100735..d2e946098eb7705583310860000b716b7485d424 100644 --- a/lib_enc/find_tilt_fx.c +++ b/lib_enc/find_tilt_fx.c @@ -175,7 +175,11 @@ void find_tilt_fx( m_tmp = div_s( m_tmp, m_cnt ); /* exp(e_tmp + e_cnt) */ e_tmp = sub( e_tmp, e_cnt ); - lp_E = L_sub_o( L_shr_o( m_tmp, sub( e_tmp, 1 ), &Overflow ), lp_bckr, &Overflow ); /* Q_new + QSCALE */ +#ifdef ISSUE_1799_replace_L_shr_o + lp_E = L_sub_o( L_shr_sat( m_tmp, sub( e_tmp, 1 ) ), lp_bckr, &Overflow ); /* Q_new + QSCALE */ +#else + lp_E = L_sub_o( L_shr_o( m_tmp, sub( e_tmp, 1 ), &Overflow ), lp_bckr, &Overflow ); /* Q_new + QSCALE */ +#endif pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame */ } @@ -203,7 +207,11 @@ void find_tilt_fx( m_tmp = div_s( m_tmp, m_hpE ); /* exp(e_tmp + e_hpE) */ e_tmp = sub( e_tmp, e_hpE ); - ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ +#ifdef ISSUE_1799_replace_L_shr_o + ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */ +#else + ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ +#endif } ELSE IF( lp_E == 0 ) { @@ -466,7 +474,11 @@ void find_tilt_ivas_fx( m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16 m_tmp = div_s( m_tmp, m_hpE ); // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr) e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) ); - ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ +#ifdef ISSUE_1799_replace_L_shr_o + ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */ +#else + ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ +#endif move32(); } diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index 6114fb69b844502bcbbdd368614f799f1dc06887..792ddf2657bb1179654586be941c73121a581717 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -178,7 +178,11 @@ Word16 find_uv_fx( /* o : coding type */ exp1 = sub( norm_l( *pt_enr_ssf1 ), 1 ); wtmp1 = extract_h( L_shl( *pt_enr_ssf1, exp1 ) ); fac = div_s( wtmp1, wtmp0 ); +#ifdef ISSUE_1799_replace_L_shr_o + fac_32 = L_shr_sat( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ) ); /* fac32 in Q13*/ +#else fac_32 = L_shr_o( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ), &Overflow ); /* fac32 in Q13*/ +#endif if ( GT_32( fac_32, dE1 ) ) { @@ -670,7 +674,11 @@ Word16 find_uv_ivas_fx( /* o : coding typ exp1 = sub( norm_l( *pt_enr_ssf1 ), 1 ); wtmp1 = extract_h( L_shl( *pt_enr_ssf1, exp1 ) ); fac = div_s( wtmp1, wtmp0 ); +#ifdef ISSUE_1799_replace_L_shr_o + fac_32 = L_shr_sat( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ) ); /* fac32 in Q13*/ +#else fac_32 = L_shr_o( L_deposit_l( fac ), add( sub( exp1, exp0 ), 15 - 13 ), &Overflow ); /* fac32 in Q13*/ +#endif if ( GT_32( fac_32, dE1 ) ) { diff --git a/lib_enc/hvq_enc_fx.c b/lib_enc/hvq_enc_fx.c index ceda6a1333624469c77cb633de881c69ac327e46..f6c45dab21681433a16b2a636f7f11b725a8e519 100644 --- a/lib_enc/hvq_enc_fx.c +++ b/lib_enc/hvq_enc_fx.c @@ -145,8 +145,12 @@ Word16 hvq_enc_ivas_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_NFPE_FACTOR_CUBE_FX ); /* in Q(12+6+1) = Q19 */ expNfpe3 = extract_l( L_mult0( expNfpe, 3 ) ); /* Cube operation */ /* Number of bits required to adjust to Q15 */ - adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ - noise_level[i] = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ + adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ +#ifdef ISSUE_1799_replace_L_shr_o + noise_level[i] = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ +#else + noise_level[i] = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ +#endif move16(); q_noise_level_idx[i] = quant_lc_fx( noise_level[i], &q_noise_level[i] ); move16(); @@ -176,9 +180,13 @@ Word16 hvq_enc_ivas_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_LB_NFPE_FACTOR_CUBE_FX ); /* in Q(12+9+1) = Q22 */ expo3 = extract_l( L_mult0( expo, 3 ) ); /* Cube operation. */ /* Number of bits required to adjust to Q15 */ - adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ - lb_nfpe = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ - IF( GT_16( lb_nfpe, 16384 ) ) /* in Q15 */ + adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ +#ifdef ISSUE_1799_replace_L_shr_o + lb_nfpe = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ +#else + lb_nfpe = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ +#endif + IF( GT_16( lb_nfpe, 16384 ) ) /* in Q15 */ { lb_nfpe = 16384; move16(); @@ -326,8 +334,12 @@ Word16 hvq_enc_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_NFPE_FACTOR_CUBE_FX ); /* in Q(12+6+1) = Q19 */ expNfpe3 = extract_l( L_mult0( expNfpe, 3 ) ); /* Cube operation */ /* Number of bits required to adjust to Q15 */ - adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ - noise_level[i] = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ + adjust = add( 19 - ( 15 + 16 ), expNfpe3 ); /* +16 is due to the following extract_h(). */ +#ifdef ISSUE_1799_replace_L_shr_o + noise_level[i] = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ +#else + noise_level[i] = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ +#endif move16(); q_noise_level_idx[i] = quant_lc_fx( noise_level[i], &q_noise_level[i] ); move16(); @@ -357,9 +369,13 @@ Word16 hvq_enc_fx( /*o : Consumed bits acc = L_mult( tmp16, HVQ_LB_NFPE_FACTOR_CUBE_FX ); /* in Q(12+9+1) = Q22 */ expo3 = extract_l( L_mult0( expo, 3 ) ); /* Cube operation. */ /* Number of bits required to adjust to Q15 */ - adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ - lb_nfpe = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ - IF( lb_nfpe > 16384 ) /* in Q15 */ + adjust = add( 22 - ( 15 + 16 ), expo3 ); /* +16 is due to the following extract_h(). */ +#ifdef ISSUE_1799_replace_L_shr_o + lb_nfpe = extract_h( L_shr_sat( acc, adjust ) ); /* noise_level[] in Q15 */ +#else + lb_nfpe = extract_h( L_shr_o( acc, adjust, &Overflow ) ); /* noise_level[] in Q15 */ +#endif + IF( lb_nfpe > 16384 ) /* in Q15 */ { lb_nfpe = 16384; move16(); diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 1ed2d8d043abb4c9db0c7704eb6abab2bd1e7454..224e4dddbcdc9183b1749fe35f9c4aab8876d069 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -1232,7 +1232,11 @@ void noise_est_fx( ExpDen = norm_l( Ltmp ); den = extract_h( L_shl( Ltmp, ExpDen ) ); num = div_s( num, den ); +#ifdef ISSUE_1799_replace_L_shr_o + noise_chartmp = extract_h( L_shr_sat( num, add( sub( ExpNum, ExpDen ), 4 - 16 ) ) ); /* Q11 */ +#else noise_chartmp = extract_h( L_shr_o( num, add( sub( ExpNum, ExpDen ), 4 - 16 ), &Overflow ) ); /* Q11 */ +#endif } noise_chartmp = s_min( noise_chartmp, (Word16) 10 << 11 ); /* Q11 */ @@ -1331,7 +1335,11 @@ void noise_est_fx( den = extract_h( L_shl( Lden, ExpDen ) ); num = div_s( num, den ); Ltmp = Mult_32_16( non_sta, num ); - non_sta = L_shr_o( Ltmp, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#ifdef ISSUE_1799_replace_L_shr_o + non_sta = L_shr_sat( Ltmp, sub( ExpNum, ExpDen ) ); /* Q10 */ +#else + non_sta = L_shr_o( Ltmp, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#endif } /* st->ave_enr[i] = alpha * st->ave_enr[i] + (1-alpha) * enr[i];*/ /* update long-term average */ @@ -1366,7 +1374,11 @@ void noise_est_fx( den = extract_h( L_shl( Lden, ExpDen ) ); num = div_s( num, den ); Ltmp1 = Mult_32_16( Lnon_sta2, num ); - Lnon_sta2 = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#ifdef ISSUE_1799_replace_L_shr_o + Lnon_sta2 = L_shr_sat( Ltmp1, sub( ExpNum, ExpDen ) ); /* Q10 */ +#else + Lnon_sta2 = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#endif } /* st_ave_enr2[i] = (float)alpha2 * st_ave_enr2[i] @@ -2556,7 +2568,7 @@ void noise_est_ivas_fx( #ifdef ISSUE_1796_replace_shl_o noise_chartmp = shl_sat( num, sub( sub( exp, exp2 ), 4 ) ); // 15+exp2-exp1 -> Q11 #else - noise_chartmp = shl_o( num, sub( sub( exp, exp2 ), 4 ), &Overflow ); // 15+exp2-exp1 -> Q11 + noise_chartmp = shl_o( num, sub( sub( exp, exp2 ), 4 ), &Overflow ); // 15+exp2-exp1 -> Q11 #endif } @@ -2685,9 +2697,13 @@ void noise_est_ivas_fx( ExpDen = norm_l( Lden ); den = extract_h( L_shl( Lden, ExpDen ) ); // q_enr+ExpDen-16 - num = div_s( num, den ); // 15+ExpNum-ExpDen - Ltmp1 = Mult_32_16( non_sta, num ); // 15+ExpNum-ExpDen+10-15 - non_sta = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ + num = div_s( num, den ); // 15+ExpNum-ExpDen + Ltmp1 = Mult_32_16( non_sta, num ); // 15+ExpNum-ExpDen+10-15 +#ifdef ISSUE_1799_replace_L_shr_o + non_sta = L_shr_sat( Ltmp1, sub( ExpNum, ExpDen ) ); /* Q10 */ +#else + non_sta = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#endif } /* st->ave_enr[i] = alpha * st->ave_enr[i] + (1-alpha) * enr[i];*/ /* update long-term average */ @@ -2724,9 +2740,13 @@ void noise_est_ivas_fx( ExpDen = norm_l( Lden ); den = extract_h( L_shl( Lden, ExpDen ) ); // q_enr+ExpDen-16 - num = div_s( num, den ); // 15+ExpNum-ExpDen - Ltmp1 = Mult_32_16( Lnon_sta2, num ); // 15+ExpNum-ExpDen+10-15 - Lnon_sta2 = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ + num = div_s( num, den ); // 15+ExpNum-ExpDen + Ltmp1 = Mult_32_16( Lnon_sta2, num ); // 15+ExpNum-ExpDen+10-15 +#ifdef ISSUE_1799_replace_L_shr_o + Lnon_sta2 = L_shr_sat( Ltmp1, sub( ExpNum, ExpDen ) ); /* Q10 */ +#else + Lnon_sta2 = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#endif } /* st_ave_enr2[i] = (float)alpha2 * st_ave_enr2[i] + (1.0f - alpha2) * (enr[i]) */ diff --git a/lib_enc/pitch_ol2_fx.c b/lib_enc/pitch_ol2_fx.c index cbeea8f1dd818e825eb8d075f0d61df51ddd9215..de47d85afe5be7b606fe2356554c538c2b8f1105 100644 --- a/lib_enc/pitch_ol2_fx.c +++ b/lib_enc/pitch_ol2_fx.c @@ -294,7 +294,11 @@ void StableHighPitchDetect_fx( tmp = abs_s( tmp ); tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS +#ifdef ISSUE_1799_replace_L_shr_o + diff = L_negate( L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ) ); +#else diff = L_negate( L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ) ); +#endif BASOP_SATURATE_WARNING_ON_EVS diff16 = round_fx_o( diff, &Overflow ); } @@ -302,7 +306,11 @@ void StableHighPitchDetect_fx( { tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS +#ifdef ISSUE_1799_replace_L_shr_o + diff = L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ); +#else diff = L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ); +#endif BASOP_SATURATE_WARNING_ON_EVS diff16 = round_fx_o( diff, &Overflow ); } @@ -509,7 +517,11 @@ void StableHighPitchDetect_ivas_fx( tmp = abs_s( tmp ); tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS +#ifdef ISSUE_1799_replace_L_shr_o + diff = L_negate( L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ) ); +#else diff = L_negate( L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ) ); +#endif BASOP_SATURATE_WARNING_ON_EVS diff16 = round_fx_o( diff, &Overflow ); } @@ -517,7 +529,11 @@ void StableHighPitchDetect_ivas_fx( { tmp = div_s( 16384, tmp ); /*Q(15+exp)*/ BASOP_SATURATE_WARNING_OFF_EVS +#ifdef ISSUE_1799_replace_L_shr_o + diff = L_shr_sat( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ) ); +#else diff = L_shr_o( Mult_32_16( diff, tmp ), sub( exp + 7, 31 ), &Overflow ); +#endif BASOP_SATURATE_WARNING_ON_EVS diff16 = round_fx_o( diff, &Overflow ); } diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c index 79c55821e723e62585ce2df46f29b494b6ddfef0..d4e3284da0afbc81539e13ffe0dce04064d38642 100644 --- a/lib_enc/pitch_ol_fx.c +++ b/lib_enc/pitch_ol_fx.c @@ -751,7 +751,11 @@ void pitch_ol_fx( Ltmp = L_mult0( cor_buf[ind], enr1 ); qCorX = add( sub( 15, enr1_exp ), sub( 14, pt_exp1[ind] ) ); +#ifdef ISSUE_1799_replace_L_shr_o + corX[i][j] = extract_h( L_shr_sat( Ltmp, sub( qCorX, 31 ) ) ); +#else corX[i][j] = extract_h( L_shr_o( Ltmp, sub( qCorX, 31 ), &Overflow ) ); +#endif qCorX = 31; move16(); @@ -788,7 +792,11 @@ void pitch_ol_fx( Ltmp = L_mult0( cor_buf[ind1 + len_x], enr1 ); qCorX = add( sub( 15, enr1_exp ), sub( 14, pt_exp3[ind1] ) ); +#ifdef ISSUE_1799_replace_L_shr_o + corX[i][j + NSECT] = extract_h( L_shr_sat( Ltmp, qCorX - 31 ) ); +#else corX[i][j + NSECT] = extract_h( L_shr_o( Ltmp, qCorX - 31, &Overflow ) ); +#endif qCorX = 31; move16(); diff --git a/lib_enc/pvq_encode_fx.c b/lib_enc/pvq_encode_fx.c index 749a39ed91243268b64f71275ce5106e00cf9749..d08b8a9026c632ca5c9e02fd27e5eebc53666370 100644 --- a/lib_enc/pvq_encode_fx.c +++ b/lib_enc/pvq_encode_fx.c @@ -359,8 +359,12 @@ void pvq_encode_ivas_fx( } Mpy_32_16_ss( L_isqrt, tmp, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) +1 */ Mpy_32_16_ss( L_tmp, neg_gain_norm, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *Q15 +1 */ - L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); /* Q31+x */ - xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15, array move */ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_shr_sat( L_tmp, shift_tot ); /* Q31+x */ +#else + L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); /* Q31+x */ +#endif + xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15, array move */ move16(); L_xq[i] = L_tmp; /* Q31 currently unused */ move32(); @@ -567,8 +571,12 @@ void pvq_encode_fx( } Mpy_32_16_ss( L_isqrt, tmp, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) +1 */ Mpy_32_16_ss( L_tmp, neg_gain_norm, &L_tmp, &u16_tmp ); /* Q31*Q(0+x) *Q15 +1 */ - L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); /* Q31+x */ - xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15, array move */ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_shr_sat( L_tmp, shift_tot ); /* Q31+x */ +#else + L_tmp = L_shr_o( L_tmp, shift_tot, &Overflow ); /* Q31+x */ +#endif + xq[i] = round_fx_o( L_tmp, &Overflow ); /* Q15, array move */ move16(); L_xq[i] = L_tmp; /* Q31 currently unused */ move32(); diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 6334a6ef0b8b78ed44c5cac29e9c16c1b55a2b36..0c4a4ec235c9175344e71dde0d3ba3d2c1e4ef1e 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -1500,11 +1500,19 @@ static Word16 attack_det_fx( /* o : attack flag exp1 = norm_s( att_3lsub_pos ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), att_3lsub_pos ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[0], Qx, &Overflow ); /*Qx */ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_shr_sat( finc[0], Qx ); /*Qx */ +#else + L_tmp = L_shr_o( finc[0], Qx, &Overflow ); /*Qx */ +#endif FOR( i = 1; i < att_3lsub_pos; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr_o( finc[i], Qx, &Overflow ), &Overflow ); /*Qx */ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_add_o( L_tmp, L_shr_sat( finc[i], Qx ), &Overflow ); /*Qx */ +#else + L_tmp = L_add_o( L_tmp, L_shr_o( finc[i], Qx, &Overflow ), &Overflow ); /*Qx */ +#endif } L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ etmp = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ @@ -1513,10 +1521,18 @@ static Word16 attack_det_fx( /* o : attack flag exp1 = norm_s( tmp1 ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), tmp1 ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[attack], Qx, &Overflow ); /*Qx */ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_shr_sat( finc[attack], Qx ); /*Qx */ +#else + L_tmp = L_shr_o( finc[attack], Qx, &Overflow ); /*Qx */ +#endif FOR( i = 1; i < tmp1; i++ ) { +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_add_o( L_tmp, L_shr_sat( finc[i + attack], Qx ), &Overflow ); /*Qx */ +#else L_tmp = L_add_o( L_tmp, L_shr_o( finc[i + attack], Qx, &Overflow ), &Overflow ); /*Qx */ +#endif } L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ etmp2 = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ diff --git a/lib_enc/swb_bwe_enc_hr_fx.c b/lib_enc/swb_bwe_enc_hr_fx.c index 8b5a173533d53746f84d83b62e6844e0a290ae22..f510a1cb6765a30cc2f64b59538f907473dd6968 100644 --- a/lib_enc/swb_bwe_enc_hr_fx.c +++ b/lib_enc/swb_bwe_enc_hr_fx.c @@ -767,7 +767,11 @@ void swb_bwe_enc_hr_fx( FOR( i = 0; i < Nsv2 * WIDTH_BAND; i++ ) { L_tmp = L_mult( temp, t_audio_fx[i] ); +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_shr_sat( L_tmp, temp2 ); +#else L_tmp = L_shr_o( L_tmp, temp2, &Overflow ); +#endif t_audio_fx[i] = round_fx_o( L_tmp, &Overflow ); move16(); } diff --git a/lib_enc/swb_bwe_enc_lr_fx.c b/lib_enc/swb_bwe_enc_lr_fx.c index 938cdd971357f75642f58b731ebc3513729939cd..3c92c7f895dc010ace1e3d01e5e96c687ad91e8e 100644 --- a/lib_enc/swb_bwe_enc_lr_fx.c +++ b/lib_enc/swb_bwe_enc_lr_fx.c @@ -174,14 +174,15 @@ static Word16 GetSubbandCorrIndex2_har_fx( /* o : L_corr_sq = L_mult_o( corr_sq_hi_fx, corr_sq_hi_fx, &Overflow ); /* (((Qhi:Qsh+exp_norm_hi-16)+Qss+1)+exp_norm-16)*2+1 */ L_corr_sq = L_shr_o( L_corr_sq, s_min( shl( exp_norm, 1 ), 31 ), &Overflow ); /* (QCorr-16)*2+1 */ - IF( Overflow != 0 ) + if ( Overflow != 0 ) { L_corr_sq = 0x0L; - move16(); - Overflow = 0; - move16(); + move32(); } + Overflow = 0; + move16(); + /* normalize for L_lagCorr_sq and L_corr_sq */ L_buf = L_or( L_lagCorr_sq, L_corr_sq ); exp_corr = norm_l( L_buf ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index dd28a9ab32599168719bb8b7c0a3f0ed92d27676..d396418e40c709e2819c43eb43c3aefc2697a7f4 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7455,8 +7455,12 @@ void fb_tbe_enc_fx( { tmp = div_s( tmp2, tmp ); L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/ + L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/ +#ifdef ISSUE_1799_replace_L_shr_o + L_tmp = L_max( L_shr_sat( L_tmp, sub( 31, exp ) ), 0x1 ); /* Q0 */ +#else L_tmp = L_max( L_shr_o( L_tmp, sub( 31, exp ), &Overflow ), 0x1 ); /* Q0 */ +#endif } ELSE { diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 23099510b9b710beaa6d02928892ef2f4b5e3e71..955c7c74d05f54baa470d3801349327756f04514 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -1014,7 +1014,11 @@ Word16 wb_vad_fx( m_num = shr( m_num, 1 ); shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); snr_tmp = div_s( m_num, m_noise_local ); +#ifdef ISSUE_1799_replace_L_shr_o + L_snr = L_shr_sat( snr_tmp, shift_snr ); /* L_snr in Q4 */ +#else L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ +#endif } ELSE { @@ -1047,7 +1051,11 @@ Word16 wb_vad_fx( shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); snr_tmp = div_s( m_num, m_noise_local ); +#ifdef ISSUE_1799_replace_L_shr_o + L_snr = L_shr_sat( snr_tmp, shift_snr ); /* L_snr in Q4 */ +#else L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ +#endif } ELSE { @@ -1082,7 +1090,7 @@ Word16 wb_vad_fx( #ifdef ISSUE_1796_replace_shl_o tmp = shl_sat( snr, 5 ); /* Q8 -> Q13 */ #else - tmp = shl_o( snr, 5, &Overflow ); /* Q8 -> Q13 */ + tmp = shl_o( snr, 5, &Overflow ); /* Q8 -> Q13 */ #endif IF( LT_16( i, 2 ) ) { @@ -1152,7 +1160,11 @@ Word16 wb_vad_fx( shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); snr_tmp = div_s( m_num, m_noise_local ); - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ +#ifdef ISSUE_1799_replace_L_shr_o + L_snr = L_shr_sat( snr_tmp, shift_snr ); /* L_snr in Q4 */ +#else + L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ +#endif } ELSE {