diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index d6210dfc7d4b3c050bd77310f010c93922678654..5e94ec92ff88ab8922c0c9e4485bc81db8b425f0 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -1076,6 +1076,7 @@ Word16 matrix_product_mant_exp_fx( } ELSE /* Regular case */ { +#ifndef FIX_TUNE_IVAS_TOOLS_MATRIX_PRODUCT_WMOPS_MR1010X IF( NE_16( colsX, rowsY ) ) { return EXIT_FAILURE; @@ -1113,6 +1114,43 @@ Word16 matrix_product_mant_exp_fx( move16(); col = rowsX; /*Q0*/ move16(); +#else + assert( colsX == rowsY ); + assert( colsX >= 1 ); + + Word16 XY_fx_e = add( X_fx_e, Y_fx_e ); + + FOR( j = 0; j < colsY; ++j ) + { + Word16 j_rowsY = imult1616( j, rowsY ); + FOR( i = 0; i < rowsX; ++i ) + { + Word32 Z_fx_m; + Word16 Z_fx_e; + + x_idx = add( i, 0 ); + y_idx = add( 0, j_rowsY ); + Z_fx_m = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); + Z_fx_e = XY_fx_e; + FOR( k = 1; k < colsX; ++k ) + { + x_idx = add( x_idx, rowsX ); + y_idx = add( 1, y_idx ); + Z_fx_m = BASOP_Util_Add_Mant32Exp( Z_fx_m, Z_fx_e, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ), XY_fx_e, &Z_fx_e ); /*Q31 - Zp_fx_e*/ + } + *Zp_fx++ = Z_fx_m; + move32(); + *Zp_fx_e++ = Z_fx_e; + move16(); + } + } + + + row = colsY; /*Q0*/ + move16(); + col = rowsX; /*Q0*/ + move16(); +#endif } Zp_fx = Z_fx; /*Q31 - Zp_fx_e*/ diff --git a/lib_com/options.h b/lib_com/options.h index 1b2c15f872080cbde13e6d7fa2f8cb912b9fe84b..c72a34a61e12779f7970c30a71ec1e41e88fae33 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,5 +153,6 @@ #define FIX_881_HILBERT_FILTER /* VA: improve the precision of the Hilbert filter to remove 2kHz unwanted tone */ #define FIX_ISSUE_1245 /* Ittiam: Fix for issue 1245: Basop Encoder: Audible noise for silent Stereo input DTX on @24.4 kbps, @32 kbps*/ #define FIX_MINOR_SVD_WMOPS_MR1010X /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */ +#define FIX_TUNE_IVAS_TOOLS_MATRIX_PRODUCT_WMOPS_MR1010X /* FhG: Major WMOPS tuning in HQ matrix multiplication, bit-exact to previous version, saves about 37 WMOPS for MR1010 */ #define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ #endif