Skip to content
Commits on Source (50)
......@@ -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 */
......
......@@ -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 );
......
......@@ -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();
}
......
......@@ -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() */
......
......@@ -1219,71 +1219,23 @@ Word16 maximum_exp_fx( /* o : index of the maximum value
const Word16 *exp_vec, /* i : exponents of input vector */
const Word16 lvec_fx /* i : length of input vector */
)
#ifdef FIX_1981_MAXIMUM_EXP_FX_
{
Word16 j, ind;
Word16 tmp, exp;
ind = 0;
move16();
Word16 scale;
scale = sub( norm_s( vec_fx[ind] ), 1 );
tmp = shl( vec_fx[ind], scale );
exp = sub( exp_vec[ind], scale );
#if 1
static int cnt = 0;
cnt++;
#endif
FOR( j = 1; j < lvec_fx; j++ )
{
IF( LT_16( tmp, shr_sat( vec_fx[j], sub( exp, exp_vec[j] ) ) ) )
{
ind = j;
move16();
scale = sub( norm_s( vec_fx[ind] ), 1 );
tmp = shl( vec_fx[ind], scale );
exp = sub( exp_vec[ind], scale );
}
}
// printf( "\nind = %d", ind );
return ind;
}
#elif 1
#ifdef FIX_1981_MAXIMUM_EXP_FX
{
Word16 j, ind;
ind = 0;
move16();
#if 1
static int cnt = 0;
cnt++;
#endif
FOR( j = 1; j < lvec_fx; j++ )
{
#if 0
if ( ( vec_fx[j] == 0 && vec_fx[j - 1] != 0 && vec_fx[j + 1] != 0 && lvec_fx > j ) )
{
assert( 0 );
}
#endif
#if 1
if ( LT_32( L_deposit_l( vec_fx[ind] ), L_shr_sat( L_deposit_l( vec_fx[j] ), sub( exp_vec[ind], exp_vec[j] ) ) ) )
#else
/* if(vec[j] > vec[ind]) //means */
/* if( GT_32( L_shr_sat( L_deposit_l( vec_fx[j])), sub( exp_vec[ind], exp_vec[j] ) , L_deposit_l( vec_fx[ind] ))) //is like */
if ( L_mac0_sat( L_shl_sat( L_deposit_l( vec_fx[j] ), sub( exp_vec[j], exp_vec[ind] ) ), vec_fx[ind], -0x0001 ) > 0 )
#endif
{
ind = j;
move16();
}
}
// printf( "\n%d:ind = %d", cnt, ind );
return ind;
}
#else
......
......@@ -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;
......
......@@ -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
}
#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
}
#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 );
......
......@@ -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 );
......
......@@ -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();
}
......
......@@ -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();
......
......@@ -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 )
......
......@@ -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 */
......