Commit 7eb5140a authored by Manuel Jander's avatar Manuel Jander
Browse files

Merge extract_l/W_extract_l and 64 bit operator overflow detection and the fixes for EVS modes.

parent 07e5f4e6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3195,7 +3195,7 @@ static ivas_error decodeVoIP(
#ifdef SUPPORT_JBM_TRACEFILE
                if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, &parametersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK )
#else
                if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, &bitstreamReadDone, &nSamplesRendered, &parametersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK )
                if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, &bitstreamReadDone, &parametersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK )
#endif
                {
                    fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+46 −0
Original line number Diff line number Diff line
@@ -1224,6 +1224,52 @@ Word16 extract_l( Word32 L_var1 )
    return ( var_out );
}

#ifdef FIX_2493_CHECK_EXTRACT_L
/*___________________________________________________________________________
 |                                                                           |
 |   Function Name : extract_l2                                              |
 |                                                                           |
 |   Purpose :                                                               |
 |                                                                           |
 |   Return the 16 LSB of L_var1. Check range.                               |
 |                                                                           |
 |   Complexity weight : 1                                                   |
 |                                                                           |
 |   Inputs :                                                                |
 |                                                                           |
 |    L_var1                                                                 |
 |             32 bit long signed integer (Word32 ) whose value falls in the |
 |             range : 0xffff 8000 <= L_var1 <= 0x0000 7fff.                 |
 |                                                                           |
 |   Outputs :                                                               |
 |                                                                           |
 |    none                                                                   |
 |                                                                           |
 |   Return Value :                                                          |
 |                                                                           |
 |    var_out                                                                |
 |             16 bit short signed integer (Word16) whose value falls in the |
 |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
 |___________________________________________________________________________|
*/
Word16 extract_l2( Word32 L_var1 )
{
    Word16 var_out;

    assert( L_var1 <=(Word32)MAX_16 && L_var1 >= (Word32)(Word16)MIN_16 );

    var_out = (Word16) L_var1;

#ifdef WMOPS
    multiCounter[currCounter].extract_l++;
#endif

    BASOP_CHECK();


    return ( var_out );
}
#endif

/*___________________________________________________________________________
 |                                                                           |
+3 −0
Original line number Diff line number Diff line
@@ -129,6 +129,9 @@ Word32 L_mult( Word16 var1, Word16 var2 ); /*
Word16 negate( Word16 var1 );                                                /* Short negate,        1   */
Word16 extract_h( Word32 L_var1 );                                           /* Extract high,        1   */
Word16 extract_l( Word32 L_var1 );                                           /* Extract low,         1   */
#ifdef FIX_2493_CHECK_EXTRACT_L
Word16 extract_l2( Word32 L_var1 );                                          /* Extract low and check range 1 */
#endif
Word16 round_fx( Word32 L_var1 );                                            /* Round,               1   */
Word32 L_mac( Word32 L_var3, Word16 var1, Word16 var2 );                     /* Mac,  1  */
Word32 L_msu( Word32 L_var3, Word16 var1, Word16 var2 );                     /* Msu,  1  */
+74 −2
Original line number Diff line number Diff line
@@ -18,6 +18,10 @@
#include <stdlib.h>
#include "stl.h"

#ifdef FIX_2493_CHECK_64BIT
#include <assert.h>
#endif

#define WMC_TOOL_SKIP

