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

Generated by: LCOV version 1.14