diff --git a/lib_com/basop32.c b/lib_com/basop32.c index fbe08a11f74d5a2afd466d351a5652b35d13f275..1e7ff42e453589d1cd74a3edf539e58bbd5bcd4e 100644 --- a/lib_com/basop32.c +++ b/lib_com/basop32.c @@ -740,7 +740,12 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) } else { + +#ifdef FIX_1528_USAN_BASOP32 + result = (Word32) var1 * (Word32) ( ( (UWord32) 1 ) << var2 ); +#else result = (Word32) var1 * ( (Word32) 1 << var2 ); +#endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { @@ -1626,7 +1631,11 @@ Word32 L_add_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) { Word32 L_var_out; +#ifdef FIX_1528_USAN_BASOP32 + L_var_out = (Word32) ( (UWord32) L_var1 + (UWord32) L_var2 ); +#else L_var_out = L_var1 + L_var2; +#endif if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) == 0 ) { @@ -1708,7 +1717,11 @@ Word32 L_sub_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) { Word32 L_var_out; +#ifdef FIX_1528_USAN_BASOP32 + L_var_out = (Word32) ( (UWord32) L_var1 - (UWord32) L_var2 ); +#else L_var_out = L_var1 - L_var2; +#endif if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) != 0 ) { @@ -1871,9 +1884,17 @@ Word32 L_add_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) Word32 L_test; Flag carry_int = 0; +#ifdef FIX_1528_USAN_BASOP32 + L_var_out = (Word32) ( (UWord32) L_var1 + (UWord32) L_var2 + (UWord32) get_carry( Carry ) ); +#else L_var_out = L_var1 + L_var2 + get_carry( Carry ); +#endif +#ifdef FIX_1528_USAN_BASOP32 + L_test = (Word32) ( (UWord32) L_var1 + (UWord32) L_var2 ); +#else L_test = L_var1 + L_var2; +#endif if ( ( L_var1 > 0 ) && ( L_var2 > 0 ) && ( L_test < 0 ) ) { @@ -2790,7 +2811,11 @@ Word32 L_deposit_h( Word16 var1 ) { Word32 L_var_out; +#ifdef FIX_1528_USAN_BASOP32 + L_var_out = (Word32) ( ( (UWord32) var1 ) << 16 ); +#else L_var_out = (Word32) var1 << 16; +#endif #ifdef WMOPS multiCounter[currCounter].L_deposit_h++; diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index e52f404f6f83b00535931530c021d8e381dd072f..9ed148f3af8ce5669b0899114e716f47e0af90e2 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -1409,7 +1409,11 @@ Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, Word32 y, Word16 *s ) *s = 0; return ( (Word32) 0 ); } +#ifdef FIX_1528_USAN_BASOP32 + IF( EQ_32( y, (Word32) 0x80000000 ) ) +#else IF( EQ_32( y, 0x80000000 ) ) +#endif { /* Division by -1.0: same as negation of numerator */ /* Return normalized negated numerator */ diff --git a/lib_com/options.h b/lib_com/options.h index a5d5a4846c8ca6a0005aa7ef7bd9e2c4e3582dbd..28d4d9df3a947546b21cd79c149a56f5710759ef 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -102,6 +102,7 @@ #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ #define TEST_HR +#define FIX_1528_USAN_BASOP32 /* Eri: (Issue #1528): The operators L_add_o, L_add_co, shl_o and L_sub_o assume additions/subtractions treated as unsigned numbers where wrap-around may happen. */ #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ #define FIX_1713_EXP /* VA: proposed correction to exp in ic-BWE*/