Commit f2d5ec73 authored by JÜRGEN Gerstacker's avatar JÜRGEN Gerstacker
Browse files

temporary BASOP_WATCH() to find exceeding shift amounts in 64-bit shift-operators

parent 5d9ebfb5
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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
+18 −6
Original line number Diff line number Diff line
@@ -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

/*__________________________________________________________________________________
|                                                                                  |
+264 −1
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#define MAX_64 (Word64) 0x7fffffffffffffffLL
#define MIN_64 (Word64) 0x8000000000000000LL


/*****************************************************************************
 *
 *  Prototypes for enhanced 64 bit arithmetic operators
@@ -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 );
@@ -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 );

@@ -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 );