LCOV - code coverage report
Current view: top level - lib_com - bitalloc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ da9cc8ead0679b4682d329fdff98cf1616159273 Lines: 523 563 92.9 %
Date: 2025-10-13 22:24:20 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h" /* Compilation switches                   */
       7             : #include "cnst.h"    /* Common constants                       */
       8             : #include "rom_com.h" /* Static table prototypes                */
       9             : #include "prot_fx.h" /* Function prototypes                    */
      10             : 
      11       10848 : void bitalloc_fx(
      12             :     Word16 *y,              /* i  : reordered norm of sub-vectors              Q0 */
      13             :     Word16 *idx,            /* i  : reordered sub-vector indices               Q0 */
      14             :     Word16 sum,             /* i  : number of available bits                   Q0 */
      15             :     Word16 N,               /* i  : number of norms                            Q0 */
      16             :     Word16 K,               /* i  : maximum number of bits per dimension       Q0 */
      17             :     Word16 *r,              /* o  : bit-allacation vector                      Q0 */
      18             :     const Word16 *sfmsize,  /* i  : band length                                Q0 */
      19             :     const Word16 hqswb_clas /* i  : signal classification flag                 Q0 */
      20             : )
      21             : {
      22             :     Word16 i, j, k, n, m, v, im;
      23             :     Word16 diff, temp;
      24             :     Word16 fac;
      25             :     Word16 ii;
      26             : #ifndef ISSUE_1836_replace_overflow_libcom
      27             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      28             :     Flag Overflow = 0;
      29             :     move32();
      30             : #endif
      31             : #endif
      32       10848 :     Word16 SFM_thr = SFM_G1G2;
      33       10848 :     move16();
      34             : 
      35       10848 :     N = sub( N, 1 ); /* Q0 */
      36             : 
      37       10848 :     if ( EQ_16( hqswb_clas, HQ_HARMONIC ) )
      38             :     {
      39        1570 :         SFM_thr = 22; /* Q0 */
      40        1570 :         move16();
      41             :     }
      42             : 
      43       10848 :     fac = 3;
      44       10848 :     move16();
      45       10848 :     K = sub( K, 2 ); /* Q0 */
      46       10848 :     im = 1;
      47       10848 :     move16();
      48       10848 :     diff = sum; /* Q0 */
      49       10848 :     move16();
      50       10848 :     n = shr( sum, 3 ); /* Q0 */
      51      480526 :     FOR( i = 0; i < n; i++ )
      52             :     {
      53      480526 :         k = 0;
      54      480526 :         move16();
      55      480526 :         temp = y[0];
      56      480526 :         move16();
      57     6654533 :         FOR( m = 1; m < im; m++ )
      58             :         {
      59             : #ifdef ISSUE_1836_replace_overflow_libcom
      60     6174007 :             v = sub_sat( temp, y[m] ); /* Q0 */
      61             : #else
      62             :             v = sub_o( temp, y[m], &Overflow );                /* Q0 */
      63             : #endif
      64     6174007 :             temp = s_max( temp, y[m] );
      65     6174007 :             if ( v < 0 )
      66             :             {
      67      467615 :                 k = m; /* Q0 */
      68      467615 :                 move16();
      69             :             }
      70             :         }
      71             : 
      72      480526 :         IF( LT_16( temp, y[m] ) )
      73             :         {
      74      236147 :             k = m;
      75      236147 :             move16();
      76      236147 :             if ( LT_16( im, N ) )
      77             :             {
      78      235901 :                 im = add( im, 1 ); /* Q0 */
      79             :             }
      80             :         }
      81             : 
      82      480526 :         j = idx[k];
      83      480526 :         move16();
      84             : 
      85      480526 :         test();
      86      480526 :         IF( GE_16( sum, sfmsize[j] ) && LT_16( r[j], K ) )
      87             :         {
      88      476454 :             y[k] = sub( y[k], fac ); /* Q0 */
      89      476454 :             move16();
      90      476454 :             r[j] = add( r[j], 1 ); /* Q0 */
      91      476454 :             move16();
      92             : 
      93      476454 :             if ( GE_16( r[j], K ) )
      94             :             {
      95        1090 :                 y[k] = -32768;
      96        1090 :                 move16();
      97             :             }
      98      476454 :             sum = sub( sum, sfmsize[j] ); /* Q0 */
      99             :         }
     100             :         ELSE
     101             :         {
     102        4072 :             y[k] = -32768;
     103        4072 :             move16();
     104        4072 :             k = add( k, 1 );
     105        4072 :             test();
     106        4072 :             if ( EQ_16( k, im ) && LT_16( im, N ) )
     107             :             {
     108        2177 :                 im = add( im, 1 ); /* Q0 */
     109             :             }
     110             :         }
     111             : 
     112      480526 :         test();
     113      480526 :         IF( ( LT_16( sum, sfmsize[SFM_G1 - 1] ) ) || ( EQ_16( diff, sum ) ) ) /* sfmsize[SFM_G1-1] matches WID_G1, but also allows for extended BWs used in ACELP->HQ switching.  */
     114             :         {
     115             :             BREAK;
     116             :         }
     117             : 
     118      469678 :         diff = sum; /* Q0 */
     119      469678 :         move16();
     120      469678 :         v = sub( N, 1 ); /* Q0 */
     121             : 
     122      469678 :         IF( GT_16( k, v ) )
     123             :         {
     124         490 :             FOR( ii = 0; ii <= N; ii++ )
     125             :             {
     126         490 :                 IF( GT_16( y[ii], -32768 ) )
     127             :                 {
     128         234 :                     if ( LT_16( ii, N ) )
     129             :                     {
     130         234 :                         im = add( ii, 1 ); /* Q0 */
     131             :                     }
     132         234 :                     BREAK;
     133             :                 }
     134             :             }
     135             :         }
     136             :     }
     137             : 
     138             : 
     139       10848 :     IF( GE_16( sum, sfmsize[SFM_G1] ) ) /* sfmsize[SFM_G1] matches WID_G2, but also allows for extended BWs used in ACELP->HQ switching.  */
     140             :     {
     141       40870 :         FOR( i = 0; i <= N; i++ )
     142             :         {
     143       40462 :             j = idx[i]; /* Q0 */
     144       40462 :             move16();
     145       40462 :             test();
     146       40462 :             test();
     147       40462 :             IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && r[j] == 0 )
     148             :             {
     149        1090 :                 r[j] = 1;
     150        1090 :                 move16();
     151        1090 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     152        1090 :                 IF( LT_16( sum, sfmsize[SFM_G1] ) )
     153             :                 {
     154        1032 :                     BREAK;
     155             :                 }
     156             :             }
     157             :         }
     158             :     }
     159             : 
     160       10848 :     IF( GE_16( sum, sfmsize[SFM_G1] ) )
     161             :     {
     162        8582 :         FOR( i = 0; i <= N; i++ )
     163             :         {
     164        8526 :             j = idx[i];
     165        8526 :             move16();
     166        8526 :             test();
     167        8526 :             test();
     168        8526 :             IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && EQ_16( r[j], 1 ) )
     169             :             {
     170         366 :                 r[j] = 2;
     171         366 :                 move16();
     172         366 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     173         366 :                 IF( LT_16( sum, sfmsize[SFM_G1] ) )
     174             :                 {
     175         352 :                     BREAK;
     176             :                 }
     177             :             }
     178             :         }
     179             :     }
     180             : 
     181       10848 :     IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
     182             :     {
     183       93603 :         FOR( i = 0; i <= N; i++ )
     184             :         {
     185       92156 :             j = idx[i]; /* Q0 */
     186       92156 :             move16();
     187       92156 :             test();
     188       92156 :             IF( LT_16( j, SFM_G1 ) && r[j] == 0 )
     189             :             {
     190        1534 :                 r[j] = 1;
     191        1534 :                 move16();
     192        1534 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     193        1534 :                 IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
     194             :                 {
     195        1534 :                     BREAK;
     196             :                 }
     197             :             }
     198             :         }
     199             :     }
     200             : 
     201       10848 :     IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
     202             :     {
     203       35703 :         FOR( i = 0; i <= N; i++ )
     204             :         {
     205       35207 :             j = idx[i]; /* Q0 */
     206       35207 :             move16();
     207       35207 :             test();
     208       35207 :             IF( LT_16( j, SFM_G1 ) && EQ_16( r[j], 1 ) )
     209             :             {
     210         967 :                 r[j] = 2; /* Q0 */
     211         967 :                 move16();
     212         967 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     213         967 :                 IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
     214             :                 {
     215         951 :                     BREAK;
     216             :                 }
     217             :             }
     218             :         }
     219             :     }
     220             : 
     221       10848 :     return;
     222             : }
     223             : 
     224             : #define WMC_TOOL_SKIP
     225             : 
     226             : /*-------------------------------------------------------------------*
     227             :  * BitAllocF()
     228             :  *
     229             :  * Fractional bit allocation
     230             :  *-------------------------------------------------------------------*/
     231             : 
     232        1401 : Word16 BitAllocF_fx(
     233             :     Word16 *y,          /* i  : norm of sub-vectors                      :Q0  */
     234             :     Word32 bit_rate,    /* i  : bitrate                                  :Q0  */
     235             :     Word16 B,           /* i  : number of available bits                 :Q0  */
     236             :     Word16 N,           /* i  : number of sub-vectors                    :Q0  */
     237             :     Word16 *R,          /* o  : bit-allocation indicator                 :Q0  */
     238             :     Word16 *Rsubband_fx /* o  : sub-band bit-allocation vector           :Q3  */
     239             :     ,
     240             :     const Word16 hqswb_clas,   /* i  : hq swb class                             :Q0  */
     241             :     const Word16 num_env_bands /* i  : Number sub bands to be encoded for HF GNERIC :Q0  */
     242             : )
     243             : {
     244             :     Word16 fac;
     245        1401 :     Word16 i, n, Nmin, Bits, bs, low_rate = 0;
     246        1401 :     move16();
     247             : 
     248             :     Word16 m_fx;
     249             :     Word32 t_fx, B_fx;
     250             :     Word32 L_tmp1, L_tmp2, L_tmp3;
     251             :     Word16 tmp, exp1, exp2;
     252             :     Word32 Rsubband_w32_fx[NB_SFM]; /* Q15  */
     253             :     Word16 B_w16_fx;
     254             : #ifndef ISSUE_1836_replace_overflow_libcom
     255             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     256             :     Flag Overflow = 0;
     257             :     move32();
     258             : #endif
     259             : #endif
     260             : 
     261        1401 :     set32_fx( Rsubband_w32_fx, 0, NB_SFM );
     262             : 
     263        1401 :     fac = 3;
     264        1401 :     move16();
     265             : 
     266        1401 :     IF( LT_32( bit_rate, 32000 ) )
     267             :     {
     268        1401 :         bs = 2;
     269        1401 :         move16();
     270             :     }
     271             :     ELSE
     272             :     {
     273           0 :         bs = 3;
     274           0 :         move16();
     275             :     }
     276        1401 :     low_rate = 1;
     277        1401 :     move16();
     278             : 
     279        1401 :     Nmin = N; /* Q0 */
     280        1401 :     move16();
     281        1401 :     if ( GT_16( Nmin, SFM_N ) )
     282             :     {
     283        1401 :         Nmin = SFM_N; /* Q0 */
     284        1401 :         move16();
     285             :     }
     286             : 
     287             :     /* Initial bits distribution */
     288        1401 :     test();
     289        1401 :     IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     290             :     {
     291             :         /* Initial bits distribution */
     292        1281 :         L_tmp1 = 0;
     293        1281 :         move16();
     294        1281 :         m_fx = 0;
     295        1281 :         move16();
     296       35868 :         FOR( i = 0; i < num_env_bands; i++ )
     297             :         {
     298       34587 :             L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
     299             :         }
     300        1281 :         L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
     301             : 
     302        1281 :         t_fx = L_deposit_l( 0 );
     303        1281 :         n = 0;
     304        1281 :         move16();
     305        1281 :         tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); /* Q0 */
     306        1281 :         exp1 = norm_s( tmp );
     307        1281 :         tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
     308        1281 :         exp2 = norm_s( tmp );
     309        1281 :         tmp = shl( tmp, exp2 );
     310        1281 :         exp1 = add( 29, sub( exp2, exp1 ) );
     311             : 
     312       51240 :         FOR( i = 0; i < N; i++ )
     313             :         {
     314       49959 :             L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[num_env_bands - 1] ), L_tmp1 ); /* Q0 */
     315       49959 :             Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
     316       49959 :             move32(); /*Q0*/
     317       49959 :             IF( Rsubband_w32_fx[i] > 0 )
     318             :             {
     319       28312 :                 n = add( n, Nb[i] );
     320       28312 :                 Rsubband_w32_fx[i] = Mult_32_16( Rsubband_w32_fx[i], tmp );
     321       28312 :                 move32();                                                          /*exp1 - 15*/
     322       28312 :                 Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/
     323             : 
     324       28312 :                 t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/
     325             :             }
     326             :             ELSE
     327             :             {
     328       21647 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     329       21647 :                 move32();
     330             :             }
     331             :         }
     332             :     }
     333             :     ELSE
     334             :     {
     335             :         /* Initial bits distribution */
     336         120 :         L_tmp1 = 0;
     337         120 :         move16();
     338         120 :         m_fx = 0;
     339         120 :         move16();
     340        4800 :         FOR( i = 0; i < N; i++ )
     341             :         {
     342        4680 :             L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
     343             :         }
     344         120 :         L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
     345             : 
     346             : 
     347         120 :         t_fx = L_deposit_l( 0 );
     348         120 :         n = 0;
     349         120 :         move16();
     350         120 :         tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); /* Q0 */
     351         120 :         exp1 = norm_s( tmp );
     352         120 :         tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
     353         120 :         exp2 = norm_s( tmp );
     354         120 :         tmp = shl( tmp, exp2 );
     355         120 :         exp1 = add( 29, sub( exp2, exp1 ) );
     356        4800 :         FOR( i = 0; i < N; i++ )
     357             :         {
     358        4680 :             L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); /* Q0 */
     359        4680 :             Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
     360        4680 :             move32(); /*Q0*/
     361        4680 :             IF( Rsubband_w32_fx[i] > 0 )
     362             :             {
     363        3404 :                 n = add( n, Nb[i] );
     364        3404 :                 L_tmp3 = Mult_32_16( Rsubband_w32_fx[i], tmp );        /*exp1 - 15*/
     365        3404 :                 Rsubband_w32_fx[i] = L_shl( L_tmp3, sub( 30, exp1 ) ); /*Q15*/
     366        3404 :                 move32();
     367             : 
     368        3404 :                 t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q15*/
     369             :             }
     370             :             ELSE
     371             :             {
     372        1276 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     373        1276 :                 move32();
     374             :             }
     375             :         }
     376             :     }
     377             : 
     378             :     /* Distribute the remaining bits to subbands with non-zero bits */
     379        1401 :     B_fx = L_shl( B, 15 );
     380        3097 :     WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
     381             :     {
     382        1696 :         L_tmp1 = L_sub( t_fx, B_fx );
     383        1696 :         exp1 = sub( norm_l( L_tmp1 ), 1 );
     384        1696 :         exp2 = norm_s( n );
     385        1696 :         tmp = div_s( extract_h( L_shl( L_tmp1, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
     386        1696 :         m_fx = shl_sat( tmp, sub( exp2, exp1 ) );                          /*Q14*/
     387        1696 :         t_fx = L_deposit_l( 0 );
     388        1696 :         n = 0;
     389        1696 :         move16();
     390       67840 :         FOR( i = 0; i < N; i++ )
     391             :         {
     392       66144 :             IF( Rsubband_w32_fx[i] > 0 )
     393             :             {
     394       37363 :                 Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
     395       37363 :                 move32();
     396             : 
     397       37363 :                 IF( Rsubband_w32_fx[i] > 0 )
     398             :                 {
     399       36297 :                     n = add( n, Nb[i] );
     400             : 
     401       36297 :                     t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
     402             :                 }
     403             :                 ELSE
     404             :                 {
     405        1066 :                     Rsubband_w32_fx[i] = L_deposit_l( 0 );
     406        1066 :                     move32();
     407             :                 }
     408             :             }
     409             :         }
     410             :     }
     411        1401 :     Bits = B; /* Q0 */
     412        1401 :     move16();
     413             : 
     414             :     /* Impose bit-constraints to subbands with less than minimum bits*/
     415        1401 :     t_fx = L_deposit_l( 0 );
     416        1401 :     n = 0;
     417        1401 :     move16();
     418       56040 :     FOR( i = 0; i < N; i++ )
     419             :     {
     420       54639 :         IF( Rsubband_w32_fx[i] > 0 )
     421             :         {
     422       30650 :             test();
     423       30650 :             IF( ( LT_32( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) ) && ( EQ_16( low_rate, 1 ) ) )
     424             :             {
     425        6140 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     426        6140 :                 move32();
     427             :             }
     428       24510 :             ELSE IF( LE_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     429             :             {
     430        7809 :                 B = sub( B, Nb[i] );                     /* Q0 */
     431        7809 :                 Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
     432        7809 :                 move32();
     433             :             }
     434             :             ELSE
     435             :             {
     436       16701 :                 n = add( n, Nb[i] );                      /* Q0 */
     437       16701 :                 t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
     438             :             }
     439             :         }
     440             :     }
     441             : 
     442             :     /* Distribute the remaining bits to subbands with more than 1-bit per sample */
     443        3247 :     WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
     444             :     {
     445        1891 :         L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) );
     446        1891 :         L_tmp2 = L_abs( L_tmp1 );
     447             : 
     448        1891 :         IF( n > 0 )
     449             :         {
     450        1891 :             exp1 = sub( norm_l( L_tmp2 ), 1 );
     451        1891 :             exp2 = norm_s( n );
     452        1891 :             tmp = div_s( extract_h( L_shl( L_tmp2, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
     453             : #ifdef ISSUE_1836_replace_overflow_libcom
     454        1891 :             m_fx = shl_sat( tmp, sub( exp2, exp1 ) ); /*Q14*/
     455             : #else
     456             :             m_fx = shl_o( tmp, sub( exp2, exp1 ), &Overflow ); /*Q14*/
     457             : #endif
     458        1891 :             if ( L_tmp1 < 0 )
     459             :             {
     460         284 :                 m_fx = negate( m_fx );
     461             :             }
     462             : 
     463        1891 :             t_fx = L_deposit_l( 0 );
     464        1891 :             n = 0;
     465        1891 :             move16();
     466       75640 :             FOR( i = 0; i < N; i++ )
     467             :             {
     468       73749 :                 IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     469             :                 {
     470       20530 :                     Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
     471       20530 :                     move32();
     472       20530 :                     IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     473             :                     {
     474       18470 :                         n = add( n, Nb[i] ); /* Q0 */
     475             : 
     476       18470 :                         t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
     477             :                     }
     478             :                     ELSE
     479             :                     {
     480        2060 :                         B = sub( B, Nb[i] ); /* Q0 */
     481             : 
     482        2060 :                         Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
     483        2060 :                         move32();
     484             :                     }
     485             :                 }
     486             :             }
     487             :         }
     488             :         /*In case no subband has enough bits more than 1-bit per sample, take bits off the higher subbands */
     489        1891 :         IF( t_fx == 0 )
     490             :         {
     491         195 :             FOR( i = N - 1; i >= 0; i-- )
     492             :             {
     493         195 :                 IF( Rsubband_w32_fx[i] > 0 )
     494             :                 {
     495          57 :                     B = add( B, Nb[i] ); /* Q0 */
     496          57 :                     Rsubband_w32_fx[i] = L_deposit_l( 0 );
     497          57 :                     move32();
     498          57 :                     IF( B >= 0 )
     499             :                     {
     500          45 :                         BREAK;
     501             :                     }
     502             :                 }
     503             :             }
     504          45 :             BREAK;
     505             :         }
     506             :     }
     507             : 
     508             :     /* fine redistribution of over-allocated or under-allocated bits */
     509        1401 :     tmp = 0;
     510        1401 :     move16();
     511       56040 :     FOR( i = 0; i < N; i++ )
     512             :     {
     513       54639 :         Rsubband_fx[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); /* Q3 */
     514       54639 :         move16();
     515       54639 :         tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
     516             :     }
     517             : 
     518        1401 :     B = Bits;
     519        1401 :     B_w16_fx = shl( B, 3 );
     520        1401 :     IF( GT_16( tmp, B_w16_fx ) )
     521             :     {
     522           2 :         tmp = sub( tmp, B_w16_fx );
     523           2 :         FOR( i = 0; i < N; i++ )
     524             :         {
     525           2 :             IF( GE_16( Rsubband_fx[i], add( shl( Nb[i], 3 ), tmp ) ) )
     526             :             {
     527           2 :                 Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
     528           2 :                 move16();
     529           2 :                 BREAK;
     530             :             }
     531             :         }
     532             :     }
     533             :     ELSE
     534             :     {
     535        1399 :         tmp = sub( tmp, B_w16_fx );
     536        1801 :         FOR( i = 0; i < N; i++ )
     537             :         {
     538        1801 :             IF( Rsubband_fx[i] > 0 )
     539             :             {
     540        1399 :                 Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
     541        1399 :                 move16();
     542        1399 :                 BREAK;
     543             :             }
     544             :         }
     545             :     }
     546             : 
     547             :     /* Calcuate total used bits and initialize R to be used for Noise Filling */
     548        1401 :     tmp = 0;
     549        1401 :     move16();
     550       56040 :     FOR( i = 0; i < N; i++ )
     551             :     {
     552       54639 :         tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
     553       54639 :         R[i] = shr( Rsubband_fx[i], 3 );  /* Q0 */
     554       54639 :         move16();
     555             :     }
     556        1401 :     return shr( tmp, 3 );
     557             : }
     558             : /*-------------------------------------------------------------------*
     559             :  * Bit_group()
     560             :  *
     561             :  * bit allocation in group
     562             :  *-------------------------------------------------------------------*/
     563        2175 : static void Bit_group_fx(
     564             :     Word16 *y,           /* i  : norm of sub-band                              Q0*/
     565             :     Word16 start_band,   /* i  : start band indices                            Q0*/
     566             :     Word16 end_band,     /* i  : end band indices                              Q0*/
     567             :     Word16 Bits,         /* i  : number of allocation bits in group            Q0*/
     568             :     Word16 thr,          /* i  : smallest bit number for allocation in group   Q0*/
     569             :     Word32 *Rsubband_fx, /* o  : bit allocation of sub-band                    Q21*/
     570             :     Word16 *fac_fx       /* i  : weight factor for norm of sub-band            Q13*/
     571             : )
     572             : {
     573             :     Word16 i, j, k, m, y_index[16], index[16], bit_band, band_num, norm_sum;
     574             :     Word16 tmp, exp;
     575             :     Word16 factor_fx;
     576        2175 :     Word32 R_temp_fx[16], R_sum_fx = 0, R_sum_org_fx = 0, Bits_avg_fx = 0;
     577             :     Word32 L_tmp;
     578        2175 :     move32();
     579        2175 :     move32();
     580        2175 :     move32();
     581             : 
     582             :     /* initialization for bit allocation in one group*/
     583        2175 :     tmp = 6554;
     584        2175 :     move16(); /*Q15  1/5    */
     585        2175 :     if ( EQ_16( thr, 5 ) )
     586             :     {
     587         725 :         tmp = 6554;
     588         725 :         move16(); /*Q15  1/5    */
     589             :     }
     590        2175 :     if ( EQ_16( thr, 6 ) )
     591             :     {
     592         725 :         tmp = 5462;
     593         725 :         move16(); /*Q15  1/6 */
     594             :     }
     595        2175 :     if ( EQ_16( thr, 7 ) )
     596             :     {
     597         725 :         tmp = 4682;
     598         725 :         move16(); /*Q15  1/7 */
     599             :     }
     600        2175 :     bit_band = mult( tmp, Bits ); /*0+15-15=0, Q0 */
     601        2175 :     band_num = sub( end_band, start_band );
     602             : 
     603       21025 :     FOR( i = 0; i < band_num; i++ )
     604             :     {
     605       18850 :         y_index[i] = y[i + start_band]; /* Q0 */
     606       18850 :         move16();
     607       18850 :         index[i] = i;
     608       18850 :         move16();
     609             :     }
     610             : 
     611             :     /* Rearrange norm vector in decreasing order */
     612        2175 :     reordvct_fx( y_index, band_num, index );
     613             :     /* norm vector modification */
     614             : 
     615        2175 :     factor_fx = div_s( 1, band_num ); /*Q15 */
     616        2175 :     IF( GT_16( thr, 5 ) )
     617             :     {
     618        8700 :         FOR( i = 0; i < band_num; i++ )
     619             :         {
     620        7250 :             L_tmp = L_mult( i, factor_fx );              /*Q16 */
     621        7250 :             tmp = extract_h( L_shl( L_tmp, 13 ) );       /*Q13 */
     622        7250 :             tmp = sub( fac_fx[1], tmp );                 /*Q13 */
     623        7250 :             L_tmp = L_mult( y_index[i], tmp );           /*Q14 */
     624        7250 :             y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
     625        7250 :             move16();
     626             :         }
     627             :     }
     628             :     ELSE
     629             :     {
     630       12325 :         FOR( i = 0; i < band_num; i++ )
     631             :         {
     632       11600 :             L_tmp = L_mult( i, factor_fx );              /*Q16 */
     633       11600 :             tmp = extract_h( L_shl( L_tmp, 13 ) );       /*Q13 */
     634       11600 :             tmp = sub( fac_fx[0], tmp );                 /*Q13 */
     635       11600 :             L_tmp = L_mult( y_index[i], tmp );           /*Q14 */
     636       11600 :             y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
     637       11600 :             move16();
     638             :         }
     639             :     }
     640             : 
     641             :     /* bit allocation based on modified norm */
     642        2175 :     L_tmp = L_mult( band_num, 24576 );    /*Q16 */
     643        2175 :     tmp = extract_h( L_shl( L_tmp, 7 ) ); /*Q7 */
     644        2175 :     IF( GE_16( shl( bit_band, 7 ), tmp ) )
     645             :     {
     646       20221 :         FOR( j = 0; j < band_num; j++ )
     647             :         {
     648       18214 :             if ( y_index[j] < 0 )
     649             :             {
     650         148 :                 y_index[j] = 0;
     651         148 :                 move16();
     652             :             }
     653       18214 :             R_temp_fx[j] = 2097152;
     654       18214 :             move16(); /*Q21 = 1     move16(); */
     655             :         }
     656             : 
     657        2007 :         i = sub( band_num, 1 );
     658        2007 :         norm_sum = 0; /*Q0 */
     659       20221 :         FOR( k = 0; k <= i; k++ )
     660             :         {
     661       18214 :             norm_sum = add( norm_sum, y_index[k] );
     662             :         }
     663             : 
     664        4120 :         FOR( j = 0; j < band_num; j++ )
     665             :         {
     666        4120 :             IF( norm_sum == 0 )
     667             :             {
     668           0 :                 FOR( k = 0; k <= i; k++ )
     669             :                 {
     670           0 :                     R_temp_fx[k] = L_deposit_h( 0 ); /*Q21 */
     671           0 :                     move32();
     672             :                 }
     673             :             }
     674             :             ELSE
     675             :             {
     676        4120 :                 exp = norm_s( norm_sum );
     677        4120 :                 tmp = shl( norm_sum, exp );        /*Q(exp) */
     678        4120 :                 tmp = div_s( 16384, tmp );         /*Q(15+14-exp) */
     679        4120 :                 Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
     680             : 
     681       38722 :                 FOR( k = 0; k <= i; k++ )
     682             :                 {
     683       34602 :                     L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
     684       34602 :                     L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
     685             : 
     686       34602 :                     R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
     687       34602 :                     move32(); /*Q21 */
     688             :                 }
     689             :             }
     690             : 
     691        4120 :             L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
     692        4120 :             IF( LT_32( R_temp_fx[i], L_tmp ) )
     693             :             {
     694        2113 :                 R_temp_fx[i] = L_deposit_h( 0 );
     695        2113 :                 move32();
     696        2113 :                 norm_sum = sub( norm_sum, y_index[i] );
     697        2113 :                 i--;
     698             :             }
     699             :             ELSE
     700             :             {
     701        2007 :                 BREAK;
     702             :             }
     703             :         }
     704             :     }
     705             :     ELSE
     706             :     {
     707         454 :         FOR( j = 0; j < bit_band; j++ )
     708             :         {
     709         286 :             if ( y_index[j] < 0 )
     710             :             {
     711           0 :                 y_index[j] = 0;
     712           0 :                 move16();
     713             :             }
     714         286 :             R_temp_fx[j] = 2097152;
     715         286 :             move32(); /*Q21 = 1 */
     716             :         }
     717             : 
     718         518 :         FOR( j = bit_band; j < band_num; j++ )
     719             :         {
     720         350 :             R_temp_fx[j] = L_deposit_l( 0 );
     721         350 :             move32();
     722             :         }
     723             : 
     724         168 :         norm_sum = 0;
     725         168 :         move16();
     726         454 :         FOR( k = 0; k < bit_band; k++ )
     727             :         {
     728         286 :             norm_sum = add( norm_sum, y_index[k] );
     729             :         }
     730             : 
     731         168 :         i = bit_band;
     732         168 :         move16();
     733         324 :         FOR( j = 0; j < bit_band; j++ )
     734             :         {
     735         204 :             IF( norm_sum == 0 )
     736             :             {
     737           0 :                 FOR( k = 0; k < i; k++ )
     738             :                 {
     739           0 :                     R_temp_fx[k] = L_deposit_l( 0 ); /*Q21                    */
     740           0 :                     move32();
     741             :                 }
     742             :             }
     743             :             ELSE
     744             :             {
     745         204 :                 exp = norm_s( norm_sum );
     746         204 :                 tmp = shl( norm_sum, exp );        /*Q(exp) */
     747         204 :                 tmp = div_s( 16384, tmp );         /*Q(15+14-exp) */
     748         204 :                 Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
     749         746 :                 FOR( k = 0; k < i; k++ )
     750             :                 {
     751         542 :                     L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
     752         542 :                     L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
     753             : 
     754         542 :                     R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
     755         542 :                     move32(); /*Q21 */
     756             :                 }
     757             :             }
     758         204 :             R_sum_fx = 0;
     759         204 :             move32();
     760         204 :             L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
     761         648 :             FOR( k = 0; k < i; k++ )
     762             :             {
     763         492 :                 IF( LT_32( R_temp_fx[k], L_tmp ) )
     764             :                 {
     765         146 :                     FOR( m = k; m < i; m++ )
     766             :                     {
     767          98 :                         norm_sum = sub( norm_sum, y_index[m] );
     768          98 :                         R_temp_fx[m] = L_deposit_l( 0 ); /*Q21 */
     769          98 :                         move32();
     770             :                     }
     771          48 :                     i = k;
     772          48 :                     move16();
     773          48 :                     BREAK;
     774             :                 }
     775             :                 ELSE
     776             :                 {
     777         444 :                     R_sum_fx = L_add( R_sum_fx, R_temp_fx[k] ); /* Q21 */
     778             :                 }
     779             :             }
     780         204 :             IF( EQ_32( R_sum_fx, R_sum_org_fx ) )
     781             :             {
     782          48 :                 BREAK;
     783             :             }
     784             : 
     785         156 :             R_sum_org_fx = R_sum_fx;
     786         156 :             move32();
     787             :         }
     788             :     }
     789             : 
     790             :     /*  index comeback */
     791       21025 :     FOR( k = 0; k < band_num; k++ )
     792             :     {
     793       18850 :         j = index[k];
     794       18850 :         move16();
     795       18850 :         Rsubband_fx[j + start_band] = R_temp_fx[k]; /* Q21 */
     796       18850 :         move32();
     797             :     }
     798             : 
     799        2175 :     return;
     800             : }
     801             : 
     802             : /*-------------------------------------------------------------------*
     803             :  * BitAllocWB()
     804             :  *
     805             :  * WB bit allocation
     806             :  *-------------------------------------------------------------------*/
     807             : 
     808         725 : Word16 BitAllocWB_fx(                     /* o  : t                                           Q0*/
     809             :                       Word16 *y,          /* i  : norm of sub-vectors                         Q0*/
     810             :                       Word16 B,           /* i  : number of available bits                    Q0*/
     811             :                       Word16 N,           /* i  : number of sub-vectors                       Q0*/
     812             :                       Word16 *R,          /* o  : bit-allocation indicator                    Q0*/
     813             :                       Word16 *Rsubband_fx /* o  : sub-band bit-allocation vector              Q3*/
     814             : )
     815             : {
     816             :     Word16 t_fx;
     817             :     Word16 i, j, k, B1, B2, B3, B_saved;
     818             :     Word16 Rsum_fx, Rsum_sub_fx[3];
     819             :     Word32 Ravg_sub_32_fx[3], R_diff_32_fx[2];
     820             :     Word16 factor_fx[2]; /*Q13 */
     821             :     Word16 BANDS;
     822             :     Word16 tmp, exp;
     823         725 :     Word16 Rsum_sub_fx_tmp = 0; /* initialize just to avoid compiler warning */
     824         725 :     move16();
     825             :     Word32 L_tmp, L_tmp1;
     826             :     Word32 Rsubband_buf[NB_SFM];
     827             : 
     828         725 :     BANDS = N;
     829         725 :     move16();
     830         725 :     if ( GT_16( BANDS, SFM_N ) )
     831             :     {
     832           0 :         BANDS = SFM_N;
     833           0 :         move16();
     834             :     }
     835             :     /* Init Rsubband to non-zero values for bands to be allocated bits */
     836       19575 :     FOR( k = 0; k < BANDS; k++ )
     837             :     {
     838       18850 :         Rsubband_buf[k] = 2097152;
     839       18850 :         move32(); /*Q21 */
     840             :     }
     841             :     /* Calculate the norm sum and average of sub-band */
     842         725 :     Rsum_sub_fx[0] = 0;
     843         725 :     move16();
     844       12325 :     FOR( j = 0; j < SFM_G1; j++ )
     845             :     {
     846       11600 :         if ( y[j] > 0 )
     847             :         {
     848       11460 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[0], y[j] ); /*Q0 */
     849             :         }
     850       11600 :         if ( y[j] > 0 )
     851             :         {
     852       11460 :             Rsum_sub_fx[0] = Rsum_sub_fx_tmp;
     853       11460 :             move16(); /*Q0 */
     854             :         }
     855             :     }
     856         725 :     Ravg_sub_32_fx[0] = L_mult( Rsum_sub_fx[0], 2048 );
     857         725 :     move32(); /*Q16  0+15+1   //q15 1/16 =2048 */
     858             : 
     859         725 :     Rsum_sub_fx[1] = 0;
     860         725 :     move16();
     861        6525 :     FOR( j = SFM_G1; j < SFM_G1G2; j++ )
     862             :     {
     863        5800 :         if ( y[j] > 0 )
     864             :         {
     865        5560 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[1], y[j] ); /*Q0 */
     866             :         }
     867        5800 :         if ( y[j] > 0 )
     868             :         {
     869        5560 :             Rsum_sub_fx[1] = Rsum_sub_fx_tmp;
     870        5560 :             move16(); /*Q0 */
     871             :         }
     872             :     }
     873         725 :     Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16  0+15+1   //q15 1/8 =4096 */
     874         725 :     move32();
     875         725 :     Rsum_sub_fx[2] = 0;
     876         725 :     move16();
     877        2175 :     FOR( j = SFM_G1G2; j < BANDS; j++ )
     878             :     {
     879        1450 :         if ( y[j] > 0 )
     880             :         {
     881        1370 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[2], y[j] ); /*Q0 */
     882             :         }
     883        1450 :         if ( y[j] > 0 )
     884             :         {
     885        1370 :             Rsum_sub_fx[2] = Rsum_sub_fx_tmp;
     886        1370 :             move16(); /*Q0 */
     887             :         }
     888             :     }
     889         725 :     tmp = div_s( 1, BANDS - SFM_G1G2 ); /*Q15 */
     890         725 :     Ravg_sub_32_fx[2] = L_mult( Rsum_sub_fx[2], tmp );
     891         725 :     move32(); /*Q16 */
     892             : 
     893             :     /* Bit allocation for every group */
     894         725 :     tmp = add( Rsum_sub_fx[0], Rsum_sub_fx[1] );
     895         725 :     Rsum_fx = add( tmp, Rsum_sub_fx[2] ); /*Q0     */
     896             : 
     897         725 :     factor_fx[0] = 16384; /*Q13     move16(); */
     898         725 :     factor_fx[1] = 24576; /*Q13     move16(); */
     899         725 :     move16();
     900         725 :     move16();
     901             :     {
     902         725 :         R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] );
     903         725 :         move32(); /*Q16 */
     904         725 :         R_diff_32_fx[1] = L_sub( Ravg_sub_32_fx[1], Ravg_sub_32_fx[2] );
     905         725 :         move32(); /*Q16 */
     906             : 
     907         725 :         test();
     908         725 :         IF( LT_32( R_diff_32_fx[0], 393216 /* 32 in Q16 */ ) && LT_32( R_diff_32_fx[1], 245760 /* 3.75 in Q16 */ ) )
     909             :         {
     910         433 :             IF( Rsum_fx == 0 )
     911             :             {
     912           0 :                 B1 = 0;
     913           0 :                 move16();
     914           0 :                 B2 = 0;
     915           0 :                 move16();
     916           0 :                 B3 = 0;
     917           0 :                 move16();
     918             :             }
     919             :             ELSE
     920             :             {
     921         433 :                 exp = norm_s( Rsum_fx );
     922         433 :                 tmp = shl( Rsum_fx, exp );                       /*Q(exp) */
     923         433 :                 tmp = div_s( 16384, tmp );                       /*Q(15+14-exp) */
     924         433 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[0] );            /*Q1 */
     925         433 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     926         433 :                 B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     927         433 :                 test();
     928         433 :                 if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
     929             :                 {
     930           6 :                     B1 = add( B1, 1 );
     931             :                 }
     932         433 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[1] );            /*Q1 */
     933         433 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     934         433 :                 B2 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     935         433 :                 test();
     936         433 :                 if ( GT_32( L_tmp1, L_mult( B2, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B2, 1 ), Rsum_fx ) ) )
     937             :                 {
     938           8 :                     B2 = add( B2, 1 );
     939             :                 }
     940         433 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[2] );            /*Q1 */
     941         433 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     942         433 :                 B3 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     943         433 :                 test();
     944         433 :                 if ( GT_32( L_tmp1, L_mult( B3, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B3, 1 ), Rsum_fx ) ) )
     945             :                 {
     946           6 :                     B3 = add( B3, 1 );
     947             :                 }
     948             :             }
     949         433 :             IF( GT_32( Ravg_sub_32_fx[2], 786432 /* 12 in Q16 */ ) )
     950             :             {
     951         170 :                 B_saved = 0;
     952         170 :                 move16();
     953         170 :                 IF( GT_16( B1, 288 ) )
     954             :                 {
     955          28 :                     B_saved = sub( B1, 288 ); /* Q0 */
     956          28 :                     B1 = 288;
     957          28 :                     move16();
     958             :                 }
     959             : 
     960         170 :                 IF( GT_16( B2, 256 ) )
     961             :                 {
     962           0 :                     tmp = sub( B2, 256 );          /* Q0 */
     963           0 :                     B_saved = add( B_saved, tmp ); /* Q0 */
     964           0 :                     B2 = 256;
     965           0 :                     move16();
     966             :                 }
     967             : 
     968         170 :                 IF( GT_16( B3, 96 ) )
     969             :                 {
     970           0 :                     tmp = sub( B3, 96 );           /* Q0 */
     971           0 :                     B_saved = add( B_saved, tmp ); /* Q0 */
     972           0 :                     B3 = 96;
     973           0 :                     move16();
     974             :                 }
     975             : 
     976         170 :                 IF( B_saved > 0 )
     977             :                 {
     978          28 :                     IF( EQ_16( B1, 288 ) )
     979             :                     {
     980          28 :                         tmp = shr( B_saved, 1 ); /* Q0 */
     981          28 :                         B2 = add( B2, tmp );     /* Q0 */
     982          28 :                         tmp = sub( B, B1 );      /* Q0 */
     983          28 :                         B3 = sub( tmp, B2 );     /* Q0 */
     984             :                     }
     985             :                     ELSE
     986             :                     {
     987           0 :                         tmp = shr( B_saved, 1 ); /* Q0 */
     988           0 :                         B1 = add( B1, tmp );     /* Q0 */
     989           0 :                         IF( EQ_16( B2, 256 ) )
     990             :                         {
     991           0 :                             tmp = sub( B, B1 );  /* Q0 */
     992           0 :                             B3 = sub( tmp, B2 ); /* Q0 */
     993             :                         }
     994             :                         ELSE
     995             :                         {
     996           0 :                             tmp = sub( B, B1 );  /* Q0 */
     997           0 :                             B2 = sub( tmp, B3 ); /* Q0 */
     998             :                         }
     999             :                     }
    1000             :                 }
    1001             :             }
    1002             : 
    1003         433 :             factor_fx[0] = 16384;
    1004         433 :             move16(); /*Q13 */
    1005         433 :             factor_fx[1] = 12288;
    1006         433 :             move16(); /*Q13 */
    1007             :         }
    1008             :         ELSE
    1009             :         {
    1010         292 :             IF( Rsum_fx == 0 )
    1011             :             {
    1012           0 :                 B1 = 0;
    1013           0 :                 move16();
    1014           0 :                 B2 = 0;
    1015           0 :                 move16();
    1016           0 :                 B3 = B;
    1017           0 :                 move16();
    1018             :             }
    1019             :             ELSE
    1020             :             {
    1021         292 :                 exp = norm_s( Rsum_fx );
    1022         292 :                 tmp = shl( Rsum_fx, exp );                       /*Q(exp) */
    1023         292 :                 tmp = div_s( 16384, tmp );                       /*Q(15+14-exp) */
    1024         292 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[0] );            /*Q1 */
    1025         292 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
    1026         292 :                 B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
    1027         292 :                 test();
    1028         292 :                 if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
    1029             :                 {
    1030           2 :                     B1 = add( B1, 1 ); /* Q0 */
    1031             :                 }
    1032         292 :                 L_tmp1 = Mult_32_16( 1975684956, shl( B, 5 ) );          /*Q(31+5-15=21) */
    1033         292 :                 L_tmp1 = Mult_32_16( L_tmp1, shl( Rsum_sub_fx[1], 7 ) ); /*Q(21+7-15=13) */
    1034         292 :                 L_tmp = Mult_32_16( L_tmp1, tmp );                       /*Q(27-exp) */
    1035         292 :                 B2 = extract_h( L_shl( L_tmp, sub( exp, 11 ) ) );        /*Q0 */
    1036         292 :                 test();
    1037         292 :                 if ( GT_32( L_tmp1, L_shl( L_mult( B2, Rsum_fx ), 12 ) ) && GE_32( L_add( L_tmp1, 2 ), L_shl( L_mult( add( B2, 1 ), Rsum_fx ), 12 ) ) )
    1038             :                 {
    1039           0 :                     B2 = add( B2, 1 );
    1040             :                 }
    1041         292 :                 tmp = sub( B, B1 );  /* Q0 */
    1042         292 :                 B3 = sub( tmp, B2 ); /* Q0 */
    1043             :             }
    1044             :         }
    1045             :     }
    1046             : 
    1047         725 :     IF( LT_16( Rsum_sub_fx[2], 3 ) )
    1048             :     {
    1049          60 :         B2 = add( B2, B3 ); /* Q0 */
    1050          60 :         B3 = 0;
    1051          60 :         move16();
    1052             :     }
    1053             : 
    1054             :     /* Bit allocation in group */
    1055         725 :     Bit_group_fx( y, 0, SFM_G1, B1, 5, Rsubband_buf, factor_fx );
    1056         725 :     Bit_group_fx( y, SFM_G1, SFM_G1G2, B2, 6, Rsubband_buf, factor_fx );
    1057         725 :     Bit_group_fx( y, SFM_G1G2, BANDS, B3, 7, Rsubband_buf, factor_fx );
    1058       19575 :     FOR( i = 0; i < BANDS; i++ )
    1059             :     {
    1060       18850 :         Rsubband_fx[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); /* Q3 */
    1061       18850 :         move16();
    1062             :     }
    1063             : 
    1064             :     /* Calcuate total used bits and initialize R to be used for Noise Filling */
    1065         725 :     L_tmp = L_deposit_l( 0 );
    1066       19575 :     FOR( i = 0; i < N; i++ )
    1067             :     {
    1068       18850 :         L_tmp = L_add( L_tmp, Rsubband_buf[i] );         /*Q21 */
    1069       18850 :         R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */
    1070       18850 :         move16();
    1071             :     }
    1072         725 :     t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */
    1073             : 
    1074         725 :     return (Word16) t_fx;
    1075             : }
    1076             : 
    1077             : #undef WMC_TOOL_SKIP

Generated by: LCOV version 1.14