Loading Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading lib_com/enh64.c +18 −6 Original line number Diff line number Diff line Loading @@ -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 ) { Loading Loading @@ -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 /*___________________________________________________________________________ | | Loading Loading @@ -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; Loading @@ -268,7 +272,7 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*___________________________________________________________________________ | | Loading Loading @@ -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 ) { Loading @@ -326,7 +331,7 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*___________________________________________________________________________ | | Loading Loading @@ -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; Loading @@ -382,7 +388,7 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*_________________________________________________________________________________________________ | | Loading Loading @@ -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; Loading @@ -1142,7 +1149,7 @@ Word32 W_shl_sat_l( Word64 L64_var, Word16 n ) return L_result; } #endif /*__________________________________________________________________________________ | | Loading Loading @@ -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 ) { Loading @@ -1715,6 +1724,7 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*_____________________________________________________________________________ | | Loading Loading @@ -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 ) { Loading @@ -1767,7 +1779,7 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*__________________________________________________________________________________ | | Loading lib_com/enh64.h +264 −1 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ #define MAX_64 (Word64) 0x7fffffffffffffffLL #define MIN_64 (Word64) 0x8000000000000000LL /***************************************************************************** * * Prototypes for enhanced 64 bit arithmetic operators Loading @@ -23,10 +24,170 @@ #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 ); Loading @@ -44,8 +205,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 ); Loading @@ -61,14 +247,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 ); Loading Loading
Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
lib_com/enh64.c +18 −6 Original line number Diff line number Diff line Loading @@ -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 ) { Loading Loading @@ -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 /*___________________________________________________________________________ | | Loading Loading @@ -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; Loading @@ -268,7 +272,7 @@ Word64 W_shr( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*___________________________________________________________________________ | | Loading Loading @@ -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 ) { Loading @@ -326,7 +331,7 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*___________________________________________________________________________ | | Loading Loading @@ -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; Loading @@ -382,7 +388,7 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*_________________________________________________________________________________________________ | | Loading Loading @@ -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; Loading @@ -1142,7 +1149,7 @@ Word32 W_shl_sat_l( Word64 L64_var, Word16 n ) return L_result; } #endif /*__________________________________________________________________________________ | | Loading Loading @@ -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 ) { Loading @@ -1715,6 +1724,7 @@ UWord64 W_lshl( UWord64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*_____________________________________________________________________________ | | Loading Loading @@ -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 ) { Loading @@ -1767,7 +1779,7 @@ UWord64 W_lshr( UWord64 L64_var1, Word16 var2 ) return ( L64_var_out ); } #endif /*__________________________________________________________________________________ | | Loading
lib_com/enh64.h +264 −1 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ #define MAX_64 (Word64) 0x7fffffffffffffffLL #define MIN_64 (Word64) 0x8000000000000000LL /***************************************************************************** * * Prototypes for enhanced 64 bit arithmetic operators Loading @@ -23,10 +24,170 @@ #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 ); Loading @@ -44,8 +205,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 ); Loading @@ -61,14 +247,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 ); Loading