LCOV - code coverage report
Current view: top level - lib_com - bitalloc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3ea8505de0a48ae0f5675c28be980f7a28fcc88e Lines: 529 567 93.3 %
Date: 2025-06-01 02:01:13 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       10849 : 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       10849 :     Flag Overflow = 0;
      28       10849 :     move32();
      29             : #endif
      30       10849 :     Word16 SFM_thr = SFM_G1G2;
      31       10849 :     move16();
      32             : 
      33       10849 :     N = sub( N, 1 ); /* Q0 */
      34             : 
      35       10849 :     if ( EQ_16( hqswb_clas, HQ_HARMONIC ) )
      36             :     {
      37        1519 :         SFM_thr = 22; /* Q0 */
      38        1519 :         move16();
      39             :     }
      40             : 
      41       10849 :     fac = 3;
      42       10849 :     move16();
      43       10849 :     K = sub( K, 2 ); /* Q0 */
      44       10849 :     im = 1;
      45       10849 :     move16();
      46       10849 :     diff = sum; /* Q0 */
      47       10849 :     move16();
      48       10849 :     n = shr( sum, 3 ); /* Q0 */
      49      480863 :     FOR( i = 0; i < n; i++ )
      50             :     {
      51      480863 :         k = 0;
      52      480863 :         move16();
      53      480863 :         temp = y[0];
      54      480863 :         move16();
      55     6645868 :         FOR( m = 1; m < im; m++ )
      56             :         {
      57     6165005 :             v = sub_o( temp, y[m], &Overflow ); /* Q0 */
      58     6165005 :             temp = s_max( temp, y[m] );
      59     6165005 :             if ( v < 0 )
      60             :             {
      61      467838 :                 k = m; /* Q0 */
      62      467838 :                 move16();
      63             :             }
      64             :         }
      65             : 
      66      480863 :         IF( LT_16( temp, y[m] ) )
      67             :         {
      68      235596 :             k = m;
      69      235596 :             move16();
      70      235596 :             if ( LT_16( im, N ) )
      71             :             {
      72      235347 :                 im = add( im, 1 ); /* Q0 */
      73             :             }
      74             :         }
      75             : 
      76      480863 :         j = idx[k];
      77      480863 :         move16();
      78             : 
      79      480863 :         test();
      80      480863 :         IF( GE_16( sum, sfmsize[j] ) && LT_16( r[j], K ) )
      81             :         {
      82      476797 :             y[k] = sub( y[k], fac ); /* Q0 */
      83      476797 :             move16();
      84      476797 :             r[j] = add( r[j], 1 ); /* Q0 */
      85      476797 :             move16();
      86             : 
      87      476797 :             if ( GE_16( r[j], K ) )
      88             :             {
      89        1096 :                 y[k] = -32768;
      90        1096 :                 move16();
      91             :             }
      92      476797 :             sum = sub( sum, sfmsize[j] ); /* Q0 */
      93             :         }
      94             :         ELSE
      95             :         {
      96        4066 :             y[k] = -32768;
      97        4066 :             move16();
      98        4066 :             k = add( k, 1 );
      99        4066 :             test();
     100        4066 :             if ( EQ_16( k, im ) && LT_16( im, N ) )
     101             :             {
     102        2174 :                 im = add( im, 1 ); /* Q0 */
     103             :             }
     104             :         }
     105             : 
     106      480863 :         test();
     107      480863 :         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      470014 :         diff = sum; /* Q0 */
     113      470014 :         move16();
     114      470014 :         v = sub( N, 1 ); /* Q0 */
     115             : 
     116      470014 :         IF( GT_16( k, v ) )
     117             :         {
     118         498 :             FOR( ii = 0; ii <= N; ii++ )
     119             :             {
     120         498 :                 IF( GT_16( y[ii], -32768 ) )
     121             :                 {
     122         236 :                     if ( LT_16( ii, N ) )
     123             :                     {
     124         236 :                         im = add( ii, 1 ); /* Q0 */
     125             :                     }
     126         236 :                     BREAK;
     127             :                 }
     128             :             }
     129             :         }
     130             :     }
     131             : 
     132             : 
     133       10849 :     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       40173 :         FOR( i = 0; i <= N; i++ )
     136             :         {
     137       39773 :             j = idx[i]; /* Q0 */
     138       39773 :             move16();
     139       39773 :             test();
     140       39773 :             test();
     141       39773 :             IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && r[j] == 0 )
     142             :             {
     143        1068 :                 r[j] = 1;
     144        1068 :                 move16();
     145        1068 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     146        1068 :                 IF( LT_16( sum, sfmsize[SFM_G1] ) )
     147             :                 {
     148        1017 :                     BREAK;
     149             :                 }
     150             :             }
     151             :         }
     152             :     }
     153             : 
     154       10849 :     IF( GE_16( sum, sfmsize[SFM_G1] ) )
     155             :     {
     156        8457 :         FOR( i = 0; i <= N; i++ )
     157             :         {
     158        8402 :             j = idx[i];
     159        8402 :             move16();
     160        8402 :             test();
     161        8402 :             test();
     162        8402 :             IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && EQ_16( r[j], 1 ) )
     163             :             {
     164         358 :                 r[j] = 2;
     165         358 :                 move16();
     166         358 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     167         358 :                 IF( LT_16( sum, sfmsize[SFM_G1] ) )
     168             :                 {
     169         345 :                     BREAK;
     170             :                 }
     171             :             }
     172             :         }
     173             :     }
     174             : 
     175       10849 :     IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
     176             :     {
     177       93312 :         FOR( i = 0; i <= N; i++ )
     178             :         {
     179       91881 :             j = idx[i]; /* Q0 */
     180       91881 :             move16();
     181       91881 :             test();
     182       91881 :             IF( LT_16( j, SFM_G1 ) && r[j] == 0 )
     183             :             {
     184        1549 :                 r[j] = 1;
     185        1549 :                 move16();
     186        1549 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     187        1549 :                 IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
     188             :                 {
     189        1549 :                     BREAK;
     190             :                 }
     191             :             }
     192             :         }
     193             :     }
     194             : 
     195       10849 :     IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
     196             :     {
     197       35395 :         FOR( i = 0; i <= N; i++ )
     198             :         {
     199       34906 :             j = idx[i]; /* Q0 */
     200       34906 :             move16();
     201       34906 :             test();
     202       34906 :             IF( LT_16( j, SFM_G1 ) && EQ_16( r[j], 1 ) )
     203             :             {
     204         958 :                 r[j] = 2; /* Q0 */
     205         958 :                 move16();
     206         958 :                 sum = sub( sum, sfmsize[j] ); /* Q0 */
     207         958 :                 IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
     208             :                 {
     209         942 :                     BREAK;
     210             :                 }
     211             :             }
     212             :         }
     213             :     }
     214             : 
     215       10849 :     return;
     216             : }
     217             : 
     218             : #define WMC_TOOL_SKIP
     219             : 
     220             : /*-------------------------------------------------------------------*
     221             :  * BitAllocF()
     222             :  *
     223             :  * Fractional bit allocation
     224             :  *-------------------------------------------------------------------*/
     225             : 
     226        1502 : 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        1502 :     Word16 i, n, Nmin, Bits, bs, low_rate = 0;
     240        1502 :     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        1502 :     Flag Overflow = 0;
     250        1502 :     move32();
     251             : #endif
     252             : 
     253        1502 :     set32_fx( Rsubband_w32_fx, 0, NB_SFM );
     254             : 
     255        1502 :     fac = 3;
     256        1502 :     move16();
     257             : 
     258        1502 :     IF( LT_32( bit_rate, 32000 ) )
     259             :     {
     260        1502 :         bs = 2;
     261        1502 :         move16();
     262             :     }
     263             :     ELSE
     264             :     {
     265           0 :         bs = 3;
     266           0 :         move16();
     267             :     }
     268        1502 :     low_rate = 1;
     269        1502 :     move16();
     270             : 
     271        1502 :     Nmin = N; /* Q0 */
     272        1502 :     move16();
     273        1502 :     if ( GT_16( Nmin, SFM_N ) )
     274             :     {
     275        1502 :         Nmin = SFM_N; /* Q0 */
     276        1502 :         move16();
     277             :     }
     278             : 
     279             :     /* Initial bits distribution */
     280        1502 :     test();
     281        1502 :     IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
     282             :     {
     283             :         /* Initial bits distribution */
     284        1348 :         L_tmp1 = 0;
     285        1348 :         move16();
     286        1348 :         m_fx = 0;
     287        1348 :         move16();
     288       37744 :         FOR( i = 0; i < num_env_bands; i++ )
     289             :         {
     290       36396 :             L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
     291             :         }
     292        1348 :         L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
     293             : 
     294        1348 :         t_fx = L_deposit_l( 0 );
     295        1348 :         n = 0;
     296        1348 :         move16();
     297        1348 :         tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); /* Q0 */
     298        1348 :         exp1 = norm_s( tmp );
     299        1348 :         tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
     300        1348 :         exp2 = norm_s( tmp );
     301        1348 :         tmp = shl( tmp, exp2 );
     302        1348 :         exp1 = add( 29, sub( exp2, exp1 ) );
     303             : 
     304       53920 :         FOR( i = 0; i < N; i++ )
     305             :         {
     306       52572 :             L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[num_env_bands - 1] ), L_tmp1 ); /* Q0 */
     307       52572 :             Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
     308       52572 :             move32(); /*Q0*/
     309       52572 :             IF( Rsubband_w32_fx[i] > 0 )
     310             :             {
     311       29583 :                 n = add( n, Nb[i] );
     312       29583 :                 Rsubband_w32_fx[i] = Mult_32_16( Rsubband_w32_fx[i], tmp );
     313       29583 :                 move32();                                                          /*exp1 - 15*/
     314       29583 :                 Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/
     315             : 
     316       29583 :                 t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/
     317             :             }
     318             :             ELSE
     319             :             {
     320       22989 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     321       22989 :                 move32();
     322             :             }
     323             :         }
     324             :     }
     325             :     ELSE
     326             :     {
     327             :         /* Initial bits distribution */
     328         154 :         L_tmp1 = 0;
     329         154 :         move16();
     330         154 :         m_fx = 0;
     331         154 :         move16();
     332        6160 :         FOR( i = 0; i < N; i++ )
     333             :         {
     334        6006 :             L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
     335             :         }
     336         154 :         L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
     337             : 
     338             : 
     339         154 :         t_fx = L_deposit_l( 0 );
     340         154 :         n = 0;
     341         154 :         move16();
     342         154 :         tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); /* Q0 */
     343         154 :         exp1 = norm_s( tmp );
     344         154 :         tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
     345         154 :         exp2 = norm_s( tmp );
     346         154 :         tmp = shl( tmp, exp2 );
     347         154 :         exp1 = add( 29, sub( exp2, exp1 ) );
     348        6160 :         FOR( i = 0; i < N; i++ )
     349             :         {
     350        6006 :             L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); /* Q0 */
     351        6006 :             Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
     352        6006 :             move32(); /*Q0*/
     353        6006 :             IF( Rsubband_w32_fx[i] > 0 )
     354             :             {
     355        4151 :                 n = add( n, Nb[i] );
     356        4151 :                 L_tmp3 = Mult_32_16( Rsubband_w32_fx[i], tmp );        /*exp1 - 15*/
     357        4151 :                 Rsubband_w32_fx[i] = L_shl( L_tmp3, sub( 30, exp1 ) ); /*Q15*/
     358        4151 :                 move32();
     359             : 
     360        4151 :                 t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q15*/
     361             :             }
     362             :             ELSE
     363             :             {
     364        1855 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     365        1855 :                 move32();
     366             :             }
     367             :         }
     368             :     }
     369             : 
     370             :     /* Distribute the remaining bits to subbands with non-zero bits */
     371        1502 :     B_fx = L_shl( B, 15 );
     372        3405 :     WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
     373             :     {
     374        1903 :         L_tmp1 = L_sub( t_fx, B_fx );
     375        1903 :         exp1 = sub( norm_l( L_tmp1 ), 1 );
     376        1903 :         exp2 = norm_s( n );
     377        1903 :         tmp = div_s( extract_h( L_shl( L_tmp1, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
     378        1903 :         m_fx = shl_sat( tmp, sub( exp2, exp1 ) );                          /*Q14*/
     379        1903 :         t_fx = L_deposit_l( 0 );
     380        1903 :         n = 0;
     381        1903 :         move16();
     382       76120 :         FOR( i = 0; i < N; i++ )
     383             :         {
     384       74217 :             IF( Rsubband_w32_fx[i] > 0 )
     385             :             {
     386       41300 :                 Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
     387       41300 :                 move32();
     388             : 
     389       41300 :                 IF( Rsubband_w32_fx[i] > 0 )
     390             :                 {
     391       39816 :                     n = add( n, Nb[i] );
     392             : 
     393       39816 :                     t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
     394             :                 }
     395             :                 ELSE
     396             :                 {
     397        1484 :                     Rsubband_w32_fx[i] = L_deposit_l( 0 );
     398        1484 :                     move32();
     399             :                 }
     400             :             }
     401             :         }
     402             :     }
     403        1502 :     Bits = B; /* Q0 */
     404        1502 :     move16();
     405             : 
     406             :     /* Impose bit-constraints to subbands with less than minimum bits*/
     407        1502 :     t_fx = L_deposit_l( 0 );
     408        1502 :     n = 0;
     409        1502 :     move16();
     410       60080 :     FOR( i = 0; i < N; i++ )
     411             :     {
     412       58578 :         IF( Rsubband_w32_fx[i] > 0 )
     413             :         {
     414       32250 :             test();
     415       32250 :             IF( ( LT_32( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) ) && ( EQ_16( low_rate, 1 ) ) )
     416             :             {
     417        6737 :                 Rsubband_w32_fx[i] = L_deposit_l( 0 );
     418        6737 :                 move32();
     419             :             }
     420       25513 :             ELSE IF( LE_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     421             :             {
     422        8138 :                 B = sub( B, Nb[i] );                     /* Q0 */
     423        8138 :                 Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
     424        8138 :                 move32();
     425             :             }
     426             :             ELSE
     427             :             {
     428       17375 :                 n = add( n, Nb[i] );                      /* Q0 */
     429       17375 :                 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        3428 :     WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
     436             :     {
     437        1988 :         L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) );
     438        1988 :         L_tmp2 = L_abs( L_tmp1 );
     439             : 
     440        1988 :         IF( n > 0 )
     441             :         {
     442        1988 :             exp1 = sub( norm_l( L_tmp2 ), 1 );
     443        1988 :             exp2 = norm_s( n );
     444        1988 :             tmp = div_s( extract_h( L_shl( L_tmp2, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
     445        1988 :             m_fx = shl_o( tmp, sub( exp2, exp1 ), &Overflow );                 /*Q14*/
     446        1988 :             if ( L_tmp1 < 0 )
     447             :             {
     448         346 :                 m_fx = negate( m_fx );
     449             :             }
     450             : 
     451        1988 :             t_fx = L_deposit_l( 0 );
     452        1988 :             n = 0;
     453        1988 :             move16();
     454       79520 :             FOR( i = 0; i < N; i++ )
     455             :             {
     456       77532 :                 IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     457             :                 {
     458       21070 :                     Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
     459       21070 :                     move32();
     460       21070 :                     IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
     461             :                     {
     462       19031 :                         n = add( n, Nb[i] ); /* Q0 */
     463             : 
     464       19031 :                         t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
     465             :                     }
     466             :                     ELSE
     467             :                     {
     468        2039 :                         B = sub( B, Nb[i] ); /* Q0 */
     469             : 
     470        2039 :                         Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
     471        2039 :                         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        1988 :         IF( t_fx == 0 )
     478             :         {
     479         309 :             FOR( i = N - 1; i >= 0; i-- )
     480             :             {
     481         309 :                 IF( Rsubband_w32_fx[i] > 0 )
     482             :                 {
     483          92 :                     B = add( B, Nb[i] ); /* Q0 */
     484          92 :                     Rsubband_w32_fx[i] = L_deposit_l( 0 );
     485          92 :                     move32();
     486          92 :                     IF( B >= 0 )
     487             :                     {
     488          62 :                         BREAK;
     489             :                     }
     490             :                 }
     491             :             }
     492          62 :             BREAK;
     493             :         }
     494             :     }
     495             : 
     496             :     /* fine redistribution of over-allocated or under-allocated bits */
     497        1502 :     tmp = 0;
     498        1502 :     move16();
     499       60080 :     FOR( i = 0; i < N; i++ )
     500             :     {
     501       58578 :         Rsubband_fx[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); /* Q3 */
     502       58578 :         move16();
     503       58578 :         tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
     504             :     }
     505             : 
     506        1502 :     B = Bits;
     507        1502 :     B_w16_fx = shl( B, 3 );
     508        1502 :     IF( GT_16( tmp, B_w16_fx ) )
     509             :     {
     510           1 :         tmp = sub( tmp, B_w16_fx );
     511           1 :         FOR( i = 0; i < N; i++ )
     512             :         {
     513           1 :             IF( GE_16( Rsubband_fx[i], add( shl( Nb[i], 3 ), tmp ) ) )
     514             :             {
     515           1 :                 Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
     516           1 :                 move16();
     517           1 :                 BREAK;
     518             :             }
     519             :         }
     520             :     }
     521             :     ELSE
     522             :     {
     523        1501 :         tmp = sub( tmp, B_w16_fx );
     524        1888 :         FOR( i = 0; i < N; i++ )
     525             :         {
     526        1888 :             IF( Rsubband_fx[i] > 0 )
     527             :             {
     528        1501 :                 Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
     529        1501 :                 move16();
     530        1501 :                 BREAK;
     531             :             }
     532             :         }
     533             :     }
     534             : 
     535             :     /* Calcuate total used bits and initialize R to be used for Noise Filling */
     536        1502 :     tmp = 0;
     537        1502 :     move16();
     538       60080 :     FOR( i = 0; i < N; i++ )
     539             :     {
     540       58578 :         tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
     541       58578 :         R[i] = shr( Rsubband_fx[i], 3 );  /* Q0 */
     542       58578 :         move16();
     543             :     }
     544        1502 :     return shr( tmp, 3 );
     545             : }
     546             : /*-------------------------------------------------------------------*
     547             :  * Bit_group()
     548             :  *
     549             :  * bit allocation in group
     550             :  *-------------------------------------------------------------------*/
     551        2472 : 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        2472 :     Word32 R_temp_fx[16], R_sum_fx = 0, R_sum_org_fx = 0, Bits_avg_fx = 0;
     565             :     Word32 L_tmp;
     566        2472 :     move32();
     567        2472 :     move32();
     568        2472 :     move32();
     569             : 
     570             :     /* initialization for bit allocation in one group*/
     571        2472 :     tmp = 6554;
     572        2472 :     move16(); /*Q15  1/5    */
     573        2472 :     if ( EQ_16( thr, 5 ) )
     574             :     {
     575         824 :         tmp = 6554;
     576         824 :         move16(); /*Q15  1/5    */
     577             :     }
     578        2472 :     if ( EQ_16( thr, 6 ) )
     579             :     {
     580         824 :         tmp = 5462;
     581         824 :         move16(); /*Q15  1/6 */
     582             :     }
     583        2472 :     if ( EQ_16( thr, 7 ) )
     584             :     {
     585         824 :         tmp = 4682;
     586         824 :         move16(); /*Q15  1/7 */
     587             :     }
     588        2472 :     bit_band = mult( tmp, Bits ); /*0+15-15=0, Q0 */
     589        2472 :     band_num = sub( end_band, start_band );
     590             : 
     591       23896 :     FOR( i = 0; i < band_num; i++ )
     592             :     {
     593       21424 :         y_index[i] = y[i + start_band]; /* Q0 */
     594       21424 :         move16();
     595       21424 :         index[i] = i;
     596       21424 :         move16();
     597             :     }
     598             : 
     599             :     /* Rearrange norm vector in decreasing order */
     600        2472 :     reordvct_fx( y_index, band_num, index );
     601             :     /* norm vector modification */
     602             : 
     603        2472 :     factor_fx = div_s( 1, band_num ); /*Q15 */
     604        2472 :     IF( GT_16( thr, 5 ) )
     605             :     {
     606        9888 :         FOR( i = 0; i < band_num; i++ )
     607             :         {
     608        8240 :             L_tmp = L_mult( i, factor_fx );              /*Q16 */
     609        8240 :             tmp = extract_h( L_shl( L_tmp, 13 ) );       /*Q13 */
     610        8240 :             tmp = sub( fac_fx[1], tmp );                 /*Q13 */
     611        8240 :             L_tmp = L_mult( y_index[i], tmp );           /*Q14 */
     612        8240 :             y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
     613        8240 :             move16();
     614             :         }
     615             :     }
     616             :     ELSE
     617             :     {
     618       14008 :         FOR( i = 0; i < band_num; i++ )
     619             :         {
     620       13184 :             L_tmp = L_mult( i, factor_fx );              /*Q16 */
     621       13184 :             tmp = extract_h( L_shl( L_tmp, 13 ) );       /*Q13 */
     622       13184 :             tmp = sub( fac_fx[0], tmp );                 /*Q13 */
     623       13184 :             L_tmp = L_mult( y_index[i], tmp );           /*Q14 */
     624       13184 :             y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
     625       13184 :             move16();
     626             :         }
     627             :     }
     628             : 
     629             :     /* bit allocation based on modified norm */
     630        2472 :     L_tmp = L_mult( band_num, 24576 );    /*Q16 */
     631        2472 :     tmp = extract_h( L_shl( L_tmp, 7 ) ); /*Q7 */
     632        2472 :     IF( GE_16( shl( bit_band, 7 ), tmp ) )
     633             :     {
     634       22678 :         FOR( j = 0; j < band_num; j++ )
     635             :         {
     636       20444 :             if ( y_index[j] < 0 )
     637             :             {
     638         336 :                 y_index[j] = 0;
     639         336 :                 move16();
     640             :             }
     641       20444 :             R_temp_fx[j] = 2097152;
     642       20444 :             move16(); /*Q21 = 1     move16(); */
     643             :         }
     644             : 
     645        2234 :         i = sub( band_num, 1 );
     646        2234 :         norm_sum = 0; /*Q0 */
     647       22678 :         FOR( k = 0; k <= i; k++ )
     648             :         {
     649       20444 :             norm_sum = add( norm_sum, y_index[k] );
     650             :         }
     651             : 
     652        4856 :         FOR( j = 0; j < band_num; j++ )
     653             :         {
     654        4856 :             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        4856 :                 exp = norm_s( norm_sum );
     665        4856 :                 tmp = shl( norm_sum, exp );        /*Q(exp) */
     666        4856 :                 tmp = div_s( 16384, tmp );         /*Q(15+14-exp) */
     667        4856 :                 Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
     668             : 
     669       47166 :                 FOR( k = 0; k <= i; k++ )
     670             :                 {
     671       42310 :                     L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
     672       42310 :                     L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
     673             : 
     674       42310 :                     R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
     675       42310 :                     move32(); /*Q21 */
     676             :                 }
     677             :             }
     678             : 
     679        4856 :             L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
     680        4856 :             IF( LT_32( R_temp_fx[i], L_tmp ) )
     681             :             {
     682        2622 :                 R_temp_fx[i] = L_deposit_h( 0 );
     683        2622 :                 move32();
     684        2622 :                 norm_sum = sub( norm_sum, y_index[i] );
     685        2622 :                 i--;
     686             :             }
     687             :             ELSE
     688             :             {
     689        2234 :                 BREAK;
     690             :             }
     691             :         }
     692             :     }
     693             :     ELSE
     694             :     {
     695         526 :         FOR( j = 0; j < bit_band; j++ )
     696             :         {
     697         288 :             if ( y_index[j] < 0 )
     698             :             {
     699           2 :                 y_index[j] = 0;
     700           2 :                 move16();
     701             :             }
     702         288 :             R_temp_fx[j] = 2097152;
     703         288 :             move32(); /*Q21 = 1 */
     704             :         }
     705             : 
     706         930 :         FOR( j = bit_band; j < band_num; j++ )
     707             :         {
     708         692 :             R_temp_fx[j] = L_deposit_l( 0 );
     709         692 :             move32();
     710             :         }
     711             : 
     712         238 :         norm_sum = 0;
     713         238 :         move16();
     714         526 :         FOR( k = 0; k < bit_band; k++ )
     715             :         {
     716         288 :             norm_sum = add( norm_sum, y_index[k] );
     717             :         }
     718             : 
     719         238 :         i = bit_band;
     720         238 :         move16();
     721         396 :         FOR( j = 0; j < bit_band; j++ )
     722             :         {
     723         206 :             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         206 :                 exp = norm_s( norm_sum );
     734         206 :                 tmp = shl( norm_sum, exp );        /*Q(exp) */
     735         206 :                 tmp = div_s( 16384, tmp );         /*Q(15+14-exp) */
     736         206 :                 Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
     737         750 :                 FOR( k = 0; k < i; k++ )
     738             :                 {
     739         544 :                     L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
     740         544 :                     L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
     741             : 
     742         544 :                     R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
     743         544 :                     move32(); /*Q21 */
     744             :                 }
     745             :             }
     746         206 :             R_sum_fx = 0;
     747         206 :             move32();
     748         206 :             L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
     749         652 :             FOR( k = 0; k < i; k++ )
     750             :             {
     751         494 :                 IF( LT_32( R_temp_fx[k], L_tmp ) )
     752             :                 {
     753         146 :                     FOR( m = k; m < i; m++ )
     754             :                     {
     755          98 :                         norm_sum = sub( norm_sum, y_index[m] );
     756          98 :                         R_temp_fx[m] = L_deposit_l( 0 ); /*Q21 */
     757          98 :                         move32();
     758             :                     }
     759          48 :                     i = k;
     760          48 :                     move16();
     761          48 :                     BREAK;
     762             :                 }
     763             :                 ELSE
     764             :                 {
     765         446 :                     R_sum_fx = L_add( R_sum_fx, R_temp_fx[k] ); /* Q21 */
     766             :                 }
     767             :             }
     768         206 :             IF( EQ_32( R_sum_fx, R_sum_org_fx ) )
     769             :             {
     770          48 :                 BREAK;
     771             :             }
     772             : 
     773         158 :             R_sum_org_fx = R_sum_fx;
     774         158 :             move32();
     775             :         }
     776             :     }
     777             : 
     778             :     /*  index comeback */
     779       23896 :     FOR( k = 0; k < band_num; k++ )
     780             :     {
     781       21424 :         j = index[k];
     782       21424 :         move16();
     783       21424 :         Rsubband_fx[j + start_band] = R_temp_fx[k]; /* Q21 */
     784       21424 :         move32();
     785             :     }
     786             : 
     787        2472 :     return;
     788             : }
     789             : 
     790             : /*-------------------------------------------------------------------*
     791             :  * BitAllocWB()
     792             :  *
     793             :  * WB bit allocation
     794             :  *-------------------------------------------------------------------*/
     795             : 
     796         824 : 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         824 :     Word16 Rsum_sub_fx_tmp = 0; /* initialize just to avoid compiler warning */
     812         824 :     move16();
     813             :     Word32 L_tmp, L_tmp1;
     814             :     Word32 Rsubband_buf[NB_SFM];
     815             : 
     816         824 :     BANDS = N;
     817         824 :     move16();
     818         824 :     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       22248 :     FOR( k = 0; k < BANDS; k++ )
     825             :     {
     826       21424 :         Rsubband_buf[k] = 2097152;
     827       21424 :         move32(); /*Q21 */
     828             :     }
     829             :     /* Calculate the norm sum and average of sub-band */
     830         824 :     Rsum_sub_fx[0] = 0;
     831         824 :     move16();
     832       14008 :     FOR( j = 0; j < SFM_G1; j++ )
     833             :     {
     834       13184 :         if ( y[j] > 0 )
     835             :         {
     836       12841 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[0], y[j] ); /*Q0 */
     837             :         }
     838       13184 :         if ( y[j] > 0 )
     839             :         {
     840       12841 :             Rsum_sub_fx[0] = Rsum_sub_fx_tmp;
     841       12841 :             move16(); /*Q0 */
     842             :         }
     843             :     }
     844         824 :     Ravg_sub_32_fx[0] = L_mult( Rsum_sub_fx[0], 2048 );
     845         824 :     move32(); /*Q16  0+15+1   //q15 1/16 =2048 */
     846             : 
     847         824 :     Rsum_sub_fx[1] = 0;
     848         824 :     move16();
     849        7416 :     FOR( j = SFM_G1; j < SFM_G1G2; j++ )
     850             :     {
     851        6592 :         if ( y[j] > 0 )
     852             :         {
     853        6069 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[1], y[j] ); /*Q0 */
     854             :         }
     855        6592 :         if ( y[j] > 0 )
     856             :         {
     857        6069 :             Rsum_sub_fx[1] = Rsum_sub_fx_tmp;
     858        6069 :             move16(); /*Q0 */
     859             :         }
     860             :     }
     861         824 :     Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16  0+15+1   //q15 1/8 =4096 */
     862         824 :     move32();
     863         824 :     Rsum_sub_fx[2] = 0;
     864         824 :     move16();
     865        2472 :     FOR( j = SFM_G1G2; j < BANDS; j++ )
     866             :     {
     867        1648 :         if ( y[j] > 0 )
     868             :         {
     869        1504 :             Rsum_sub_fx_tmp = add( Rsum_sub_fx[2], y[j] ); /*Q0 */
     870             :         }
     871        1648 :         if ( y[j] > 0 )
     872             :         {
     873        1504 :             Rsum_sub_fx[2] = Rsum_sub_fx_tmp;
     874        1504 :             move16(); /*Q0 */
     875             :         }
     876             :     }
     877         824 :     tmp = div_s( 1, BANDS - SFM_G1G2 ); /*Q15 */
     878         824 :     Ravg_sub_32_fx[2] = L_mult( Rsum_sub_fx[2], tmp );
     879         824 :     move32(); /*Q16 */
     880             : 
     881             :     /* Bit allocation for every group */
     882         824 :     tmp = add( Rsum_sub_fx[0], Rsum_sub_fx[1] );
     883         824 :     Rsum_fx = add( tmp, Rsum_sub_fx[2] ); /*Q0     */
     884             : 
     885         824 :     factor_fx[0] = 16384; /*Q13     move16(); */
     886         824 :     factor_fx[1] = 24576; /*Q13     move16(); */
     887         824 :     move16();
     888         824 :     move16();
     889             :     {
     890         824 :         R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] );
     891         824 :         move32(); /*Q16 */
     892         824 :         R_diff_32_fx[1] = L_sub( Ravg_sub_32_fx[1], Ravg_sub_32_fx[2] );
     893         824 :         move32(); /*Q16 */
     894             : 
     895         824 :         test();
     896         824 :         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         518 :             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         518 :                 exp = norm_s( Rsum_fx );
     910         518 :                 tmp = shl( Rsum_fx, exp );                       /*Q(exp) */
     911         518 :                 tmp = div_s( 16384, tmp );                       /*Q(15+14-exp) */
     912         518 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[0] );            /*Q1 */
     913         518 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     914         518 :                 B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     915         518 :                 test();
     916         518 :                 if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
     917             :                 {
     918          34 :                     B1 = add( B1, 1 );
     919             :                 }
     920         518 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[1] );            /*Q1 */
     921         518 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     922         518 :                 B2 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     923         518 :                 test();
     924         518 :                 if ( GT_32( L_tmp1, L_mult( B2, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B2, 1 ), Rsum_fx ) ) )
     925             :                 {
     926          10 :                     B2 = add( B2, 1 );
     927             :                 }
     928         518 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[2] );            /*Q1 */
     929         518 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
     930         518 :                 B3 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
     931         518 :                 test();
     932         518 :                 if ( GT_32( L_tmp1, L_mult( B3, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B3, 1 ), Rsum_fx ) ) )
     933             :                 {
     934           8 :                     B3 = add( B3, 1 );
     935             :                 }
     936             :             }
     937         518 :             IF( GT_32( Ravg_sub_32_fx[2], 786432 /* 12 in Q16 */ ) )
     938             :             {
     939         179 :                 B_saved = 0;
     940         179 :                 move16();
     941         179 :                 IF( GT_16( B1, 288 ) )
     942             :                 {
     943          27 :                     B_saved = sub( B1, 288 ); /* Q0 */
     944          27 :                     B1 = 288;
     945          27 :                     move16();
     946             :                 }
     947             : 
     948         179 :                 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         179 :                 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         179 :                 IF( B_saved > 0 )
     965             :                 {
     966          27 :                     IF( EQ_16( B1, 288 ) )
     967             :                     {
     968          27 :                         tmp = shr( B_saved, 1 ); /* Q0 */
     969          27 :                         B2 = add( B2, tmp );     /* Q0 */
     970          27 :                         tmp = sub( B, B1 );      /* Q0 */
     971          27 :                         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         518 :             factor_fx[0] = 16384;
     992         518 :             move16(); /*Q13 */
     993         518 :             factor_fx[1] = 12288;
     994         518 :             move16(); /*Q13 */
     995             :         }
     996             :         ELSE
     997             :         {
     998         306 :             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         306 :                 exp = norm_s( Rsum_fx );
    1010         306 :                 tmp = shl( Rsum_fx, exp );                       /*Q(exp) */
    1011         306 :                 tmp = div_s( 16384, tmp );                       /*Q(15+14-exp) */
    1012         306 :                 L_tmp1 = L_mult( B, Rsum_sub_fx[0] );            /*Q1 */
    1013         306 :                 L_tmp = Mult_32_16( L_tmp1, tmp );               /*Q(15-exp) */
    1014         306 :                 B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
    1015         306 :                 test();
    1016         306 :                 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         306 :                 L_tmp1 = Mult_32_16( 1975684956, shl( B, 5 ) );          /*Q(31+5-15=21) */
    1021         306 :                 L_tmp1 = Mult_32_16( L_tmp1, shl( Rsum_sub_fx[1], 7 ) ); /*Q(21+7-15=13) */
    1022         306 :                 L_tmp = Mult_32_16( L_tmp1, tmp );                       /*Q(27-exp) */
    1023         306 :                 B2 = extract_h( L_shl( L_tmp, sub( exp, 11 ) ) );        /*Q0 */
    1024         306 :                 test();
    1025         306 :                 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         306 :                 tmp = sub( B, B1 );  /* Q0 */
    1030         306 :                 B3 = sub( tmp, B2 ); /* Q0 */
    1031             :             }
    1032             :         }
    1033             :     }
    1034             : 
    1035         824 :     IF( LT_16( Rsum_sub_fx[2], 3 ) )
    1036             :     {
    1037          94 :         B2 = add( B2, B3 ); /* Q0 */
    1038          94 :         B3 = 0;
    1039          94 :         move16();
    1040             :     }
    1041             : 
    1042             :     /* Bit allocation in group */
    1043         824 :     Bit_group_fx( y, 0, SFM_G1, B1, 5, Rsubband_buf, factor_fx );
    1044         824 :     Bit_group_fx( y, SFM_G1, SFM_G1G2, B2, 6, Rsubband_buf, factor_fx );
    1045         824 :     Bit_group_fx( y, SFM_G1G2, BANDS, B3, 7, Rsubband_buf, factor_fx );
    1046       22248 :     FOR( i = 0; i < BANDS; i++ )
    1047             :     {
    1048       21424 :         Rsubband_fx[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); /* Q3 */
    1049       21424 :         move16();
    1050             :     }
    1051             : 
    1052             :     /* Calcuate total used bits and initialize R to be used for Noise Filling */
    1053         824 :     L_tmp = L_deposit_l( 0 );
    1054       22248 :     FOR( i = 0; i < N; i++ )
    1055             :     {
    1056       21424 :         L_tmp = L_add( L_tmp, Rsubband_buf[i] );         /*Q21 */
    1057       21424 :         R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */
    1058       21424 :         move16();
    1059             :     }
    1060         824 :     t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */
    1061             : 
    1062         824 :     return (Word16) t_fx;
    1063             : }
    1064             : 
    1065             : #undef WMC_TOOL_SKIP

Generated by: LCOV version 1.14