From ca0d77b8359888b72498a8205169d8ad2d874817 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 8 Jun 2026 11:05:56 +0200 Subject: [PATCH 01/47] Make overflow detection robust against compiler optimization. --- lib_basop/enh64.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++ lib_com/options.h | 1 + 2 files changed, 58 insertions(+) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 8bffb620c..5f5d7c032 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -1176,6 +1176,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 = 0x800000000000LL; + + L64_var1 = W_shl( L64_var1, 16 ); + + L64_var_out = L64_var1 + 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; @@ -1193,6 +1210,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--; @@ -1240,7 +1258,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 = L64_var1 + 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; @@ -1258,6 +1292,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--; @@ -1370,6 +1405,16 @@ Word64 W_add_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) L64_var_out = L64_var1 + L64_var2; +#ifdef FIX_2600_UNDEF + 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 if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) == 0 ) { if ( ( L64_var_out ^ L64_var1 ) & MIN_64 ) @@ -1378,6 +1423,7 @@ Word64 W_add_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) set_overflow( Overflow ); } } +#endif #ifdef WMOPS multiCounter[currCounter].W_add++; @@ -1427,6 +1473,16 @@ Word64 W_sub_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) L64_var_out = L64_var1 - L64_var2; +#ifdef FIX_2600_UNDEF + 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 if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) != 0 ) { if ( ( L64_var_out ^ L64_var1 ) & MIN_64 ) @@ -1435,6 +1491,7 @@ Word64 W_sub_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) set_overflow( Overflow ); } } +#endif #ifdef WMOPS multiCounter[currCounter].W_add++; diff --git a/lib_com/options.h b/lib_com/options.h index aebd87cb0..0b9e324ff 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -90,6 +90,7 @@ #define FIX_ISSUE_2613_WRONG_COMP_MACRO /* FhG: basop issue 2613: Inconsistent comparison macros in function tdm_SCh_LSF_intra_pred_fx*/ #define FIX_ISSUE_2611_WRONG_COMMENT /* FhG: basop issue 2611: Wrong Q value comment in fucntion stereo_dft_sg_recovery_fx()*/ #define FIX_BASOP_2550_TCX_ENC_MEM_UPDATE /* FhG: fix condition in tcx_encoder_memory_update_*_fx(), bring inline with float */ +#define FIX_2600_UNDEF /* FhG: fix reliance on unsigned overflow behaviour */ /* #################### End BE switches ################################## */ -- GitLab From ebb7e79196347fb0e0fed49953206f946ccf3c86 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 8 Jun 2026 11:42:53 +0200 Subject: [PATCH 02/47] Fix rounding offset. --- lib_basop/enh64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 5f5d7c032..2ba59e725 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -1177,7 +1177,7 @@ Word32 W_round48_L_o( Word64 L64_var1, Flag *Overflow ) Word32 L_result; #ifdef FIX_2600_UNDEF - uint64_t L64_var2 = 0x800000000000LL; + Word64 L64_var2 = 0x80000000LL; L64_var1 = W_shl( L64_var1, 16 ); -- GitLab From d16cfdb079d56ec252f852954ff3918092ae40be Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 8 Jun 2026 14:56:49 +0200 Subject: [PATCH 03/47] Fix copy paste error. --- lib_basop/enh64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 2ba59e725..5c8a72281 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -1177,7 +1177,7 @@ Word32 W_round48_L_o( Word64 L64_var1, Flag *Overflow ) Word32 L_result; #ifdef FIX_2600_UNDEF - Word64 L64_var2 = 0x80000000LL; + uint64_t L64_var2 = 0x80000000LL; L64_var1 = W_shl( L64_var1, 16 ); -- GitLab From 2587bb7d781fef53bbc3f0be44681b325847f379 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 10 Jun 2026 08:03:44 +0200 Subject: [PATCH 04/47] Fix sanitizer errors/warnings. --- lib_basop/enh64.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 5c8a72281..1bbb8cb04 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -1181,7 +1181,7 @@ Word32 W_round48_L_o( Word64 L64_var1, Flag *Overflow ) L64_var1 = W_shl( L64_var1, 16 ); - L64_var_out = L64_var1 + L64_var2; + L64_var_out = (UWord64)L64_var1 + (UWord64)L64_var2; if ( ( ( L64_var1 ^ L64_var2 ) & (uint64_t) MIN_64 ) == 0 ) { @@ -1262,7 +1262,7 @@ Word16 W_round32_s_o( Word64 L64_var1, Flag *Overflow ) uint64_t L64_var2 = 0x800000000000LL; L64_var1 = W_shl( L64_var1, 16 ); - L64_var_out = L64_var1 + L64_var2; + L64_var_out = (UWord64)L64_var1 + (UWord64)L64_var2; if ( ( ( L64_var1 ^ L64_var2 ) & (uint64_t) MIN_64 ) == 0 ) { @@ -1403,9 +1403,9 @@ Word64 W_add_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) { Word64 L64_var_out; - L64_var_out = L64_var1 + L64_var2; - #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 ) @@ -1415,6 +1415,8 @@ Word64 W_add_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) } } #else + L64_var_out = L64_var1 + L64_var2; + if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) == 0 ) { if ( ( L64_var_out ^ L64_var1 ) & MIN_64 ) @@ -1471,9 +1473,9 @@ Word64 W_sub_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) { Word64 L64_var_out; - L64_var_out = L64_var1 - L64_var2; - #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 ) @@ -1483,6 +1485,8 @@ Word64 W_sub_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow ) } } #else + L64_var_out = L64_var1 - L64_var2; + if ( ( ( L64_var1 ^ L64_var2 ) & MIN_64 ) != 0 ) { if ( ( L64_var_out ^ L64_var1 ) & MIN_64 ) -- GitLab From 01a3a681f9b1a98416c161e518e7e97885a53d0b Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 11 Jun 2026 12:09:22 +0200 Subject: [PATCH 05/47] correct W_mult_16_16(), sanitizer, undefined behaviour --- lib_basop/enh64.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 1bbb8cb04..b6372fc79 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -924,11 +924,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 : | | | @@ -938,12 +938,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 */ -- GitLab From cf48512ebda8fff7e012bdc40e16d7c2c8ac1f5b Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 11 Jun 2026 14:00:26 +0200 Subject: [PATCH 06/47] fix issue 2600 (shift left negative) for W_mac_16_16 and W_msu_16_16, correct all function description --- lib_basop/enh64.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index b6372fc79..4f8564906 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -960,8 +960,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 | | | @@ -973,11 +973,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 : | | | @@ -992,7 +992,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 @@ -1010,6 +1015,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 | | | @@ -1021,11 +1028,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 : | | | @@ -1040,7 +1048,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++; -- GitLab From 0f8256e2e13b91107b6714b98a44a05908f4d35f Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 11 Jun 2026 14:59:44 +0200 Subject: [PATCH 07/47] fix issue 2600: fix sanitizer issue with shift left negative value --- lib_basop/enh64.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 4f8564906..0d3fba419 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -391,7 +391,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 | | | @@ -407,7 +407,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 : | | | @@ -422,7 +422,12 @@ 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 L64_var_out += L64_var1; #ifdef WMOPS multiCounter[currCounter].W_mac_32_16++; @@ -438,7 +443,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 | | | @@ -454,7 +459,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 : | | | @@ -469,7 +474,12 @@ 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 L64_var_out = L64_var1 - L64_var_out; #ifdef WMOPS multiCounter[currCounter].W_msu_32_16++; @@ -477,7 +487,6 @@ Word64 W_msu_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) return L64_var_out; } - /*_________________________________________________________________________________________________ | | | Function Name : W_mult_32_16 | @@ -511,7 +520,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 */ @@ -693,7 +707,6 @@ Word32 W_sat_l( Word64 L64_var ) { L_var_out = (Word32) L64_var; } - #ifdef WMOPS multiCounter[currCounter].W_sat_l++; #endif /* if WMOPS */ -- GitLab From 513eb98088c4ece7bd37ee6bef1b015f71d646fe Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 11 Jun 2026 16:09:37 +0200 Subject: [PATCH 08/47] fix issue 2600: sanitizer error shift left negative value --- lib_basop/enh64.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 0d3fba419..9c1286984 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -831,7 +831,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++; @@ -1660,7 +1664,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 | @@ -1683,7 +1687,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 ) @@ -1697,7 +1701,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 -- GitLab From 1e14a48585f7dd6e48982733867e8cc00f05ff8b Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 11 Jun 2026 16:21:55 +0200 Subject: [PATCH 09/47] FIX_2600_UNDEF, correction of sanitizer warnings --- lib_basop/enh1632.c | 38 ++++++++++++++++++++++--------------- lib_basop/enh40.c | 5 +++++ lib_basop/enh40.h | 4 ++++ lib_basop/typedef.h | 15 +++++++++++++++ lib_basop/typedefs.h | 3 +++ lib_util/hrtf_file_reader.c | 1 + lib_util/masa_file_reader.c | 1 + 7 files changed, 52 insertions(+), 15 deletions(-) diff --git a/lib_basop/enh1632.c b/lib_basop/enh1632.c index f397c3432..af23be6f5 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 57df99e5c..b07250de5 100644 --- a/lib_basop/enh40.c +++ b/lib_basop/enh40.c @@ -966,8 +966,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 8cfb0c600..7927009db 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/typedef.h b/lib_basop/typedef.h index 9968d4c84..c6046acc9 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 __uint64 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 001f3f164..ac338350f 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_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index d961a1e8f..0e7916f57 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 7a241e531..59bbcaf30 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 -- GitLab From 9be69bdcdcc832c80dd7b2d39fc396b3bef91556 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 11 Jun 2026 16:41:40 +0200 Subject: [PATCH 10/47] fix issue 2600: use unsigned data for left shift --- lib_basop/enh64.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 9c1286984..8fb6fac33 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -171,7 +171,11 @@ Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) if ( var2 < -64 ) var2 = -64; var2 = -var2; +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#else L64_var_out = L64_var1 >> var2; +#endif } else { @@ -316,7 +320,11 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) } else { +#ifdef FIX_2600_UNDEF + L64_var_out = (Word64) ( (UWord64) L64_var1 << var2 ); +#else L64_var_out = L64_var1 << var2; +#endif } #ifdef WMOPS multiCounter[currCounter].W_shl_nosat++; -- GitLab From 2ea7abab14824c78795ef5d4b3de7821f2b75b31 Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 11 Jun 2026 16:44:49 +0200 Subject: [PATCH 11/47] FIX_2600_UNDEF, correction of sanitizer warnings --- lib_basop/enh40.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_basop/enh40.c b/lib_basop/enh40.c index b07250de5..6551f5c5e 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 = (UWord40) ( (Word40) ( (Word32) var2 * (Word32) uvar1_l ) ) << 1; +#else L40_var1 = ( (Word40) ( (Word32) var2 * (Word32) uvar1_l ) ) << 1; +#endif *varout_l = Extract40_L( L40_var1 ); -- GitLab From 42c6bbf483c61c095a23f9e69fce781f1eb0b789 Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 11 Jun 2026 17:10:57 +0200 Subject: [PATCH 12/47] FIX_2600_UNDEF, correction of sanitizer warnings --- lib_com/rom_basop_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/rom_basop_util.c b/lib_com/rom_basop_util.c index 321658f7a..6e336b637 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 ) -- GitLab From a9f09b1cadb1016ef4076dcac87c56b1325f1105 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 11 Jun 2026 17:15:36 +0200 Subject: [PATCH 13/47] fix issue 2600: limit shift left amount to 63 in W_shl_nosat --- lib_basop/enh64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 8fb6fac33..21da58e22 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -321,7 +321,7 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) else { #ifdef FIX_2600_UNDEF - L64_var_out = (Word64) ( (UWord64) L64_var1 << var2 ); + L64_var_out = (Word64) ( (UWord64) L64_var1 << s_min( 63, var2) ); #else L64_var_out = L64_var1 << var2; #endif -- GitLab From f21ee01385cc1501d08d496d8b1cd19aa854476b Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 11 Jun 2026 17:44:45 +0200 Subject: [PATCH 14/47] FIX_2600_UNDEF function L_add_o(), L_sub_o(), L_deposit_h(), correction of sanitizer warnings --- lib_basop/basop32.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 1b9ef845d..e874511c8 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -740,7 +740,11 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) } else { +#ifdef FIX_2600_UNDEF + result = (Word32) var1 * (Word32)( (UWord32) 1 << var2 ); +#else result = (Word32) var1 * ( (Word32) 1 << var2 ); +#endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { @@ -770,7 +774,9 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) Word16 shl( Word16 var1, Word16 var2 ) { Word16 var_out; +#ifndef FIX_2600_UNDEF Word32 result; +#endif if ( var2 < 0 ) { @@ -785,8 +791,19 @@ Word16 shl( Word16 var1, Word16 var2 ) } else { +#ifdef FIX_2600_UNDEF + var_out = (Word16) ( (UWord16) var1 << s_min( 15, var2 ) ); +#else result = (Word32) var1 * ( (Word32) 1 << var2 ); +#endif +#ifdef FIX_2600_UNDEF + if ( var2 > 15 && var1 != 0 ) + { + assert( 0 ); + var_out = ( var1 > 0 ) ? MAX_16 : MIN_16; + } +#else if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { assert( 0 ); @@ -800,6 +817,7 @@ Word16 shl( Word16 var1, Word16 var2 ) multiCounter[currCounter].extract_l--; #endif } +#endif /* FIX_2600_UNDEF */ } #ifdef WMOPS @@ -1640,7 +1658,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 + L_var2 ); +#else L_var_out = L_var1 + L_var2; +#endif if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) == 0 ) { @@ -1722,7 +1744,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 - L_var2 ); +#else L_var_out = L_var1 - L_var2; +#endif if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) != 0 ) { @@ -2804,7 +2830,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++; -- GitLab From d9b1d1b1ad1d8ee052a2c1bff4a3bce09aa98d2c Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 11 Jun 2026 18:23:17 +0200 Subject: [PATCH 15/47] fix issue 2600: limit shift amount to data width (64) for all W_* --- lib_basop/enh64.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 21da58e22..15338bf6f 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -75,7 +75,11 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; +#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++; @@ -118,7 +122,11 @@ Word64 W_sub_nosat( Word64 L64_var1, Word64 L64_var2 ) { Word64 L64_var_out; +#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++; @@ -263,7 +271,11 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) } else { +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#else L64_var_out = L64_var1 >> var2; +#endif } #ifdef WMOPS @@ -316,7 +328,11 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 <= 0 ) { var2 = -var2; +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#else L64_var_out = L64_var1 >> var2; +#endif } else { @@ -377,11 +393,19 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { var2 = -var2; +#ifdef FIX_2600_UNDEF + L64_var_out = (Word64) ( (UWord64) L64_var1 << s_min( 63, var2 ) ); +#else L64_var_out = L64_var1 << var2; +#endif } else { +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#else L64_var_out = L64_var1 >> var2; +#endif } #ifdef WMOPS @@ -1812,11 +1836,19 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 >> s_min( 63, -var2 ); +#else L64_var_out = L64_var1 >> ( -var2 ); +#endif } else { +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 << s_min( 63, var2 ); +#else L64_var_out = L64_var1 << var2; +#endif } #ifdef WMOPS multiCounter[currCounter].W_lshl++; @@ -1864,11 +1896,19 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 << s_min( 63, -var2 ); +#else L64_var_out = L64_var1 << ( -var2 ); +#endif } else { +#ifdef FIX_2600_UNDEF + L64_var_out = L64_var1 >> s_min( 63, var2 ); +#else L64_var_out = L64_var1 >> var2; +#endif } #ifdef WMOPS multiCounter[currCounter].W_lshr++; -- GitLab From 93375a4207c1df6ea61884aa2edd75e5a6b799df Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 11 Jun 2026 18:34:07 +0200 Subject: [PATCH 16/47] FIX_2600_UNDEF function L_add_o(), L_sub_o(), L_deposit_h(), correction of sanitizer warnings --- lib_basop/basop32.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index e874511c8..59d593889 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -741,7 +741,8 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) else { #ifdef FIX_2600_UNDEF - result = (Word32) var1 * (Word32)( (UWord32) 1 << var2 ); + //var_out = (Word16) ( (UWord16) var1 << s_min( 15, var2 ) ); not working + result = (Word32) var1 * (Word32) ( (UWord32) 1 << s_min( 15, var2 ) ); #else result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif @@ -774,9 +775,7 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) Word16 shl( Word16 var1, Word16 var2 ) { Word16 var_out; -#ifndef FIX_2600_UNDEF Word32 result; -#endif if ( var2 < 0 ) { @@ -792,18 +791,10 @@ Word16 shl( Word16 var1, Word16 var2 ) else { #ifdef FIX_2600_UNDEF - var_out = (Word16) ( (UWord16) var1 << s_min( 15, var2 ) ); + result = (Word32) var1 * (Word32) ( (UWord32) 1 << s_min( 15, var2 ) ); #else result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif - -#ifdef FIX_2600_UNDEF - if ( var2 > 15 && var1 != 0 ) - { - assert( 0 ); - var_out = ( var1 > 0 ) ? MAX_16 : MIN_16; - } -#else if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { assert( 0 ); @@ -817,7 +808,6 @@ Word16 shl( Word16 var1, Word16 var2 ) multiCounter[currCounter].extract_l--; #endif } -#endif /* FIX_2600_UNDEF */ } #ifdef WMOPS -- GitLab From 2520e3ffd28d494651bf532dbb0455ab228c4ac3 Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 11 Jun 2026 19:23:32 +0200 Subject: [PATCH 17/47] FIX_2600_UNDEF, sanitizer, undefined behaviour, include of options.h must be before stl.h --- lib_enc/enc_acelp_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/enc_acelp_fx.c b/lib_enc/enc_acelp_fx.c index 52e42582c..4f46d61dc 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" -- GitLab From 6db5f82532f28fa58e7e15d0926f0a1f0b10548d Mon Sep 17 00:00:00 2001 From: gerstack Date: Fri, 12 Jun 2026 09:37:21 +0200 Subject: [PATCH 18/47] FIX_2600_UNDEF __uint64 changed to "unsigned __int64" --- lib_basop/typedef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_basop/typedef.h b/lib_basop/typedef.h index c6046acc9..020d0f6d2 100644 --- a/lib_basop/typedef.h +++ b/lib_basop/typedef.h @@ -96,7 +96,7 @@ typedef unsigned short UWord16; typedef unsigned int UWord32; typedef __int64 Word40; #ifdef FIX_2600_UNDEF -typedef __uint64 UWord40; +typedef unsigned __uint64 UWord40; #endif typedef int Flag; #define TYPEDEF_INITIALIZED -- GitLab From b93a6718cb2b0b0714cbff34e8fcce8f6b0854ef Mon Sep 17 00:00:00 2001 From: gerstack Date: Fri, 12 Jun 2026 09:53:59 +0200 Subject: [PATCH 19/47] FIX_2600_UNDEF, added FIX for L_add() and L_sub() --- lib_basop/basop32.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 59d593889..1522168d9 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -1677,7 +1677,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 + L_var2 ); +#else L_var_out = L_var1 + L_var2; +#endif if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) == 0 ) { @@ -1762,7 +1766,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 - L_var2 ); +#else L_var_out = L_var1 - L_var2; +#endif if ( ( ( L_var1 ^ L_var2 ) & MIN_32 ) != 0 ) { -- GitLab From c53978dbcc77e7578a20a9cf6869b3833674a551 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 12 Jun 2026 11:28:34 +0200 Subject: [PATCH 20/47] fix issue 2600: compensate s_min WMOPS costs for shift-amount limiting within enh64 operators --- lib_basop/enh64.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 15338bf6f..5a31c6a64 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -181,6 +181,9 @@ Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) var2 = -var2; #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 @@ -273,6 +276,9 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) { #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 @@ -330,6 +336,9 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) var2 = -var2; #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 @@ -338,6 +347,9 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) { #ifdef FIX_2600_UNDEF L64_var_out = (Word64) ( (UWord64) L64_var1 << s_min( 63, var2) ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif #else L64_var_out = L64_var1 << var2; #endif @@ -395,6 +407,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) var2 = -var2; #ifdef FIX_2600_UNDEF L64_var_out = (Word64) ( (UWord64) L64_var1 << s_min( 63, var2 ) ); +#ifdef WMOPS + multiCounter[currCounter].s_min--; +#endif #else L64_var_out = L64_var1 << var2; #endif @@ -403,6 +418,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) { #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 @@ -1838,6 +1856,9 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) { #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 @@ -1846,6 +1867,9 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) { #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 @@ -1898,6 +1922,9 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) { #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 @@ -1906,6 +1933,9 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) { #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 -- GitLab From e5aadfeb9c505ba09557b2b434266d491389be7e Mon Sep 17 00:00:00 2001 From: gerstack Date: Fri, 12 Jun 2026 14:08:47 +0200 Subject: [PATCH 21/47] FIX_2600_UNDEF, added WMOPS-compensation for s_min, corrected casting in a shift-operation --- lib_basop/basop32.c | 8 ++++++-- lib_basop/enh40.c | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 1522168d9..a8717687d 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -741,12 +741,13 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) else { #ifdef FIX_2600_UNDEF - //var_out = (Word16) ( (UWord16) var1 << s_min( 15, var2 ) ); not working 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 ) ) ) { *Overflow = 1; @@ -792,6 +793,9 @@ Word16 shl( Word16 var1, Word16 var2 ) { #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 diff --git a/lib_basop/enh40.c b/lib_basop/enh40.c index 6551f5c5e..dceda65a6 100644 --- a/lib_basop/enh40.c +++ b/lib_basop/enh40.c @@ -879,7 +879,7 @@ void Mpy_32_16_ss( Word32 L_var1, Word16 var2, Word32 *L_varout_h, UWord16 *varo /* Below line can not overflow, so we can use << instead of L40_shl. */ #ifdef FIX_2600_UNDEF - L40_var1 = (UWord40) ( (Word40) ( (Word32) var2 * (Word32) uvar1_l ) ) << 1; + L40_var1 = (Word40) ( (UWord40) ( (Word32) var2 * (Word32) uvar1_l ) << 1 ); #else L40_var1 = ( (Word40) ( (Word32) var2 * (Word32) uvar1_l ) ) << 1; #endif -- GitLab From 77b44e4c6d2356d4c4e96fb01cee7afc54f405be Mon Sep 17 00:00:00 2001 From: gerstack Date: Fri, 12 Jun 2026 18:07:40 +0200 Subject: [PATCH 22/47] aseop32.c: removed functions L_macNs(), L_macNs_co(), L_macNs(), L_macNs_sat(), DEPR_L_msuNs(), L_msuNs_co(), L_msuNs(), L_msuNs_sat(), L_add_c(), L_add_co(), DEPR_L_sub_c(), L_sub_co(), L_sub_c(). lib_dec/dec_tcx_fx.c: replacing L_macNs_co() with L_macNs() --- lib_basop/basop32.c | 4 ++++ lib_dec/dec_tcx_fx.c | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index a8717687d..3cd103222 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -1462,6 +1462,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 | @@ -1617,6 +1618,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 | @@ -1798,6 +1800,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 | @@ -2141,6 +2144,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 | diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 5f5b6d3fd..ab9363126 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 ); } -- GitLab From e3fae4242699d328a583f52b6988d8f8855b7afd Mon Sep 17 00:00:00 2001 From: gerstack Date: Fri, 12 Jun 2026 18:10:50 +0200 Subject: [PATCH 23/47] correction: definition UWord40 --- lib_basop/typedef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_basop/typedef.h b/lib_basop/typedef.h index 020d0f6d2..855b4eae0 100644 --- a/lib_basop/typedef.h +++ b/lib_basop/typedef.h @@ -96,7 +96,7 @@ typedef unsigned short UWord16; typedef unsigned int UWord32; typedef __int64 Word40; #ifdef FIX_2600_UNDEF -typedef unsigned __uint64 UWord40; +typedef unsigned __int64 UWord40; #endif typedef int Flag; #define TYPEDEF_INITIALIZED -- GitLab From 2dc7c89957c0893c089456c2903d7ccb5d406702 Mon Sep 17 00:00:00 2001 From: gerstack Date: Fri, 12 Jun 2026 18:36:23 +0200 Subject: [PATCH 24/47] correction of pipeline-error "implicit-integer-sign-change", added an unsigned-cast --- lib_basop/basop32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 3cd103222..ff022ae5f 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -1684,7 +1684,7 @@ Word32 L_add( Word32 L_var1, Word32 L_var2 ) Word32 L_var_out; #ifdef FIX_2600_UNDEF - L_var_out = (Word32)( (UWord32)L_var1 + L_var2 ); + L_var_out = (Word32)( (UWord32)L_var1 + (UWord32)L_var2 ); #else L_var_out = L_var1 + L_var2; #endif -- GitLab From a7204fd61100b4fa6653fde5f06c8e55d9c055cf Mon Sep 17 00:00:00 2001 From: gerstack Date: Fri, 12 Jun 2026 19:00:54 +0200 Subject: [PATCH 25/47] correction of test codec-usan "implicit-integer-sign-change", added unsigned-casts at all possible implicit sign-changes --- lib_basop/basop32.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index ff022ae5f..adccb9509 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -1655,7 +1655,7 @@ 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 + L_var2 ); + L_var_out = (Word32)( (UWord32)L_var1 + (UWord32)L_var2 ); #else L_var_out = L_var1 + L_var2; #endif @@ -1745,7 +1745,7 @@ 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 - L_var2 ); + L_var_out = (Word32)( (UWord32)L_var1 - (UWord32)L_var2 ); #else L_var_out = L_var1 - L_var2; #endif @@ -1773,7 +1773,7 @@ Word32 L_sub( Word32 L_var1, Word32 L_var2 ) Word32 L_var_out; #ifdef FIX_2600_UNDEF - L_var_out = (Word32)( (UWord32)L_var1 - L_var2 ); + L_var_out = (Word32)( (UWord32)L_var1 - (UWord32)L_var2 ); #else L_var_out = L_var1 - L_var2; #endif -- GitLab From 7eb4993d8910a24b986116ac480a89e6bb451b40 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 15 Jun 2026 16:08:56 +0200 Subject: [PATCH 26/47] Add switch FIX_2600_UNDEF_SHIFT_SAT to limit shift amount for 64 bit operators (disabled). Throw assert if 64 bit shift is too large. Add FIX_2600_UNDEF_adaptive_polar_ext_plc_fx to limit W_shr(). --- lib_basop/enh64.c | 56 +++++++++++++++++++++++++------- lib_com/options.h | 2 ++ lib_isar/isar_splitRendererPLC.c | 8 +++++ 3 files changed, 55 insertions(+), 11 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 5a31c6a64..2f4cbcabc 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -20,6 +20,10 @@ #define WMC_TOOL_SKIP +#ifdef FIX_2600_UNDEF +#include +#endif + /***************************************************************************** * * Local Functions @@ -179,12 +183,15 @@ Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) if ( var2 < -64 ) var2 = -64; var2 = -var2; -#ifdef FIX_2600_UNDEF +#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 } @@ -274,12 +281,15 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) } else { -#ifdef FIX_2600_UNDEF +#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 } @@ -334,23 +344,29 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 <= 0 ) { var2 = -var2; -#ifdef FIX_2600_UNDEF +#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 - L64_var_out = (Word64) ( (UWord64) L64_var1 << s_min( 63, 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 #else +#ifdef FIX_2600_UNDEF + assert( var2 <= 63 ); +#endif L64_var_out = L64_var1 << var2; #endif } @@ -405,23 +421,29 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { var2 = -var2; -#ifdef FIX_2600_UNDEF +#ifdef FIX_2600_UNDEF_SHIFT_SAT L64_var_out = (Word64) ( (UWord64) 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 +#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 } @@ -1854,23 +1876,29 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { -#ifdef FIX_2600_UNDEF +#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 +#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 } @@ -1920,23 +1948,29 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) if ( var2 < 0 ) { -#ifdef FIX_2600_UNDEF +#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 +#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 } diff --git a/lib_com/options.h b/lib_com/options.h index a3e7cce97..1523ec42c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -87,6 +87,8 @@ #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_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_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 */ diff --git a/lib_isar/isar_splitRendererPLC.c b/lib_isar/isar_splitRendererPLC.c index d29a52722..f1263b17a 100644 --- a/lib_isar/isar_splitRendererPLC.c +++ b/lib_isar/isar_splitRendererPLC.c @@ -780,7 +780,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 +817,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 -- GitLab From f38c58850a0375be4ccda430d910de418b109ce1 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 15 Jun 2026 16:23:46 +0200 Subject: [PATCH 27/47] Add FIX_2600_UNDEF_ivas_find_enr --- lib_com/options.h | 1 + lib_enc/analy_sp_fx.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 1523ec42c..7db6f5bea 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -89,6 +89,7 @@ #define FIX_2600_UNDEF /* FhG: fix reliance on unsigned overflow behaviour */ // #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_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 */ diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index e7d09c786..e6df3d29b 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(); +#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; -- GitLab From c0c52e63d9b1dd3c86a5ab2769b2cfa77c4d673f Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 15 Jun 2026 16:27:02 +0200 Subject: [PATCH 28/47] clang format --- lib_enc/analy_sp_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index e6df3d29b..1f1ac3f17 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -758,9 +758,9 @@ static void ivas_find_enr( freq = BIN_FREQ_FX; move16(); #ifdef FIX_2600_UNDEF_ivas_find_enr - tmp_shift = s_max( -63, sub( -Q16, shift ) ); // 16 - shift - 32 + tmp_shift = s_max( -63, sub( -Q16, shift ) ); // 16 - shift - 32 #else - tmp_shift = sub( -Q16, shift ); // 16 - shift - 32 + tmp_shift = sub( -Q16, shift ); // 16 - shift - 32 #endif FOR( i = 0; i < voic_band; i++ ) /* up to maximum allowed voiced critical band */ { -- GitLab From 8af0a15c09b69d80572be8cbdee3311d6eaf0ada Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 15 Jun 2026 17:27:55 +0200 Subject: [PATCH 29/47] Add FIX_2600_UNDEF_eig2x2_fx --- lib_com/options.h | 1 + lib_isar/isar_splitRendererPLC.c | 4 ++++ lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 7db6f5bea..87e998874 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -90,6 +90,7 @@ // #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_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 */ diff --git a/lib_isar/isar_splitRendererPLC.c b/lib_isar/isar_splitRendererPLC.c index f1263b17a..fcdb1b478 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 diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index f82cce810..b6a9dc6d1 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 ); -- GitLab From 398287d3e3d4e897e8a73c8e52367e93960af925 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 15 Jun 2026 17:57:18 +0200 Subject: [PATCH 30/47] Merge NONBE_FIX_2493_EXTRACT_L_d_syn_filt_fx to fix assert. --- lib_com/options.h | 9 +++++---- lib_dec/ivas_lfe_plc_fx.c | 4 ++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 87e998874..3a5d15c5d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -87,10 +87,6 @@ #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_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_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 */ @@ -100,6 +96,11 @@ /* 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 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 */ diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c index a088b44ad..8be016ef2 100755 --- a/lib_dec/ivas_lfe_plc_fx.c +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -656,7 +656,11 @@ static void d_syn_filt_fx( move32(); yy_q_fx[i] = sub( s_q_fx, 32 ); move16(); +#ifdef NONBE_FIX_2493_EXTRACT_L_d_syn_filt_fx + y_fx[i] = W_extract_l( W_shr( s_fx, s_min( 63, sub( s_q_fx, Q5 ) ) ) ); +#else y_fx[i] = W_extract_l( W_shr( s_fx, sub( s_q_fx, Q5 ) ) ); +#endif move32(); } *y_q_fx = Q5; -- GitLab From 09b365f39f7dd4fc286f980d4b8df7dbe852f7ec Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 09:34:46 +0200 Subject: [PATCH 31/47] Use FIX_2600_UNDEF_SHIFT_SAT to enable shift limiting in 32 bit shifts, the same as for 64 bit (disabled), and add assert if shift leads to undefined behaiour. --- lib_basop/basop32.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index adccb9509..15a82c4a4 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -740,12 +740,15 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) } else { -#ifdef FIX_2600_UNDEF +#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( var2 <= 15 ); +#endif result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) @@ -791,12 +794,15 @@ Word16 shl( Word16 var1, Word16 var2 ) } else { -#ifdef FIX_2600_UNDEF +#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( var2 <= 15 ); +#endif result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) -- GitLab From d20da814e17a2a77482f2ca268ebc90a3d0d857e Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 11:11:18 +0200 Subject: [PATCH 32/47] Fix too large 32 bit shifts for encoder pipeline fails. --- lib_com/options.h | 2 ++ lib_com/tools_fx.c | 8 ++++++-- lib_enc/igf_enc_fx.c | 8 ++++++++ lib_enc/multi_harm_fx.c | 4 ++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 22035cf38..cdc069fe1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -100,6 +100,8 @@ #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, IGF_getSFM_new_fx, IGF_CalculateEnvelope_fx because of wrong operator usage */ +#define FIX_2600_UNDEF_multi_harm_fx /* FhG: Avoid too large 32 bit shift in multi_harm_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) */ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index eba00b918..a89104117 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -839,9 +839,13 @@ Word16 usquant_fx( /* idx = (short)( (x - qlow)/delta + 0.5f); */ 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) */ + 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) */ +#ifdef FIX_2600_UNDEF_usquant_fx + idx = extract_l( L_shr_r( L_add_sat( L_tmp, L_shl_sat( 1, sub( 30, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ +#else 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_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 94f054c83..a4a088fc3 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_usquant_fx + 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_usquant_fx + 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*/ ), L_shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*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/multi_harm_fx.c b/lib_enc/multi_harm_fx.c index 6c0ef3f09..c7ceb53c1 100644 --- a/lib_enc/multi_harm_fx.c +++ b/lib_enc/multi_harm_fx.c @@ -273,7 +273,11 @@ Word16 multi_harm_fx( corxy = shl( corxy, cor ); /* cor = corxy * corxy / (corx2 * cory2) */ corxy = div_s( corxy, corx2 ); +#ifdef FIX_2600_UNDEF_multi_harm_fx + cor = shr_sat( corxy, s_max( -15, sub( shl( tmp16, 1 ), Expx2 ) ) ); /* Q15 */ +#else cor = shr_sat( corxy, sub( shl( tmp16, 1 ), Expx2 ) ); /* Q15 */ +#endif } ELSE { -- GitLab From 431d03d3a510d230b9bc1bfa983b158c646a320d Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 12:54:18 +0200 Subject: [PATCH 33/47] Undo change in shl_o(). --- lib_basop/basop32.c | 17 +++++++++++++---- lib_com/options.h | 2 +- lib_enc/igf_enc_fx.c | 2 +- lib_enc/ivas_core_pre_proc_front_fx.c | 5 +++++ lib_enc/multi_harm_fx.c | 4 ---- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 15a82c4a4..22d1df139 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,15 +745,12 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) } else { -#ifdef FIX_2600_UNDEF_SHIFT_SAT +#ifdef FIX_2600_UNDEF result = (Word32) var1 * (Word32) ( (UWord32) 1 << s_min( 15, var2 ) ); #ifdef WMOPS multiCounter[currCounter].s_min--; #endif #else -#ifdef FIX_2600_UNDEF - assert( var2 <= 15 ); -#endif result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) @@ -783,8 +785,10 @@ Word16 shl( Word16 var1, Word16 var2 ) if ( var2 < 0 ) { +#ifdef FIX_2600_UNDEF if ( var2 < -16 ) var2 = -16; +#endif var2 = -var2; var_out = shr( var1, var2 ); @@ -875,8 +879,13 @@ Word16 shr_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 = shl_o( var1, var2, Overflow ); diff --git a/lib_com/options.h b/lib_com/options.h index a9a86c2f5..7a32d44df 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,7 +101,7 @@ #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, IGF_getSFM_new_fx, IGF_CalculateEnvelope_fx because of wrong operator usage */ -#define FIX_2600_UNDEF_multi_harm_fx /* FhG: Avoid too large 32 bit shift in multi_harm_fx */ +#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) */ diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index a4a088fc3..58765fb3e 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -2363,7 +2363,7 @@ static void IGF_CalculateEnvelope_fx( dampingFactor = shr( dampingFactor, 1 ); #ifdef FIX_2600_UNDEF_usquant_fx - 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*/ ), L_shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ ); + 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 diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 3bcad237f..8afbc0109 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/multi_harm_fx.c b/lib_enc/multi_harm_fx.c index c7ceb53c1..6c0ef3f09 100644 --- a/lib_enc/multi_harm_fx.c +++ b/lib_enc/multi_harm_fx.c @@ -273,11 +273,7 @@ Word16 multi_harm_fx( corxy = shl( corxy, cor ); /* cor = corxy * corxy / (corx2 * cory2) */ corxy = div_s( corxy, corx2 ); -#ifdef FIX_2600_UNDEF_multi_harm_fx - cor = shr_sat( corxy, s_max( -15, sub( shl( tmp16, 1 ), Expx2 ) ) ); /* Q15 */ -#else cor = shr_sat( corxy, sub( shl( tmp16, 1 ), Expx2 ) ); /* Q15 */ -#endif } ELSE { -- GitLab From 2c0f7a62a4752581bfe1d2538c233399c21a4e71 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 13:41:25 +0200 Subject: [PATCH 34/47] Fix FIX_2600_UNDEF_usquant_fx --- lib_com/tools_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index a89104117..62dca5a0c 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -842,7 +842,7 @@ Word16 usquant_fx( 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) */ #ifdef FIX_2600_UNDEF_usquant_fx - idx = extract_l( L_shr_r( L_add_sat( L_tmp, L_shl_sat( 1, sub( 30, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ + idx = extract_l( L_shr_r( L_add( L_tmp, L_shl_sat( 1, sub( 14, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ #else idx = extract_l( L_shr_r( L_add( L_tmp, shl_sat( 1, sub( 30, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ #endif -- GitLab From 670aa6eddda6ec488f7a81823d907b1cefe71ddf Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 14:45:07 +0200 Subject: [PATCH 35/47] Add FIX_2600_UNDEF_res_bpf_adapt_ivas_fx, FIX_2600_UNDEF_ivas_dirac_dec_decorr_process_fx, FIX_2600_UNDEF_WB_BWE_decoding_fx --- lib_com/options.h | 3 +++ lib_com/swb_bwe_com_fx.c | 4 ++++ lib_dec/bass_psfilter_fx.c | 4 ++++ lib_rend/ivas_dirac_decorr_dec_fx.c | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 7a32d44df..224066286 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -102,6 +102,9 @@ #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, 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 FIX_2600_UNDEF_res_bpf_adapt_ivas_fx /* FhG: Avoid too large 16 bit shift in res_bpf_adapt_ivas_fx */ +#define FIX_2600_UNDEF_ivas_dirac_dec_decorr_process_fx /* FhG: Avoid too large 16 bit shift in ivas_dirac_dec_decorr_process_fx */ +#define FIX_2600_UNDEF_WB_BWE_decoding_fx /* FhG: Avoid too large 16 bit shift in WB_BWE_decoding_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) */ diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index 5daa4e06d..7a67da279 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -942,7 +942,11 @@ void WB_BWE_decoding_fx( } ELSE { +#ifdef FIX_2600_UNDEF_WB_BWE_decoding_fx + WB_signal[n_freq] = shl( WB_signal[n_freq], s_min( 15, sub( 15, Q_syn ) ) ); /*Q15 */ +#else WB_signal[n_freq] = shl( WB_signal[n_freq], sub( 15, Q_syn ) ); /*Q15 */ +#endif move16(); } } diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index d2558f47c..6e3552c5b 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -1034,7 +1034,11 @@ Word16 res_bpf_adapt_ivas_fx( { Word16 temp; bpf_error_ratio = BASOP_Util_Divide3232_Scale( error_nrg, res_hb_nrg, &temp ); +#ifdef FIX_2600_UNDEF_res_bpf_adapt_ivas_fx + bpf_error_ratio = shl( bpf_error_ratio, s_min( 15, sub( 13, sub( 15, temp ) ) ) ); +#else bpf_error_ratio = shl( bpf_error_ratio, sub( 13, sub( 15, temp ) ) ); +#endif } ELSE { diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index 792ac76de..d84355597 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -906,7 +906,11 @@ void ivas_dirac_dec_decorr_process_fx( duck_gain = Sqrt16( duck_gain, &e_duck_gain ); +#ifdef FIX_2600_UNDEF_ivas_dirac_dec_decorr_process_fx + duck_gain = shl( duck_gain, s_min( 15, sub( e_duck_gain, 1 ) ) ); // Q14 +#else duck_gain = shl( duck_gain, sub( e_duck_gain, 1 ) ); // Q14 +#endif frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 1 ); // q_frame_f frame_dec_fx_ptr[2 * band_idx + 1] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx + 1], duck_gain ), 1 ); // q_frame_f -- GitLab From dfdb914b087220a708fecd881e78036b39cfa0e6 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 16:10:34 +0200 Subject: [PATCH 36/47] Remove FIX_2600_UNDEF_WB_BWE_decoding_fx, FIX_2600_UNDEF_res_bpf_adapt_ivas_fx, FIX_2600_UNDEF_ivas_dirac_dec_decorr_process_fx, but allow too large shift for zero values to not throw exception. --- lib_basop/basop32.c | 9 +++------ lib_com/options.h | 5 +---- lib_com/swb_bwe_com_fx.c | 4 ---- lib_dec/bass_psfilter_fx.c | 4 ---- lib_rend/ivas_dirac_decorr_dec_fx.c | 4 ---- 5 files changed, 4 insertions(+), 22 deletions(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 22d1df139..e3a7805e1 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -785,7 +785,7 @@ Word16 shl( Word16 var1, Word16 var2 ) if ( var2 < 0 ) { -#ifdef FIX_2600_UNDEF +#ifndef FIX_2600_UNDEF if ( var2 < -16 ) var2 = -16; #endif @@ -805,7 +805,7 @@ Word16 shl( Word16 var1, Word16 var2 ) #endif #else #ifdef FIX_2600_UNDEF - assert( var2 <= 15 ); + assert( var1 == 0 || var2 <= 15 ); #endif result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif @@ -879,10 +879,7 @@ Word16 shr_o( Word16 var1, Word16 var2, Flag *Overflow ) if ( var2 < 0 ) { -#ifdef FIX_2600_UNDEF - if ( var2 < -15 ) - var2 = -15; -#else +#ifndef FIX_2600_UNDEF if ( var2 < -16 ) var2 = -16; #endif diff --git a/lib_com/options.h b/lib_com/options.h index 224066286..a9176d6f3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,10 +101,7 @@ #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, 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 FIX_2600_UNDEF_res_bpf_adapt_ivas_fx /* FhG: Avoid too large 16 bit shift in res_bpf_adapt_ivas_fx */ -#define FIX_2600_UNDEF_ivas_dirac_dec_decorr_process_fx /* FhG: Avoid too large 16 bit shift in ivas_dirac_dec_decorr_process_fx */ -#define FIX_2600_UNDEF_WB_BWE_decoding_fx /* FhG: Avoid too large 16 bit shift in WB_BWE_decoding_fx */ +// #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) */ diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index 7a67da279..5daa4e06d 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -942,11 +942,7 @@ void WB_BWE_decoding_fx( } ELSE { -#ifdef FIX_2600_UNDEF_WB_BWE_decoding_fx - WB_signal[n_freq] = shl( WB_signal[n_freq], s_min( 15, sub( 15, Q_syn ) ) ); /*Q15 */ -#else WB_signal[n_freq] = shl( WB_signal[n_freq], sub( 15, Q_syn ) ); /*Q15 */ -#endif move16(); } } diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index 6e3552c5b..d2558f47c 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -1034,11 +1034,7 @@ Word16 res_bpf_adapt_ivas_fx( { Word16 temp; bpf_error_ratio = BASOP_Util_Divide3232_Scale( error_nrg, res_hb_nrg, &temp ); -#ifdef FIX_2600_UNDEF_res_bpf_adapt_ivas_fx - bpf_error_ratio = shl( bpf_error_ratio, s_min( 15, sub( 13, sub( 15, temp ) ) ) ); -#else bpf_error_ratio = shl( bpf_error_ratio, sub( 13, sub( 15, temp ) ) ); -#endif } ELSE { diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index d84355597..792ac76de 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -906,11 +906,7 @@ void ivas_dirac_dec_decorr_process_fx( duck_gain = Sqrt16( duck_gain, &e_duck_gain ); -#ifdef FIX_2600_UNDEF_ivas_dirac_dec_decorr_process_fx - duck_gain = shl( duck_gain, s_min( 15, sub( e_duck_gain, 1 ) ) ); // Q14 -#else duck_gain = shl( duck_gain, sub( e_duck_gain, 1 ) ); // Q14 -#endif frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 1 ); // q_frame_f frame_dec_fx_ptr[2 * band_idx + 1] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx + 1], duck_gain ), 1 ); // q_frame_f -- GitLab From 72aefa2fb9bcc3a1e8193aa40abf5a327f2442ff Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 18:25:12 +0200 Subject: [PATCH 37/47] Separate FIX_2600_UNDEF_usquant_fx from other cases, simplify FIX_2600_UNDEF_usquant_fx case. --- lib_com/options.h | 3 ++- lib_com/tools_fx.c | 2 +- lib_enc/igf_enc_fx.c | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a9176d6f3..42055f834 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -100,7 +100,8 @@ #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, IGF_getSFM_new_fx, IGF_CalculateEnvelope_fx because of wrong operator usage */ +#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_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) */ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 62dca5a0c..5212b254b 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -842,7 +842,7 @@ Word16 usquant_fx( 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) */ #ifdef FIX_2600_UNDEF_usquant_fx - idx = extract_l( L_shr_r( L_add( L_tmp, L_shl_sat( 1, sub( 14, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ + idx = round_fx( L_shl( L_tmp, sub( exp, 15 ) ) ); /*Q0 */ #else idx = extract_l( L_shr_r( L_add( L_tmp, shl_sat( 1, sub( 30, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ #endif diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 58765fb3e..fd301b805 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -743,7 +743,7 @@ static Word16 IGF_getSFM_new_fx( IF( denom != 0 ) { -#ifdef FIX_2600_UNDEF_usquant_fx +#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 ); @@ -2362,7 +2362,7 @@ 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_usquant_fx +#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*/ ); -- GitLab From 6c1697cb0678de430b6604e0ec3e5380da086744 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 20:22:10 +0200 Subject: [PATCH 38/47] Add FIX_2600_UNDEF_usquant_fx_EVS_BE to make usquant_fx bit exact for EVS cases. --- lib_com/options.h | 1 + lib_com/prot_fx.h | 10 ++++++++++ lib_com/tools_fx.c | 32 +++++++++++++++++++++++++++++- lib_enc/acelp_core_switch_enc_fx.c | 6 +++++- lib_enc/enc_gen_voic_fx.c | 5 +++++ lib_enc/enc_higher_acelp_fx.c | 12 +++++++++++ lib_enc/enc_tran_fx.c | 5 +++++ lib_enc/gain_enc_fx.c | 15 +++++++++++++- lib_enc/gs_enc_fx.c | 4 ++++ lib_enc/prot_fx_enc.h | 7 ++++++- lib_enc/swb_bwe_enc_fx.c | 4 ++++ lib_enc/swb_tbe_enc_fx.c | 19 +++++++++++++++++- 12 files changed, 115 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 42055f834..3b11225a2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,6 +101,7 @@ #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. */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 513f5f588..c7c132d7b 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8427,6 +8427,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/tools_fx.c b/lib_com/tools_fx.c index 5212b254b..f49aa2a5d 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,6 +833,25 @@ 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; Word16 tmp, exp; @@ -842,7 +862,17 @@ Word16 usquant_fx( 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) */ #ifdef FIX_2600_UNDEF_usquant_fx - idx = round_fx( L_shl( L_tmp, sub( exp, 15 ) ) ); /*Q0 */ +#ifdef FIX_2600_UNDEF_usquant_fx_EVS_BE + IF( isEVS ) + { + /* This is wrong, temporarily only. */ + 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 + { + idx = round_fx( L_shl( L_tmp, sub( exp, 15 ) ) ); /*Q0 */ + } #else idx = extract_l( L_shr_r( L_add( L_tmp, shl_sat( 1, sub( 30, exp ) ) ), sub( 31, exp ) ) ); /*Q0 */ #endif diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 89df6423c..33ebfded7 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/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 5f1b69807..d61389cfc 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 f17d16671..22c2560c8 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 10e458fb5..32f62ebae 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 3e3c76323..0fca06dd1 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 1e614638f..12cf2d668 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/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 6137b71db..dad102208 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 01d9ae8bd..8b88d784d 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 f06795ad8..6cf453f56 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -4000,7 +4000,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; @@ -4014,8 +4018,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(); } @@ -4056,11 +4064,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 ) ) -- GitLab From 39a54bb61b5ac106e5b71b789bd873706dd1b003 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 21:07:22 +0200 Subject: [PATCH 39/47] Add FIX_2600_UNDEF_usquant_fx_EVS_BE cases. --- lib_com/swb_tbe_com_fx.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 0ce926375..b40f4779a 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; -- GitLab From e49843f9aff697d134d2217b5e126cff2157a898 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 17 Jun 2026 23:48:36 +0200 Subject: [PATCH 40/47] Improve precision of usquant_fx to avoid regression. --- lib_com/options.h | 2 +- lib_com/tools_fx.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3b11225a2..88790e9ff 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,7 +101,7 @@ #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_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. */ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index f49aa2a5d..e61594433 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -854,26 +854,34 @@ Word16 usquant_fx( ) { Word16 idx; +#ifdef FIX_2600_UNDEF_usquant_fx + Word16 exp; +#else Word16 tmp, exp; +#endif Word32 L_tmp; /* idx = (short)( (x - qlow)/delta + 0.5f); */ - 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) */ #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 { - idx = round_fx( L_shl( L_tmp, sub( exp, 15 ) ) ); /*Q0 */ + 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 -- GitLab From 3a7a8aedf6bbb9e51f0b03c0c471a9478380fdf1 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 18 Jun 2026 00:31:15 +0200 Subject: [PATCH 41/47] Reactivate FIX_2600_UNDEF_usquant_fx_EVS_BE --- lib_com/options.h | 2 +- lib_com/tools_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 88790e9ff..3b11225a2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,7 +101,7 @@ #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_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. */ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index e61594433..f36c99c83 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -854,7 +854,7 @@ Word16 usquant_fx( ) { Word16 idx; -#ifdef FIX_2600_UNDEF_usquant_fx +#if defined( FIX_2600_UNDEF_usquant_fx ) && ! defined( FIX_2600_UNDEF_usquant_fx_EVS_BE ) Word16 exp; #else Word16 tmp, exp; -- GitLab From fff231448c4c9d1c0f8ce58ae934ef562d64d6ac Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 18 Jun 2026 00:53:32 +0200 Subject: [PATCH 42/47] clang format --- lib_com/tools_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index f36c99c83..ec0634021 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -854,7 +854,7 @@ Word16 usquant_fx( ) { Word16 idx; -#if defined( FIX_2600_UNDEF_usquant_fx ) && ! defined( FIX_2600_UNDEF_usquant_fx_EVS_BE ) +#if defined( FIX_2600_UNDEF_usquant_fx ) && !defined( FIX_2600_UNDEF_usquant_fx_EVS_BE ) Word16 exp; #else Word16 tmp, exp; -- GitLab From 0b2e618eb36d50b45be88d8d9d6a4dc2ed596c7d Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 18 Jun 2026 12:19:52 +0200 Subject: [PATCH 43/47] Remove unrelated changes to main. --- lib_basop/basop32.c | 2 ++ lib_basop/enh64.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index e3a7805e1..9a2d1c93b 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -753,6 +753,7 @@ Word16 shl_o( Word16 var1, Word16 var2, Flag *Overflow ) #else result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif + if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { *Overflow = 1; @@ -809,6 +810,7 @@ Word16 shl( Word16 var1, Word16 var2 ) #endif result = (Word32) var1 * ( (Word32) 1 << var2 ); #endif + if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) { assert( 0 ); diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 2f4cbcabc..eb8e0c4ad 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -559,6 +559,7 @@ Word64 W_msu_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 ) return L64_var_out; } + /*_________________________________________________________________________________________________ | | | Function Name : W_mult_32_16 | @@ -779,6 +780,7 @@ Word32 W_sat_l( Word64 L64_var ) { L_var_out = (Word32) L64_var; } + #ifdef WMOPS multiCounter[currCounter].W_sat_l++; #endif /* if WMOPS */ -- GitLab From 7340a30ca9da35c57d156775df2ba2bcc7fe362d Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 18 Jun 2026 13:04:47 +0200 Subject: [PATCH 44/47] fix issue in shl as done in shl_o --- lib_basop/basop32.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib_basop/basop32.c b/lib_basop/basop32.c index 9a2d1c93b..b7aab005b 100644 --- a/lib_basop/basop32.c +++ b/lib_basop/basop32.c @@ -786,7 +786,10 @@ Word16 shl( Word16 var1, Word16 var2 ) if ( var2 < 0 ) { -#ifndef FIX_2600_UNDEF +#ifdef FIX_2600_UNDEF + if ( var2 < -15 ) + var2 = -15; +#else if ( var2 < -16 ) var2 = -16; #endif @@ -808,7 +811,7 @@ Word16 shl( Word16 var1, Word16 var2 ) #ifdef FIX_2600_UNDEF assert( var1 == 0 || var2 <= 15 ); #endif - result = (Word32) var1 * ( (Word32) 1 << var2 ); + result = (Word32) var1 * (Word32) ( (UWord32) 1 << var2 ); #endif if ( ( var2 > 15 && var1 != 0 ) || ( result != (Word32) ( (Word16) result ) ) ) -- GitLab From 634f5ee10a37c0f9b46d6635e1a1e3d9aed0304f Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 18 Jun 2026 13:13:12 +0200 Subject: [PATCH 45/47] Limit shift amount for saturating shifts, the same as for 32 bit shifts. --- lib_basop/enh64.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index eb8e0c4ad..0e4410050 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -180,18 +180,16 @@ Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) if ( var2 <= 0 ) { - if ( var2 < -64 ) - var2 = -64; +#ifdef FIX_2600_UNDEF 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 + if ( var2 < -64 ) + var2 = -64; + var2 = -var2; L64_var_out = L64_var1 >> var2; #endif } @@ -281,15 +279,12 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) } else { -#ifdef FIX_2600_UNDEF_SHIFT_SAT +#ifdef FIX_2600_UNDEF 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 } -- GitLab From ce103366542a1cfc0b13a46767be5ab8ca254157 Mon Sep 17 00:00:00 2001 From: gerstack Date: Thu, 18 Jun 2026 13:36:25 +0200 Subject: [PATCH 46/47] fix sanitizer issues --- lib_basop/enh64.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index eb8e0c4ad..ffe603856 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -367,7 +367,7 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) #ifdef FIX_2600_UNDEF assert( var2 <= 63 ); #endif - L64_var_out = L64_var1 << var2; + L64_var_out = (Word64) ( (UWord64)L64_var1 << var2 ); #endif } #ifdef WMOPS @@ -430,7 +430,7 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) #ifdef FIX_2600_UNDEF assert( var2 <= 63 ); #endif - L64_var_out = L64_var1 << var2; + L64_var_out = (Word64) ( (UWord64) L64_var1 << var2 ); #endif } else -- GitLab From 7a56f3cf664e3b23e366d11b490e68a03f3b5706 Mon Sep 17 00:00:00 2001 From: gerstack Date: Tue, 23 Jun 2026 13:58:42 +0200 Subject: [PATCH 47/47] FIX undefined behavior in assert() for FIX_2493 --- lib_basop/enh64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_basop/enh64.c b/lib_basop/enh64.c index 0f54f90cf..bc900d27c 100644 --- a/lib_basop/enh64.c +++ b/lib_basop/enh64.c @@ -367,7 +367,7 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) #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 -- GitLab