Commit 8d5ad835 authored by Nicolas Roussin's avatar Nicolas Roussin
Browse files

Move Mpy_64_32 to lib_com/basop_util.

parent 9f34f359
Loading
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -2958,3 +2958,14 @@ cmplx CL_mult_32x16( cmplx input, cmplx_s coeff )
#endif
    return result;
}

Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 )
{
    Word32 var1_l;
    Word64 var_out;
    var1_l = W_extract_l( W_var1 );
    var_out = W_mult0_32_32( L_and( var1_l, 1 ), L_var2 );
    var_out = W_mac_32_32( var_out, L_lshr( var1_l, 1 ), L_var2 );
    var_out = W_mac_32_32( W_shr( var_out, 31 ), W_extract_h( W_var1 ), L_var2 );
    return var_out;
}
+20 −0
Original line number Diff line number Diff line
@@ -907,4 +907,24 @@ cmplx CL_scale_t( cmplx x, Word16 y );
cmplx CL_dscale_t( cmplx x, Word16 y1, Word16 y2 );
cmplx CL_mult_32x16( cmplx input, cmplx_s coeff );


/*!
   \brief   64-bit/32-bit multiplication with shift 
  
     This multiplication is similar to Mpy_32_32 except for the fact that the first argument 
     and the return type are Word64. The function performs the following operation:
   
       z = ((int128_t)x   (int128_t)y) >> 31
  
     where:
      - x is a 64-bit signed integer
      - y is a 32-bit signed integer
      - z is a 64-bit signed integer
   
   \param W_var1 64-bit signed integer argument
   \param L_var2 32-bit signed integer argument
   \return 64-bit signed integer representing the result of the multiplication with shift
*/
Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 );

#endif /* __BASOP_UTIL_H__ */
+0 −25
Original line number Diff line number Diff line
@@ -184,31 +184,6 @@ void ivas_filters_init_fx(

#ifdef OPT_2239_IVAS_FILTER_PROCESS
static Word64 ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, const Word16 stage, const Word64 in );
static Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 );

/*-----------------------------------------------------------------------------------------*
 * Function Mpy_64_32()
 *
 * Performs the the following operation:
 *
 *  z = ((int128_t)x * (int128_t)y) >> 31
 *
 * where:
 *  - x is a 64-bit signed integer
 *  - y is a 32-bit signed integer
 *  - z is a 64-bit signed integer
 *-----------------------------------------------------------------------------------------*/

static Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 )
{
    Word32 var1_l;
    Word64 var_out;
    var1_l = W_extract_l( W_var1 );                                               // 1
    var_out = W_mult0_32_32( L_and( var1_l, 1 ), L_var2 );                        // 2
    var_out = W_mac_32_32( var_out, L_lshr( var1_l, 1 ), L_var2 );                // 2
    var_out = W_mac_32_32( W_shr( var_out, 31 ), W_extract_h( W_var1 ), L_var2 ); // 3
    return var_out;
}

/*-----------------------------------------------------------------------------------------*
 * Function ivas_iir_2_filter_fx()