diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index ec6c89896dcb67d234a75087071c291a8c4775ec..fe2b7e871a0ebe2aca06094cb879427b4593ef71 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -2072,12 +2072,18 @@ Word16 idiv1616_1( Word16 x, Word16 y ) } } +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word32 norm_llQ31( /* o : normalized result Q31 */ Word32 L_c, /* i : upper bits of accu Q-1 */ Word32 L_sum, /* i : lower bits of accu, unsigned Q31 */ Word16 *exp /* o : exponent of result in [-32,31] Q0 */ ) { +#ifdef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + move32(); /* compensate missing instrumentation */ + move32(); /* compensate missing instrumentation */ + return w_norm_llQ31( ( (Word64) L_c << 32 ) | (UWord32) L_sum, exp ); +#else Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL @@ -2088,8 +2094,8 @@ Word32 norm_llQ31( /* o : normalized result Q31 */ #endif /* BASOP_NOGLOB */ /* Move MSBit of L_sum into L_c */ - Carry = 0; #ifdef ISSUE_1836_replace_overflow_libcom + Carry = 0; L_tmp = L_add_c( L_sum, L_sum, &Carry ); /* L_tmp = L_sum << 1 */ L_c = L_add_c( L_c, L_c, &Carry ); #else @@ -2121,7 +2127,9 @@ Word32 norm_llQ31( /* o : normalized result Q31 */ *exp = i; move16(); return L_sum; +#endif /* #ifdef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW */ } +#endif /* #ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW */ Word32 Dot_product16HQ( /* o : normalized result Q31 */ diff --git a/lib_com/basop_util.h b/lib_com/basop_util.h index 9e5882f2224fd7b8aee34603ca03d89c5a076996..e6db321da23b9caa126676f83ea2ad6f8c3b8ae3 100644 --- a/lib_com/basop_util.h +++ b/lib_com/basop_util.h @@ -647,7 +647,10 @@ Word32 norm_llQ31( /* o : normalized result Q31 */ * \brief Compute normalized Q31 Values out of overflowed Q31 value * using 64-bit operators *------------------------------------------------------------------*/ -static inline Word32 w_norm_llQ31( Word64 L64_var1, Word16 *S_var2 ) /*Q31 - L_tmp_exp*/ +static inline Word32 w_norm_llQ31( /* o : normalized result Q31 - *S_var2 */ + Word64 L64_var1, /* i : 64-bit accu Q63 */ + Word16 *S_var2 /* o : exponent of result in [-32,31] Q0 */ +) { Word32 L_result; Word16 sh = W_norm( L64_var1 ); diff --git a/lib_com/igf_base_fx.c b/lib_com/igf_base_fx.c index 44cf27c5f3da77010f5d13489439a0dc2bc507c7..e9aea5274e0cd2ba97755416455eb861b5b61ca0 100644 --- a/lib_com/igf_base_fx.c +++ b/lib_com/igf_base_fx.c @@ -1115,28 +1115,42 @@ void IGFCommonFuncsCalcSfbEnergyPowerSpec( const Word16 startSfb, /**< in ) { Word16 /*Q0*/ sfb; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word16 /*Q0*/ line; Word32 L_c; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; move16(); move16(); #endif +#endif +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW FOR( sfb = startSfb; sfb < stopSfb; sfb++ ) { sfbEnergy[sfb] = L_deposit_l( 0 ); move32(); } +#endif IF( NULL == pPowerSpectrum ) { +#ifdef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + FOR( sfb = startSfb; sfb < stopSfb; sfb++ ) + { + sfbEnergy[sfb] = L_deposit_l( 0 ); + move32(); + } +#endif return; } FOR( sfb = startSfb; sfb < stopSfb; sfb++ ) { +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_c = L_deposit_l( 0 ); FOR( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ ) { @@ -1150,6 +1164,12 @@ void IGFCommonFuncsCalcSfbEnergyPowerSpec( const Word16 startSfb, /**< in } sfbEnergy[sfb] = norm_llQ31( L_c, sfbEnergy[sfb], &( sfbEnergy_exp[sfb] ) ); move32(); +#else + sfbEnergy[sfb] = sum_array_norm( pPowerSpectrum + swb_offset[sfb], + swb_offset[sfb + 1] - swb_offset[sfb], + &( sfbEnergy_exp[sfb] ) ); + move32(); +#endif sfbEnergy_exp[sfb] = add( sfbEnergy_exp[sfb], *pPowerSpectrum_exp ); move16(); } diff --git a/lib_com/options.h b/lib_com/options.h index 397618990f28e710fe2097a1ac25358056f9899a..3e11805fcc15d132eae7fadd29420369ba9e6ad5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -73,6 +73,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW /* FhG: bit-exact, replace carry and overflow operations by 64-bit operations, MR 2166 */ #define ISSUE_1836_replace_overflow_libcom /* FhG: BE - replace overflow operators by non-overflow-alternatives in lib_com */ #define ISSUE_1867_replace_overflow_libenc /* FhG: BE - replace overflow operators by non-overflow-alternatives all over the lib_enc module */ #define FIX_1942_ASSERTION_LOWSHELF /* FhG: Modified the target_gains_db_fx calculation in compute_t60_coeffs_fx() */ diff --git a/lib_dec/arith_coder_dec_fx.c b/lib_dec/arith_coder_dec_fx.c index 60a59c4da469f113f7195179ed0521d2c343bc2d..77ae166b450b57fd108d9f0a948e902fb0772a3f 100644 --- a/lib_dec/arith_coder_dec_fx.c +++ b/lib_dec/arith_coder_dec_fx.c @@ -27,11 +27,16 @@ static Word16 tcx_arith_decode_fx( Tastat as; Word16 exp_k; Word16 tmp; - Word32 L_tmp, Q; #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + Word32 L_tmp, Q; Flag Overflow = 0; move32(); Flag Carry = 0; +#else + Word32 Q; + Word64 W_tmp; +#endif move32(); #endif @@ -39,7 +44,11 @@ static Word16 tcx_arith_decode_fx( bp = ari_start_decoding_14bits_prm_fx( prm, 0, &as ); tmp = sub( envelope_e, 1 + 15 ); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_tmp = L_deposit_l( 0 ); +#else + W_tmp = 0; +#endif FOR( k = 0; k < L_frame; k++ ) { IF( envelope[k] == 0 ) /* safety check in case of bit errors */ @@ -63,7 +72,11 @@ static Word16 tcx_arith_decode_fx( { bp = ari_decode_14bits_sign_fx( prm, bp, target_bits, &s, &as ); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_tmp = L_macNs_co( L_tmp, q, k, &Carry, &Overflow ); +#else + W_tmp = W_mac_16_16( W_tmp, q, k ); +#endif Q = L_mult( q, negate( shl( 1, sub( 30, SPEC_EXP_DEC ) ) ) ); IF( EQ_16( s, 0 ) ) @@ -88,7 +101,11 @@ static Word16 tcx_arith_decode_fx( set32_fx( q_spectrum + k, 0, sub( L_frame, k ) ); /* noise filling seed */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW *nf_seed = extract_l( L_tmp ); +#else + *nf_seed = extract_l( W_extract_l( W_tmp ) ); +#endif move16(); return bp; diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 16884caaa902d537f329163bf0b5518824a1d9b6..091b5ee5d50ffe52b44d87150452e7a04b675441 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -15,23 +15,36 @@ ******************************************************/ static void calcGainc_fx( Word16 *exc, Word16 Q_exc, Word32 old_fpitch /*Q16*/, Word16 L_subfr /*Q0*/, Word32 lp_gainp /*Q16*/, Word32 *lp_gainc /*Q16*/ ) { - Word32 L_c; Word16 tmp16, tmp16_2, tmp16_3, tmp_e, tmp2_e, tmp_loop, i; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + Word32 L_c; Word32 L_acc, L_tmp; +#else + Word64 W_acc; + Word32 L_tmp; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; +#endif move32(); move32(); #endif +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_acc = L_deposit_l( 0 ); L_c = L_deposit_l( 0 ); +#else + W_acc = 0; +#endif +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Overflow = 0; move16(); Carry = 0; move16(); +#endif tmp16 = round_fx( old_fpitch ); /*Q0*/ tmp_loop = shl( L_subfr, 1 ); @@ -44,14 +57,22 @@ static void calcGainc_fx( Word16 *exc, Word16 Q_exc, Word32 old_fpitch /*Q16*/, /*st->lp_gainc += ( exc[i-2*L_subfr] - st->Mode2_lp_gainp * exc[i-2*L_subfr-(int)(st->old_fpitch+0.5f)] ) * ( exc[i-2*L_subfr] - st->Mode2_lp_gainp * exc[i-2*L_subfr-(int)(st->old_fpitch+0.5f)] );*/ tmp16_3 = sub_sat( exc[( i - ( L_subfr * 2 ) )] /*Q1*/, mult_r( tmp16_2 /*Q15*/, exc[( ( i - ( L_subfr * 2 ) ) - tmp16 )] /*Q1*/ ) /*Q1*/ ); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_acc = L_macNs_co( L_acc, tmp16_3, tmp16_3, &Carry, &Overflow ); /*Q3*/ Overflow = 0; move16(); L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Accumulate Carrys Q-1*/ Carry = 0; move16(); +#else + W_acc = W_mac_16_16( W_acc, tmp16_3, tmp16_3 ); /*Q3*/ +#endif } - L_tmp = norm_llQ31( L_c, L_acc, &tmp_e ); /*Q3,norm,tmp_e*/ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + L_tmp = norm_llQ31( L_c, L_acc, &tmp_e ); /*Q3,norm,tmp_e*/ +#else + L_tmp = w_norm_llQ31( W_acc, &tmp_e ); /*Q3,norm,tmp_e*/ +#endif tmp_e = add( tmp_e, 31 - ( add( shl( Q_exc, 1 ), 1 ) ) ); /*L_tmp is Q31, now*/ tmp16 = BASOP_Util_Divide3216_Scale( L_tmp /*Q31,norm,tmp_e*/, shl( L_subfr, 1 ) /*Q15,15*/, &tmp2_e ) /*Q15,tmp2_e+tmp_e-15*/; tmp_e = sub( add( tmp2_e, tmp_e ), 15 ); @@ -67,15 +88,23 @@ static void calcGainc_fx( Word16 *exc, Word16 Q_exc, Word32 old_fpitch /*Q16*/, static void calcGainc2_fx( Word16 *exc, Word16 Q_exc, Word16 L_subfr /*Q0*/, Word32 *lp_gainc /*Q16*/ ) { Word16 i, cnt, tmp16, tmp_e, tmp2_e; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word32 L_c, L_acc, L_tmp; +#else + Word64 W_acc; + Word32 L_tmp; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; +#endif #endif move16(); move16(); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Carry = 0; move16(); Overflow = 0; @@ -83,21 +112,32 @@ static void calcGainc2_fx( Word16 *exc, Word16 Q_exc, Word16 L_subfr /*Q0*/, Wor L_c = L_deposit_l( 0 ); L_acc = L_deposit_l( 0 ); +#else + W_acc = 0; +#endif cnt = shl( L_subfr, 1 ); FOR( i = 0; i < cnt; i++ ) { /* *gainc += ( exc[i-2*L_subfr] ) * ( exc[i-2*L_subfr]); */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_acc = L_macNs_co( L_acc, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, &Carry, &Overflow ); /*Q3*/ Overflow = 0; move16(); L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /* Accumulate Carrys Q-1*/ Carry = 0; move16(); +#else + W_acc = W_mac_16_16( W_acc, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, exc[( i - ( L_subfr * 2 ) )] /*Q1*/ ); /*Q3*/ +#endif } - L_tmp = norm_llQ31( L_c, L_acc, &tmp_e ); /*Q3,norm,tmp_e*/ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + L_tmp = norm_llQ31( L_c, L_acc, &tmp_e ); /*Q3,norm,tmp_e*/ +#else + L_tmp = w_norm_llQ31( W_acc, &tmp_e ); /*Q3,norm,tmp_e*/ +#endif tmp_e = add( tmp_e, sub( 31, ( add( shl( Q_exc, 1 ), 1 ) ) ) ); /*L_tmp is Q31, now*/ tmp16 = BASOP_Util_Divide3216_Scale( L_tmp /*Q31,norm,tmp_e*/, shl( L_subfr, 1 ) /*Q15,15*/, &tmp2_e ) /*Q15,tmp2_e+tmp_e-15*/; tmp_e = sub( add( tmp2_e, tmp_e ), 15 ); diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index 1851c04a661c642a33c8a36e839c5b96990aa3f9..206627d924110c06cda37ecd4a6277cde81385d3 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -1482,11 +1482,15 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in Word16 dS[IGF_MAX_SFB]; Word16 dS_e[IGF_MAX_SFB]; Word32 energyTmp[24]; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word32 L_c; +#endif Word16 Hr; #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; +#endif move16(); move16(); #endif @@ -1565,6 +1569,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in &dE_e, negate( tmp ) ); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_c = 0; move32(); FOR( tb = 0; tb < 24; tb++ ) @@ -1577,6 +1582,9 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); } L_tmp = norm_llQ31( L_c, L_tmp, &shift ); // Q31 +#else + L_tmp = sum_array_norm( energyTmp, 24, &shift ); +#endif /* float: dE = (float)sqrt(dE / 24.f); basop: */ shift = add( sub( shift, 4 ), dE_e ); /* x/24 = (x >> 4) * 1/1.5 */ dE = Sqrt16norm( extract_h( L_tmp ), &shift ); @@ -2168,15 +2176,19 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in Word16 dS[IGF_MAX_SFB]; Word16 dS_e[IGF_MAX_SFB]; Word32 energyTmp[24]; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word32 L_c; +#endif Word16 spec_e_arr[N_MAX]; Word16 vspec_e_arr[N_MAX_TCX - IGF_START_MN]; #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; move16(); Flag Carry = 0; move16(); #endif +#endif /* initialize variables */ @@ -2254,6 +2266,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in &dE_e, negate( tmp ) ); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_c = 0; move32(); FOR( tb = 0; tb < 24; tb++ ) @@ -2265,6 +2278,9 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); } L_tmp = norm_llQ31( L_c, L_tmp, &shift ); // Q31 +#else + L_tmp = sum_array_norm( energyTmp, 24, &shift ); +#endif /* float: dE = (float)sqrt(dE / 24.f); basop: */ shift = add( sub( shift, 4 ), dE_e ); /* x/24 = (x >> 4) * 1/1.5 */ dE = Sqrt16norm( extract_h( L_tmp ), &shift ); diff --git a/lib_enc/arith_coder_enc_fx.c b/lib_enc/arith_coder_enc_fx.c index a9955e6f69979a1c608ae6891d07a797f616826f..58125b81cafde7044d7fb0c02b05883a1d082edd 100644 --- a/lib_enc/arith_coder_enc_fx.c +++ b/lib_enc/arith_coder_enc_fx.c @@ -688,14 +688,21 @@ void tcx_arith_encode_envelope_fx( const Word8 *deadzone_flags; Word16 gamma_w, gamma_uw; Word16 hm_bits; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word32 L_tmp, L_tmp2; +#else + Word32 L_tmp; + Word64 W_tmp2; +#endif Word16 tmp; TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; move32(); move32(); +#endif #endif assert( L_spec <= N_MAX_ARI ); @@ -780,10 +787,18 @@ void tcx_arith_encode_envelope_fx( move16(); /* Multiply back the signs */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_tmp2 = L_deposit_l( 0 ); +#else + W_tmp2 = 0; +#endif FOR( k = 0; k <= kMax; k++ ) { +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_tmp2 = L_macNs_co( L_tmp2, q_spectrum[k], k, &Carry, &Overflow ); +#else + W_tmp2 = W_mac_16_16( W_tmp2, q_spectrum[k], k ); +#endif if ( signs[k] != 0 ) L_tmp = L_mult( q_spectrum[k], -( 1 << ( 30 - SPEC_EXP_DEC ) ) ); @@ -797,7 +812,11 @@ void tcx_arith_encode_envelope_fx( set32_fx( spectrum + k, 0, sub( s_max( L_frame, L_spec ), k ) ); /* noise filling seed */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW *nf_seed = extract_l( L_tmp2 ); +#else + *nf_seed = extract_l( W_extract_l( W_tmp2 ) ); +#endif move16(); } diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index 3ab224a62b2eabae46f3c8227943db9ee044cf69..2d6b9fcb077b9e08b643f08dde38c78dc5f2e01d 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -1274,8 +1274,10 @@ void QuantizeSpectrum_fx( CONTEXT_HM_CONFIG *phm_cfg; TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; +#endif #endif /* Stack memory is split between encoder and internal decoder to reduce max @@ -1839,17 +1841,30 @@ void QuantizeSpectrum_fx( /* Save quantized Values */ tmp32 = L_deposit_l( 0 ); + move16(); +#ifdef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + Word64 seed = 0; + move64(); +#endif FOR( i = 0; i < L_spec; i++ ) { spectrum[i] = L_mult( sqQ[i], 1 << ( 30 - SPEC_EXP_DEC ) ); move32(); /* noise filling seed */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW tmp32 = L_macNs_co( tmp32, abs_s( sqQ[i] ), i, &Carry, &Overflow ); +#else + seed = W_mac_16_16( seed, abs_s( sqQ[i] ), i ); +#endif } *spectrum_e = SPEC_EXP_DEC; move16(); +#ifdef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW + nf_seed = extract_l( W_extract_l( seed ) ); // Q0 +#else nf_seed = extract_l( tmp32 ); +#endif } ELSE /* low rates: new arithmetic coder */ { @@ -2900,10 +2915,12 @@ void QuantizeTCXSpectrum_fx( Word16 att_fx = 0; move16(); #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; move16(); Flag Carry = 0; move16(); +#endif #endif /*-----------------------------------------------------------* * Init * @@ -3527,7 +3544,11 @@ void QuantizeTCXSpectrum_fx( spectrum_fx[i] = L_mult( sqQ[i], 1 << ( 30 - SPEC_EXP_DEC ) ); move32(); /* noise filling seed */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW tmp32 = L_macNs_co( tmp32, abs_s( sqQ[i] ), i, &Carry, &Overflow ); +#else + tmp32 = L_macNs( tmp32, abs_s( sqQ[i] ), i ); +#endif } *spectrum_e = SPEC_EXP_DEC; move16(); diff --git a/lib_enc/enc_acelp_fx.c b/lib_enc/enc_acelp_fx.c index 2053a12932c98eae3e56db050da6d6886e9bc3fa..ec8efa841e96b1a093378b0e87ed04c18e02a304 100644 --- a/lib_enc/enc_acelp_fx.c +++ b/lib_enc/enc_acelp_fx.c @@ -2058,10 +2058,16 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U { Word16 k, nb_pulse, i, t, pos[NPMAXPT], posno; Word16 sign, m; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW UWord32 s; +#else + UWord64 W_s; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; +#endif move32(); move32(); #endif @@ -2087,7 +2093,11 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U } /* Iterate over the different pulse positions */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW s = L_deposit_l( 0 ); +#else + W_s = 0; +#endif t = 0; move16(); nb_pulse = 0; @@ -2100,9 +2110,15 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U /* Code m-1 pulses */ FOR( i = 1; i < m; ++i ) { +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Carry = 0; +#endif move32(); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW s = L_add_co( s, pulsestostates[pos[k]][t], &Carry, &Overflow ); +#else + W_s = W_add( W_s, pulsestostates[pos[k]][t] ); +#endif t = add( t, 1 ); if ( sub( t, NPMAXPT ) > 0 ) { @@ -2113,22 +2129,42 @@ static void E_ACELP_codearithp_fx( const Word16 v[] /*Q9*/, UWord32 *n /*Q0*/, U /* Code sign */ /* We use L_add_c since we want to work with unsigned UWord32 */ /* Therefore, we have to clear carry */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Carry = 0; +#endif move32(); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW s = L_lshl( s, 1 ); +#else + W_s = W_lshl( W_s, 1 ); +#endif if ( sign < 0 ) { +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW s = L_add_co( s, 1, &Carry, &Overflow ); +#else + W_s = W_add( W_s, 1 ); +#endif } /* Code last pulse */ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Carry = 0; +#endif move32(); +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW s = L_add_co( s, pulsestostates[pos[k]][t], &Carry, &Overflow ); +#else + W_s = W_add( W_s, pulsestostates[pos[k]][t] ); +#endif t = add( t, 1 ); } +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW *ps = s; /*Q0*/ +#else + *ps = (UWord32) W_s; /*Q0*/ +#endif move32(); *n = L_deposit_l( 0 ); if ( nb_pulse ) diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c old mode 100644 new mode 100755 index 2a96904e1ad651c9bdba754ee6ef004bee6d9d34..b6a1c66c202aff09bbe1d85d057a5ec8c58c4394 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -369,7 +369,9 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou Word32 highPassEner; /* Q31 */ Word32 lastLine; Word32 nextLine; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word32 L_c; +#endif Word32 highPassEner_Ovfl; Word16 s; Word16 tmploop; @@ -383,11 +385,15 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou Word16 tmp; Word32 L_tmp; +#if !defined( FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW ) && !defined( ISSUE_1867_replace_overflow_libenc ) #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Carry = 0; +#endif move32(); move32(); +#endif #endif hPrivateData = &hInstance->igfData; @@ -420,19 +426,32 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou IF( igfBgn > 0 ) { +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_c = 0; move32(); +#else + Word64 W_highPassEner = 0; + move64(); +#endif FOR( i = 0; i < igfBgn; i++ ) { +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Carry = 0; move32(); highPassEner = L_add_co( highPassEner, Mpy_32_16_1( pPowerSpectrum[i], shl( i, 4 ) /*Q4*/ ) /*Q20, pPowerSpectrum_exp*/, &Carry, &Overflow ); Overflow = 0; move32(); L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); +#else + W_highPassEner = W_add( W_highPassEner, W_deposit32_l( Mpy_32_16_1( pPowerSpectrum[i], shl( i, 4 ) /*Q4*/ ) ) /*Q20, pPowerSpectrum_exp*/ ); +#endif } +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW highPassEner = norm_llQ31( L_c, highPassEner, highPassEner_exp ); /*Q20, highPassEner_exp*/ +#else + highPassEner = w_norm_llQ31( W_highPassEner, highPassEner_exp ); /*Q20, highPassEner_exp*/ +#endif *highPassEner_exp = add( *highPassEner_exp, pPowerSpectrum_exp ); move16(); test(); @@ -896,16 +915,22 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value Word16 invDenom_exp, numf_exp; Word16 numf; Word32 SFM32; +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Word32 L_c; +#endif Word16 invDenom, SFM; #ifdef BASOP_NOGLOB_DECLARE_LOCAL +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Flag Overflow = 0; Flag Carry = 0; +#endif move32(); move32(); #endif +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW L_c = 0; +#endif move32(); num = 0; move32(); @@ -916,6 +941,7 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value SFM = 32767 /*1.0f Q15*/; move16(); + Word64 W_denom = W_deposit32_l( denom ); FOR( i = start; i < stop; i++ ) { /*ln(x * 2^-Qx * 2^xExp) = ln(x) - Qx + xExp*/ @@ -935,15 +961,23 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value n = s_max( 0, n ); num = L_add( num, L_deposit_l( n ) ); /*Q0*/ +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW Carry = 0; move32(); denom = L_add_co( energy[i], denom, &Carry, &Overflow ); Overflow = 0; move32(); L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); +#else + W_denom = W_add( W_deposit32_l( energy[i] ), W_denom ); +#endif } +#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW denom = norm_llQ31( L_c, denom, &denom_exp ); /*Q31*/ +#else + denom = w_norm_llQ31( W_denom, &denom_exp ); /*Q31*/ +#endif denom_exp = add( denom_exp, *energy_exp ); /* calculate SFM only if signal is present */