[Complexity] Simplify set32_fx()
# Basic info This is a subtask of #1009 - it splits off the simplification/complexity optimization of the function set32_fx(). This optimization is BE. # Bug description The function is overly complicated, since it seems to distinguish between a 32 bit variable where only the 16 LSBs are populated and any other 32 bit variable. It's probably a misinterpretation of the STL 18.10.1, which states: > **18.10.1 Data moves\ > **Each data move between two 16-bit or two 32-bit variables, **move16**() and **move32**() operators > > respectively, has a complexity weight of 1. > > 1\. A 16-bit variable cannot be directly moved to a 32-bit or 40-bit variable. > > (...) > > For above 3 types of moves, functions such as the following ones must be used: > > round fx() extract h() extract l() L deposit h() L deposit l() > > round40() Extract40 H() Extract40 L() L40 deposit h() L40 deposit l() > > L saturate40() L Extract40() L40 deposit32() > > There will be no extra weighting for data move when using above functions: the weighting of the data move is already included in the weighting of these functions. In our understanding, a 32 bit variable is a 32 bit variable, regardless of the value it is actually holding... In addition, the function actually counts the data move twice (`L_deposit_l()` + `move32()`). ``` void set32_fx( Word32 y[], /* i/o: Vector to set */ const Word32 a, /* i : Value to set the vector to */ const Word16 N /* i : Lenght of the vector */ ) { #ifdef PATCH Word16 i; FOR( i = 0; i < N; i++ ) { y[i] = a; move32(); } #else Word16 i, tmp; tmp = extract_l( a ); IF( EQ_32( L_deposit_l( tmp ), a ) ) { FOR( i = 0; i < N; i++ ) { y[i] = L_deposit_l( tmp ); move32(); } } ELSE { FOR( i = 0; i < N; i++ ) { y[i] = a; move32(); } } #endif return; } ``` A simplification as outlined above is proposed. # Ways to reproduce See commandline in #1009 .
issue