LCOV - code coverage report
Current view: top level - lib_com - bitalloc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 519 563 92.2 %
Date: 2025-08-23 01:22:27 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        5303 : 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        5303 :     Word16 SFM_thr = SFM_G1G2;
      33        5303 :     move16();
      34             : 
      35        5303 :     N = sub( N, 1 ); /* Q0 */
      36             : 
      37        5303 :     if ( EQ_16( hqswb_clas, HQ_HARMONIC ) )
      38             :     {
      39         752 :         SFM_thr = 22; /* Q0 */
      40         752 :         move16();
      41             :     }
      42             : 
      43        5303 :     fac = 3;
      44        5303 :     move16();
      45        5303 :     K = sub( K, 2 ); /* Q0 */
      46        5303 :     im = 1;
      47        5303 :     move16();
      48        5303 :     diff = sum; /* Q0 */
      49        5303 :     move16();
      50        5303 :     n = shr( sum, 3 ); /* Q0 */
      51      234204 :     FOR( i = 0; i < n; i++ )
      52             :     {
      53      234204 :         k = 0;
      54      234204 :         move16();
      55      234204 :         temp = y[0];
      56      234204 :         move16();
      57     3221544 :         FOR( m = 1; m < im; m++ )
      58             :         {
      59             : #ifdef ISSUE_1836_replace_overflow_libcom
      60     2987340 :             v = sub_sat( temp, y[m] ); /* Q0 */
      61             : #else
      62             :             v = sub_o( temp, y[m], &Overflow );                /* Q0 */
      63             : #endif
      64     2987340 :             temp = s_max( temp, y[m] );
      65     2987340 :             if ( v < 0 )
      66             :             {
      67      227583 :                 k = m; /* Q0 */
      68      227583 :                 move16();
      69             :             }
      70             :         }
      71             : 
      72      234204 :         IF( LT_16( temp, y[m] ) )
      73             :         {
      74      114643 :             k = m;
      75      114643 :             move16();
      76      114643 :             if ( LT_16( im, N ) )
      77             :             {
      78      114517 :                 im = add( im, 1 ); /* Q0 */
      79             :             }
      80             :         }
      81             : 
      82      234204 :         j = idx[k];
      83      234204 :         move16();
      84             : 
      85      234204 :         test();
      86      234204 :         IF( GE_16( sum, sfmsize[j] ) && LT_16( r[j], K ) )
      87             :         {
      88      232214 :             y[k] = sub( y[k], fac ); /* Q0 */
      89      232214 :             move16();
      90      232214 :             r[j] = add( r[j], 1 ); /* Q0 */
      91      232214 :             move16();
      92             : 
      93      232214 :             if ( GE_16( r[j], K ) )
      94             :             {
      95         551 :                 y[k] = -32768;
      96         551 :                 move16();
      97             :             }
      98      232214 :             sum = sub( sum, sfmsize[j] ); /* Q0 */
      99             :         }
     100             :         ELSE
     101             :         {
     102        1990 :             y[k] = -32768;
     103        1990 :             move16();
     104        1990 :             k = add( k, 1 );
     105        1990 :             test();
     106        1990 :             if ( EQ_16( k, im ) && LT_16( im, N ) )
     107             :             {
     108        1068 :                 im = add( im, 1 ); /* Q0 */
     109             :             }
     110             :         }
     111             : 
     112      234204 :         test();
     113      234204 :         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      228901 :         diff = sum; /* Q0 */
     119      228901 :         move16();
     120      228901 :         v = sub( N, 1 ); /* Q0 */
     121             : 
     122      228901 :         IF( GT_16( k, v ) )
     123             :         {
     124         253 :             FOR( ii = 0; ii <= N; ii++ )
     125             :             {
     126         253 :                 IF( GT_16( y[ii], -32768 ) )
     127             :                 {
     128         119 :                     if ( LT_16( ii, N ) )
     129             :                     {
     130         119 :                         im = add( ii, 1 ); /* Q0 */
     131             :                     }
     132         119 :                     BREAK;
     133             :                 }
     134             :             }
     135             :         }
     136             :     }
     137             : 
     138             : 
     139        5303 :     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       19396 :         FOR( i = 0; i <= N; i++ )
     142             :         {
     143       19202 :             j = idx[i]; /* Q0 */
     144       19202 :             move16();
     145       19202 :             test();
     146       19202 :             test();
     147       19202 :             IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && r[j] == 0 )
     148             :             {
     149         516 :                 r[j] = 1;
     150         516 :                 move16();
     151         516 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     152         516 :                 IF( LT_16( sum, sfmsize[SFM_G1] ) )
     153             :                 {
     154         495 :                     BREAK;
     155             :                 }
     156             :             }
     157             :         }
     158             :     }
     159             : 
     160        5303 :     IF( GE_16( sum, sfmsize[SFM_G1] ) )
     161             :     {
     162        4087 :         FOR( i = 0; i <= N; i++ )
     163             :         {
     164        4060 :             j = idx[i];
     165        4060 :             move16();
     166        4060 :             test();
     167        4060 :             test();
     168        4060 :             IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && EQ_16( r[j], 1 ) )
     169             :             {
     170         174 :                 r[j] = 2;
     171         174 :                 move16();
     172         174 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     173         174 :                 IF( LT_16( sum, sfmsize[SFM_G1] ) )
     174             :                 {
     175         167 :                     BREAK;
     176             :                 }
     177             :             }
     178             :         }
     179             :     }
     180             : 
     181        5303 :     IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
     182             :     {
     183       45006 :         FOR( i = 0; i <= N; i++ )
     184             :         {
     185       44327 :             j = idx[i]; /* Q0 */
     186       44327 :             move16();
     187       44327 :             test();
     188       44327 :             IF( LT_16( j, SFM_G1 ) && r[j] == 0 )
     189             :             {
     190         771 :                 r[j] = 1;
     191         771 :                 move16();
     192         771 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     193         771 :                 IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
     194             :                 {
     195         771 :                     BREAK;
     196             :                 }
     197             :             }
     198             :         }
     199             :     }
     200             : 
     201        5303 :     IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
     202             :     {
     203       16734 :         FOR( i = 0; i <= N; i++ )
     204             :         {
     205       16505 :             j = idx[i]; /* Q0 */
     206       16505 :             move16();
     207       16505 :             test();
     208       16505 :             IF( LT_16( j, SFM_G1 ) && EQ_16( r[j], 1 ) )
     209             :             {
     210         458 :                 r[j] = 2; /* Q0 */
     211         458 :                 move16();
     212         458 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     213         458 :                 IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
     214             :                 {
     215         450 :                     BREAK;
     216             :                 }
     217             :             }
     218             :         }
     219             :     }
     220             : 
     221        5303 :     return;
     222             : }
     223             : 
     224             : #define WMC_TOOL_SKIP
     225             : 
     226             : /*-------------------------------------------------------------------*
     227             :  * BitAllocF()
     228             :  *
     229             :  * Fractional bit allocation
     230             :  *-------------------------------------------------------------------*/
     231             : 
     232         834 : 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         834 :     Word16 i, n, Nmin, Bits, bs, low_rate = 0;
     246         834 :     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         834 :     set32_fx( Rsubband_w32_fx, 0, NB_SFM );
     262             : 
     263         834 :     fac = 3;
     264         834 :     move16();
     265             : 
     266         834 :     IF( LT_32( bit_rate, 32000 ) )
     267             :     {
     268         834 :         bs = 2;
     269         834 :         move16();
     270             :     }
     271             :     ELSE
     272             :     {
     273           0 :         bs = 3;
     274           0 :         move16();
     275             :     }
     276         834 :     low_rate = 1;
     277         834 :     move16();
     278             : 
     279         834 :     Nmin = N; /* Q0 */
     280         834 :     move16();
     281         834 :     if ( GT_16( Nmin, SFM_N ) )
     282             :     {
     283         834 :         Nmin = SFM_N; /* Q0 */
     284         834 :         move16();
     285             :     }
     286             : 
     287             :     /* Initial bits distribution */
     288         834 :     test();
     289         834 :     IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     290             :     {
     291             :         /* Initial bits distribution */
     292         736 :         L_tmp1 = 0;
     293         736 :         move16();
     294         736 :         m_fx = 0;
     295         736 :         move16();
     296       20608 :         FOR( i = 0; i < num_env_bands; i++ )
     297             :         {
     298       19872 :             L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
     299             :         }
     300         736 :         L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
     301             : 
     302         736 :         t_fx = L_deposit_l( 0 );
     303         736 :         n = 0;
     304         736 :         move16();
     305         736 :         tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); /* Q0 */
     306         736 :         exp1 = norm_s( tmp );
     307         736 :         tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
     308         736 :         exp2 = norm_s( tmp );
     309         736 :         tmp = shl( tmp, exp2 );
     310         736 :         exp1 = add( 29, sub( exp2, exp1 ) );
     311             : 
     312       29440 :         FOR( i = 0; i < N; i++ )
     313             :         {
     314       28704 :             L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[num_env_bands - 1] ), L_tmp1 ); /* Q0 */
     315       28704 :             Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
     316       28704 :             move32(); /*Q0*/
     317       28704 :             IF( Rsubband_w32_fx[i] > 0 )
     318             :             {
     319       16148 :                 n = add( n, Nb[i] );
     320       16148 :                 Rsubband_w32_fx[i] = Mult_32_16( Rsubband_w32_fx[i], tmp );
     321       16148 :                 move32();                                                          /*exp1 - 15*/
     322       16148 :                 Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/
     323             : 
     324       16148 :                 t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/
     325             :             }
     326             :             ELSE
     327             :             {
     328       12556 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     329       12556 :                 move32();
     330             :             }
     331             :         }
     332             :     }
     333             :     ELSE
     334             :     {
     335             :         /* Initial bits distribution */
     336          98 :         L_tmp1 = 0;
     337          98 :         move16();
     338          98 :         m_fx = 0;
     339          98 :         move16();
     340        3920 :         FOR( i = 0; i < N; i++ )
     341             :         {
     342        3822 :             L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
     343             :         }
     344          98 :         L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
     345             : 
     346             : 
     347          98 :         t_fx = L_deposit_l( 0 );
     348          98 :         n = 0;
     349          98 :         move16();
     350          98 :         tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); /* Q0 */
     351          98 :         exp1 = norm_s( tmp );
     352          98 :         tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
     353          98 :         exp2 = norm_s( tmp );
     354          98 :         tmp = shl( tmp, exp2 );
     355          98 :         exp1 = add( 29, sub( exp2, exp1 ) );
     356        3920 :         FOR( i = 0; i < N; i++ )
     357             :         {
     358        3822 :             L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); /* Q0 */
     359        3822 :             Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
     360        3822 :             move32(); /*Q0*/
     361        3822 :             IF( Rsubband_w32_fx[i] > 0 )
     362             :             {
     363        2577 :                 n = add( n, Nb[i] );
     364        2577 :                 L_tmp3 = Mult_32_16( Rsubband_w32_fx[i], tmp );        /*exp1 - 15*/
     365        2577 :                 Rsubband_w32_fx[i] = L_shl( L_tmp3, sub( 30, exp1 ) ); /*Q15*/
     366        2577 :                 move32();
     367             : 
     368        2577 :                 t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q15*/
     369             :             }
     370             :             ELSE
     371             :             {
     372        1245 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     373        1245 :                 move32();
     374             :             }
     375             :         }
     376             :     }
     377             : 
     378             :     /* Distribute the remaining bits to subbands with non-zero bits */
     379         834 :     B_fx = L_shl( B, 15 );
     380        1922 :     WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
     381             :     {
     382        1088 :         L_tmp1 = L_sub( t_fx, B_fx );
     383        1088 :         exp1 = sub( norm_l( L_tmp1 ), 1 );
     384        1088 :         exp2 = norm_s( n );
     385        1088 :         tmp = div_s( extract_h( L_shl( L_tmp1, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
     386        1088 :         m_fx = shl_sat( tmp, sub( exp2, exp1 ) );                          /*Q14*/
     387        1088 :         t_fx = L_deposit_l( 0 );
     388        1088 :         n = 0;
     389        1088 :         move16();
     390       43520 :         FOR( i = 0; i < N; i++ )
     391             :         {
     392       42432 :             IF( Rsubband_w32_fx[i] > 0 )
     393             :             {
     394       23449 :                 Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
     395       23449 :                 move32();
     396             : 
     397       23449 :                 IF( Rsubband_w32_fx[i] > 0 )
     398             :                 {
     399       22476 :                     n = add( n, Nb[i] );
     400             : 
     401       22476 :                     t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
     402             :                 }
     403             :                 ELSE
     404             :                 {
     405         973 :                     Rsubband_w32_fx[i] = L_deposit_l( 0 );
     406         973 :                     move32();
     407             :                 }
     408             :             }
     409             :         }
     410             :     }
     411         834 :     Bits = B; /* Q0 */
     412         834 :     move16();
     413             : 
     414             :     /* Impose bit-constraints to subbands with less than minimum bits*/
     415         834 :     t_fx = L_deposit_l( 0 );
     416         834 :     n = 0;
     417         834 :     move16();
     418       33360 :     FOR( i = 0; i < N; i++ )
     419             :     {
     420       32526 :         IF( Rsubband_w32_fx[i] > 0 )
     421             :         {
     422       17752 :             test();
     423       17752 :             IF( ( LT_32( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) ) && ( EQ_16( low_rate, 1 ) ) )
     424             :             {
     425        3839 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     426        3839 :                 move32();
     427             :             }
     428       13913 :             ELSE IF( LE_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     429             :             {
     430        4469 :                 B = sub( B, Nb[i] );                     /* Q0 */
     431        4469 :                 Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
     432        4469 :                 move32();
     433             :             }
     434             :             ELSE
     435             :             {
     436        9444 :                 n = add( n, Nb[i] );                      /* Q0 */
     437        9444 :                 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        1884 :     WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
     444             :     {
     445        1090 :         L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) );
     446        1090 :         L_tmp2 = L_abs( L_tmp1 );
     447             : 
     448        1090 :         IF( n > 0 )
     449             :         {
     450        1090 :             exp1 = sub( norm_l( L_tmp2 ), 1 );
     451        1090 :             exp2 = norm_s( n );
     452        1090 :             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        1090 :             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        1090 :             if ( L_tmp1 < 0 )
     459             :             {
     460         205 :                 m_fx = negate( m_fx );
     461             :             }
     462             : 
     463        1090 :             t_fx = L_deposit_l( 0 );
     464        1090 :             n = 0;
     465        1090 :             move16();
     466       43600 :             FOR( i = 0; i < N; i++ )
     467             :             {
     468       42510 :                 IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     469             :                 {
     470       11302 :                     Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
     471       11302 :                     move32();
     472       11302 :                     IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     473             :                     {
     474       10243 :                         n = add( n, Nb[i] ); /* Q0 */
     475             : 
     476       10243 :                         t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
     477             :                     }
     478             :                     ELSE
     479             :                     {
     480        1059 :                         B = sub( B, Nb[i] ); /* Q0 */
     481             : 
     482        1059 :                         Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
     483        1059 :                         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        1090 :         IF( t_fx == 0 )
     490             :         {
     491         193 :             FOR( i = N - 1; i >= 0; i-- )
     492             :             {
     493         193 :                 IF( Rsubband_w32_fx[i] > 0 )
     494             :                 {
     495          63 :                     B = add( B, Nb[i] ); /* Q0 */
     496          63 :                     Rsubband_w32_fx[i] = L_deposit_l( 0 );
     497          63 :                     move32();
     498          63 :                     IF( B >= 0 )
     499             :                     {
     500          40 :                         BREAK;
     501             :                     }
     502             :                 }
     503             :             }
     504          40 :             BREAK;
     505             :         }
     506             :     }
     507             : 
     508             :     /* fine redistribution of over-allocated or under-allocated bits */
     509         834 :     tmp = 0;
     510         834 :     move16();
     511       33360 :     FOR( i = 0; i < N; i++ )
     512             :     {
     513       32526 :         Rsubband_fx[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); /* Q3 */
     514       32526 :         move16();
     515       32526 :         tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
     516             :     }
     517             : 
     518         834 :     B = Bits;
     519         834 :     B_w16_fx = shl( B, 3 );
     520         834 :     IF( GT_16( tmp, B_w16_fx ) )
     521             :     {
     522           0 :         tmp = sub( tmp, B_w16_fx );
     523           0 :         FOR( i = 0; i < N; i++ )
     524             :         {
     525           0 :             IF( GE_16( Rsubband_fx[i], add( shl( Nb[i], 3 ), tmp ) ) )
     526             :             {
     527           0 :                 Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
     528           0 :                 move16();
     529           0 :                 BREAK;
     530             :             }
     531             :         }
     532             :     }
     533             :     ELSE
     534             :     {
     535         834 :         tmp = sub( tmp, B_w16_fx );
     536        1054 :         FOR( i = 0; i < N; i++ )
     537             :         {
     538        1054 :             IF( Rsubband_fx[i] > 0 )
     539             :             {
     540         834 :                 Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
     541         834 :                 move16();
     542         834 :                 BREAK;
     543             :             }
     544             :         }
     545             :     }
     546             : 
     547             :     /* Calcuate total used bits and initialize R to be used for Noise Filling */
     548         834 :     tmp = 0;
     549         834 :     move16();
     550       33360 :     FOR( i = 0; i < N; i++ )
     551             :     {
     552       32526 :         tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
     553       32526 :         R[i] = shr( Rsubband_fx[i], 3 );  /* Q0 */
     554       32526 :         move16();
     555             :     }
     556         834 :     return shr( tmp, 3 );
     557             : }
     558             : /*-------------------------------------------------------------------*
     559             :  * Bit_group()
     560             :  *
     561             :  * bit allocation in group
     562             :  *-------------------------------------------------------------------*/
     563        1410 : 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        1410 :     Word32 R_temp_fx[16], R_sum_fx = 0, R_sum_org_fx = 0, Bits_avg_fx = 0;
     577             :     Word32 L_tmp;
     578        1410 :     move32();
     579        1410 :     move32();
     580        1410 :     move32();
     581             : 
     582             :     /* initialization for bit allocation in one group*/
     583        1410 :     tmp = 6554;
     584        1410 :     move16(); /*Q15  1/5    */
     585        1410 :     if ( EQ_16( thr, 5 ) )
     586             :     {
     587         470 :         tmp = 6554;
     588         470 :         move16(); /*Q15  1/5    */
     589             :     }
     590        1410 :     if ( EQ_16( thr, 6 ) )
     591             :     {
     592         470 :         tmp = 5462;
     593         470 :         move16(); /*Q15  1/6 */
     594             :     }
     595        1410 :     if ( EQ_16( thr, 7 ) )
     596             :     {
     597         470 :         tmp = 4682;
     598         470 :         move16(); /*Q15  1/7 */
     599             :     }
     600        1410 :     bit_band = mult( tmp, Bits ); /*0+15-15=0, Q0 */
     601        1410 :     band_num = sub( end_band, start_band );
     602             : 
     603       13630 :     FOR( i = 0; i < band_num; i++ )
     604             :     {
     605       12220 :         y_index[i] = y[i + start_band]; /* Q0 */
     606       12220 :         move16();
     607       12220 :         index[i] = i;
     608       12220 :         move16();
     609             :     }
     610             : 
     611             :     /* Rearrange norm vector in decreasing order */
     612        1410 :     reordvct_fx( y_index, band_num, index );
     613             :     /* norm vector modification */
     614             : 
     615        1410 :     factor_fx = div_s( 1, band_num ); /*Q15 */
     616        1410 :     IF( GT_16( thr, 5 ) )
     617             :     {
     618        5640 :         FOR( i = 0; i < band_num; i++ )
     619             :         {
     620        4700 :             L_tmp = L_mult( i, factor_fx );              /*Q16 */
     621        4700 :             tmp = extract_h( L_shl( L_tmp, 13 ) );       /*Q13 */
     622        4700 :             tmp = sub( fac_fx[1], tmp );                 /*Q13 */
     623        4700 :             L_tmp = L_mult( y_index[i], tmp );           /*Q14 */
     624        4700 :             y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
     625        4700 :             move16();
     626             :         }
     627             :     }
     628             :     ELSE
     629             :     {
     630        7990 :         FOR( i = 0; i < band_num; i++ )
     631             :         {
     632        7520 :             L_tmp = L_mult( i, factor_fx );              /*Q16 */
     633        7520 :             tmp = extract_h( L_shl( L_tmp, 13 ) );       /*Q13 */
     634        7520 :             tmp = sub( fac_fx[0], tmp );                 /*Q13 */
     635        7520 :             L_tmp = L_mult( y_index[i], tmp );           /*Q14 */
     636        7520 :             y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
     637        7520 :             move16();
     638             :         }
     639             :     }
     640             : 
     641             :     /* bit allocation based on modified norm */
     642        1410 :     L_tmp = L_mult( band_num, 24576 );    /*Q16 */
     643        1410 :     tmp = extract_h( L_shl( L_tmp, 7 ) ); /*Q7 */
     644        1410 :     IF( GE_16( shl( bit_band, 7 ), tmp ) )
     645             :     {
     646       12814 :         FOR( j = 0; j < band_num; j++ )
     647             :         {
     648       11558 :             if ( y_index[j] < 0 )
     649             :             {
     650         262 :                 y_index[j] = 0;
     651         262 :                 move16();
     652             :             }
     653       11558 :             R_temp_fx[j] = 2097152;
     654       11558 :             move16(); /*Q21 = 1     move16(); */
     655             :         }
     656             : 
     657        1256 :         i = sub( band_num, 1 );
     658        1256 :         norm_sum = 0; /*Q0 */
     659       12814 :         FOR( k = 0; k <= i; k++ )
     660             :         {
     661       11558 :             norm_sum = add( norm_sum, y_index[k] );
     662             :         }
     663             : 
     664        2826 :         FOR( j = 0; j < band_num; j++ )
     665             :         {
     666        2826 :             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        2826 :                 exp = norm_s( norm_sum );
     677        2826 :                 tmp = shl( norm_sum, exp );        /*Q(exp) */
     678        2826 :                 tmp = div_s( 16384, tmp );         /*Q(15+14-exp) */
     679        2826 :                 Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
     680             : 
     681       28099 :                 FOR( k = 0; k <= i; k++ )
     682             :                 {
     683       25273 :                     L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
     684       25273 :                     L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
     685             : 
     686       25273 :                     R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
     687       25273 :                     move32(); /*Q21 */
     688             :                 }
     689             :             }
     690             : 
     691        2826 :             L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
     692        2826 :             IF( LT_32( R_temp_fx[i], L_tmp ) )
     693             :             {
     694        1570 :                 R_temp_fx[i] = L_deposit_h( 0 );
     695        1570 :                 move32();
     696        1570 :                 norm_sum = sub( norm_sum, y_index[i] );
     697        1570 :                 i--;
     698             :             }
     699             :             ELSE
     700             :             {
     701        1256 :                 BREAK;
     702             :             }
     703             :         }
     704             :     }
     705             :     ELSE
     706             :     {
     707         299 :         FOR( j = 0; j < bit_band; j++ )
     708             :         {
     709         145 :             if ( y_index[j] < 0 )
     710             :             {
     711           2 :                 y_index[j] = 0;
     712           2 :                 move16();
     713             :             }
     714         145 :             R_temp_fx[j] = 2097152;
     715         145 :             move32(); /*Q21 = 1 */
     716             :         }
     717             : 
     718         671 :         FOR( j = bit_band; j < band_num; j++ )
     719             :         {
     720         517 :             R_temp_fx[j] = L_deposit_l( 0 );
     721         517 :             move32();
     722             :         }
     723             : 
     724         154 :         norm_sum = 0;
     725         154 :         move16();
     726         299 :         FOR( k = 0; k < bit_band; k++ )
     727             :         {
     728         145 :             norm_sum = add( norm_sum, y_index[k] );
     729             :         }
     730             : 
     731         154 :         i = bit_band;
     732         154 :         move16();
     733         234 :         FOR( j = 0; j < bit_band; j++ )
     734             :         {
     735         104 :             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         104 :                 exp = norm_s( norm_sum );
     746         104 :                 tmp = shl( norm_sum, exp );        /*Q(exp) */
     747         104 :                 tmp = div_s( 16384, tmp );         /*Q(15+14-exp) */
     748         104 :                 Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
     749         377 :                 FOR( k = 0; k < i; k++ )
     750             :                 {
     751         273 :                     L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
     752         273 :                     L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
     753             : 
     754         273 :                     R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
     755         273 :                     move32(); /*Q21 */
     756             :                 }
     757             :             }
     758         104 :             R_sum_fx = 0;
     759         104 :             move32();
     760         104 :             L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
     761         328 :             FOR( k = 0; k < i; k++ )
     762             :             {
     763         248 :                 IF( LT_32( R_temp_fx[k], L_tmp ) )
     764             :                 {
     765          73 :                     FOR( m = k; m < i; m++ )
     766             :                     {
     767          49 :                         norm_sum = sub( norm_sum, y_index[m] );
     768          49 :                         R_temp_fx[m] = L_deposit_l( 0 ); /*Q21 */
     769          49 :                         move32();
     770             :                     }
     771          24 :                     i = k;
     772          24 :                     move16();
     773          24 :                     BREAK;
     774             :                 }
     775             :                 ELSE
     776             :                 {
     777         224 :                     R_sum_fx = L_add( R_sum_fx, R_temp_fx[k] ); /* Q21 */
     778             :                 }
     779             :             }
     780         104 :             IF( EQ_32( R_sum_fx, R_sum_org_fx ) )
     781             :             {
     782          24 :                 BREAK;
     783             :             }
     784             : 
     785          80 :             R_sum_org_fx = R_sum_fx;
     786          80 :             move32();
     787             :         }
     788             :     }
     789             : 
     790             :     /*  index comeback */
     791       13630 :     FOR( k = 0; k < band_num; k++ )
     792             :     {
     793       12220 :         j = index[k];
     794       12220 :         move16();
     795       12220 :         Rsubband_fx[j + start_band] = R_temp_fx[k]; /* Q21 */
     796       12220 :         move32();
     797             :     }
     798             : 
     799        1410 :     return;
     800             : }
     801             : 
     802             : /*-------------------------------------------------------------------*
     803             :  * BitAllocWB()
     804             :  *
     805             :  * WB bit allocation
     806             :  *-------------------------------------------------------------------*/
     807             : 
     808         470 : 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         470 :     Word16 Rsum_sub_fx_tmp = 0; /* initialize just to avoid compiler warning */
     824         470 :     move16();
     825             :     Word32 L_tmp, L_tmp1;
     826             :     Word32 Rsubband_buf[NB_SFM];
     827             : 
     828         470 :     BANDS = N;
     829         470 :     move16();
     830         470 :     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       12690 :     FOR( k = 0; k < BANDS; k++ )
     837             :     {
     838       12220 :         Rsubband_buf[k] = 2097152;
     839       12220 :         move32(); /*Q21 */
     840             :     }
     841             :     /* Calculate the norm sum and average of sub-band */
     842         470 :     Rsum_sub_fx[0] = 0;
     843         470 :     move16();
     844        7990 :     FOR( j = 0; j < SFM_G1; j++ )
     845             :     {
     846        7520 :         if ( y[j] > 0 )
     847             :         {
     848        7247 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[0], y[j] ); /*Q0 */
     849             :         }
     850        7520 :         if ( y[j] > 0 )
     851             :         {
     852        7247 :             Rsum_sub_fx[0] = Rsum_sub_fx_tmp;
     853        7247 :             move16(); /*Q0 */
     854             :         }
     855             :     }
     856         470 :     Ravg_sub_32_fx[0] = L_mult( Rsum_sub_fx[0], 2048 );
     857         470 :     move32(); /*Q16  0+15+1   //q15 1/16 =2048 */
     858             : 
     859         470 :     Rsum_sub_fx[1] = 0;
     860         470 :     move16();
     861        4230 :     FOR( j = SFM_G1; j < SFM_G1G2; j++ )
     862             :     {
     863        3760 :         if ( y[j] > 0 )
     864             :         {
     865        3357 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[1], y[j] ); /*Q0 */
     866             :         }
     867        3760 :         if ( y[j] > 0 )
     868             :         {
     869        3357 :             Rsum_sub_fx[1] = Rsum_sub_fx_tmp;
     870        3357 :             move16(); /*Q0 */
     871             :         }
     872             :     }
     873         470 :     Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16  0+15+1   //q15 1/8 =4096 */
     874         470 :     move32();
     875         470 :     Rsum_sub_fx[2] = 0;
     876         470 :     move16();
     877        1410 :     FOR( j = SFM_G1G2; j < BANDS; j++ )
     878             :     {
     879         940 :         if ( y[j] > 0 )
     880             :         {
     881         836 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[2], y[j] ); /*Q0 */
     882             :         }
     883         940 :         if ( y[j] > 0 )
     884             :         {
     885         836 :             Rsum_sub_fx[2] = Rsum_sub_fx_tmp;
     886         836 :             move16(); /*Q0 */
     887             :         }
     888             :     }
     889         470 :     tmp = div_s( 1, BANDS - SFM_G1G2 ); /*Q15 */
     890         470 :     Ravg_sub_32_fx[2] = L_mult( Rsum_sub_fx[2], tmp );
     891         470 :     move32(); /*Q16 */
     892             : 
     893             :     /* Bit allocation for every group */
     894         470 :     tmp = add( Rsum_sub_fx[0], Rsum_sub_fx[1] );
     895         470 :     Rsum_fx = add( tmp, Rsum_sub_fx[2] ); /*Q0     */
     896             : 
     897         470 :     factor_fx[0] = 16384; /*Q13     move16(); */
     898         470 :     factor_fx[1] = 24576; /*Q13     move16(); */
     899         470 :     move16();
     900         470 :     move16();
     901             :     {
     902         470 :         R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] );
     903         470 :         move32(); /*Q16 */
     904         470 :         R_diff_32_fx[1] = L_sub( Ravg_sub_32_fx[1], Ravg_sub_32_fx[2] );
     905         470 :         move32(); /*Q16 */
     906             : 
     907         470 :         test();
     908         470 :         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         311 :             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         311 :                 exp = norm_s( Rsum_fx );
     922         311 :                 tmp = shl( Rsum_fx, exp );                       /*Q(exp) */
     923         311 :                 tmp = div_s( 16384, tmp );                       /*Q(15+14-exp) */
     924         311 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[0] );            /*Q1 */
     925         311 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     926         311 :                 B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     927         311 :                 test();
     928         311 :                 if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
     929             :                 {
     930          31 :                     B1 = add( B1, 1 );
     931             :                 }
     932         311 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[1] );            /*Q1 */
     933         311 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     934         311 :                 B2 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     935         311 :                 test();
     936         311 :                 if ( GT_32( L_tmp1, L_mult( B2, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B2, 1 ), Rsum_fx ) ) )
     937             :                 {
     938           6 :                     B2 = add( B2, 1 );
     939             :                 }
     940         311 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[2] );            /*Q1 */
     941         311 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     942         311 :                 B3 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     943         311 :                 test();
     944         311 :                 if ( GT_32( L_tmp1, L_mult( B3, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B3, 1 ), Rsum_fx ) ) )
     945             :                 {
     946           5 :                     B3 = add( B3, 1 );
     947             :                 }
     948             :             }
     949         311 :             IF( GT_32( Ravg_sub_32_fx[2], 786432 /* 12 in Q16 */ ) )
     950             :             {
     951         104 :                 B_saved = 0;
     952         104 :                 move16();
     953         104 :                 IF( GT_16( B1, 288 ) )
     954             :                 {
     955          13 :                     B_saved = sub( B1, 288 ); /* Q0 */
     956          13 :                     B1 = 288;
     957          13 :                     move16();
     958             :                 }
     959             : 
     960         104 :                 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         104 :                 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         104 :                 IF( B_saved > 0 )
     977             :                 {
     978          13 :                     IF( EQ_16( B1, 288 ) )
     979             :                     {
     980          13 :                         tmp = shr( B_saved, 1 ); /* Q0 */
     981          13 :                         B2 = add( B2, tmp );     /* Q0 */
     982          13 :                         tmp = sub( B, B1 );      /* Q0 */
     983          13 :                         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         311 :             factor_fx[0] = 16384;
    1004         311 :             move16(); /*Q13 */
    1005         311 :             factor_fx[1] = 12288;
    1006         311 :             move16(); /*Q13 */
    1007             :         }
    1008             :         ELSE
    1009             :         {
    1010         159 :             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         159 :                 exp = norm_s( Rsum_fx );
    1022         159 :                 tmp = shl( Rsum_fx, exp );                       /*Q(exp) */
    1023         159 :                 tmp = div_s( 16384, tmp );                       /*Q(15+14-exp) */
    1024         159 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[0] );            /*Q1 */
    1025         159 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
    1026         159 :                 B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
    1027         159 :                 test();
    1028         159 :                 if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
    1029             :                 {
    1030           1 :                     B1 = add( B1, 1 ); /* Q0 */
    1031             :                 }
    1032         159 :                 L_tmp1 = Mult_32_16( 1975684956, shl( B, 5 ) );          /*Q(31+5-15=21) */
    1033         159 :                 L_tmp1 = Mult_32_16( L_tmp1, shl( Rsum_sub_fx[1], 7 ) ); /*Q(21+7-15=13) */
    1034         159 :                 L_tmp = Mult_32_16( L_tmp1, tmp );                       /*Q(27-exp) */
    1035         159 :                 B2 = extract_h( L_shl( L_tmp, sub( exp, 11 ) ) );        /*Q0 */
    1036         159 :                 test();
    1037         159 :                 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         159 :                 tmp = sub( B, B1 );  /* Q0 */
    1042         159 :                 B3 = sub( tmp, B2 ); /* Q0 */
    1043             :             }
    1044             :         }
    1045             :     }
    1046             : 
    1047         470 :     IF( LT_16( Rsum_sub_fx[2], 3 ) )
    1048             :     {
    1049          64 :         B2 = add( B2, B3 ); /* Q0 */
    1050          64 :         B3 = 0;
    1051          64 :         move16();
    1052             :     }
    1053             : 
    1054             :     /* Bit allocation in group */
    1055         470 :     Bit_group_fx( y, 0, SFM_G1, B1, 5, Rsubband_buf, factor_fx );
    1056         470 :     Bit_group_fx( y, SFM_G1, SFM_G1G2, B2, 6, Rsubband_buf, factor_fx );
    1057         470 :     Bit_group_fx( y, SFM_G1G2, BANDS, B3, 7, Rsubband_buf, factor_fx );
    1058       12690 :     FOR( i = 0; i < BANDS; i++ )
    1059             :     {
    1060       12220 :         Rsubband_fx[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); /* Q3 */
    1061       12220 :         move16();
    1062             :     }
    1063             : 
    1064             :     /* Calcuate total used bits and initialize R to be used for Noise Filling */
    1065         470 :     L_tmp = L_deposit_l( 0 );
    1066       12690 :     FOR( i = 0; i < N; i++ )
    1067             :     {
    1068       12220 :         L_tmp = L_add( L_tmp, Rsubband_buf[i] );         /*Q21 */
    1069       12220 :         R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */
    1070       12220 :         move16();
    1071             :     }
    1072         470 :     t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */
    1073             : 
    1074         470 :     return (Word16) t_fx;
    1075             : }
    1076             : 
    1077             : #undef WMC_TOOL_SKIP

Generated by: LCOV version 1.14