diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 712b5b0a8591964ab1ea5f2aa34515409ae71fe5..642723c7665974df0a8cc01c321ca46a66d14b70 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -729,8 +729,13 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) if ( var2 < 0 ) { +#ifdef FIX_2600_UNDEF + if ( var2 < -15 ) + var2 = -15; +#else if ( var2 < -16 ) var2 = -16; +#endif var2 = -var2; var_out = shr( var1, var2 ); @@ -740,7 +745,14 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) } else { +#ifdef FIX_2600_UNDEF + result = (Word32) var1 * (Word32) ( (UWord32) 1 << s_min( 15, var2 ) ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else result = (Word32) var1 * ( (Word32) 1 << var2 ); +#endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { @@ -774,8 +786,13 @@ Word16 shl( Word16 var1, Word16 var2 ) if ( var2 < 0 ) { +#ifdef FIX_2600_UNDEF + if ( var2 < -15 ) + var2 = -15; +#else if ( var2 < -16 ) var2 = -16; +#endif var2 = -var2; var_out = shr( var1, var2 ); @@ -785,7 +802,17 @@ Word16 shl( Word16 var1, Word16 var2 ) } else { - result = (Word32) var1 * ( (Word32) 1 << var2 ); +#ifdef FIX_2600_UNDEF_SHIFT_SAT + result = (Word32) var1 * (Word32) ( (UWord32) 1 << s_min( 15, var2 ) ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else +#ifdef FIX_2600_UNDEF + assert( var1 == 0 || var2 <= 15 ); +#endif + result = (Word32) var1 * (Word32) ( (UWord32) 1 << var2 ); +#endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { @@ -857,8 +884,10 @@ Word16 shr_o( Word16 var1, Word16 var2, Flag *Overflow ) if ( var2 < 0 ) { +#ifndef FIX_2600_UNDEF if ( var2 < -16 ) var2 = -16; +#endif var2 = -var2; var_out = shl_o( var1, var2, Overflow ); @@ -1446,6 +1475,7 @@ Word32 L_msu_sat( Word32 L_var3, Word16 var1, Word16 var2 ) Flag Overflow; return L_msu_o( L_var3, var1, var2, &Overflow ); } +#ifndef FIX_2600_UNDEF /*___________________________________________________________________________ | | | Function Name : L_macNs | @@ -1601,6 +1631,7 @@ Word32 L_msuNs_sat( Word32 L_var3, Word16 var1, Word16 var2 ) Flag Carry, Overflow; return L_msuNs_co( L_var3, var1, var2, &Carry, &Overflow ); } +#endif /* ! FIX_2600_UNDEF */ /*___________________________________________________________________________ | | | Function Name : L_add | @@ -1636,7 +1667,11 @@ Word32 L_add_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) { Word32 L_var_out; +#ifdef FIX_2600_UNDEF + 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 ) { @@ -1661,7 +1696,11 @@ Word32 L_add( Word32 L_var1, Word32 L_var2 ) { Word32 L_var_out; +#ifdef FIX_2600_UNDEF + 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 ) { @@ -1718,7 +1757,11 @@ Word32 L_sub_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) { Word32 L_var_out; +#ifdef FIX_2600_UNDEF + 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 ) { @@ -1742,7 +1785,11 @@ Word32 L_sub( Word32 L_var1, Word32 L_var2 ) { Word32 L_var_out; +#ifdef FIX_2600_UNDEF + 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 ) { @@ -1766,6 +1813,7 @@ Word32 L_sub_sat( Word32 L_var1, Word32 L_var2 ) return L_sub_o( L_var1, L_var2, &Overflow ); } +#ifndef FIX_2600_UNDEF /*___________________________________________________________________________ | | | Function Name : L_add_c | @@ -2109,6 +2157,7 @@ Word32 L_sub_c( Word32 L_var1, Word32 L_var2 ) { return L_sub_co( L_var1, L_var2, NULL, NULL ); } +#endif /* ! FIX_2600_UNDEF */ /*___________________________________________________________________________ | | | Function Name : L_negate | @@ -2800,7 +2849,11 @@ Word32 L_deposit_h( Word16 var1 ) { Word32 L_var_out; +#ifdef FIX_2600_UNDEF + 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_basop/enh1632.c b/lib_basop/enh1632.c index f397c3432b9dc63b6a376cfb394e3efb50a82bc0..af23be6f563e927dc54e74f7668e43ca06168bfd 100644 --- a/lib_basop/enh1632.c +++ b/lib_basop/enh1632.c @@ -89,10 +89,10 @@ * Inputs : * * var1 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var1 <= 0x0000 7fff. + * the range 0x8000 <= var1 <= 0x7fff. * * var2 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * the range 0x8000 <= var2 <= 0x7fff. * * Outputs : * @@ -101,7 +101,7 @@ * Return Value: * * var_out 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var_out <= 0x0000 7fff. + * the range 0x8000 <= var_out <= 0x7fff. * *****************************************************************************/ Word16 lshl( Word16 var1, Word16 var2 ) @@ -129,7 +129,11 @@ Word16 lshl( Word16 var1, Word16 var2 ) } else { +#ifdef FIX_2600_UNDEF + var_out = (Word16)( (UWord16)var1 << var2 ); +#else var_out = var1 << var2; +#endif } } #ifdef WMOPS @@ -156,10 +160,10 @@ Word16 lshl( Word16 var1, Word16 var2 ) * Inputs : * * var1 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var1 <= 0x0000 7fff. + * the range 0x8000 <= var1 <= 0x7fff. * * var2 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * the range 0x8000 <= var2 <= 0x7fff. * * Outputs : * @@ -168,7 +172,7 @@ Word16 lshl( Word16 var1, Word16 var2 ) * Return Value: * * var_out 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var_out <= 0x0000 7fff. + * the range 0x8000 <= var_out <= 0x7fff. * *****************************************************************************/ Word16 lshr( Word16 var1, Word16 var2 ) @@ -229,7 +233,7 @@ Word16 lshr( Word16 var1, Word16 var2 ) * the range 0x8000 0000 <= L_var1 <= 0x7fff ffff. * * var2 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * the range 0x8000 <= var2 <= 0x7fff. * * Outputs : * @@ -266,7 +270,11 @@ Word32 L_lshl( Word32 L_var1, Word16 var2 ) } else { +#ifdef FIX_2600_UNDEF + L_var_out = (Word32)( (UWord32)L_var1 << var2 ); +#else L_var_out = L_var1 << var2; +#endif } } #ifdef WMOPS @@ -297,7 +305,7 @@ Word32 L_lshl( Word32 L_var1, Word16 var2 ) * the range 0x8000 0000 <= L_var1 <= 0x7fff ffff. * * var2 16 bit short signed integer (Word16) whose value falls in - * the range 0xffff 8000 <= var2 <= 0x0000 7fff. + * the range 0x8000 <= var2 <= 0x7fff. * * Outputs : * @@ -361,10 +369,10 @@ Word32 L_lshr( Word32 L_var1, Word16 var2 ) * Inputs : * * var1 16 bit short signed integer (Word16) whose value falls in - * the range : 0xffff 8000 <= var1 <= 0x0000 7fff. + * the range : 0x 800 <= var1 <= 0x7fff. * * var2 16 bit short signed integer (Word16) whose value falls in - * the range : 0xffff 8000 <= var2 <= 0x0000 7fff. + * the range : 0x8000 <= var2 <= 0x7fff. * * Outputs : * @@ -373,7 +381,7 @@ Word32 L_lshr( Word32 L_var1, Word16 var2 ) * Return Value : * * var_out 16 bit short signed integer (Word16) whose value falls in - * the range : 0xffff 8000 <= var_out <= 0x0000 7fff. + * the range : 0x8000 <= var_out <= 0x7fff. * *****************************************************************************/ Word16 shl_ro( Word16 var1, Word16 var2, Flag *Overflow ) @@ -479,7 +487,7 @@ Word32 L_shl_r( Word32 L_var1, Word16 var2 ) * Inputs : * * var1 16 bit short signed integer (Word16) whose value falls in - * the range : 0xffff 8000 <= var1 <= 0x0000 7fff. + * the range : 0x8000 <= var1 <= 0x7fff. * * var2 16 bit short signed integer (Word16) whose value must be 0 * or 1. @@ -492,7 +500,7 @@ Word32 L_shl_r( Word32 L_var1, Word16 var2 ) * Return Value : * * var_out 16 bit short signed integer (Word16) whose value falls in - * the range : 0xffff 8000 <= var_out <= 0x0000 7fff. + * the range : 0x8000 <= var_out <= 0x7fff. * *****************************************************************************/ Word16 rotr( Word16 var1, Word16 var2, Word16 *var3 ) @@ -528,7 +536,7 @@ Word16 rotr( Word16 var1, Word16 var2, Word16 *var3 ) * Inputs : * * var1 16 bit short signed integer (Word16) whose value falls in - * the range : 0xffff 8000 <= var1 <= 0x0000 7fff. + * the range : 0x8000 <= var1 <= 0x7fff. * * var2 16 bit short signed integer (Word16) whose value must be 0 * or 1. @@ -541,7 +549,7 @@ Word16 rotr( Word16 var1, Word16 var2, Word16 *var3 ) * Return Value : * * var_out 16 bit short signed integer (Word16) whose value falls in - * the range : 0xffff 8000 <= var_out <= 0x0000 7fff. + * the range : 0x8000 <= var_out <= 0x7fff. * *****************************************************************************/ Word16 rotl( Word16 var1, Word16 var2, Word16 *var3 ) diff --git a/lib_basop/enh40.c b/lib_basop/enh40.c index 57df99e5c706d64c70ceadb659e837d93f8e244c..dceda65a618082ce182b7209bc2efd8097089a92 100644 --- a/lib_basop/enh40.c +++ b/lib_basop/enh40.c @@ -878,7 +878,11 @@ void Mpy_32_16_ss( Word32 L_var1, Word16 var2, Word32 *L_varout_h, UWord16 *varo var1_h = extract_h( L_var1 ); /* Below line can not overflow, so we can use << instead of L40_shl. */ +#ifdef FIX_2600_UNDEF + L40_var1 = (Word40) ( (UWord40) ( (Word32) var2 * (Word32) uvar1_l ) << 1 ); +#else L40_var1 = ( (Word40) ( (Word32) var2 * (Word32) uvar1_l ) ) << 1; +#endif *varout_l = Extract40_L( L40_var1 ); @@ -966,8 +970,13 @@ void Mpy_32_32_ss( Word32 L_var1, Word32 L_var2, Word32 *L_varout_h, UWord32 *L_ *L_varout_l = 0x0000ffff & L_Extract40( L40_var1 ); L40_var1 = L40_shr( L40_var1, 16 ); +#ifdef FIX_2600_UNDEF + L40_var1 = L40_add( L40_var1, (UWord40) ( (Word40) ( (Word32) var2_h * (Word32) uvar1_l ) ) << 1 ); + L40_var1 = L40_add( L40_var1, (UWord40) ( (Word40) ( (Word32) var1_h * (Word32) uvar2_l ) ) << 1 ); +#else L40_var1 = L40_add( L40_var1, ( (Word40) ( (Word32) var2_h * (Word32) uvar1_l ) ) << 1 ); L40_var1 = L40_add( L40_var1, ( (Word40) ( (Word32) var1_h * (Word32) uvar2_l ) ) << 1 ); +#endif *L_varout_l |= ( L_Extract40( L40_var1 ) ) << 16; L40_var1 = L40_shr( L40_var1, 16 ); diff --git a/lib_basop/enh40.h b/lib_basop/enh40.h index 8cfb0c6009194f2c88e2a6713d91f3440515ce1c..7927009db95c26b8d2e0360363d79dfef5aa0cf1 100644 --- a/lib_basop/enh40.h +++ b/lib_basop/enh40.h @@ -336,7 +336,11 @@ static __inline Word40 L40_mult( Word16 var1, Word16 var2 ) L40_var_out = (Word40) L_var_out; /* Below line can not overflow, so we can use << instead of L40_shl. */ +#ifdef FIX_2600_UNDEF + L40_var_out = (Word40)( (UWord40) L40_var_out << 1 ); +#else L40_var_out = L40_var_out << 1; +#endif #ifdef WMOPS multiCounter[currCounter].L40_mult++; diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 808701a88b18fd89ab636aa3ebe2663c631ba28b..bc900d27c2fc0b606222b632ed3fda6c242dcf41 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -18,7 +18,7 @@ #include #include "stl.h" -#ifdef FIX_2493_CHECK_64BIT +#if defined( FIX_2493_CHECK_64BIT ) || defined( FIX_2600_UNDEF ) #include #endif @@ -78,10 +78,15 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; + #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var2 > 0 && L64_var1 > MAX_64 - L64_var2 ) || ( L64_var2 < 0 && L64_var1 < MIN_64 - L64_var2 ) ) ); #endif +#ifdef FIX_2600_UNDEF + L64_var_out = (Word64) ( (UWord64) L64_var1 + (UWord64) L64_var2 ); +#else L64_var_out = L64_var1 + L64_var2; +#endif #ifdef WMOPS multiCounter[currCounter].W_add_nosat++; @@ -123,10 +128,15 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ) Word64 W_sub_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; + #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var2 < 0 && L64_var1 > MAX_64 + L64_var2 ) || ( L64_var2 > 0 && L64_var1 < MIN_64 + L64_var2 ) ) ); #endif +#ifdef FIX_2600_UNDEF + L64_var_out = (Word64) ( (UWord64) L64_var1 - (UWord64) L64_var2 ); +#else L64_var_out = L64_var1 - L64_var2; +#endif #ifdef WMOPS multiCounter[currCounter].W_sub_nosat++; @@ -176,10 +186,18 @@ Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) if ( var2 <= 0 ) { +#ifdef FIX_2600_UNDEF + var2 = -var2; + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else if ( var2 < -64 ) var2 = -64; var2 = -var2; L64_var_out = L64_var1 >> var2; +#endif } else { @@ -267,7 +285,14 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) } else { +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else L64_var_out = L64_var1 >> var2; +#endif } #ifdef WMOPS @@ -320,14 +345,34 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 <= 0 ) { var2 = -var2; +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else +#ifdef FIX_2600_UNDEF + assert( var2 <= 63 ); +#endif L64_var_out = L64_var1 >> var2; +#endif } else { +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = (Word64) ( (UWord64) L64_var1 << s_min( 63, var2 ) ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#elif defined( FIX_2600_UNDEF ) + assert( var2 <= 63 ); #ifdef FIX_2493_CHECK_64BIT - assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 ); + assert( ( (Word64)( (UWord64) L64_var1 << var2 ) >> var2 ) == L64_var1 ); #endif + L64_var_out = (Word64) ( (UWord64)L64_var1 << var2 ); +#else L64_var_out = L64_var1 << var2; +#endif } #ifdef WMOPS multiCounter[currCounter].W_shl_nosat++; @@ -380,14 +425,34 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { var2 = -var2; +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = (Word64) ( (UWord64) L64_var1 << s_min( 63, var2 ) ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#elif defined( FIX_2600_UNDEF ) + assert( var2 <= 63 ); #ifdef FIX_2493_CHECK_64BIT assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 ); #endif + L64_var_out = (Word64) ( (UWord64) L64_var1 << var2 ); +#else L64_var_out = L64_var1 << var2; +#endif } else { +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else +#ifdef FIX_2600_UNDEF + assert( var2 <= 63 ); +#endif L64_var_out = L64_var1 >> var2; +#endif } #ifdef WMOPS @@ -405,7 +470,7 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) | Purpose : | | | | Multiply L_var2 by var3 and shift the result left by 1. Add the 64 bit | -| result to L64_var1, return a 64 bit result. | +| result to L64_var1 without saturation control, returns a 64 bit result. | | | | Complexity weight : 1 | | | @@ -421,7 +486,7 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) | | | var3 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var3 <= 0x0000 7fff. | +| range : 0x8000 <= var3 <= 0x7fff. | | | | Outputs : | | | @@ -436,10 +501,16 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) */ Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) { +#ifdef FIX_2600_UNDEF + /* sanitizer undefined behaviour (UBSAN) runtime error: left shift of negative value */ + Word64 L64_var_out = (Word64)( (UWord64)( (Word64) L_var2 * var3 ) << 1 ); +#else Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1; +#endif #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out > 0 && L64_var1 > MAX_64 - L64_var_out ) || ( L64_var_out < 0 && L64_var1 < MIN_64 - L64_var_out ) ) ); #endif + L64_var_out += L64_var1; #ifdef WMOPS multiCounter[currCounter].W_mac_32_16++; @@ -455,7 +526,7 @@ Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) | Purpose : | | | | Multiply L_var2 by var3 and shift the result left by 1. Subtract the 64 bit | -| result from L64_var1, return a 64 bit result. | +| result from L64_var1 without saturation control, returns a 64 bit result. | | | | Complexity weight : 1 | | | @@ -471,7 +542,7 @@ Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) | | | var3 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var3 <= 0x0000 7fff. | +| range : 0x8000 <= var3 <= 0x7fff. | | | | Outputs : | | | @@ -486,10 +557,16 @@ Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) */ Word64 W_msu_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) { +#ifdef FIX_2600_UNDEF + /* sanitizer undefined behaviour (UBSAN) runtime error: left shift of negative value */ + Word64 L64_var_out = (Word64)( (UWord64)( (Word64) L_var2 * var3 ) << 1 ); +#else Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1; +#endif #ifdef FIX_2493_CHECK_64BIT assert( !( ( L64_var_out < 0 && L64_var1 > MAX_64 + L64_var_out ) || ( L64_var_out > 0 && L64_var1 < MIN_64 + L64_var_out ) ) ); #endif + L64_var_out = L64_var1 - L64_var_out; #ifdef WMOPS multiCounter[currCounter].W_msu_32_16++; @@ -531,7 +608,12 @@ Word64 W_msu_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) */ Word64 W_mult_32_16( Word32 L_var1, Word16 var2 ) { +#ifdef FIX_2600_UNDEF + /* sanitizer undefined behaviour (UBSAN) runtime error: left shift of negative value */ + Word64 L64_var_out = (Word64)( (UWord64)( (Word64) L_var1 * var2 ) << 1 ); +#else Word64 L64_var_out = ( (Word64) L_var1 * var2 ) << 1; +#endif #ifdef WMOPS multiCounter[currCounter].W_mult_32_16++; #endif /* if WMOPS */ @@ -844,7 +926,11 @@ Word64 W_deposit32_h( Word32 L_var1 ) { Word64 L64_var_out; +#ifdef FIX_2600_UNDEF + L64_var_out = (Word64) ( (UWord64) L_var1 << 32 ); +#else L64_var_out = (Word64) L_var1 << 32; +#endif #ifdef WMOPS multiCounter[currCounter].W_deposit32_h++; @@ -950,11 +1036,11 @@ Word32 W_extract_h( Word64 L64_var1 ) | | | var1 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff | +| range : 0x8000 <= var1 <= 0x7fff | | | | var2 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| range : 0x8000 <= var2 <= 0x7fff. | | | | Outputs : | | | @@ -964,12 +1050,17 @@ Word32 W_extract_h( Word64 L64_var1 ) | | | L64_var_out | | 64 bit long long signed integer (Word64) whose value falls in the | -| range : 0x80000000 00000000LL <= L64_acc <= 0x7fffffff ffffffffLL. | +| range : 0xffffffff 80010000LL <= L64_acc <= 0x00000000 80000000LL. | |_________________________________________________________________________________________________| */ Word64 W_mult_16_16( Word16 var1, Word16 var2 ) { +#ifdef FIX_2600_UNDEF + /* sanitizer undefined behaviour (UBSAN) runtime error: left shift of negative value */ + Word64 L64_var_out = (Word64)( (UWord64)( (Word64) var1 * var2 ) << 1 ); +#else Word64 L64_var_out = ( (Word64) var1 * var2 ) << 1; +#endif #ifdef WMOPS multiCounter[currCounter].W_mult_16_16++; #endif /* if WMOPS */ @@ -981,8 +1072,8 @@ Word64 W_mult_16_16( Word16 var1, Word16 var2 ) | | | Purpose : | | | -| Multiply var1 by var2 and shift the result left by 1 and add the 64 bit result to L64_acc, | -| return a 64 bit result. | +| Multiply var1 by var2 and shift the result left by 1, adds the 64 bit result to L64_acc | +| without saturation control and returns a 64 bit result. | | | | Complexity weight : 1 | | | @@ -994,11 +1085,11 @@ Word64 W_mult_16_16( Word16 var1, Word16 var2 ) | | | var1 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| range : 0x8000 <= var1 <= 0x7fff | | | | var2 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var2 <= 0x0000 7fff. | +| range : 0x8000 <= var2 <= 0x7fff | | | | Outputs : | | | @@ -1013,7 +1104,12 @@ Word64 W_mult_16_16( Word16 var1, Word16 var2 ) */ Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ) { +#ifdef FIX_2600_UNDEF + /* sanitizer undefined behaviour (UBSAN) runtime error: left shift of negative value */ + Word64 L64_var_out = (Word64)( (UWord64)( (Word64) var1 * var2 ) << 1 ); +#else Word64 L64_var_out = ( (Word64) var1 * var2 ) << 1; +#endif L64_acc = L64_acc + L64_var_out; #ifdef WMOPS @@ -1031,6 +1127,8 @@ Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ) | | | Multiply var2 by var3 and shift the result left by1 and subtract the 64 bit result | | from L64_var1, return a 64 bit result. | +| Multiply var2 by var3 and shift the result left by 1, subtracts the 64 bit result from | +| iL64_var1 without saturation control and returns a 64 bit result. | | | | Complexity weight : 1 | | | @@ -1042,11 +1140,12 @@ Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ) | | | var2 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var2 <= 0x0000 7fff. | +| range : 0x8000 <= var2 <= 0x7fff | | | | var3 | | 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var3 <= 0x0000 7fff. | +| range : 0x8000 <= var3 <= 0x7fff | +| | | | | Outputs : | | | @@ -1061,7 +1160,12 @@ Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ) */ Word64 W_msu_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) { +#ifdef FIX_2600_UNDEF + /* sanitizer undefined behaviour (UBSAN) runtime error: left shift of negative value */ + Word64 L64_var_out = (Word64)( (UWord64)( (Word64) var2 * var3 ) << 1 ); +#else Word64 L64_var_out = ( (Word64) var2 * var3 ) << 1; +#endif L64_var_out = L64_var1 - L64_var_out; #ifdef WMOPS multiCounter[currCounter].W_msu_16_16++; @@ -1202,6 +1306,23 @@ Word32 W_round48_L_o( Word64 L64_var1, Flag *Overflow ) Word64 L64_var_out; Word32 L_result; +#ifdef FIX_2600_UNDEF + uint64_t L64_var2 = 0x80000000LL; + + L64_var1 = W_shl( L64_var1, 16 ); + + L64_var_out = (UWord64)L64_var1 + (UWord64)L64_var2; + + if ( ( ( L64_var1 ^ L64_var2 ) & (uint64_t) MIN_64 ) == 0 ) + { + if ( ( L64_var_out ^ L64_var1 ) & (uint64_t) MIN_64 ) + { + L64_var_out = ( L64_var1 < 0 ) ? MIN_64 : MAX_64; + set_overflow( Overflow ); + } + } + L_result = W_extract_h( L64_var_out ); +#else Word64 L64_var2 = 0x80000000; Word64 L64_MIN = (Word64) 0x8000000000000000LL; Word64 L64_MAX = 0x7FFFFFFFFFFFFFFFLL; @@ -1219,6 +1340,7 @@ Word32 W_round48_L_o( Word64 L64_var1, Flag *Overflow ) } } L_result = W_extract_h( L64_var_out ); +#endif #ifdef WMOPS multiCounter[currCounter].W_round48_L++; multiCounter[currCounter].W_extract_h--; @@ -1266,7 +1388,23 @@ Word16 W_round32_s_o( Word64 L64_var1, Flag *Overflow ) Word32 L_var; Word16 var_out; +#ifdef FIX_2600_UNDEF + uint64_t L64_var2 = 0x800000000000LL; + + L64_var1 = W_shl( L64_var1, 16 ); + L64_var_out = (UWord64)L64_var1 + (UWord64)L64_var2; + if ( ( ( L64_var1 ^ L64_var2 ) & (uint64_t) MIN_64 ) == 0 ) + { + if ( ( L64_var_out ^ L64_var1 ) & (uint64_t) MIN_64 ) + { + L64_var_out = ( L64_var1 < 0 ) ? MIN_64 : MAX_64; + set_overflow( Overflow ); + } + } + L_var = W_extract_h( L64_var_out ); + var_out = extract_h( L_var ); +#else Word64 L64_var2 = 0x800000000000LL; Word64 L64_MIN = 0x8000000000000000LL; Word64 L64_MAX = 0x7FFFFFFFFFFFFFFFLL; @@ -1284,6 +1422,7 @@ Word16 W_round32_s_o( Word64 L64_var1, Flag *Overflow ) } L_var = W_extract_h( L64_var_out ); var_out = extract_h( L_var ); +#endif #ifdef WMOPS multiCounter[currCounter].W_round32_s++; multiCounter[currCounter].W_extract_h--; @@ -1394,6 +1533,18 @@ Word64 W_add_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) { Word64 L64_var_out; +#ifdef FIX_2600_UNDEF + L64_var_out = (UWord64)L64_var1 + (UWord64)L64_var2; + + if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) == 0 ) + { + if ( ( (uint64_t) L64_var_out ^ (uint64_t) L64_var1 ) & MIN_64 ) + { + L64_var_out = ( L64_var1 < 0 ) ? MIN_64 : MAX_64; + set_overflow( Overflow ); + } + } +#else L64_var_out = L64_var1 + L64_var2; if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) == 0 ) @@ -1404,6 +1555,7 @@ Word64 W_add_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) set_overflow( Overflow ); } } +#endif #ifdef WMOPS multiCounter[currCounter].W_add++; @@ -1451,6 +1603,18 @@ Word64 W_sub_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) { Word64 L64_var_out; +#ifdef FIX_2600_UNDEF + L64_var_out = (UWord64)L64_var1 - (UWord64)L64_var2; + + if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) != 0 ) + { + if ( ( (uint64_t) L64_var_out ^ (uint64_t) L64_var1 ) & (uint64_t) MIN_64 ) + { + L64_var_out = ( L64_var1 < 0 ) ? MIN_64 : MAX_64; + set_overflow( Overflow ); + } + } +#else L64_var_out = L64_var1 - L64_var2; if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) != 0 ) @@ -1461,6 +1625,7 @@ Word64 W_sub_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) set_overflow( Overflow ); } } +#endif #ifdef WMOPS multiCounter[currCounter].W_add++; @@ -1594,7 +1759,7 @@ Word64 W_abs( Word64 L64_var1 ) | | | Purpose : | | | -| Multiply L_var1 by L_var2 and shift the result left by 1.Saturate and set overflow in case | +| Multiply L_var1 by L_var2 and shift the result left by 1. Saturate and set overflow in case | | where both inputs are 0x80000000 . Return a 64 bit result. | | | | Complexity weight : 1 | @@ -1617,7 +1782,7 @@ Word64 W_abs( Word64 L64_var1 ) | | | L64_var_out | | 64 bit long long signed integer (Word64) whose value falls in the | -| range : 0x80000000 00000000LL <= L64_var_out <= 0x7fffffff ffffffffLL. | +| range : 0x80000001 00000000LL <= L64_var_out <= 0x7fffffff ffffffffLL. | |_________________________________________________________________________________________________| */ Word64 W_mult_32_32_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) @@ -1631,7 +1796,12 @@ Word64 W_mult_32_32_o( Word32 L_var1, Word32 L_var2, Flag *Overflow ) } else { +#ifdef FIX_2600_UNDEF + /* sanitizer undefined behaviour (UBSAN) runtime error: left shift of negative value */ + L64_var_out = (Word64)( (UWord64)( (Word64) L_var1 * L_var2 ) << 1 ); +#else L64_var_out = ( (Word64) L_var1 * L_var2 ) << 1; +#endif } #ifdef WMOPS @@ -1729,11 +1899,31 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = L64_var1 >> s_min( 63, -var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else +#ifdef FIX_2600_UNDEF + assert( -var2 <= 63 ); +#endif L64_var_out = L64_var1 >> ( -var2 ); +#endif } else { +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = L64_var1 << s_min( 63, var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else +#ifdef FIX_2600_UNDEF + assert( var2 <= 63 ); +#endif L64_var_out = L64_var1 << var2; +#endif } #ifdef WMOPS multiCounter[currCounter].W_lshl++; @@ -1781,11 +1971,31 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = L64_var1 << s_min( 63, -var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else +#ifdef FIX_2600_UNDEF + assert( -var2 <= 63 ); +#endif L64_var_out = L64_var1 << ( -var2 ); +#endif } else { +#ifdef FIX_2600_UNDEF_SHIFT_SAT + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif +#else +#ifdef FIX_2600_UNDEF + assert( var2 <= 63 ); +#endif L64_var_out = L64_var1 >> var2; +#endif } #ifdef WMOPS multiCounter[currCounter].W_lshr++; diff --git a/lib_basop/typedef.h b/lib_basop/typedef.h index 9968d4c84cba87fc0435c0737579b64448365196..855b4eae0427a8c828683b79abbfba63c28112af 100644 --- a/lib_basop/typedef.h +++ b/lib_basop/typedef.h @@ -78,6 +78,9 @@ typedef int32_t Word32; typedef uint16_t UWord16; typedef uint32_t UWord32; typedef int64_t Word40; +#ifdef FIX_2600_UNDEF +typedef uint64_t UWord40; +#endif typedef bool Flag; #define TYPEDEF_INITIALIZED #else @@ -92,6 +95,9 @@ typedef int Word32; typedef unsigned short UWord16; typedef unsigned int UWord32; typedef __int64 Word40; +#ifdef FIX_2600_UNDEF +typedef unsigned __int64 UWord40; +#endif typedef int Flag; #define TYPEDEF_INITIALIZED #elif defined( __sun ) @@ -103,6 +109,9 @@ typedef long Word32; typedef unsigned short UWord16; typedef unsigned long UWord32; typedef long long Word40; +#ifdef FIX_2600_UNDEF +typedef unsigned long long UWord40; +#endif typedef int Flag; #define TYPEDEF_INITIALIZED #elif defined( __unix__ ) || defined( __unix ) || defined( __APPLE__ ) || defined( __CYGWIN__ ) || defined( __MINGW32__ ) @@ -114,6 +123,9 @@ typedef unsigned short UWord16; typedef unsigned int UWord32; /*#error "The 40-bit operations have not been tested on unix : need to define Word40"*/ typedef long long Word40; +#ifdef FIX_2600_UNDEF +typedef unsigned long long UWord40; +#endif typedef int Flag; #endif #define TYPEDEF_INITIALIZED @@ -129,6 +141,9 @@ typedef int Flag; #define maxUWord32 UINT_MAX /* Definition of Word40 was missing 10/06/2013 */ #define Word40 long long +#ifdef FIX_2600_UNDEF +#define UWord40 unsigned long long +#endif typedef float Float32; diff --git a/lib_basop/typedefs.h b/lib_basop/typedefs.h index 001f3f1647c4ed00dd47fd28101a3f20a3c52c1b..ac338350f8d4123a75a93e241ed648c962a49cb6 100644 --- a/lib_basop/typedefs.h +++ b/lib_basop/typedefs.h @@ -131,6 +131,9 @@ typedef unsigned short UWord16; /* Definition of Word40 was missing 10/06/2013 */ #define Word40 long long +#ifdef FIX_2600_UNDEF +#define UWord40 unsigned long long +#endif /* ********* define 32 bit signed/unsigned types & constants diff --git a/lib_com/options.h b/lib_com/options.h index 708911c0fd88b6f383abef2c193a2df162784818..99aaa66b50de2d1aa0670ce2cf06c80794d2c965 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,6 +86,9 @@ #define FIX_1990_SANITIZER_IN_REVERB_LOAD /* Nokia: Fix issue part of issue 1990 by introducing missing free of structure - keep until #2059 is addressed */ #define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define NONBE_1122_KEEP_EVS_MODE_UNCHANGED /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR. */ +#define FIX_2600_UNDEF /* FhG: fix reliance on unsigned overflow behaviour */ +#define FIX_BASOP_2620_ICBWE_GSMAPPING_DEAD_CLAMP /* FhG: remove dead (always-overwritten) gsMapping clamp in ic_bwe_enc_gsMapping_fx; float ref has no clamp */ +#define FIX_BASOP_2626_RC_UNI_DEC_READ_BITS_HANG /* FhG: BASOP #2626: rc_uni_dec_read_bits: replace loop counter tmp with UWord64; with UWord32 the division-substitute loop (tmp <= low) never terminates after the bit-error sentinel sets rc_low=0xFFFFFFFF -> decoder hang on corrupted bitstreams */ #define HARMONIZE_2502_GENERATE_COMFORT_NOISE_DEC /* FhG: harmonize generate_comfort_noise_dec_fx() and generate_comfort_noise_dec_ivas_fx() */ /* #################### End BE switches ################################## */ @@ -94,6 +97,19 @@ /* any switch which is non-be wrt. TS 26.251 V3.0 */ #define FIX_1576_LCLD_CRASH_DIFFERENT_CODEC_ISAR_FRAME_SIZE /* Dolby: float issue 1576: fix for crash in LCLD mode when codec frame size is less than isar frame size */ +// #define FIX_2600_UNDEF_SHIFT_SAT /* FhG: limit shift amount for 64 bit operators. */ +#define FIX_2600_UNDEF_adaptive_polar_ext_plc_fx /* FhG: Avoid too large 64 bit shift in adaptive_polar_ext_plc_fx */ +#define FIX_2600_UNDEF_ivas_find_enr /* FhG: Avoid too large 64 bit shift in ivas_find_enr */ +#define FIX_2600_UNDEF_eig2x2_fx /* FhG: Avoid too large 64 bit shift in eig2x2_fx */ +#define FIX_2600_UNDEF_usquant_fx /* FhG: Avoid too large 32 bit shift in usquant_fx because of wrong operator usage */ +#define FIX_2600_UNDEF_usquant_fx_EVS_BE /* FhG: Make FIX_2600_UNDEF_usquant_fx bit exact for EVS with wrong calculation */ +#define FIX_2600_UNDEF_wrong_lsat /* FhG: Avoid too large 32 bit shift in IGF_getSFM_new_fx, IGF_CalculateEnvelope_fx because of wrong operator usage */ +// #define FIX_2600_UNDEF_ivas_core_pre_proc_front_fx /* FhG: Avoid too large 16 bit shift in ivas_core_pre_proc_front_fx */ +#define NONBE_FIX_2493_EXTRACT_L_d_syn_filt_fx /* FhG: Fix extract_l overflow inside d_syn_filt_fx(). W_shr( x, s ) with s out of range problem. */ +#define FIX_BASOP_2612_RESET_DECIM_MEM /* FhG: BASOP #2612: reset (zero) the 16k resampler memory of the secondary channel on DFT->TD stereo switch (otherwise -> fx overshoot) */ +#define FIX_BASOP_2621_STEREO_CNG_NOISY_SPEECH_QSHIFT /* FhG: BASOP #2621: stereo_dft_generate_comfort_noise_fx flag_noisy_speech: compare (lp_speech-lp_noise) Q23 diff against 28.0 in Q23 (was vs integer 28 with q_lp_noise=0) */ +#define FIX_ISSUE_2618_PLC_RES_ATT_SCALING /* FhG: BASOP #2618: residual PLC burst attenuation, apply divide/Sqrt32 exponent so fac tracks exponent correctly */ +#define NONBE_FIX2614_LP_CNG_ASSERT /* FhG: */ #define FIX_FLOAT_1600_OMASA_WRONG_RENDER_PATH /* Nokia: float issue 1600: fix initialization condition of stereo type detection for OMASA */ #define FIX_BASOP_2627_PARAM_MC_ILD_REMAP_EXP /* FhG: BASOP #2627: accumulate 10^(ILD/10) using a dynamic exponent */ #define FIX_BASOP_2635_EFAP_ADD_VERTEX_ELE_ROUND /* FhG: BASOP #2635: round |elevation| with anint_fx before the 90deg subtraction in add_vertex_fx */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 9d1272b61d2c14f09550de2d81e48b7049c0981e..802c71eddb7c40a66bb99ba94acdc292fa9ecbca 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8429,6 +8429,16 @@ Word16 usquant_fx( const Word16 cbsize /* i: codebook size */ ); +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE +Word16 usquant2_fx( + const Word16 x, /* i : scalar value to quantize Qx*/ + Word16 *xq, /* o : quantized value Qx*/ + const Word16 qlow, /* i : lowest codebook entry (index 0) Qx*/ + const Word16 delta, /* i : quantization step Qx-1*/ + const Word16 cbsize, /* i : codebook size */ + const Word16 isEVS ); +#endif + /* o : Sum */ Word32 Dot_product( const Word16 x[], /* i : 12bits: x vector */ diff --git a/lib_com/rom_basop_util.c b/lib_com/rom_basop_util.c index 321658f7a927a8edbf7f58dbb894dad0f9a5269f..6e336b63705874aa5ce5e836e956234955fc8650 100644 --- a/lib_com/rom_basop_util.c +++ b/lib_com/rom_basop_util.c @@ -30,11 +30,11 @@ *******************************************************************************************************/ +#include "options.h" #include "rom_basop_util.h" #include "stl.h" #include #include -#include "options.h" #define STC( x ) WORD322WORD16( x ) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 0ce926375bce539a8dc24de5a589f80dfce0e862..b40f4779a7f2ff6e7bdd911f834c89ff182e6ce8 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -29,8 +29,11 @@ static void flip_spectrum_fx( const Word16 input[], Word16 output[], const Word1 static void Calc_st_filt_tbe_fx( const Word16 element_mode, const Word16 enc_dec, Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero ); static void Hilbert_transform_fx( Word32 tmp_R[], Word32 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id ); static void Hilbert_transform_sp_fx( Word16 tmp_R[], Word16 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id ); +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE +static void Estimate_mix_factors_fx( const Word16 *shb_res, const Word16 Q_shb, const Word16 *exc16kWhtnd, const Word16 Q_bwe_exc, const Word16 *White_exc16k_frac, const Word16 Q_frac, const Word32 pow1, const Word16 Q_pow1, const Word32 pow22, const Word16 Q_pow22, Word16 *vf_modified, Word16 *vf_ind, Word16 isEVS ); +#else static void Estimate_mix_factors_fx( const Word16 *shb_res, const Word16 Q_shb, const Word16 *exc16kWhtnd, const Word16 Q_bwe_exc, const Word16 *White_exc16k_frac, const Word16 Q_frac, const Word32 pow1, const Word16 Q_pow1, const Word32 pow22, const Word16 Q_pow22, Word16 *vf_modified, Word16 *vf_ind ); - +#endif /*-------------------------------------------------------------------* * swb_tbe_reset() @@ -1806,8 +1809,13 @@ void GenShapedSHBExcitation_fx( { IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, + ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind, element_mode == EVS_MONO ); +#else Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); +#endif tmp = voiceFacEst[0]; move16(); tmp2 = MAX_16; @@ -2748,14 +2756,23 @@ void GenShapedSHBExcitation_ivas_fx( g = shl_sat( g, g_e ); /* Q15 */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + *vf_ind = usquant2_fx( g, &mix_factor, 0, delta, cbsize, element_mode == EVS_MONO ); +#else *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize ); +#endif move16(); } } ELSE { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, + Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind, element_mode == EVS_MONO ); +#else Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); +#endif tmp = voiceFacEst[0]; tmp2 = MAX_16; move16(); @@ -5264,7 +5281,12 @@ static void Estimate_mix_factors_fx( const Word32 pow22, /* i : White noise excitation for normalization in Q_pow22 */ const Word16 Q_pow22, Word16 *vf_modified, /* o : Estimated voice factors */ - Word16 *vf_ind /* o : voice factors VQ index */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + Word16 *vf_ind, /* o : voice factors VQ index */ + Word16 isEVS +#else + Word16 *vf_ind /* o : voice factors VQ index */ +#endif ) { Word16 shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k]; @@ -5371,7 +5393,11 @@ static void Estimate_mix_factors_fx( vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ ); move16(); +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + *vf_ind = usquant2_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ), isEVS ); +#else *vf_ind = usquant_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ) ); +#endif move16(); vf_modified[0] = tmp1; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index eba00b918cc0518f8380921404904955bd805d7c..ec0634021fa4a3f1e9e2d7fb2292cdeb490d32f8 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -825,6 +825,7 @@ Word32 usdequant32_fx( *-------------------------------------------------------------------*/ /* o: index of the winning codeword */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE Word16 usquant_fx( const Word16 x, /* i : scalar value to quantize Qx*/ Word16 *xq, /* o : quantized value Qx*/ @@ -832,16 +833,57 @@ Word16 usquant_fx( const Word16 delta, /* i : quantization step Qx-1*/ const Word16 cbsize /* i : codebook size */ ) +{ + return usquant2_fx( x, xq, qlow, delta, cbsize, 0 ); +} + +Word16 usquant2_fx( +#else +Word16 usquant_fx( +#endif + const Word16 x, /* i : scalar value to quantize Qx*/ + Word16 *xq, /* o : quantized value Qx*/ + const Word16 qlow, /* i : lowest codebook entry (index 0) Qx*/ + const Word16 delta, /* i : quantization step Qx-1*/ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + const Word16 cbsize, /* i : codebook size */ + const Word16 isEVS +#else + const Word16 cbsize /* i : codebook size */ +#endif +) { Word16 idx; +#if defined( FIX_2600_UNDEF_usquant_fx ) && !defined( FIX_2600_UNDEF_usquant_fx_EVS_BE ) + Word16 exp; +#else Word16 tmp, exp; +#endif Word32 L_tmp; /* idx = (short)( (x - qlow)/delta + 0.5f); */ +#ifdef FIX_2600_UNDEF_usquant_fx +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + IF( isEVS ) + { + /* This is wrong, temporarily only. */ + exp = norm_s( delta ); + tmp = div_s( shl( 1, sub( 14, exp ) ), delta ); /*Q(29-exp-(Qx-1))->Q(30-exp-Qx) */ + L_tmp = L_mult( sub_sat( x, qlow ), tmp ); /*Q(31-exp) */ + idx = extract_l( L_shr_r( L_add( L_tmp, L_deposit_l( shl_sat( 1, sub( 30, exp ) ) ) ), sub( 31, exp ) ) ); /*Q0 */ + } + ELSE +#endif + { + L_tmp = L_deposit_h( BASOP_Util_Divide1616_Scale( sub_sat( x, qlow ), delta, &exp ) ); + idx = round_fx( L_shl( L_tmp, sub( exp, 16 ) ) ); /*Q0 */ + } +#else exp = norm_s( delta ); tmp = div_s( shl( 1, sub( 14, exp ) ), delta ); /*Q(29-exp-(Qx-1))->Q(30-exp-Qx) */ L_tmp = L_mult( sub_sat( x, qlow ), tmp ); /*Q(31-exp) */ idx = extract_l( L_shr_r( L_add( L_tmp, shl_sat( 1, sub( 30, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ +#endif idx = s_min( idx, sub( cbsize, 1 ) ); idx = s_max( idx, 0 ); diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 5f5b6d3fd13259746228594a515414f3c93788b6..ab93631261070b3ec85a2bdc3c6bf2d3de7582bf 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -81,10 +81,12 @@ void decoder_tcx_fx( Word16 L_spec_con; TCX_LTP_DEC_HANDLE hTcxLtpDec; TCX_DEC_HANDLE hTcxDec; +#ifndef FIX_2600_UNDEF Flag Overflow = 0; Flag Carry = 0; move32(); move32(); +#endif temp_concealment_method = 0; move16(); @@ -731,7 +733,11 @@ void decoder_tcx_fx( tmp32 = L_deposit_l( 0 ); FOR( i = 0; i < L_spec; i++ ) { +#ifdef FIX_2600_UNDEF + tmp32 = L_mac( tmp32, abs_s( prm_sqQ[i] ), i ); +#else tmp32 = L_macNs_co( tmp32, abs_s( prm_sqQ[i] ), i, &Carry, &Overflow ); +#endif } nf_seed = extract_l( tmp32 ); } @@ -4548,10 +4554,12 @@ void decoder_tcx_noisefilling_fx( Word32 total_brate; Word32 tmp32; Word16 *pInfoTCXNoise; +#ifndef FIX_2600_UNDEF Flag Overflow = 0; move32(); Flag Carry = 0; move32(); +#endif total_brate = ( (Word16) EQ_16( st->element_mode, IVAS_CPE_MDCT ) ? st->element_brate : st->total_brate ); move32(); /*-----------------------------------------------------------------* @@ -4628,7 +4636,11 @@ void decoder_tcx_noisefilling_fx( tmp32 = L_deposit_l( 0 ); FOR( i = 0; i < L_spec; i++ ) { +#ifdef FIX_2600_UNDEF + tmp32 = L_mac( tmp32, abs_s( prm_sqQ[i] ), i ); +#else tmp32 = L_macNs_co( tmp32, abs_s( prm_sqQ[i] ), i, &Carry, &Overflow ); +#endif } nf_seed = extract_l( tmp32 ); } diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 89df6423ca1339b2071e23e63733b66c2240e24c..33ebfded70c85c2aad48feff16522ab61e0f9324 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -519,8 +519,12 @@ static void bwe_switch_enc_fx( L_tmp1 = L_mult( tmp, E2_fx ); /*30-q_tmp1+q_tmp2 */ q_tmp2 = sub( q_tmp1, q_tmp2 ); /*30-q_tmp2 */ L_tmp1 = L_shl( L_tmp1, sub( q_tmp2, 24 ) ); - gain_fx = round_fx_sat( Isqrt( L_tmp1 ) ); /*Q12 */ + gain_fx = round_fx_sat( Isqrt( L_tmp1 ) ); /*Q12 */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + ind1_fx = usquant2_fx( gain_fx, &gain_fx, shr( MINVALUEOFFIRSTGAIN_FX, 1 ), shr( DELTAOFFIRSTGAIN_FX, 4 ), ( 1 << NOOFGAINBITS1 ), st_fx->element_mode == EVS_MONO ); /* Q0 */ +#else ind1_fx = usquant_fx( gain_fx, &gain_fx, shr( MINVALUEOFFIRSTGAIN_FX, 1 ), shr( DELTAOFFIRSTGAIN_FX, 4 ), ( 1 << NOOFGAINBITS1 ) ); /* Q0 */ +#endif push_indice( hBstr, IND_CORE_SWITCHING_AUDIO_GAIN, ind1_fx, NOOFGAINBITS1 ); return; diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index e7d09c786d06b16f010c79b5529d09ca260195f1..1f1ac3f1794c2191d261b6f02411eeafeff1dd08 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -757,7 +757,11 @@ static void ivas_find_enr( freq = BIN_FREQ_FX; move16(); - tmp_shift = sub( -Q16, shift ); // 16 - shift - 32 +#ifdef FIX_2600_UNDEF_ivas_find_enr + tmp_shift = s_max( -63, sub( -Q16, shift ) ); // 16 - shift - 32 +#else + tmp_shift = sub( -Q16, shift ); // 16 - shift - 32 +#endif FOR( i = 0; i < voic_band; i++ ) /* up to maximum allowed voiced critical band */ { band_ener = 0; diff --git a/lib_enc/enc_acelp_fx.c b/lib_enc/enc_acelp_fx.c index 52e42582c3ce33e25db2f2105b03646f7eb01624..4f46d61dcd72dd37938227aa30a6256c101e710e 100644 --- a/lib_enc/enc_acelp_fx.c +++ b/lib_enc/enc_acelp_fx.c @@ -3,10 +3,10 @@ ====================================================================================*/ #include +#include "options.h" /* FIX_2600_UNDEF, options.h must be BEFORE typedef.h */ #include "typedef.h" #include #include -#include "options.h" #include "cnst.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 5f1b69807f2454e301f9a1e69f74b887a8850878..d61389cfc8eca5b6a844a2d14b0587369850dfbe 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -344,8 +344,13 @@ void encod_gen_voic_fx( } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + gain_enc_SQ_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, shift_wsp, st_fx->element_mode == EVS_MONO ); +#else gain_enc_SQ_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, shift_wsp ); +#endif } ELSE { diff --git a/lib_enc/enc_higher_acelp_fx.c b/lib_enc/enc_higher_acelp_fx.c index f17d166712fe295df2fe532481e8a3f7c36b6182..22c2560c86325f2324811b5f318e300bd95a4b72 100644 --- a/lib_enc/enc_higher_acelp_fx.c +++ b/lib_enc/enc_higher_acelp_fx.c @@ -201,15 +201,27 @@ void transf_cdbk_enc_fx( } IF( GT_32( st_fx->core_brate, 56000 ) ) { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + index = usquant2_fx( stmp, &stmp, G_AVQ_MIN_INACT_64k_Q12, G_AVQ_DELTA_INACT_64k_Q12 >> 1, ( 1 << G_AVQ_BITS ), st_fx->element_mode == EVS_MONO ); /* Q0 */ +#else index = usquant_fx( stmp, &stmp, G_AVQ_MIN_INACT_64k_Q12, G_AVQ_DELTA_INACT_64k_Q12 >> 1, ( 1 << G_AVQ_BITS ) ); /* Q0 */ +#endif } ELSE IF( GT_32( st_fx->core_brate, 42000 ) ) { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + index = usquant2_fx( stmp, &stmp, G_AVQ_MIN_INACT_48k_Q12, G_AVQ_DELTA_INACT_48k_Q12 >> 1, ( 1 << G_AVQ_BITS ), st_fx->element_mode == EVS_MONO ); /* Q0 */ +#else index = usquant_fx( stmp, &stmp, G_AVQ_MIN_INACT_48k_Q12, G_AVQ_DELTA_INACT_48k_Q12 >> 1, ( 1 << G_AVQ_BITS ) ); /* Q0 */ +#endif } ELSE { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + index = usquant2_fx( stmp, &stmp, G_AVQ_MIN_INACT_Q12, G_AVQ_DELTA_INACT_Q12 >> 1, ( 1 << G_AVQ_BITS ), st_fx->element_mode == EVS_MONO ); /* Q0 */ +#else index = usquant_fx( stmp, &stmp, G_AVQ_MIN_INACT_Q12, G_AVQ_DELTA_INACT_Q12 >> 1, ( 1 << G_AVQ_BITS ) ); /* Q0 */ +#endif } Ltmp = Mult_32_16( gain_code, stmp ); /* Q16 * Q12 - 15 -> Q13*/ Ltmp = L_shl_sat( Ltmp, 5 ); /* Q13 -> Q18*/ diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 10e458fb5710a073f8c2f61cbd3b433e3e228791..32f62ebae9670ec82eee93ff54a8ff4b7442e983 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -245,8 +245,13 @@ Word16 encod_tran_fx( IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { /* SQ gain_pit and gain_code */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + gain_enc_SQ_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, shift_wsp, st_fx->element_mode == EVS_MONO ); +#else gain_enc_SQ_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, shift_wsp ); +#endif } ELSE { diff --git a/lib_enc/gain_enc_fx.c b/lib_enc/gain_enc_fx.c index 3e3c763230a571a5cd5e0486d3452c7a955585a7..0fca06dd1196c5a983365462120d6fdb04221c25 100644 --- a/lib_enc/gain_enc_fx.c +++ b/lib_enc/gain_enc_fx.c @@ -431,7 +431,11 @@ void gain_enc_mless_fx( /* gain_pit Q */ tmp1 = mult_r( G_PITCH_MAX_MINUS_MIN_TC192_Q13, div_s( 1, sub( shl( 1, nBits ), 1 ) ) ); /*Q13*/ /* set quantization step */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + index = usquant2_fx( *gain_pit, gain_pit, G_PITCH_MIN_TC192_Q14, tmp1, shl( 1, nBits ), element_mode == EVS_MONO ); +#else index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_TC192_Q14, tmp1, shl( 1, nBits ) ); +#endif move16(); push_indice( hBstr, IND_GAIN_PIT, index, nBits ); @@ -555,7 +559,12 @@ void gain_enc_SQ_fx( Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 Q_xn /* i : xn and y1 scaling */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + const Word16 Q_xn, /* i : xn and y1 scaling */ + const Word16 isEVS +#else + const Word16 Q_xn /* i : xn and y1 scaling */ +#endif ) { Word16 index, nBits_pitch, nBits_code; @@ -780,7 +789,11 @@ void gain_enc_SQ_fx( /*tmp1 = (G_PITCH_MAX - G_PITCH_MIN) / ((1 << nBits_pitch) - 1);*/ /* set quantization step */ tmp1 = mult_r( G_PITCH_MAX_Q13, div_s( 1, sub( shl( 1, nBits_pitch ), 1 ) ) ); /*Q13*/ /* set quantization step */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + index = usquant2_fx( *gain_pit, gain_pit, G_PITCH_MIN_Q14, tmp1, shl( 1, nBits_pitch ), isEVS ); // Q0 +#else index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_Q14, tmp1, shl( 1, nBits_pitch ) ); // Q0 +#endif push_indice( hBstr, IND_GAIN_PIT, index, nBits_pitch ); /* gain_code Q */ diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c index 1e614638f58280c1e54fea9451d7b73a65779782..12cf2d66843ac495a9e643121a1a33443d3bc946 100644 --- a/lib_enc/gs_enc_fx.c +++ b/lib_enc/gs_enc_fx.c @@ -284,7 +284,11 @@ void encod_audio_fx( } IF( NE_16( st_fx->coder_type, INACTIVE ) ) { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + hGSCEnc->noise_lev = sub( ( NOISE_LEVEL_SP3 + 1 ), usquant2_fx( hGSCEnc->mid_dyn_fx, &m_mean, MIN_DYNAMIC_FX, shr( GSF_NF_DELTA_FX, 1 ), GSC_NF_STEPS, st_fx->element_mode == EVS_MONO ) ); +#else hGSCEnc->noise_lev = sub( ( NOISE_LEVEL_SP3 + 1 ), usquant_fx( hGSCEnc->mid_dyn_fx, &m_mean, MIN_DYNAMIC_FX, shr( GSF_NF_DELTA_FX, 1 ), GSC_NF_STEPS ) ); +#endif move16(); hGSCEnc->noise_lev = s_min( hGSCEnc->noise_lev, NOISE_LEVEL_SP3 ); move16(); diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 79c79cf1321ac54bbb5f1ac9b26cffa73a657f76..2fc1623c41f70661928d563523d18551387680c5 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -743,7 +743,11 @@ static Word16 IGF_getSFM_new_fx( IF( denom != 0 ) { +#ifdef FIX_2600_UNDEF_wrong_lsat + tmp = BASOP_util_Pow2( L_add( numf, L_shl_sat( 1, sub( 14, numf_e ) ) ), add( 16, numf_e ), &tmp_e ); +#else tmp = BASOP_util_Pow2( L_add( numf, shl_sat( 1, sub( 14, numf_e ) ) ), add( 16, numf_e ), &tmp_e ); +#endif sfm = BASOP_Util_Divide3232_Scale( tmp, denom, &sfm_e ); sfm_e = add( sfm_e, sub( tmp_e, denom_e ) ); sfm = shl_sat( extract_l( L_min( sfm, L_shl_sat( 1, sub( 15, sfm_e ) ) ) ), sfm_e ); @@ -2358,7 +2362,11 @@ static void IGF_CalculateEnvelope_fx( dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor ); // dampingFactor_e dampingFactor = shr( dampingFactor, 1 ); +#ifdef FIX_2600_UNDEF_wrong_lsat + gain = Mult_32_16( gain, extract_h( L_shl_sat( L_min( L_add( dampingFactor, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), L_shl_sat( 1, sub( 15, dampingFactor_e ) ) ), add( dampingFactor_e, 16 ) ) ) /*Q15*/ ); +#else gain = Mult_32_16( gain, shl_sat( extract_l( L_min( L_add( dampingFactor, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ ); +#endif hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor; move16(); diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 3bcad237f8d85a83a66be47fca6f22041b05ea08..8afbc010915cfc0ada08d645a1c9b9a4e0f9d853 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -360,8 +360,13 @@ void pre_proc_front_ivas_fx( st->q_old_inp = Q_min; move16(); +#ifdef FIX_2600_UNDEF_ivas_core_pre_proc_front_fx + scale_sig( old_inp_12k8_fx, L_INP_12k8, s_min( 15, sub( st->q_inp, Q_old_in ) ) ); + scale_sig( old_inp_16k_fx, L_INP, s_min( 15, sub( st->q_inp, Q_old_in ) ) ); +#else scale_sig( old_inp_12k8_fx, L_INP_12k8, sub( st->q_inp, Q_old_in ) ); scale_sig( old_inp_16k_fx, L_INP, sub( st->q_inp, Q_old_in ) ); +#endif L_look = L_LOOK_12k8; /* lookahead at 12.8kHz */ move16(); diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 6137b71dbd10b19f6a4e0300a304a568e0218e37..dad102208d3930d824030f3a31f8c55427cad664 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -3040,7 +3040,12 @@ void gain_enc_SQ_fx( Word32 *norm_gain_code, /* o : norm. gain of the codebook excitation Q16*/ Word16 *g_corr, /* i/o: correlations , ,, -2 and 2 Qx*/ const Word16 clip_gain, /* i : gain pitch clipping flag (1 = clipping) Q0*/ - const Word16 Q_xn /* i : xn and y1 scaling */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + const Word16 Q_xn, /* i : xn and y1 scaling */ + const Word16 isEVS +#else + const Word16 Q_xn /* i : xn and y1 scaling */ +#endif ); void updt_tar_fx( diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c index 01d9ae8bd1e7a71e3036a637b90cf9437a046cfe..8b88d784d3e105fc1d945879ca5f67acda9722d3 100644 --- a/lib_enc/swb_bwe_enc_fx.c +++ b/lib_enc/swb_bwe_enc_fx.c @@ -518,7 +518,11 @@ void swb_bwe_enc_fx( } fb_ener_adjust_fx = s_min( fb_ener_adjust_fx, 16384 ); /*Q15 */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + idxGain = usquant2_fx( fb_ener_adjust_fx, &ener_adjust_quan_fx, 0, 512, shl( 1, NUM_BITS_FB_FRAMEGAIN ), st_fx->element_mode == EVS_MONO ); +#else idxGain = usquant_fx( fb_ener_adjust_fx, &ener_adjust_quan_fx, 0, 512, shl( 1, NUM_BITS_FB_FRAMEGAIN ) ); +#endif } /* write FB BWE frame gain to the bitstream */ diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 473288345ab3dc3920a4ea36521ac5b5fb1c2dca..19bdbc99fc431885940b201122e3f5b2f6f5ac36 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -4004,7 +4004,11 @@ static void Quant_shb_ener_sf_fx( temp_shb_ener_sf_fx = 0; move16(); +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + idxSubEner_fx = usquant2_fx( tmp, &temp_shb_ener_sf_fx, 0, 86, shl( 1, NUM_BITS_SHB_ENER_SF ), 1 ); /* 86 = 0.042f in Q11 = Qin-1 */ +#else idxSubEner_fx = usquant_fx( tmp, &temp_shb_ener_sf_fx, 0, 86, shl( 1, NUM_BITS_SHB_ENER_SF ) ); /* 86 = 0.042f in Q11 = Qin-1 */ +#endif /* o: temp_shb_ener_sf_fx in Q12 */ Q_fac = -Q10; @@ -4018,8 +4022,12 @@ static void Quant_shb_ener_sf_fx( temp_shb_ener_sf_fx = 0; move16(); +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + idxSubEner_fx = usquant2_fx( tmp, &temp_shb_ener_sf_fx, 0, 43, 1 << NUM_BITS_SHB_ENER_SF, 0 ); /* 43 = 0.042f in Q10 = Qin-1 */ +#else idxSubEner_fx = usquant_fx( tmp, &temp_shb_ener_sf_fx, 0, 43, 1 << NUM_BITS_SHB_ENER_SF ); /* 43 = 0.042f in Q10 = Qin-1 */ - /* o: temp_shb_ener_sf_fx in Q11 */ +#endif + /* o: temp_shb_ener_sf_fx in Q11 */ Q_fac = -Q9; move16(); } @@ -4060,11 +4068,20 @@ static void Quant_shb_res_gshape_fx( FOR( i = 0; i < NB_SUBFR16k; i++ ) { +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + idxSubGain_fx[i] = usquant2_fx( shb_res_gshape_fx[i], + &shb_res_gshape_fx[i], + 2048 /*0.125f Q14*/, /*2048 = 0.125 in Q14 */ + 1024 /*0.125f Q13*/, /*1024 = 0.125 in Q13 */ + shl( 1, NUM_BITS_SHB_RES_GS ), + st->element_mode == EVS_MONO ); +#else idxSubGain_fx[i] = usquant_fx( shb_res_gshape_fx[i], &shb_res_gshape_fx[i], 2048 /*0.125f Q14*/, /*2048 = 0.125 in Q14 */ 1024 /*0.125f Q13*/, /*1024 = 0.125 in Q13 */ shl( 1, NUM_BITS_SHB_RES_GS ) ); +#endif move16(); IF( EQ_16( st->codec_mode, MODE2 ) ) diff --git a/lib_isar/isar_splitRendererPLC.c b/lib_isar/isar_splitRendererPLC.c index d29a5272298b5613e812762c05abfd16babd4a91..fcdb1b47899b221bba11c17cd6889f764359e336 100644 --- a/lib_isar/isar_splitRendererPLC.c +++ b/lib_isar/isar_splitRendererPLC.c @@ -467,7 +467,11 @@ static void adaptive_polar_ext_plc_fx( IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) { +#ifdef FIX_2600_UNDEF_adaptive_polar_ext_plc_fx + real_sum = W_shr( real_sum, s_min( 63, sub( rat_real_sum_q, rat_imag_sum_q ) ) ); +#else real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); +#endif sqrt_exp = rat_imag_sum_q; } ELSE @@ -780,7 +784,11 @@ static void adaptive_polar_ext_plc_fx( IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) { +#ifdef FIX_2600_UNDEF_adaptive_polar_ext_plc_fx + real_sum = W_shr( real_sum, s_min( 63, sub( rat_real_sum_q, rat_imag_sum_q ) ) ); +#else real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); +#endif rat_real_sum_q = rat_imag_sum_q; } ELSE @@ -813,7 +821,11 @@ static void adaptive_polar_ext_plc_fx( IF( GT_16( rat_real_sum_q, rat_imag_sum_q ) ) { +#ifdef FIX_2600_UNDEF_adaptive_polar_ext_plc_fx + real_sum = W_shr( real_sum, s_min( 63, sub( rat_real_sum_q, rat_imag_sum_q ) ) ); +#else real_sum = W_shr( real_sum, sub( rat_real_sum_q, rat_imag_sum_q ) ); +#endif rat_real_sum_q = rat_imag_sum_q; } ELSE diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index f82cce81066581549af9a47f5d2bf36fde8eb8ae..b6a9dc6d199158bbd8ef9fe95859cf4c5b773d9f 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3543,7 +3543,11 @@ static void eig2x2_fx( move16(); } +#ifdef FIX_2600_UNDEF_eig2x2_fx + q_diff = s_max( -63, sub( q_tmp1, q_tmp2 ) ); +#else q_diff = sub( q_tmp1, q_tmp2 ); +#endif q_tmp1 = s_min( q_tmp1, q_tmp2 ); if ( q_diff > 0 ) { @@ -3686,7 +3690,11 @@ static void eig2x2_fx( tmp3 = W_shr( W_mult0_32_32( s0_fx, s0_fx ), q_diff ); tmp4 = W_shr( W_mult0_32_32( s1_fx, s1_fx ), q_diff ); +#ifdef FIX_2600_UNDEF_eig2x2_fx + q_diff = s_min( 63, sub( q_crossSquare, q_min ) ); +#else q_diff = sub( q_crossSquare, q_min ); +#endif crossSquare_fx = W_shr( crossSquare_fx, q_diff ); tmp3 = W_add( tmp3, crossSquare_fx ); tmp4 = W_add( tmp4, crossSquare_fx ); diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index d961a1e8f62cd5300230770af00ab05f6ca1a25e..0e7916f57572f983f814a4ef936204cf9a5e7d7e 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -30,6 +30,7 @@ *******************************************************************************************************/ +#include "options.h" #include "hrtf_file_reader.h" #include #include diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c index 7a241e53165e792bafc23d881704969a7e6af02d..59bbcaf306293e7880b213b5abbbc9ed0d4ab80f 100644 --- a/lib_util/masa_file_reader.c +++ b/lib_util/masa_file_reader.c @@ -30,6 +30,7 @@ *******************************************************************************************************/ +#include "options.h" #include "masa_file_reader.h" #include #include