/*****************************************************************************
@@ -74,7 +78,9 @@
Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 )
{
    Word64 L64_var_out;

#ifdef FIX_2493_CHECK_64BIT
    assert( W_abs( ( ( L64_var1 + L64_var2 ) >> 1 ) - ( ( L64_var1 >> 1 ) + ( L64_var2 >> 1 ) ) ) < 2 );
#endif
    L64_var_out = L64_var1 + L64_var2;

#ifdef WMOPS
@@ -117,7 +123,9 @@ Word64 W_add_nosat( Word64 L64_var1, Word64 L64_var2 )
Word64 W_sub_nosat( Word64 L64_var1, Word64 L64_var2 )
{
    Word64 L64_var_out;

#ifdef FIX_2493_CHECK_64BIT
    assert( W_abs( ( ( L64_var1 - L64_var2 ) >> 1 ) - ( ( L64_var1 >> 1 ) - ( L64_var2 >> 1 ) ) ) < 2 );
#endif
    L64_var_out = L64_var1 - L64_var2;

#ifdef WMOPS
@@ -316,6 +324,9 @@ Word64 W_shl_nosat( Word64 L64_var1, Word16 var2 )
    }
    else
    {
#ifdef FIX_2493_CHECK_64BIT
        assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 );
#endif
        L64_var_out = L64_var1 << var2;
    }
#ifdef WMOPS
@@ -369,6 +380,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 )
    if ( var2 < 0 )
    {
        var2 = -var2;
#ifdef FIX_2493_CHECK_64BIT
        assert( ( ( L64_var1 << var2 ) >> var2 ) == L64_var1 );
#endif
        L64_var_out = L64_var1 << var2;
    }
    else
@@ -423,6 +437,9 @@ Word64 W_shr_nosat( Word64 L64_var1, Word16 var2 )
Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 )
{
    Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1;
#ifdef FIX_2493_CHECK_64BIT
    assert( W_abs( ( ( L64_var_out + L64_var1 ) >> 1 ) - ( ( L64_var_out >> 1 ) + ( L64_var1 >> 1 ) ) ) < 2 );
#endif
    L64_var_out += L64_var1;
#ifdef WMOPS
    multiCounter[currCounter].W_mac_32_16++;
@@ -470,6 +487,9 @@ Word64 W_mac_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 )
Word64 W_msu_32_16( Word64 L64_var1, Word32 L_var2, Word16 var3 )
{
    Word64 L64_var_out = ( (Word64) L_var2 * var3 ) << 1;
#ifdef FIX_2493_CHECK_64BIT
    assert( W_abs( ( ( L64_var1 - L64_var_out ) >> 1 ) - ( ( L64_var1 >> 1 ) - ( L64_var_out >> 1 ) ) ) < 2 );
#endif
    L64_var_out = L64_var1 - L64_var_out;
#ifdef WMOPS
    multiCounter[currCounter].W_msu_32_16++;
@@ -596,6 +616,9 @@ Word64 W_mult0_16_16( Word16 var1, Word16 var2 )
Word64 W_mac0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 )
{
    Word64 L64_var_out = (Word64) var2 * var3;
#ifdef FIX_2493_CHECK_64BIT
    assert( W_abs( ( ( L64_var_out + L64_var1 ) >> 1 ) - ( ( L64_var_out >> 1 ) + ( L64_var1 >> 1 ) ) ) < 2 );
#endif
    L64_var_out += L64_var1;
#ifdef WMOPS
    multiCounter[currCounter].W_mac0_16_16++;
@@ -642,6 +665,9 @@ Word64 W_mac0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 )
Word64 W_msu0_16_16( Word64 L64_var1, Word16 var2, Word16 var3 )
{
    Word64 L64_var_out = (Word64) var2 * var3;
#ifdef FIX_2493_CHECK_64BIT
    assert( W_abs( ( ( L64_var1 - L64_var_out ) >> 1 ) - ( ( L64_var1 >> 1 ) - ( L64_var_out >> 1 ) ) ) < 2 );
#endif
    L64_var_out = L64_var1 - L64_var_out;
#ifdef WMOPS
    multiCounter[currCounter].W_msu0_16_16++;
@@ -868,6 +894,52 @@ Word32 W_extract_l( Word64 L64_var1 )
    return ( L_var_out );
}

#ifdef FIX_2493_CHECK_EXTRACT_L

#include <assert.h>

/*__________________________________________________________________________________
|                                                                                  |
|   Function Name : W_extract_l                                                    |
|                                                                                  |
|   Purpose :                                                                      |
|                                                                                  |
|   Return the 32 LSB of L64_var1 and check the range                              |
|                                                                                  |
|   Complexity weight : 1                                                          |
|                                                                                  |
|   Inputs :                                                                       |
|                                                                                  |
|    L64_var1                                                                      |
|             64 bit long long signed integer (Word64) whose value falls in        |
|             range : 0x00000000 80000000LL <= L64_var1 <= 0xffffffff 7fffffffLL.  |
|                                                                                  |
|   Outputs :                                                                      |
|                                                                                  |
|    none                                                                          |
|                                                                                  |
|   Return Value :                                                                 |
|                                                                                  |
|    L_var_out                                                                     |
|             32 bit long signed integer (Word32) whose value falls in the         |
|             range : 0x8000 0000 <= L_var_out <= 0x7fff 0000.                     |
|__________________________________________________________________________________|
*/
Word32 W_extract_l2( Word64 L64_var1 )
{
    Word32 L_var_out;

    assert( L64_var1 <= (Word64) MAX_32 && L64_var1 >= (Word64) (Word32) MIN_32 );

    L_var_out = (Word32) L64_var1;

#ifdef WMOPS
    multiCounter[currCounter].W_extract_l++;
#endif /* if WMOPS */

    return ( L_var_out );
}
#endif

/*__________________________________________________________________________________
|                                                                                  |
+3 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ Word32 W_sat_m( Word64 L64_var );
Word32 W_shl_sat_l( Word64 L64_var, Word16 n );

Word32 W_extract_l( Word64 L64_var1 );
#ifdef FIX_2493_CHECK_EXTRACT_L
Word32 W_extract_l2( Word64 L64_var1 );
#endif
Word32 W_extract_h( Word64 L64_var1 );

Word32 W_round48_L( Word64 L64_var1 );
Loading