From f0e3ade73759a2e3b91e43b13c63d29c7c830ea3 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 13 Dec 2024 16:55:31 +0100 Subject: [PATCH 1/2] Optimize minimum_s(), minimum_l(), avoid IF --- lib_com/options.h | 1 + lib_com/tools.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index d1be6ee8e..c86bbfcfb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -93,4 +93,5 @@ #define FIX_1052_COPY_CMPLX_DISCREPANCY /* VA: modify IF-ELSE statements used in Copy*() functions to avoid dependency on x[] and y[] in RAM */ #define FIX_1049_SHR_RO_COMPLEXITY /* VA: fix for issue 1049: incorrect counting of complexity in the shr_ro() function */ #define FIX_1103_OPT_L_NORM_ARR /* FhG: Optimize L_norm_arr(), avoid IF */ +#define FIX_1105_OPT_MINIMUM_SL /* FhG: Optimize minimum_s(), minimum_l(), avoid IF */ #endif diff --git a/lib_com/tools.c b/lib_com/tools.c index b35819658..c09ac3c41 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -879,15 +879,27 @@ Word16 minimum_s( Word16 *min_val /* o : minimum value in the input vector */ ) { +#ifdef FIX_1105_OPT_MINIMUM_SL + Word16 i, ind; +#else Word16 i, ind, tmp; +#endif ind = 0; move16(); +#ifndef FIX_1105_OPT_MINIMUM_SL tmp = vec[0]; move16(); +#endif FOR( i = 1; i < lvec; i++ ) { +#ifdef FIX_1105_OPT_MINIMUM_SL + if ( LT_16( vec[i], vec[ind] ) ) + { + ind = add( i, 0 ); + } +#else IF( LT_16( vec[i], tmp ) ) { ind = i; @@ -895,11 +907,16 @@ Word16 minimum_s( tmp = vec[i]; move16(); } +#endif } if ( min_val != NULL ) { +#ifdef FIX_1105_OPT_MINIMUM_SL + *min_val = vec[ind]; +#else *min_val = tmp; +#endif move16(); } @@ -920,15 +937,27 @@ Word16 minimum_l( ) { Word16 i, ind; +#ifndef FIX_1105_OPT_MINIMUM_SL Word32 tmp; +#endif ind = 0; +#ifndef FIX_1105_OPT_MINIMUM_SL tmp = vec[0]; +#endif move16(); +#ifndef FIX_1105_OPT_MINIMUM_SL move32(); +#endif FOR( i = 1; i < lvec; i++ ) { +#ifdef FIX_1105_OPT_MINIMUM_SL + if ( LT_32( vec[i], vec[ind] ) ) + { + ind = add( i, 0 ); + } +#else IF( LT_32( vec[i], tmp ) ) { ind = i; @@ -936,11 +965,16 @@ Word16 minimum_l( move16(); move32(); } +#endif } if ( min_val != NULL ) { +#ifdef FIX_1105_OPT_MINIMUM_SL + *min_val = vec[ind]; +#else *min_val = tmp; +#endif move32(); } -- GitLab From f60bcdb26ac546b147c79e2f010506bf5d1328db Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Sun, 15 Dec 2024 22:42:06 +0100 Subject: [PATCH 2/2] implement review comment by vaillancourt --- lib_com/tools.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib_com/tools.c b/lib_com/tools.c index c09ac3c41..f757239f3 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -897,7 +897,8 @@ Word16 minimum_s( #ifdef FIX_1105_OPT_MINIMUM_SL if ( LT_16( vec[i], vec[ind] ) ) { - ind = add( i, 0 ); + ind = i; + move16(); } #else IF( LT_16( vec[i], tmp ) ) @@ -955,7 +956,8 @@ Word16 minimum_l( #ifdef FIX_1105_OPT_MINIMUM_SL if ( LT_32( vec[i], vec[ind] ) ) { - ind = add( i, 0 ); + ind = i; + move16(); } #else IF( LT_32( vec[i], tmp ) ) -- GitLab