Loading lib_com/options.h +0 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,6 @@ /* #################### Start BASOP optimization switches ############################ */ #define NONBE_OPT_2193_EIG2X2 /* Dolby: Issue 2193, optimize eig2x2_fx. */ /* #################### End BASOP optimization switches ############################ */ Loading lib_rend/ivas_dirac_dec_binaural_functions_fx.c +0 −371 Original line number Diff line number Diff line Loading @@ -3463,7 +3463,6 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( return; } #ifdef NONBE_OPT_2193_EIG2X2 static Word32 eig2x2_div_fx( Word32 num, Word32 den ); static Word32 eig2x2_div_fx( Word32 num, Word32 den ) Loading @@ -3474,7 +3473,6 @@ static Word32 eig2x2_div_fx( Word32 num, Word32 den ) } return div_w_newton( num, den ); } #endif static void eig2x2_fx( const Word32 E1_fx, /*q_E*/ Loading @@ -3489,7 +3487,6 @@ static void eig2x2_fx( Word32 D_fx[BINAURAL_CHANNELS], /*q_D*/ Word16 *q_D ) { #ifdef NONBE_OPT_2193_EIG2X2 Word32 pm_fx, add_fx; Word32 tmp1, tmp2, e1, e2, c_re, c_im, c0_im, c1_im; Word32 s0_fx, s1_fx, nval0_fx, nval1_fx; Loading Loading @@ -3801,374 +3798,6 @@ static void eig2x2_fx( move32(); Uim_fx[i11][1] = Mpy_32_32( c1_im, nval1_fx ); move32(); #else Word16 chA, chB, ch; Word32 s_fx, normVal_fx, crossSquare_fx, a_fx, pm_fx, add_fx; Word32 tmp1, tmp2, tmp3, e1, e2, c_re, c_im; Word16 q_crossSquare, q_tmp1, q_tmp2, exp_tmp3, exp, q_e, q_c, q_U_1, q_U_2; Word32 epsilon_mant = 1180591621; Word16 epsilon_exp = -39; move32(); move16(); pm_fx = 0; move32(); add_fx = 0; move32(); q_tmp2 = 0; move16(); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { Ure_fx[chA][chB] = 0; move32(); Uim_fx[chA][chB] = 0; move32(); } } exp = sub( get_min_scalefactor( Cre_fx, Cim_fx ), 2 ); c_re = L_shl( Cre_fx, exp ); c_im = L_shl( Cim_fx, exp ); q_c = add( q_C, exp ); exp = sub( get_min_scalefactor( E1_fx, E2_fx ), 2 ); e1 = L_shl( E1_fx, exp ); e2 = L_shl( E2_fx, exp ); q_e = add( q_E, exp ); /*crossSquare_fx = (c_re * c_re) + (c_im * c_im) a_fx = (e1 + e2) * (e1 + e2) - 4.0f * ((e1 * e2) - crossSquare_fx) = (e1 - e2)^2 + 4 * crossSquare_fx pm_fx = 0.5f * sqrtf(max(0.0f, a_fx)) add_fx = 0.5f * (e1 + e2)*/ IF( L_and( c_re == 0, c_im == 0 ) ) { /* if c_re = 0 and c_im = 0, then crossSquare_fx = (c_re * c_re) + (c_im * c_im) = 0 a_fx = (E1 - E2)^2 pm_fx = 0.5 * sqrt(max(0, a_fx)) = 0.5 * max(0, (e1 - e2)) */ crossSquare_fx = 0; move32(); q_crossSquare = Q31; move16(); pm_fx = L_shr( L_max( 0, L_abs( L_sub( e1, e2 ) ) ), 1 ); q_tmp2 = q_e; move16(); } ELSE { crossSquare_fx = Madd_32_32( Mpy_32_32( c_re, c_re ), c_im, c_im ); q_crossSquare = sub( add( q_c, q_c ), 31 ); IF( EQ_32( e1, e2 ) ) { /* if e1 - e2 = 0, then a_fx = 4 * crossSquare_fx pm_fx = 0.5 * sqrt(max(0, 4 * crossSquare_fx)) = sqrt(0, crossSquare_fx)*/ test(); test(); IF( EQ_32( c_re, 0 ) || LT_32( L_abs( c_re ), ONE_IN_Q15 ) ) { /* if c_re = 0, then crossSquare_fx = c_im^2 => pm_fx = max(0, c_im) */ pm_fx = L_max( 0, L_abs( c_im ) ); q_tmp2 = q_c; move16(); } ELSE IF( c_im == 0 || LT_32( L_abs( c_im ), ONE_IN_Q15 ) ) { /* if c_im = 0, then crossSquare_fx = c_re^2 => pm_fx = max(0, c_re) */ pm_fx = L_max( 0, L_abs( c_re ) ); q_tmp2 = q_c; move16(); } ELSE { exp = sub( 31, q_crossSquare ); pm_fx = Sqrt32( L_max( 0, crossSquare_fx ), &exp ); q_tmp2 = sub( 31, exp ); } } ELSE { /* if e1, e2 >> c_re, c_im then (e1 - e2)^2 ~ (e1 - e2)^2 + 4 * crossSquare_fx a_fx = (E1 - E2)^2 pm_fx = 0.5 * sqrt(max(0, a_fx)) = 0.5 * max(0, (e1 - e2)) */ IF( GT_16( sub( q_c, q_e ), Q15 ) ) { pm_fx = L_shr( L_max( 0, L_abs( L_sub( e1, e2 ) ) ), 1 ); q_tmp2 = q_e; move16(); } ELSE { tmp2 = crossSquare_fx; move32(); q_tmp2 = sub( q_crossSquare, 2 ); // crossSquare_fx = 4 * crossSquare_fx; tmp1 = Mpy_32_32( L_sub( e1, e2 ), L_sub( e1, e2 ) ); q_tmp1 = sub( add( q_e, q_e ), 31 ); a_fx = BASOP_Util_Add_Mant32Exp( tmp1, sub( 31, q_tmp1 ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); // (E1 - E2)^2 + 4 * crossSquare_fx q_tmp2 = sub( 31, q_tmp2 ); exp = sub( 31, q_tmp2 ); pm_fx = Sqrt32( L_max( 0, L_sub( a_fx, 1 ) ), &exp ); pm_fx = L_shr( pm_fx, 1 ); q_tmp2 = sub( 31, exp ); } } } // add_fx = 0.5 * (e1 + e2) add_fx = L_shr( L_add( e1, e2 ), 1 ); q_tmp1 = q_e; move16(); IF( LT_16( q_tmp1, q_tmp2 ) ) { D_fx[0] = L_add( L_shr( add_fx, 1 ), L_shr( pm_fx, add( sub( q_tmp2, q_tmp1 ), 1 ) ) ); move32(); D_fx[1] = L_max( 0, L_sub( L_shr( add_fx, 1 ), L_shr( pm_fx, add( sub( q_tmp2, q_tmp1 ), 1 ) ) ) ); move32(); *q_D = sub( q_tmp1, 1 ); move16(); } ELSE { D_fx[0] = L_add( L_shr( add_fx, add( sub( q_tmp1, q_tmp2 ), 1 ) ), L_shr( pm_fx, 1 ) ); move32(); D_fx[1] = L_max( 0, L_sub( L_shr( add_fx, add( sub( q_tmp1, q_tmp2 ), 1 ) ), L_shr( pm_fx, 1 ) ) ); move32(); *q_D = sub( q_tmp2, 1 ); move16(); } /* Numeric case, when input is practically zeros */ // IF( D_fx[0] < EPSILON_FX ) IF( LT_32( L_shl_sat( D_fx[0], sub( sub( 31, *q_D ), EPSILON_EXP ) ), EPSILON_MANT ) ) { Ure_fx[0][0] = ONE_IN_Q31; move32(); Ure_fx[1][1] = ONE_IN_Q31; move32(); *q_U = Q31; move16(); return; } /* Numeric case, when input is near an identity matrix with a gain */ tmp1 = Mpy_32_32( INV_1000_Q31, add_fx ); IF( LT_16( q_tmp1, q_tmp2 ) ) { IF( LT_32( L_shr( pm_fx, sub( q_tmp2, q_tmp1 ) ), tmp1 ) ) { Ure_fx[0][0] = ONE_IN_Q30; move32(); Ure_fx[1][1] = ONE_IN_Q30; move32(); *q_U = Q30; move16(); return; } } ELSE { IF( LT_32( pm_fx, L_shr( tmp1, sub( q_tmp1, q_tmp2 ) ) ) ) { Ure_fx[0][0] = ONE_IN_Q30; move32(); Ure_fx[1][1] = ONE_IN_Q30; move32(); *q_U = Q30; move16(); return; } } q_U_1 = 0; q_U_2 = 0; move16(); move16(); /* Eigenvectors */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { Word16 q_diff = sub( q_e, *q_D ); IF( q_diff > 0 ) { tmp1 = L_sub( D_fx[ch], L_shr( e1, q_diff ) ); tmp2 = L_sub( D_fx[ch], L_shr( e2, q_diff ) ); q_tmp1 = *q_D; move16(); } ELSE { tmp1 = L_sub( L_shl( D_fx[ch], q_diff ), e1 ); tmp2 = L_sub( L_shl( D_fx[ch], q_diff ), e2 ); q_tmp1 = q_e; move16(); } IF( GT_32( L_abs( tmp2 ), L_abs( tmp1 ) ) ) { s_fx = tmp2; move32(); exp = sub( norm_l( s_fx ), 1 ); tmp2 = Mpy_32_32( s_fx, s_fx ); q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); q_tmp2 = sub( 31, q_tmp2 ); tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); q_diff = sub( q_c, q_tmp1 ); IF( q_diff > 0 ) { c_re = L_shr( c_re, q_diff ); c_im = L_shr( c_im, q_diff ); q_c = q_tmp1; move16(); } ELSE { s_fx = L_shl( s_fx, q_diff ); q_tmp1 = q_c; move16(); } Ure_fx[0][ch] = Mpy_32_32( s_fx, normVal_fx ); move32(); Ure_fx[1][ch] = Mpy_32_32( c_re, normVal_fx ); move32(); Uim_fx[1][ch] = Mpy_32_32( c_im, normVal_fx ); move32(); q_U_1 = sub( add( q_tmp1, q_tmp2 ), 31 ); IF( q_U_2 != 0 ) { q_diff = sub( q_U_2, q_U_1 ); IF( q_diff > 0 ) { Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], q_diff ); Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], q_diff ); Uim_fx[0][ch - 1] = L_shr( Uim_fx[0][ch - 1], q_diff ); q_U_2 = q_U_1; move32(); move32(); move32(); move16(); } ELSE IF( GT_16( q_U_1, q_U_2 ) ) { Ure_fx[1][ch] = L_shl( Ure_fx[1][ch], q_diff ); Ure_fx[0][ch] = L_shl( Ure_fx[0][ch], q_diff ); Uim_fx[1][ch] = L_shl( Uim_fx[1][ch], q_diff ); q_U_1 = q_U_2; move32(); move32(); move32(); move16(); } } q_U_2 = q_U_1; move16(); } ELSE { s_fx = tmp1; move32(); exp = sub( norm_l( s_fx ), 1 ); tmp2 = Mpy_32_32( s_fx, s_fx ); q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); q_tmp2 = sub( 31, q_tmp2 ); tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); q_diff = sub( q_c, q_tmp1 ); IF( q_diff > 0 ) { c_re = L_shr( c_re, q_diff ); c_im = L_shr( c_im, q_diff ); q_c = q_tmp1; move16(); } ELSE { s_fx = L_shl( s_fx, q_diff ); q_tmp1 = q_c; move16(); } Ure_fx[1][ch] = Mpy_32_32( s_fx, normVal_fx ); move32(); Ure_fx[0][ch] = Mpy_32_32( c_re, normVal_fx ); move32(); Uim_fx[0][ch] = Mpy_32_32( L_negate( c_im ), normVal_fx ); move32(); q_U_2 = sub( add( q_tmp1, q_tmp2 ), 31 ); IF( q_U_1 != 0 ) { q_diff = sub( q_U_2, q_U_1 ); IF( q_diff > 0 ) { Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], q_diff ); Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], q_diff ); Uim_fx[0][ch] = L_shr( Uim_fx[0][ch], q_diff ); q_U_2 = q_U_1; move32(); move32(); move32(); move16(); } ELSE IF( GT_16( q_U_1, q_U_2 ) ) { Ure_fx[1][ch - 1] = L_shl( Ure_fx[1][ch - 1], q_diff ); Ure_fx[0][ch - 1] = L_shl( Ure_fx[0][ch - 1], q_diff ); Uim_fx[1][ch - 1] = L_shl( Uim_fx[1][ch - 1], q_diff ); q_U_1 = q_U_2; move32(); move32(); move32(); move16(); } } q_U_1 = q_U_2; move16(); } } if ( q_U_1 != 0 ) { *q_U = q_U_1; move16(); } if ( q_U_1 == 0 ) { *q_U = q_U_2; move16(); } #endif return; } Loading Loading
lib_com/options.h +0 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,6 @@ /* #################### Start BASOP optimization switches ############################ */ #define NONBE_OPT_2193_EIG2X2 /* Dolby: Issue 2193, optimize eig2x2_fx. */ /* #################### End BASOP optimization switches ############################ */ Loading
lib_rend/ivas_dirac_dec_binaural_functions_fx.c +0 −371 Original line number Diff line number Diff line Loading @@ -3463,7 +3463,6 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( return; } #ifdef NONBE_OPT_2193_EIG2X2 static Word32 eig2x2_div_fx( Word32 num, Word32 den ); static Word32 eig2x2_div_fx( Word32 num, Word32 den ) Loading @@ -3474,7 +3473,6 @@ static Word32 eig2x2_div_fx( Word32 num, Word32 den ) } return div_w_newton( num, den ); } #endif static void eig2x2_fx( const Word32 E1_fx, /*q_E*/ Loading @@ -3489,7 +3487,6 @@ static void eig2x2_fx( Word32 D_fx[BINAURAL_CHANNELS], /*q_D*/ Word16 *q_D ) { #ifdef NONBE_OPT_2193_EIG2X2 Word32 pm_fx, add_fx; Word32 tmp1, tmp2, e1, e2, c_re, c_im, c0_im, c1_im; Word32 s0_fx, s1_fx, nval0_fx, nval1_fx; Loading Loading @@ -3801,374 +3798,6 @@ static void eig2x2_fx( move32(); Uim_fx[i11][1] = Mpy_32_32( c1_im, nval1_fx ); move32(); #else Word16 chA, chB, ch; Word32 s_fx, normVal_fx, crossSquare_fx, a_fx, pm_fx, add_fx; Word32 tmp1, tmp2, tmp3, e1, e2, c_re, c_im; Word16 q_crossSquare, q_tmp1, q_tmp2, exp_tmp3, exp, q_e, q_c, q_U_1, q_U_2; Word32 epsilon_mant = 1180591621; Word16 epsilon_exp = -39; move32(); move16(); pm_fx = 0; move32(); add_fx = 0; move32(); q_tmp2 = 0; move16(); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { Ure_fx[chA][chB] = 0; move32(); Uim_fx[chA][chB] = 0; move32(); } } exp = sub( get_min_scalefactor( Cre_fx, Cim_fx ), 2 ); c_re = L_shl( Cre_fx, exp ); c_im = L_shl( Cim_fx, exp ); q_c = add( q_C, exp ); exp = sub( get_min_scalefactor( E1_fx, E2_fx ), 2 ); e1 = L_shl( E1_fx, exp ); e2 = L_shl( E2_fx, exp ); q_e = add( q_E, exp ); /*crossSquare_fx = (c_re * c_re) + (c_im * c_im) a_fx = (e1 + e2) * (e1 + e2) - 4.0f * ((e1 * e2) - crossSquare_fx) = (e1 - e2)^2 + 4 * crossSquare_fx pm_fx = 0.5f * sqrtf(max(0.0f, a_fx)) add_fx = 0.5f * (e1 + e2)*/ IF( L_and( c_re == 0, c_im == 0 ) ) { /* if c_re = 0 and c_im = 0, then crossSquare_fx = (c_re * c_re) + (c_im * c_im) = 0 a_fx = (E1 - E2)^2 pm_fx = 0.5 * sqrt(max(0, a_fx)) = 0.5 * max(0, (e1 - e2)) */ crossSquare_fx = 0; move32(); q_crossSquare = Q31; move16(); pm_fx = L_shr( L_max( 0, L_abs( L_sub( e1, e2 ) ) ), 1 ); q_tmp2 = q_e; move16(); } ELSE { crossSquare_fx = Madd_32_32( Mpy_32_32( c_re, c_re ), c_im, c_im ); q_crossSquare = sub( add( q_c, q_c ), 31 ); IF( EQ_32( e1, e2 ) ) { /* if e1 - e2 = 0, then a_fx = 4 * crossSquare_fx pm_fx = 0.5 * sqrt(max(0, 4 * crossSquare_fx)) = sqrt(0, crossSquare_fx)*/ test(); test(); IF( EQ_32( c_re, 0 ) || LT_32( L_abs( c_re ), ONE_IN_Q15 ) ) { /* if c_re = 0, then crossSquare_fx = c_im^2 => pm_fx = max(0, c_im) */ pm_fx = L_max( 0, L_abs( c_im ) ); q_tmp2 = q_c; move16(); } ELSE IF( c_im == 0 || LT_32( L_abs( c_im ), ONE_IN_Q15 ) ) { /* if c_im = 0, then crossSquare_fx = c_re^2 => pm_fx = max(0, c_re) */ pm_fx = L_max( 0, L_abs( c_re ) ); q_tmp2 = q_c; move16(); } ELSE { exp = sub( 31, q_crossSquare ); pm_fx = Sqrt32( L_max( 0, crossSquare_fx ), &exp ); q_tmp2 = sub( 31, exp ); } } ELSE { /* if e1, e2 >> c_re, c_im then (e1 - e2)^2 ~ (e1 - e2)^2 + 4 * crossSquare_fx a_fx = (E1 - E2)^2 pm_fx = 0.5 * sqrt(max(0, a_fx)) = 0.5 * max(0, (e1 - e2)) */ IF( GT_16( sub( q_c, q_e ), Q15 ) ) { pm_fx = L_shr( L_max( 0, L_abs( L_sub( e1, e2 ) ) ), 1 ); q_tmp2 = q_e; move16(); } ELSE { tmp2 = crossSquare_fx; move32(); q_tmp2 = sub( q_crossSquare, 2 ); // crossSquare_fx = 4 * crossSquare_fx; tmp1 = Mpy_32_32( L_sub( e1, e2 ), L_sub( e1, e2 ) ); q_tmp1 = sub( add( q_e, q_e ), 31 ); a_fx = BASOP_Util_Add_Mant32Exp( tmp1, sub( 31, q_tmp1 ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); // (E1 - E2)^2 + 4 * crossSquare_fx q_tmp2 = sub( 31, q_tmp2 ); exp = sub( 31, q_tmp2 ); pm_fx = Sqrt32( L_max( 0, L_sub( a_fx, 1 ) ), &exp ); pm_fx = L_shr( pm_fx, 1 ); q_tmp2 = sub( 31, exp ); } } } // add_fx = 0.5 * (e1 + e2) add_fx = L_shr( L_add( e1, e2 ), 1 ); q_tmp1 = q_e; move16(); IF( LT_16( q_tmp1, q_tmp2 ) ) { D_fx[0] = L_add( L_shr( add_fx, 1 ), L_shr( pm_fx, add( sub( q_tmp2, q_tmp1 ), 1 ) ) ); move32(); D_fx[1] = L_max( 0, L_sub( L_shr( add_fx, 1 ), L_shr( pm_fx, add( sub( q_tmp2, q_tmp1 ), 1 ) ) ) ); move32(); *q_D = sub( q_tmp1, 1 ); move16(); } ELSE { D_fx[0] = L_add( L_shr( add_fx, add( sub( q_tmp1, q_tmp2 ), 1 ) ), L_shr( pm_fx, 1 ) ); move32(); D_fx[1] = L_max( 0, L_sub( L_shr( add_fx, add( sub( q_tmp1, q_tmp2 ), 1 ) ), L_shr( pm_fx, 1 ) ) ); move32(); *q_D = sub( q_tmp2, 1 ); move16(); } /* Numeric case, when input is practically zeros */ // IF( D_fx[0] < EPSILON_FX ) IF( LT_32( L_shl_sat( D_fx[0], sub( sub( 31, *q_D ), EPSILON_EXP ) ), EPSILON_MANT ) ) { Ure_fx[0][0] = ONE_IN_Q31; move32(); Ure_fx[1][1] = ONE_IN_Q31; move32(); *q_U = Q31; move16(); return; } /* Numeric case, when input is near an identity matrix with a gain */ tmp1 = Mpy_32_32( INV_1000_Q31, add_fx ); IF( LT_16( q_tmp1, q_tmp2 ) ) { IF( LT_32( L_shr( pm_fx, sub( q_tmp2, q_tmp1 ) ), tmp1 ) ) { Ure_fx[0][0] = ONE_IN_Q30; move32(); Ure_fx[1][1] = ONE_IN_Q30; move32(); *q_U = Q30; move16(); return; } } ELSE { IF( LT_32( pm_fx, L_shr( tmp1, sub( q_tmp1, q_tmp2 ) ) ) ) { Ure_fx[0][0] = ONE_IN_Q30; move32(); Ure_fx[1][1] = ONE_IN_Q30; move32(); *q_U = Q30; move16(); return; } } q_U_1 = 0; q_U_2 = 0; move16(); move16(); /* Eigenvectors */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { Word16 q_diff = sub( q_e, *q_D ); IF( q_diff > 0 ) { tmp1 = L_sub( D_fx[ch], L_shr( e1, q_diff ) ); tmp2 = L_sub( D_fx[ch], L_shr( e2, q_diff ) ); q_tmp1 = *q_D; move16(); } ELSE { tmp1 = L_sub( L_shl( D_fx[ch], q_diff ), e1 ); tmp2 = L_sub( L_shl( D_fx[ch], q_diff ), e2 ); q_tmp1 = q_e; move16(); } IF( GT_32( L_abs( tmp2 ), L_abs( tmp1 ) ) ) { s_fx = tmp2; move32(); exp = sub( norm_l( s_fx ), 1 ); tmp2 = Mpy_32_32( s_fx, s_fx ); q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); q_tmp2 = sub( 31, q_tmp2 ); tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); q_diff = sub( q_c, q_tmp1 ); IF( q_diff > 0 ) { c_re = L_shr( c_re, q_diff ); c_im = L_shr( c_im, q_diff ); q_c = q_tmp1; move16(); } ELSE { s_fx = L_shl( s_fx, q_diff ); q_tmp1 = q_c; move16(); } Ure_fx[0][ch] = Mpy_32_32( s_fx, normVal_fx ); move32(); Ure_fx[1][ch] = Mpy_32_32( c_re, normVal_fx ); move32(); Uim_fx[1][ch] = Mpy_32_32( c_im, normVal_fx ); move32(); q_U_1 = sub( add( q_tmp1, q_tmp2 ), 31 ); IF( q_U_2 != 0 ) { q_diff = sub( q_U_2, q_U_1 ); IF( q_diff > 0 ) { Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], q_diff ); Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], q_diff ); Uim_fx[0][ch - 1] = L_shr( Uim_fx[0][ch - 1], q_diff ); q_U_2 = q_U_1; move32(); move32(); move32(); move16(); } ELSE IF( GT_16( q_U_1, q_U_2 ) ) { Ure_fx[1][ch] = L_shl( Ure_fx[1][ch], q_diff ); Ure_fx[0][ch] = L_shl( Ure_fx[0][ch], q_diff ); Uim_fx[1][ch] = L_shl( Uim_fx[1][ch], q_diff ); q_U_1 = q_U_2; move32(); move32(); move32(); move16(); } } q_U_2 = q_U_1; move16(); } ELSE { s_fx = tmp1; move32(); exp = sub( norm_l( s_fx ), 1 ); tmp2 = Mpy_32_32( s_fx, s_fx ); q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); q_tmp2 = sub( 31, q_tmp2 ); tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); q_diff = sub( q_c, q_tmp1 ); IF( q_diff > 0 ) { c_re = L_shr( c_re, q_diff ); c_im = L_shr( c_im, q_diff ); q_c = q_tmp1; move16(); } ELSE { s_fx = L_shl( s_fx, q_diff ); q_tmp1 = q_c; move16(); } Ure_fx[1][ch] = Mpy_32_32( s_fx, normVal_fx ); move32(); Ure_fx[0][ch] = Mpy_32_32( c_re, normVal_fx ); move32(); Uim_fx[0][ch] = Mpy_32_32( L_negate( c_im ), normVal_fx ); move32(); q_U_2 = sub( add( q_tmp1, q_tmp2 ), 31 ); IF( q_U_1 != 0 ) { q_diff = sub( q_U_2, q_U_1 ); IF( q_diff > 0 ) { Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], q_diff ); Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], q_diff ); Uim_fx[0][ch] = L_shr( Uim_fx[0][ch], q_diff ); q_U_2 = q_U_1; move32(); move32(); move32(); move16(); } ELSE IF( GT_16( q_U_1, q_U_2 ) ) { Ure_fx[1][ch - 1] = L_shl( Ure_fx[1][ch - 1], q_diff ); Ure_fx[0][ch - 1] = L_shl( Ure_fx[0][ch - 1], q_diff ); Uim_fx[1][ch - 1] = L_shl( Uim_fx[1][ch - 1], q_diff ); q_U_1 = q_U_2; move32(); move32(); move32(); move16(); } } q_U_1 = q_U_2; move16(); } } if ( q_U_1 != 0 ) { *q_U = q_U_1; move16(); } if ( q_U_1 == 0 ) { *q_U = q_U_2; move16(); } #endif return; } Loading