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-bitW_v1
byv1
positions with lower 32-bit saturation and returns the 32 LSB of 64-bit result. Ifv1
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.