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

ISSUE 1817, MR less 1931, moved inline function w_norm_llQ31() to basop_util.h

parent 24fc296c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2089,6 +2089,8 @@ Word32 norm_llQ31( /* o : normalized result Q31 */
    return L_sum;
}

#ifndef FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW
/* note: now available in basop_util.h */
Word32 w_norm_llQ31( Word64 L_sum, Word16 *exp );
Word32 w_norm_llQ31(               /* o : normalized result              Q31 */
                     Word64 L_sum, /* i : upper and lower bits of accu, unsigned   Q31 */
@@ -2115,6 +2117,7 @@ Word32 w_norm_llQ31( /* o : normalized result Q31 */
    L_tmp = W_extract_h( L64_inp64 );
    return L_tmp;
}
#endif

Word32 Dot_product16HQ(                     /* o : normalized result              Q31 */
                        const Word32 L_off, /* i : initial sum value               Qn */
+17 −0
Original line number Diff line number Diff line
@@ -627,6 +627,23 @@ Word32 norm_llQ31( /* o : normalized result Q31 */
                   Word16 *exp   /* o : exponent of result in [-32,31]  Q0 */
);

#ifdef FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW
/*------------------------------------------------------------------*
 * w_norm_llQ31:
 *
 * \brief Compute normalized Q31 Values out of overflowed Q31 value
 *        using 64-bit operators
 *------------------------------------------------------------------*/
static inline Word32 w_norm_llQ31( Word64 L64_var1, Word16 *S_var2 ) /*Q31 - L_tmp_exp*/
{
    Word32 L_result;
    Word16 sh = W_norm( L64_var1 );
    L_result = W_extract_h( W_shl( L64_var1, sh ) );
    *S_var2 = ( L_result == 0 ) ? -32 : 32 - sh;
    return L_result;
}
#endif

/**
 * \brief Compute dot product of 1 32 bit vectors with itself
 * \param x input vector 1
+2 −0
Original line number Diff line number Diff line
@@ -148,4 +148,6 @@
#define FIX_1824
#define FIX_1822

#define FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW  /* FhG: bit-exact, replace carry and overflow operations by 64-bit operations, MR 1931 */

#endif
+4 −12
Original line number Diff line number Diff line
@@ -6,9 +6,9 @@
#include <stdio.h>
#include <assert.h>
#include "prot_fx.h"
#include "options.h"
#include "basop_util.h"
#include "stl.h"
#include "options.h"
#include "math.h"
#include "ivas_prot_fx.h"
#include "rom_com.h"
@@ -1859,7 +1859,7 @@ static Word32 CalculateAbsEnergy_fx( /* o : normalized resul
                                     const Word16 lg,    /* i : vector length, range [0..7FFF]  Q0 */
                                     Word16 *exp         /* o : exponent of result in [-32,31]  Q0 */
                                     )
#if 0
#ifndef FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW
{
    Word16 i;
    Word32 L_sum, L_c;
@@ -1901,7 +1901,6 @@ static Word32 CalculateAbsEnergy_fx( /* o : normalized resul
    Word16 i;
    Word32 L_sum;
    Word64 L_sum64;
    Word16 sh;

    L_sum64 = W_deposit32_l( L_off );

@@ -1909,17 +1908,10 @@ static Word32 CalculateAbsEnergy_fx( /* o : normalized resul
    {
        L_sum64 = W_mac_16_16( L_sum64, x[i], x[i] );
    }
#if 0
    L_sum = w_norm_llQ31( L_sum64, exp );
#else
    sh = W_norm( L_sum64 );
    L_sum = W_extract_h( W_shl( L_sum64, sh ) );
    *exp = ( L_sum == 0 ) ? -32 : 32 - sh;
#endif /* 0/1 use of w_norm_llQ31() */
    L_sum = w_norm_llQ31( L_sum64, exp ); /*Q31 - *exp */   
    return L_sum;
}
#endif /* 0/1 legacy */

#endif /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */

    void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_TDAC, Word16 *xn_buf, const Word16 *tcx_aldo_window_1, const PWord16 *tcx_aldo_window_1_trunc, const PWord16 *tcx_aldo_window_2, const PWord16 *tcx_mdct_window_half, const PWord16 *tcx_mdct_window_minimum, const PWord16 *tcx_mdct_window_trans, Word16 tcx_mdct_window_half_length, Word16 tcx_mdct_window_min_length, Word16 index, Word16 left_rect, Word16 tcx_offset, Word16 overlap, Word16 L_frame, Word16 L_frameTCX, Word16 L_spec_TCX5, Word16 L_frame_glob, Word16 frame_cnt, Word16 bfi, Word16 *old_out, Word16 *Q_old_wtda, Decoder_State *st, Word16 fullbandScale, Word16 *acelp_zir )
{
+15 −31
Original line number Diff line number Diff line
@@ -19,8 +19,6 @@
#include "debug.h"
#endif

#define FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW


#define CNA_ACT_DN_LARGE_PARTITION   50    /* index of the first larger partition */
#define ST_PERIODOG_FACT_Q15         29491 /* 0.9 in Q15, short-term filter factor for periodogram */
@@ -557,16 +555,6 @@ void deleteFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec )
    error
*/

static inline Word32 w_norm_llQ31_inl( Word64 L64_var1, Word16 *S_var2 ) /*Q31 - L_tmp_exp*/
{
    Word32 L_result;
    Word16 sh = W_norm( L64_var1 );
    L_result = W_extract_h( W_shl( L64_var1, sh ) );
    *S_var2 = ( L_result == 0 ) ? -32 : 32 - sh;
    return L_result;
}


Word16 ApplyFdCng_fx(
    Word16 *timeDomainInput, /* i  : pointer to time domain input Q*/
    Word16 Q,
@@ -843,18 +831,18 @@ Word16 ApplyFdCng_fx(
                    st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/
                    move16();
                    L_tmp_exp = add( L_tmp_exp, 1 );
#else  /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#else
                    {
                        Word64 W_tmp = 0;
                        FOR( j = 0; j < tmp_loop; j++ )
                        {
                            W_tmp = W_add( W_tmp, *( cngNoiseLevel + j ) ); /*Q31*/
                        }
                        L_tmp = w_norm_llQ31_inl( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
                        L_tmp = w_norm_llQ31( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
                    }
                    L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 );

                    L_tmp = Mpy_32_16_1( L_tmp, 1 ); /*Q16 - L_tmp_exp*/
                    L_tmp = L_shr( L_tmp, 15);       /*Q16 - L_tmp_exp*/

                    L_tmp = Mpy_32_16_1( L_tmp, shr( T_DIV_L_Frame[L_shl( L_mac( -28000, NORM_MDCT_FACTOR, 95 ), 1 - 15 )], 1 ) ); /*Q16,exp -7*/
                    L_tmp_exp = add( L_tmp_exp, -7 + ( 31 - 16 ) );                                                                /*->Q31, L_tmp_exp*/
@@ -862,7 +850,7 @@ Word16 ApplyFdCng_fx(
                    st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/
                    move16();
                    L_tmp_exp = add( L_tmp_exp, 1 );
#endif /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#endif
                    st->hTcxDec->conCngLevelBackgroundTrace_e = L_tmp_exp;
                    move16();
                }
@@ -901,16 +889,16 @@ Word16 ApplyFdCng_fx(
                    L_tmp_exp = add( L_tmp_exp, 31 - 16 );                                                          /*->Q31, L_tmp_exp*/

                    st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/
#else                                                                                                      /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#else
                    {
                        Word64 W_tmp = 0;
                        FOR( j = 0; j < tmp_loop; j++ )
                        {
                            W_tmp = W_add( W_tmp, *( cngNoiseLevel + j ) ); /*Q31 - L_tmp_exp*/
                        }
                        L_tmp = w_norm_llQ31_inl( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
                        L_tmp = w_norm_llQ31( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
                    }
                    L_tmp_exp = add( L_tmp_exp, *cngNoiseLevel_exp - 1 );
                    L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 );

                    L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/

@@ -919,7 +907,7 @@ Word16 ApplyFdCng_fx(


                    st->hTcxDec->conCngLevelBackgroundTrace = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/
#endif                                                                                                     /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#endif
                    move16();
                    st->hTcxDec->conCngLevelBackgroundTrace_e = L_tmp_exp;
                    move16();
@@ -958,20 +946,16 @@ Word16 ApplyFdCng_fx(

                st->cngTDLevel = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/
                move16();
#else /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#else
                {
                    Word64 W_tmp = 0;
                    FOR( j = 0; j < tmp_loop; j++ )
                    {
                        W_tmp = W_add( W_tmp, *( cngNoiseLevel + j ) ); /*Q31 - L_tmp_exp*/
                    }
#ifndef FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW
                    L_tmp = w_norm_llQ31( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
#else
                    L_tmp = w_norm_llQ31_inl( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
#endif
                }
                L_tmp_exp = add( L_tmp_exp, *cngNoiseLevel_exp - 1 );
                L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 );

                L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/

@@ -981,7 +965,7 @@ Word16 ApplyFdCng_fx(
                st->cngTDLevel = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/
                move16();

#endif /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#endif
                st->cngTDLevel_e = L_tmp_exp;
                move16();
            }
@@ -1132,16 +1116,16 @@ Word16 ApplyFdCng_fx(

                st->cngTDLevel = round_fx_o( Sqrt32( L_tmp, &L_tmp_exp ), &Overflow ); /*Q15 - L_tmp_exp*/
                move16();
#else  /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#else
                {
                    Word64 W_tmp = 0;
                    FOR( j = 0; j < tmp_loop; j++ )
                    {
                        W_tmp = W_add( W_tmp, *( cngNoiseLevel + j ) ); /*Q31 - L_tmp_exp*/
                    }
                    L_tmp = w_norm_llQ31_inl( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
                    L_tmp = w_norm_llQ31( W_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/
                }
                L_tmp_exp = add( L_tmp_exp, *cngNoiseLevel_exp - 1 );
                L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 );

                L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/

@@ -1150,7 +1134,7 @@ Word16 ApplyFdCng_fx(

                st->cngTDLevel = round_fx( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/
                move16();
#endif /* FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW */
#endif
                st->cngTDLevel_e = L_tmp_exp;
                move16();
                BREAK;