diff --git a/Makefile b/Makefile index 9d18cbde3d47ff872b918dc70675543fc18cfba9..32474a7b7cbababd7100394f01ff80ffe3ebc082 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,8 @@ endif CFLAGS += -std=c99 -pedantic -Wcast-qual -Wall -W -Wextra -Wno-long-long \ -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ -Werror-implicit-function-declaration \ - -Wno-implicit-fallthrough -ffp-contract=off + -Wno-implicit-fallthrough -ffp-contract=off \ + -Wno-unused-function -Wno-attributes # to be uncommented in CI # CFLAGS += -Werror CFLAGS += -Winit-self diff --git a/lib_com/enh64.c b/lib_com/enh64.c index 8bffb620cc8dfb0b2164e718b83fa365fb048430..f9e07fc89717b4eadf65dbce113d8798387bbbbd 100644 --- a/lib_com/enh64.c +++ b/lib_com/enh64.c @@ -161,6 +161,7 @@ Word64 W_sub_nosat( Word64 L64_var1, Word64 L64_var2 ) | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ +#if 0 Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) { @@ -204,12 +205,14 @@ Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) return ( L64_var_out ); } +#endif +#if 0 Word64 W_shl( Word64 L64_var1, Word16 var2 ) { return W_shl_o( L64_var1, var2, NULL ); } - +#endif /*___________________________________________________________________________ | | @@ -244,6 +247,7 @@ Word64 W_shl( Word64 L64_var1, Word16 var2 ) | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ +#if 0 Word64 W_shr( Word64 L64_var1, Word16 var2 ) { Word64 L64_var_out; @@ -268,7 +272,7 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } - +#endif /*___________________________________________________________________________ | | @@ -304,6 +308,7 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ +#if 0 Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) { @@ -326,7 +331,7 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } - +#endif /*___________________________________________________________________________ | | @@ -362,6 +367,7 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ +#if 0 Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) { Word64 L64_var_out; @@ -382,7 +388,7 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } - +#endif /*_________________________________________________________________________________________________ | | @@ -1126,6 +1132,7 @@ Word64 W_mac_32_32( Word64 L64_var1, Word32 L_var2, Word32 L_var3 ) | range : 0x8000 0000 <= L_result <= 0x7fff 0000. | |___________________________________________________________________________| */ +#if 0 Word32 W_shl_sat_l( Word64 L64_var, Word16 n ) { Word32 L_result; @@ -1142,7 +1149,7 @@ Word32 W_shl_sat_l( Word64 L64_var, Word16 n ) return L_result; } - +#endif /*__________________________________________________________________________________ | | @@ -1696,6 +1703,8 @@ Word64 W_mult0_32_32( Word32 L_var1, Word32 L_var2 ) | in the range : 0LL <= L64_var1 <= 0xffffffff ffffffffLL. | |______________________________________________________________________________| */ +#if 0 +#temporary UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) { @@ -1715,6 +1724,7 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) return ( L64_var_out ); } +#endif /*_____________________________________________________________________________ | | @@ -1748,6 +1758,8 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) | in the range : 0LL <= L64_var1 <= 0xffffffff ffffffffLL. | |______________________________________________________________________________| */ +#if 0 + UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) { @@ -1767,7 +1779,7 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) return ( L64_var_out ); } - +#endif /*__________________________________________________________________________________ | | diff --git a/lib_com/enh64.h b/lib_com/enh64.h index c3896bb0d257aa053df48da5c84948b8255e0401..7652e01dc683b3ff8001b8aedef6424bb76f2c4f 100644 --- a/lib_com/enh64.h +++ b/lib_com/enh64.h @@ -15,6 +15,7 @@ #define MAX_64 (Word64) 0x7fffffffffffffffLL #define MIN_64 (Word64) 0x8000000000000000LL + /***************************************************************************** * * Prototypes for enhanced 64 bit arithmetic operators @@ -23,10 +24,174 @@ #ifdef ENH_64_BIT_OPERATOR Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 ); Word64 W_sub_nosat( Word64 L64_var1, Word64 L64_var2 ); -Word64 W_shl( Word64 L64_var1, Word16 var2 ); +// Word64 W_shl( Word64 L64_var1, Word16 var2 ); +#define BASOP_WATCH_W_shl +#define BASOP_WATCH_W_shr +#define BASOP_WATCH_W_shl_nosat +#define BASOP_WATCH_W_shr_nosat +#define BASOP_WATCH_W_lshl +#define BASOP_WATCH_W_lshr +#define BASOP_WATCH_W_shl_sat_l +#define BASOP_WATCH_W_shl_o + +#define BASOP_WATCH( FILENAME, LINE, type, cond, format_string, par1, par2, par3 ) \ + { \ + static char stat; \ + if ( ( !( cond ) && stat == 0 ) ) \ + { \ + stat = 1; \ + fprintf( stderr, "%s %s %d:", type, FILENAME, LINE ); \ + fprintf( stderr, format_string, par1, par2, par3 ); \ + fprintf( stderr, "\n" ); \ + } \ + } + +#ifndef LIMIT_WLSHIFTER_RANGE +#define LIMIT_WLSHIFTER_RANGE( W64_var1, var2, limit ) \ + if ( var2 > limit || -var2 > limit ) \ + { \ + W64_var1 = 0; \ + var2 = 0; \ + } +#endif +#ifndef LIMIT_SHIFTER_RANGE +#define LIMIT_SHIFTER_RANGE( shift, limit ) shift = ( shift > 0 ) ? ( ( shift > limit ) ? limit : shift ) : ( ( -shift > limit ) ? -limit : shift ) +#endif + +#ifndef INLINE +#define INLINE __attribute__( ( always_inline ) ) +#endif + +#ifdef BASOP_WATCH_W_shl +#define W_shl( a, b ) W_shl_watch( a, b, __FILE__, __LINE__ ) +static INLINE Word64 W_shl_watch( Word64 L64_var1, Word16 var2, const char *fname, int linenumber ) +#else +static INLINE Word64 W_shl( Word64 L64_var1, Word16 var2 ) +#endif +{ + /* assert(var2 <= 63 && var2 >= -63); */ + Word64 L64_var_out = 0LL; + +#ifdef BASOP_WATCH_W_shl + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_shl() var2=%d outside range +-63%c%c", var2, 0x20, 0x20 ) +#endif + if ( L64_var1 != 0LL ) + { + LIMIT_SHIFTER_RANGE( var2, 63 ); + if ( var2 < 0 ) + { + + var2 = -var2; + L64_var_out = L64_var1 >> var2; + } + else if ( var2 >= 0 ) + { + Word64 tmp = L64_var1 >> ( 63 - var2 ); + if ( L64_var1 >= 0 ) + { + L64_var_out = ( tmp == 0 ) ? L64_var1 << var2 : MAX_64; + } + else + { + L64_var_out = ( tmp == (Word64) -1 ) ? L64_var1 << var2 : MIN_64; + } +#ifdef BASOP_WATCH_W_shl + // BASOP_WATCH(fname,linenumber, "W_shift", tmp == 0 || tmp == -1, "W_shl() L64_var1=0x%016llX var2=%d overflow %c", L64_var1, var2, 0) +#endif + } + } + return L64_var_out; +} + +#if 0 Word64 W_shr( Word64 L64_var1, Word16 var2 ); +#else +#ifdef BASOP_WATCH_W_shr +#define W_shr( a, b ) W_shr_watch( a, b, __FILE__, __LINE__ ) +static INLINE Word64 W_shr_watch( Word64 L64_var1, Word16 var2, const char *fname, int linenumber ) +#else +static INLINE Word64 W_shr( Word64 L64_var1, Word16 var2 ) +#endif +{ + Word64 L64_var_out; + +#ifdef BASOP_WATCH_W_shr + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_shr() var2=%d outside range %c%c", var2, 0x20, 0x20 ) +#endif + if ( var2 < 0 ) + { + var2 = -var2; + L64_var_out = W_shl( L64_var1, var2 ); + } + else + { + LIMIT_SHIFTER_RANGE( var2, 63 ); + L64_var_out = L64_var1 >> var2; + } + + return L64_var_out; +} +#endif + + +#if 0 Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ); +#else +#ifdef BASOP_WATCH_W_shl_nosat +#define W_shl_nosat( a, b ) W_shl_nosat_watch( a, b, __FILE__, __LINE__ ) +static INLINE Word64 W_shl_nosat_watch( Word64 L64_var1, Word16 var2, const char *fname, int linenumber ) +#else +static INLINE Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) +#endif +{ + + Word64 L64_var_out = 0LL; + +#ifdef BASOP_WATCH_W_shl_nosat + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_shl_nosat() var2=%d outside range %c%c", var2, 0x20, 0x20 ) +#endif + LIMIT_SHIFTER_RANGE( var2, 63 ); + if ( var2 <= 0 ) + { + var2 = -var2; + L64_var_out = L64_var1 >> var2; + } + else + { + L64_var_out = L64_var1 << var2; + } + return L64_var_out; +} +#endif +#if 0 Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ); +#else +#ifdef BASOP_WATCH_W_shr_nosat +#define W_shr_nosat( a, b ) W_shr_nosat_watch( a, b, __FILE__, __LINE__ ) +static INLINE Word64 W_shr_nosat_watch( Word64 L64_var1, Word16 var2, const char *fname, int linenumber ) +#else +static INLINE Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) +#endif +{ + Word64 L64_var_out; + +#ifdef BASOP_WATCH_W_shr_nosat + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_shr_nosat() var2=%d outside range %c%c", var2, 0x20, 0x20 ) +#endif + LIMIT_SHIFTER_RANGE( var2, 63 ); + if ( var2 < 0 ) + { + var2 = -var2; + L64_var_out = L64_var1 << var2; + } + else + { + L64_var_out = L64_var1 >> var2; + } + + return L64_var_out; +} +#endif Word64 W_mult_32_16( Word32 L_var1, Word16 var2 ); Word64 W_mac_32_16( Word64 L64_acc, Word32 L_var1, Word16 var2 ); Word64 W_msu_32_16( Word64 L64_acc, Word32 L_var1, Word16 var2 ); @@ -44,8 +209,33 @@ Word64 W_deposit32_h( Word32 L_var1 ); Word32 W_sat_l( Word64 L64_var ); Word32 W_sat_m( Word64 L64_var ); +#if 0 Word32 W_shl_sat_l( Word64 L64_var, Word16 n ); +#else +#ifdef BASOP_WATCH_W_shl_sat_l +#define W_shl_sat_l( a, b ) W_shl_sat_l_watch( a, b, __FILE__, __LINE__ ) +static INLINE Word32 W_shl_sat_l_watch( Word64 L64_var, Word16 var2, const char *fname, int linenumber ) +#else +static INLINE Word32 W_shl_sat_l( Word64 L64_var, Word16 var2 ) +#endif +{ + Word32 L_result; + Word64 d_var_64; +#ifdef BASOP_WATCH_W_shl_sat_l + // Word64 tmp = L64_var >> (63 - var2); + // BASOP_WATCH(fname,linenumber, "W_shift", tmp == 0 || tmp == -1, "W_shl_sat_l() L64_var=0x%016llX var2=%d overflow %c", L64_var, var2, 0) +#endif +#ifdef BASOP_WATCH_W_shl_sat_l + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_shl_sat_l() var2=%d outside range +-63%c%c", var2, 0x20, 0x20 ) +#endif + LIMIT_SHIFTER_RANGE( var2, 63 ); + d_var_64 = W_shl( L64_var, var2 ); + L_result = W_sat_l( d_var_64 ); + + return L_result; +} +#endif Word32 W_extract_l( Word64 L64_var1 ); Word32 W_extract_h( Word64 L64_var1 ); @@ -61,14 +251,91 @@ Word64 W_neg( Word64 L64_var1 ); Word64 W_abs( Word64 L64_var1 ); Word64 W_mult_32_32( Word32 L_var1, Word32 L_var2 ); Word64 W_mult0_32_32( Word32 L_var1, Word32 L_var2 ); +#if 0 UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ); +#else +#ifdef BASOP_WATCH_W_lshl +#define W_lshl( a, b ) W_lshl_watch( a, b, __FILE__, __LINE__ ) +static INLINE UWord64 W_lshl_watch( UWord64 L64_var1, Word16 var2, const char *fname, int linenumber ) +#else +static INLINE UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) +#endif /* BASOP_WATCH_W_lshl */ +{ + // assert( var2 >= -63 ); + // assert( var2 <= 63 ); + UWord64 L64_var_out = 0LL; + +#ifdef BASOP_WATCH_W_lshl + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_lshl() var2=%d outside range %c%c", var2, 0x20, 0x20 ) +#endif + LIMIT_WLSHIFTER_RANGE( L64_var1, var2, 63 ); + + if ( var2 < 0 ) + { + L64_var_out = L64_var1 >> ( -var2 ); + } + else + { + L64_var_out = L64_var1 << var2; + } + + return L64_var_out; +} +#endif +#if 0 UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ); +#else +#ifdef BASOP_WATCH_W_lshr +#define W_lshr( a, b ) W_lshr_watch( a, b, __FILE__, __LINE__ ) +static INLINE UWord64 W_lshr_watch( UWord64 L64_var1, Word16 var2, const char *fname, int linenumber ); +static INLINE UWord64 W_lshr_watch( UWord64 L64_var1, Word16 var2, const char *fname, int linenumber ) +#else +static INLINE UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) +#endif /* BASOP_WATCH_W_lshr */ +{ + + UWord64 L64_var_out = 0LL; + +#ifdef BASOP_WATCH_W_lshr + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_lshr() var2=%d outside range %c%c", var2, 0x20, 0x20 ) +#endif + LIMIT_WLSHIFTER_RANGE( L64_var1, var2, 63 ); + + if ( var2 < 0 ) + { + L64_var_out = L64_var1 << ( -var2 ); + } + else + { + L64_var_out = L64_var1 >> var2; + } + + return L64_var_out; +} +#endif + Word32 W_round64_L( Word64 L64_var1 ); /* * Overflowing operators */ +#if 0 Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ); +#else +#ifdef BASOP_WATCH_W_shl_o +#define W_shl_o( a, b, ovfl ) W_shl_o_watch( a, b, ovfl, __FILE__, __LINE__ ) +static INLINE Word64 W_shl_o_watch( Word64 L64_var1, Word16 var2, Flag *Overflow, const char *fname, int linenumber ) +#else +static INLINE Word64 W_shl_o( Word64 L64_var1, Word16 var2, Flag *Overflow ) +#endif +{ + (void) Overflow; +#ifdef BASOP_WATCH_W_shl_o + BASOP_WATCH( fname, linenumber, "W_shift", var2 < 64 && var2 > -64, "W_shl_o() var2=%d outside range %c%c", var2, 0x20, 0x20 ) +#endif + return W_shl( L64_var1, var2 ); +} +#endif Word32 W_round48_L_o( Word64 L64_var1, Flag *Overflow ); Word16 W_round32_s_o( Word64 L64_var1, Flag *Overflow ); Word64 W_add_o( Word64 L64_var1, Word64 L64_var2, Flag *Overflow );