Strange use of W_shl_sat_l - error in STL2024 specification
The 64-bit operator `W_shl_sat_l()` is described in STL2024 with quite some minor typos and also with one significant error:
> `W_shl_sat_l(W_1, var1)` arithmetically shifts left the 64-bit `W_v1` by `v1` positions with lower 32-bit saturation and returns the **32 LSB** of 64-bit result. If `v1` is negative, the result is shifted to right by (-`var1`) positions and sign extended. After shift operation, returns the **32 MSB** of 64-bit result.
**Correction:** "`v1`" should be "`var1`", and "`W_v1`" should be "`W_1`". If `var1` is negative, ... returns the 32 ~~MSB~~ **LSB** of 64-bit result.
There is source code using this operator:
**A) lib_dec/ivas_stereo_switching_dec_fx.c:**
`c_c_fx = W_extract_l( W_shl_sat_l( c_c_fx, extract_l( sub( 31, c_c_fx_q ) ) ) );`
Both extract operators are somehow wrong (bad parameter format) and useless (doing nothing); Better:
`c_c_fx = W_shl_sat_l( c_c_fx, sub( 31, c_c_fx_q ) );`
**B) Code that doesn't use W_shl_sat_l: lib_enc/ivas_enc_cov_handler_fx.c:**
`pV_re[k] = W_extract_l( W_shl_nosat( pV_re_64bit[k], q_shift_tmp ) );`
better:
`pV_re[k] = W_shl_sat_l( pV_re_64bit[k], q_shift_tmp );`
and
`cov_real[i][j][k] = W_extract_l( W_shl_nosat( cov_real_64bit[i][j][k], q_shift_tmp ) );`
better:
`cov_real[i][j][k] = W_shl_sat_l( cov_real_64bit[i][j][k], q_shift_tmp );`
**C) Similar codes:**
**lib_dec/ivas_dirac_dec_fx.c:**
`iDiv_and_mod_32( W_extract_l( W_shl_nosat( tmp_fx, 16 ) ), hSpatParamRendCom->subframe_nbslots[sf_idx], &quo, &rem, 0 );`
**lib_enc/analy_sp_fx.c:**
`band[i] = W_extract_h( W_shl_nosat( band_ener, sub( Q16, shift ) ) ); `
**lib_enc/ivas_enc_cov_handler_fx.c:**
`bb_var[ch] = W_extract_l( W_shl_nosat( bb_var_64bit[ch], sub( q_shift, 32 ) ) );`
All proposed changes should be bit-exact, saturation never needed, ensured by norm operations before.
issue