LCOV - code coverage report
Current view: top level - lib_com - tcq_position_arith_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 4c82f1d24d39d0296b18d775f18a006f4c7d024b Lines: 446 1417 31.5 %
Date: 2025-05-17 01:59:02 Functions: 16 34 47.1 %

          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 "stl.h"
       8             : 
       9             : #include "rom_com.h"
      10             : #include "prot_fx.h"
      11             : 
      12       13737 : Word32 ar_div(
      13             :     Word32 num,
      14             :     Word32 denum )
      15             : {
      16             :     Word16 exp1, exp2, exp, i;
      17             :     Word32 varout;
      18             :     Word32 sign;
      19             : 
      20       13737 :     sign = L_and( L_xor( num, denum ), (Word32) 0x80000000 );
      21             : 
      22       13737 :     num = L_abs( num );
      23       13737 :     denum = L_abs( denum );
      24             : 
      25       13737 :     test();
      26       13737 :     IF( LT_32( num, denum ) || denum == 0 )
      27             :     {
      28        1622 :         return 0;
      29             :     }
      30       12115 :     ELSE IF( EQ_32( num, denum ) )
      31             :     {
      32           0 :         return 1;
      33             :     }
      34             :     ELSE
      35             :     {
      36       12115 :         exp1 = norm_l( num );
      37       12115 :         exp2 = norm_l( denum );
      38       12115 :         exp = sub( exp2, exp1 );
      39       12115 :         denum = L_shl( denum, exp );
      40       12115 :         exp = add( exp, 1 );
      41       12115 :         varout = L_deposit_l( 0 );
      42      213661 :         FOR( i = 0; i < exp; i++ )
      43             :         {
      44      201546 :             num = L_sub( num, denum );
      45      201546 :             varout = L_shl( varout, 1 );
      46      201546 :             IF( num >= 0 )
      47             :             {
      48      100581 :                 num = L_shl( num, 1 );
      49      100581 :                 varout = L_add( varout, 1 );
      50             :             }
      51             :             ELSE
      52             :             {
      53      100965 :                 num = L_add( num, denum );
      54      100965 :                 num = L_shl( num, 1 );
      55             :             }
      56             :         }
      57             :     }
      58             : 
      59       12115 :     if ( sign != 0 )
      60             :     {
      61           0 :         varout = L_negate( varout );
      62             :     }
      63             : 
      64       12115 :     return varout;
      65             : }
      66             : 
      67           0 : static void bitstream_save_bit(
      68             :     TCQ_PBITSTREAM pBS,
      69             :     Word32 bit )
      70             : {
      71             :     UWord8 cur;
      72             : 
      73           0 :     cur = pBS->buf[pBS->numByte];
      74           0 :     move16();
      75             : 
      76             : 
      77           0 :     cur = (UWord8) ( cur | L_shl( bit, pBS->curPos ) );
      78           0 :     move16();
      79           0 :     pBS->curPos = sub( pBS->curPos, 1 );
      80           0 :     move16();
      81           0 :     pBS->buf[pBS->numByte] = cur;
      82           0 :     move16();
      83           0 :     pBS->numbits = L_add( pBS->numbits, 1 );
      84           0 :     move32();
      85           0 :     IF( pBS->curPos < 0 )
      86             :     {
      87           0 :         pBS->curPos = 7;
      88           0 :         move16();
      89           0 :         pBS->numByte = L_add( pBS->numByte, 1 );
      90           0 :         move32();
      91             :     }
      92             : 
      93           0 :     return;
      94             : }
      95             : 
      96        4789 : static UWord32 bitstream_load_bit(
      97             :     TCQ_PBITSTREAM pBS )
      98             : {
      99             :     UWord32 bit;
     100             :     Word16 *curPos;
     101             : 
     102             :     /* safety check in case of bit errors */
     103        4789 :     IF( GE_32( pBS->numByte, pBS->maxBytes ) )
     104             :     {
     105           0 :         return 0;
     106             :     }
     107             : 
     108        4789 :     curPos = &pBS->curPos;
     109        4789 :     bit = UL_and( UL_lshr( pBS->buf[pBS->numByte], ( *curPos ) ), 0x00000001 );
     110        4789 :     *curPos = sub( *curPos, 1 );
     111             : 
     112        4789 :     IF( *curPos < 0 )
     113             :     {
     114         586 :         pBS->numByte = L_add( pBS->numByte, 1 );
     115         586 :         move32();
     116         586 :         *curPos = 7;
     117         586 :         move16();
     118             :     }
     119             : 
     120        4789 :     return bit;
     121             : }
     122             : 
     123          32 : static void bitstream_rollback(
     124             :     TCQ_PBITSTREAM pBS,
     125             :     Word32 numBits )
     126             : {
     127             : 
     128         480 :     FOR( ; numBits > 0; numBits-- )
     129             :     {
     130         448 :         pBS->curPos++;
     131         448 :         move16();
     132         448 :         pBS->numbits = L_sub( pBS->numbits, 1 );
     133         448 :         move32();
     134         448 :         IF( EQ_16( pBS->curPos, 8 ) )
     135             :         {
     136          56 :             pBS->curPos = 0;
     137          56 :             move16();
     138          56 :             pBS->numByte = L_sub( pBS->numByte, 1 );
     139          56 :             move32();
     140             :         }
     141             :     }
     142             : 
     143          32 :     return;
     144             : }
     145           0 : static void transmission_bits(
     146             :     PARCODEC arInst,
     147             :     Word32 bit )
     148             : {
     149           0 :     bitstream_save_bit( arInst->bsInst, bit );
     150           0 :     arInst->num_bits = L_add( arInst->num_bits, 1 );
     151           0 :     move32();
     152           0 :     bit = !bit;
     153           0 :     move32();
     154             : 
     155           0 :     FOR( ; arInst->bits_to_follow > 0 && arInst->num_bits < arInst->max_bits; arInst->bits_to_follow-- )
     156             :     {
     157           0 :         bitstream_save_bit( arInst->bsInst, bit );
     158           0 :         arInst->num_bits = L_add( arInst->num_bits, 1 );
     159           0 :         move32();
     160             :     }
     161             : 
     162           0 :     return;
     163             : }
     164             : 
     165         316 : static Word32 ar_make_model_fx(
     166             :     const Word16 *freq,
     167             :     Word16 *model,
     168             :     const Word16 len )
     169             : {
     170             :     Word16 dist;
     171         316 :     Word32 sum = 0;
     172         316 :     move32();
     173         316 :     Word32 cum = 0;
     174         316 :     move32();
     175             :     Word16 i, tmp;
     176             : 
     177        1312 :     FOR( i = 0; i < len; i++ )
     178             :     {
     179         996 :         sum = L_add( sum, freq[i] );
     180             :     }
     181             : 
     182         316 :     IF( sum == 0 )
     183             :     {
     184           0 :         return 0;
     185             :     }
     186             : 
     187        1628 :     FOR( i = len; i >= 0; i-- )
     188             :     {
     189             :         /*model[i] = (short)( ( cum * MAX_AR_FREQ ) / sum ); */
     190        1312 :         model[i] = extract_l( ar_div( cum * MAX_AR_FREQ, sum ) );
     191        1312 :         move16();
     192        1312 :         if ( i )
     193         996 :             cum = L_add( cum, freq[i - 1] );
     194             :     }
     195             : 
     196         316 :     tmp = sub( len, 1 );
     197         996 :     FOR( i = 0; i < tmp; i++ )
     198             :     {
     199         680 :         dist = sub( model[i], model[i + 1] );
     200             : 
     201         680 :         IF( dist <= 0 )
     202             :         {
     203           0 :             model[i + 1] = add( model[i + 1], sub( dist, 1 ) );
     204           0 :             move16();
     205             :         }
     206             :     }
     207             : 
     208        1312 :     FOR( i = len; i > 0; i-- )
     209             :     {
     210         996 :         dist = sub( model[i - 1], model[i] );
     211             : 
     212         996 :         IF( dist <= 0 )
     213             :         {
     214           0 :             model[i - 1] = sub( model[i - 1], sub( dist, 1 ) );
     215           0 :             move16();
     216             :         }
     217             :     }
     218             : 
     219         316 :     return ( model[0] > model[1] );
     220             : }
     221             : 
     222           0 : void ar_encoder_start_fx(
     223             :     PARCODEC arInst,
     224             :     TCQ_PBITSTREAM bsInst,
     225             :     const Word32 max_bits )
     226             : {
     227           0 :     arInst->bsInst = bsInst;
     228           0 :     move32();
     229             : 
     230           0 :     arInst->low = L_deposit_l( 0 );
     231           0 :     move32();
     232           0 :     arInst->high = AR_TOP;
     233           0 :     move32();
     234           0 :     arInst->bits_to_follow = 0;
     235           0 :     move16();
     236             : 
     237           0 :     arInst->num_bits = L_deposit_l( 0 );
     238           0 :     move32();
     239           0 :     arInst->max_bits = max_bits;
     240           0 :     move32();
     241           0 : }
     242             : 
     243           0 : static void ar_encode_fx(
     244             :     PARCODEC arInst,
     245             :     const Word16 *model,
     246             :     Word32 symbol )
     247             : {
     248             :     Word32 range, high, low;
     249             : 
     250           0 :     high = L_add( arInst->high, 0 );
     251           0 :     low = L_add( arInst->low, 0 );
     252             : 
     253           0 :     symbol = L_add( symbol, 1 );
     254           0 :     range = L_add( L_sub( high, low ), 1 );
     255             : 
     256           0 :     high = L_sub( L_add( low, ar_div( imult3216( range, model[symbol - 1] ), model[0] ) ), 1 );
     257           0 :     low = L_add( low, ar_div( imult3216( range, model[symbol] ), model[0] ) );
     258             : 
     259             :     FOR( ;; )
     260             :     {
     261           0 :         IF( LT_32( high, AR_HALF ) )
     262             :         {
     263           0 :             transmission_bits( arInst, 0 );
     264             :         }
     265             :         ELSE
     266             :         {
     267           0 :             IF( GE_32( low, AR_HALF ) )
     268             :             {
     269           0 :                 transmission_bits( arInst, 1 );
     270             : 
     271           0 :                 low = L_sub( low, AR_HALF );
     272           0 :                 high = L_sub( high, AR_HALF );
     273             :             }
     274             :             ELSE
     275             :             {
     276           0 :                 test();
     277           0 :                 IF( GE_32( low, AR_FIRST ) && LT_32( high, AR_THIRD ) )
     278             :                 {
     279           0 :                     arInst->bits_to_follow = add( arInst->bits_to_follow, 1 );
     280           0 :                     move16();
     281             : 
     282           0 :                     low = L_sub( low, AR_FIRST );
     283           0 :                     high = L_sub( high, AR_FIRST );
     284             :                 }
     285             :                 ELSE
     286             :                 {
     287             :                     BREAK;
     288             :                 }
     289             :             }
     290             :         }
     291             : 
     292           0 :         low = L_shl( low, 1 );
     293           0 :         high = L_add( L_shl( high, 1 ), 1 );
     294             :     }
     295             : 
     296           0 :     arInst->high = high;
     297           0 :     move32();
     298           0 :     arInst->low = low;
     299           0 :     move32();
     300             : 
     301           0 :     return;
     302             : }
     303             : 
     304           0 : static void ar_encode_uniform_fx(
     305             :     PARCODEC arInst,
     306             :     UWord32 data,
     307             :     const Word32 bits )
     308             : {
     309             :     Word32 i;
     310             : 
     311           0 :     FOR( i = 0; i < bits; i++ )
     312             :     {
     313           0 :         ar_encode_fx( arInst, uniform_model, data & 0x1 );
     314           0 :         data = L_lshr( data, 1 );
     315             :     }
     316             : 
     317           0 :     return;
     318             : }
     319             : 
     320           0 : void ar_encoder_done_fx(
     321             :     PARCODEC arInst )
     322             : {
     323           0 :     arInst->bits_to_follow = add( arInst->bits_to_follow, 1 );
     324           0 :     move16();
     325           0 :     transmission_bits( arInst, arInst->low >= AR_FIRST );
     326             : 
     327           0 :     return;
     328             : }
     329             : 
     330          32 : void ar_decoder_start_fx(
     331             :     PARCODEC arInst,
     332             :     TCQ_PBITSTREAM bsInst )
     333             : {
     334             :     Word16 i;
     335             : 
     336          32 :     arInst->bsInst = bsInst;
     337          32 :     move32();
     338             : 
     339          32 :     arInst->low = L_deposit_l( 0 );
     340          32 :     move32();
     341          32 :     arInst->high = AR_TOP;
     342          32 :     move32();
     343          32 :     arInst->value = L_deposit_l( 0 );
     344          32 :     move32();
     345         544 :     FOR( i = 0; i < AR_BITS; i++ )
     346             :     {
     347         512 :         arInst->value = L_add( L_shl( arInst->value, 1 ), bitstream_load_bit( arInst->bsInst ) );
     348         512 :         move32();
     349             :     }
     350             : 
     351          32 :     return;
     352             : }
     353             : 
     354        2691 : static Word16 ar_decode_fx(
     355             :     PARCODEC arInst,
     356             :     const Word16 *model )
     357             : {
     358             :     Word32 range, high, low, value, i;
     359             :     Word16 cum;
     360             :     Word16 symbol;
     361             : 
     362        2691 :     high = L_add( arInst->high, 0 );
     363        2691 :     low = L_add( arInst->low, 0 );
     364        2691 :     value = L_add( arInst->value, 0 );
     365             : 
     366        2691 :     range = L_add( L_sub( high, low ), 1 );
     367             :     /*cum   = (short)( ( ( (unsigned int)( arInst->value - arInst->low ) + 1 ) * model[0] - 1 ) / range ); */
     368        2691 :     cum = extract_l( ar_div( L_sub( imult3216( L_add( L_sub( value, low ), 1 ), model[0] ), 1 ), range ) );
     369             : 
     370        2691 :     symbol = 1;
     371        2691 :     move16();
     372        7204 :     WHILE( GT_16( model[symbol], cum ) )
     373             :     {
     374        4513 :         symbol = add( symbol, 1 );
     375             :     }
     376             : 
     377        2691 :     high = L_sub( L_add( low, ar_div( imult3216( range, model[symbol - 1] ), model[0] ) ), 1 );
     378        2691 :     low = L_add( low, ar_div( imult3216( range, model[symbol] ), model[0] ) );
     379             : 
     380        6968 :     FOR( i = 0; i < 0x7FFF; i++ )
     381             :     {
     382             :         Word32 L_msb_diff, L_msb_low, L_msb_high;
     383             : 
     384        6968 :         L_msb_high = L_shr( high, 14 );
     385        6968 :         L_msb_low = L_shr( low, 14 );
     386        6968 :         L_msb_diff = L_sub( L_msb_high, L_msb_low );
     387        6968 :         IF( GE_32( L_msb_diff, 2 ) )
     388             :         {
     389        2691 :             BREAK;
     390             :         }
     391        4277 :         assert( tab_ari_qnew[L_msb_high][L_msb_low] != 0x0CCC );
     392        4277 :         assert( tab_ari_qnew[L_msb_high][L_msb_low] != 0x0BBB );
     393        4277 :         low = L_msu( low, 1, tab_ari_qnew[L_msb_high][L_msb_low] );
     394        4277 :         low = L_shl( low, 1 );
     395        4277 :         high = L_msu( high, 1, tab_ari_qnew[L_msb_high][L_msb_low] );
     396        4277 :         high = L_add( L_shl( high, 1 ), 1 );
     397        4277 :         value = L_msu( value, 1, tab_ari_qnew[L_msb_high][L_msb_low] );
     398        4277 :         value = L_add( L_shl( value, 1 ), bitstream_load_bit( arInst->bsInst ) );
     399             :     }
     400             : 
     401        2691 :     arInst->low = low;
     402        2691 :     move32();
     403        2691 :     arInst->high = high;
     404        2691 :     move32();
     405        2691 :     arInst->value = value;
     406        2691 :     move32();
     407             : 
     408        2691 :     return ( sub( symbol, 1 ) );
     409             : }
     410             : 
     411          32 : void ar_decoder_done_fx(
     412             :     PARCODEC arInst )
     413             : {
     414          32 :     bitstream_rollback( arInst->bsInst, AR_BITS - 2 );
     415             : 
     416          32 :     return;
     417             : }
     418             : 
     419           0 : static Word16 quantize_fx(
     420             :     Word16 val,
     421             :     const Word16 D )
     422             : {
     423             :     Word16 qval4_fx;
     424             :     Word16 retval_fx;
     425             : 
     426           0 :     val = s_min( val, 32255 ); /* limit input by (2^15 - 1)-2^9 */
     427           0 :     qval4_fx = shr( abs_s( add( val, 512 ) ), 12 );
     428           0 :     retval_fx = add( shl( qval4_fx, 2 ), DDP_fx[D] );
     429             :     /* 2nd zero check */
     430           0 :     IF( D == 0 )
     431             :     {
     432           0 :         if ( GT_16( abs_s( sub( shl( abs_s( retval_fx ), 10 ), abs_s( val ) ) ), abs_s( val ) ) )
     433             :         {
     434           0 :             retval_fx = 0;
     435           0 :             move16();
     436             :         }
     437             :     }
     438             :     /*return retval; */
     439           0 :     return retval_fx;
     440             : }
     441             : 
     442        2138 : static Word32 GetBitsFromPulses_fx(
     443             :     Word16 m,
     444             :     Word16 n )
     445             : {
     446             :     Word16 i, tmp, integer_fx, temp_fx1, temp_fx2, exp1, exp2;
     447             :     Word32 temp32;
     448             :     Word32 frac_fx32;
     449             :     Word32 logCoeff_fx;
     450        2138 :     Word16 exp = 0;
     451        2138 :     Word32 mantissa_fx = 0;
     452        2138 :     move16();
     453        2138 :     move32();
     454             : 
     455        2138 :     IF( m == 0 )
     456             :     {
     457          23 :         return 0;
     458             :     }
     459             : 
     460        2115 :     tmp = s_min( m, n );
     461       10102 :     FOR( i = 0; i < tmp; i++ )
     462             :     {
     463        7987 :         logCoeff_fx = L_add( L_shl( i + 1, 16 ), L_sub( table_logcum_fx[n + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[n - i] ) ) );
     464        7987 :         logCoeff_fx = L_add( logCoeff_fx, L_sub( table_logcum_fx[m], L_add( table_logcum_fx[i + 1], table_logcum_fx[m - i] ) ) ); /*Q16 */
     465        7987 :         integer_fx = extract_h( logCoeff_fx );                                                                                    /*Q0 */
     466        7987 :         frac_fx32 = L_sub( logCoeff_fx, L_shl( integer_fx, 16 ) );                                                                /*Q16 */
     467             : 
     468             :         /*ln2, 0.987, ln2 * ln2, 0.977 */
     469             :         /*temp1 = (int) (frac / 0.0625); */
     470             :         /*temp2 = frac - (float)temp1 * 0.0625f; */
     471             : 
     472             :         /* frac = pow(2.0, temp1 * 0.0625) * (1 + 0.693 * temp2 + 0.480 * temp2 * temp2 * 0.5);*/
     473             :         /*frac = pow_getbitsfrompulses[temp1] * (1 + 0.693f * temp2 + 0.480f * temp2 * temp2 * 0.5f); */
     474             : 
     475        7987 :         temp_fx1 = extract_h( L_shl( frac_fx32, 4 ) );
     476        7987 :         temp_fx2 = extract_l( L_and( frac_fx32, 0xfff ) ); /*Q16   */
     477             : 
     478        7987 :         frac_fx32 = L_mac( Mult_32_16( L_mult0( temp_fx2, temp_fx2 ), 7864 ), temp_fx2, 22708 ); /*Q32 */
     479        7987 :         frac_fx32 = L_add( 0x40000000, L_shr( frac_fx32, 2 ) );                                  /*30 */
     480             : 
     481        7987 :         exp1 = norm_l( pow_getbitsfrompulses_fx[temp_fx1] );
     482        7987 :         exp2 = norm_l( frac_fx32 );
     483        7987 :         frac_fx32 = Mult_32_32( L_shl( pow_getbitsfrompulses_fx[temp_fx1], exp1 ), L_shl( frac_fx32, exp2 ) ); /*21 + exp1 + 30 + exp2 - 31 */
     484        7987 :         frac_fx32 = L_add( L_shr( frac_fx32, add( exp1, exp2 ) ), 1 );                                         /*20 */
     485             : 
     486        7987 :         IF( LT_16( exp, integer_fx ) )
     487             :         {
     488        7030 :             mantissa_fx = L_shr( mantissa_fx, sub( integer_fx, exp ) );
     489        7030 :             mantissa_fx = L_add( mantissa_fx, frac_fx32 );
     490             : 
     491        7030 :             exp = integer_fx;
     492        7030 :             move16();
     493             :         }
     494             :         ELSE
     495             :         {
     496         957 :             mantissa_fx = L_add( mantissa_fx, L_shr( frac_fx32, sub( exp, integer_fx ) ) );
     497             :         }
     498        7987 :         IF( GE_32( mantissa_fx, 0x200000 ) )
     499             :         {
     500        1663 :             exp = add( exp, 1 );
     501             : 
     502        1663 :             mantissa_fx = L_shr( mantissa_fx, 1 );
     503             :         }
     504             :     }
     505             : 
     506        2115 :     mantissa_fx = L_shl( mantissa_fx, 2 ); /*22 */
     507        2115 :     temp_fx1 = extract_h( mantissa_fx );
     508             :     /*temp_fx2 = extract_h(L_shl(L_sub(mantissa_fx, L_deposit_h(temp_fx1)), 15)); // 15 */
     509        2115 :     temp32 = L_shl( L_sub( mantissa_fx, L_deposit_h( temp_fx1 ) ), 15 ); /*31 */
     510        2115 :     exp1 = sub( norm_l( temp32 ), 1 );
     511        2115 :     temp32 = ar_div( L_shl( temp32, exp1 ), temp_fx1 ); /*31 + exp1 */
     512        2115 :     temp32 = L_shr( temp32, exp1 + 1 );                 /*30 */
     513             : 
     514        2115 :     frac_fx32 = L_sub( 0x40000000, L_shr( temp32, 1 ) ); /*30 */
     515        2115 :     frac_fx32 = Mult_32_32( frac_fx32, temp32 );         /*29 */
     516        2115 :     frac_fx32 = L_shr( frac_fx32, 13 );                  /*16 */
     517        2115 :     exp1 = norm_l( temp_fx1 );
     518        2115 :     temp_fx1 = Log2_norm_lc( L_shl( temp_fx1, exp1 ) );         /*15 */
     519        2115 :     frac_fx32 = frac_fx32 + Mult_32_32( frac_fx32, 950680361 ); /* frac_fx32 *= 1/ln(2) */
     520        2115 :     return L_add( L_deposit_h( exp ), L_add( L_shl( temp_fx1, 1 ), frac_fx32 ) );
     521             :     /*return exp + (float)temp_fx1 / pow(2.0, 15) + (float)frac_fx32 / pow(2.0, 16); */
     522             : }
     523             : 
     524           0 : static void TCQnew_fx(
     525             :     Word32 *v_fx,
     526             :     Word32 scale_fx,
     527             :     Word16 Qscale,
     528             :     Word16 length,
     529             :     Word16 *vout_fx,
     530             :     Word16 pulses,
     531             :     Word16 *pulsesout,
     532             :     Word16 *nzposout,
     533             :     Word32 *savedstates,
     534             :     Word32 *lasttrellislevel,
     535             :     Word32 terminate )
     536             : {
     537             :     Word16 i, st, dminpos, position;
     538           0 :     Word16 pulsesnum, nzpos = 0;
     539           0 :     move16();
     540             :     Word32 metric_fx[STATES][TCQ_MAX_BAND_SIZE];
     541             :     Word16 path_fx[STATES][TCQ_MAX_BAND_SIZE];
     542             :     Word16 quant_fx[STATES][TCQ_MAX_BAND_SIZE];
     543             :     Word16 pused_fx[STATES][TCQ_MAX_BAND_SIZE];
     544             :     Word16 quantum1_fx, quantum2_fx, newdist1_fx, newdist2_fx /*, signq_fx*/;
     545             :     Word32 /*scale_fx, */ tmp32, dmin_fx, curdist1_fx, curdist2_fx;
     546             :     Word16 value_fx, exp;
     547             :     Word16 exp1, exp2;
     548             : 
     549           0 :     set32_fx( *metric_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
     550           0 :     set16_fx( *path_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
     551           0 :     set16_fx( *quant_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
     552           0 :     set16_fx( *pused_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
     553             : 
     554             :     /* Initialize metric */
     555           0 :     FOR( st = 1; st < STATES; st++ )
     556             :     {
     557           0 :         metric_fx[st][0] = MAX_32 >> 1;
     558           0 :         move32();
     559             :     }
     560           0 :     FOR( st = 2; st < STATES; st++ )
     561             :     {
     562           0 :         metric_fx[st][1] = MAX_32 >> 1;
     563           0 :         move32();
     564             :     }
     565           0 :     FOR( st = 4; st < STATES; st++ )
     566             :     {
     567           0 :         metric_fx[st][2] = MAX_32 >> 1;
     568           0 :         move32();
     569             :     }
     570             :     /* Viterbi for input sequence */
     571           0 :     FOR( i = 0; i < length; i++ ) /* cycle over symbols */
     572             :     {
     573           0 :         FOR( st = 0; st < STATES; st++ ) /* cycle over conditions */
     574             :         {
     575           0 :             curdist1_fx = L_add( metric_fx[step_tcq[st][0]][i], 0 );
     576           0 :             curdist2_fx = L_add( metric_fx[step_tcq[st][1]][i], 0 );
     577             : 
     578           0 :             exp = norm_l( scale_fx );
     579           0 :             tmp32 = L_shl( scale_fx, exp );
     580           0 :             tmp32 = Mult_32_16( v_fx[i], extract_h( tmp32 ) ); /*12 + 20 + exp - 16 - 15 + Qscale */
     581           0 :             exp1 = sub( 26, add( sub( exp, 19 ), Qscale ) );
     582           0 :             exp2 = norm_l( tmp32 );
     583           0 :             IF( GE_16( exp2, exp1 ) )
     584             :             {
     585           0 :                 value_fx = extract_h( L_shl( tmp32, sub( 26, add( sub( exp, 19 ), Qscale ) ) ) ); /*exp -19 + Qscale*/ /*10*/
     586             :             }
     587             :             ELSE
     588             :             {
     589           0 :                 value_fx = extract_h( L_shl( tmp32, exp2 ) ); /*exp -19 + Qscale*/ /*10*/
     590             :             }
     591             :             /* step 1 */
     592           0 :             quantum1_fx = quantize_fx( value_fx, denc[st][0] );
     593           0 :             newdist1_fx = sub( shl( quantum1_fx, 10 ), abs_s( value_fx ) ); /*10*/
     594           0 :             newdist1_fx = mult( newdist1_fx, newdist1_fx );                 /* 5 */
     595             : 
     596           0 :             test();
     597           0 :             if ( GT_16( add( quantum1_fx, pused_fx[step_tcq[st][0]][i] ), pulses ) && terminate )
     598             :             {
     599           0 :                 newdist1_fx = MAX_16;
     600           0 :                 move16();
     601             :             }
     602             :             /* step 2 */
     603           0 :             quantum2_fx = quantize_fx( value_fx, denc[st][1] );
     604           0 :             newdist2_fx = sub( shl( quantum2_fx, 10 ), abs_s( value_fx ) ); /*10*/
     605           0 :             newdist2_fx = mult( newdist2_fx, newdist2_fx );                 /*5*/
     606             : 
     607           0 :             test();
     608           0 :             if ( GT_16( add( quantum2_fx, pused_fx[step_tcq[st][1]][i] ), pulses ) && terminate )
     609             :             {
     610           0 :                 newdist2_fx = MAX_16;
     611           0 :                 move16();
     612             :             }
     613             : 
     614             :             /* decision */
     615           0 :             IF( LT_32( L_add( curdist1_fx, newdist1_fx ), L_add( curdist2_fx, newdist2_fx ) ) )
     616             :             {
     617           0 :                 path_fx[st][i + 1] = step_tcq[st][0];
     618           0 :                 move16();
     619           0 :                 metric_fx[st][i + 1] = L_add( curdist1_fx, newdist1_fx );
     620           0 :                 move32();
     621           0 :                 quant_fx[st][i + 1] = quantize_fx( value_fx, denc[st][0] );
     622           0 :                 move16();
     623           0 :                 pused_fx[st][i + 1] = add( pused_fx[step_tcq[st][0]][i], abs_s( quant_fx[st][i + 1] ) );
     624           0 :                 move16();
     625             :             }
     626             :             ELSE
     627             :             {
     628           0 :                 path_fx[st][i + 1] = step_tcq[st][1];
     629           0 :                 move16();
     630           0 :                 metric_fx[st][i + 1] = L_add( curdist2_fx, newdist2_fx );
     631           0 :                 move32();
     632           0 :                 quant_fx[st][i + 1] = quantize_fx( value_fx, denc[st][1] );
     633           0 :                 move16();
     634           0 :                 pused_fx[st][i + 1] = add( pused_fx[step_tcq[st][1]][i], abs_s( quant_fx[st][i + 1] ) );
     635           0 :                 move16();
     636             :             }
     637             :         }
     638             :     }
     639             : 
     640             :     /* Find path with minimal metric */
     641           0 :     dminpos = 0;
     642           0 :     move16();
     643           0 :     dmin_fx = L_add( metric_fx[dminpos][length], 0 );
     644           0 :     FOR( i = 1; i < STATES; i++ )
     645             :     {
     646           0 :         test();
     647           0 :         test();
     648           0 :         test();
     649           0 :         IF( ( GT_32( dmin_fx, metric_fx[i][length] ) && EQ_16( pused_fx[i][length], pulses ) ) ||
     650             :             ( NE_16( pused_fx[dminpos][length], pulses ) && EQ_16( pused_fx[i][length], pulses ) ) )
     651             :         {
     652           0 :             dmin_fx = L_add( metric_fx[i][length], 0 );
     653           0 :             dminpos = i;
     654           0 :             move16();
     655             :         }
     656             :     }
     657             :     /* Trace back to get output */
     658           0 :     nzpos = 0;
     659           0 :     move16();
     660           0 :     pulsesnum = 0;
     661           0 :     move16();
     662           0 :     position = dminpos;
     663           0 :     move16();
     664           0 :     FOR( i = length; i > 0; i-- )
     665             :     {
     666           0 :         vout_fx[i - 1] = quant_fx[position][i];
     667           0 :         move16();
     668           0 :         if ( v_fx[i - 1] <= 0 )
     669             :         {
     670           0 :             vout_fx[i - 1] = negate( quant_fx[position][i] );
     671           0 :             move16();
     672             :         }
     673           0 :         position = path_fx[position][i];
     674           0 :         move16();
     675           0 :         savedstates[i - 1] = position;
     676           0 :         move32();
     677             : 
     678             :         /* calculate output pulses number & nz */
     679           0 :         pulsesnum = add( pulsesnum, abs_s( vout_fx[i - 1] ) ); /*quant[position][i]; */
     680           0 :         IF( abs_s( vout_fx[i - 1] ) > 0 )
     681             :         {
     682           0 :             if ( nzpos == 0 )
     683             :             {
     684           0 :                 *lasttrellislevel = i;
     685           0 :                 move32();
     686             :             }
     687             : 
     688           0 :             nzpos = add( nzpos, 1 );
     689             :         }
     690             :     }
     691             : 
     692           0 :     if ( pulsesout != 0 )
     693             :     {
     694           0 :         *pulsesout = pulsesnum;
     695           0 :         move16();
     696             :     }
     697           0 :     if ( nzposout != 0 )
     698             :     {
     699           0 :         *nzposout = nzpos;
     700           0 :         move16();
     701             :     }
     702             : 
     703           0 :     return;
     704             : }
     705             : 
     706           0 : Word32 GetISCScale_fx(
     707             :     Word32 *quants_fx,
     708             :     Word16 size,
     709             :     Word32 bits_fx,
     710             :     Word16 *magn_fx,
     711             :     Word32 *qscale_fx,
     712             :     Word32 *surplus_fx,
     713             :     Word16 *pulses,
     714             :     Word32 *savedstates,
     715             :     Word32 noTCQ,
     716             :     Word16 *nzpout,
     717             :     Word16 *bcount,
     718             :     Word32 *abuffer,
     719             :     Word16 *mbuffer,
     720             :     Word32 *sbuffer )
     721             : {
     722             :     Word32 pos, terminate, trellislevel, st;
     723             :     Word32 lasttrellislevel;
     724             :     Word16 i, j, m_int, leftp, leftnz, nzpos, direction, pulsesnum, diff, pulsescurr, nzposcurr;
     725             :     Word16 sign;
     726             :     Word16 flag_g1;
     727             :     Word32 t32;
     728             :     Word16 SafeExp;
     729             : 
     730           0 :     Word32 magnbits_fx = 0, tcqmagnbits_fx /*, surplus_fx, bits_fx*/;
     731           0 :     move32();
     732             :     Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
     733             :     Word32 dmin_fx, scale_fx32;
     734             :     Word32 actualt_fx;
     735           0 :     Word32 pt_fx, sxy_fx = 0, sy2_fx = 0;
     736           0 :     move32();
     737           0 :     move32();
     738             :     Word16 pn_fx, g_fx, scale_fx;
     739             :     Word16 tmp16, exp, exp1, exp2, Q_temp, hi, lo;
     740             :     Word32 m_fx, tmp32;
     741             :     Word32 /*quants_fx[TCQ_MAX_BAND_SIZE], */ aquants_fx[TCQ_MAX_BAND_SIZE], dist_fx[TCQ_MAX_BAND_SIZE];
     742             :     Word16 exp_dist[TCQ_MAX_BAND_SIZE];
     743             :     Word16 /*magn_fx[TCQ_MAX_BAND_SIZE], */ t_fx;
     744             :     Word16 Qscale;
     745           0 :     Word16 Qsxy = 4;
     746             : 
     747           0 :     move32();
     748           0 :     move32();
     749           0 :     move32();
     750           0 :     move16();
     751             : 
     752           0 :     exp = 0; /* to avoid compilation warnings */
     753           0 :     move16();
     754           0 :     Qscale = 0; /* to avoid compilation warnings */
     755           0 :     move16();
     756             : 
     757           0 :     set32_fx( dist_fx, 0, size );
     758           0 :     set16_fx( exp_dist, 31, size );
     759           0 :     set32_fx( aquants_fx, 0, size );
     760             : 
     761           0 :     IF( bits_fx < 0 )
     762             :     {
     763           0 :         pulsesnum = 0;
     764           0 :         move16();
     765             : 
     766           0 :         IF( surplus_fx != NULL )
     767             :         {
     768             :             /* *surplus_fx += bits_fx; */
     769           0 :             *surplus_fx = L_add( *surplus_fx, bits_fx );
     770           0 :             move32();
     771             :         }
     772             :     }
     773             :     ELSE
     774             :     {
     775           0 :         pulsesnum = GetScale_fx( size, bits_fx, surplus_fx );
     776             :     }
     777           0 :     *nzpout = 0;
     778           0 :     move16();
     779             : 
     780           0 :     if ( pulses != NULL )
     781             :     {
     782           0 :         *pulses = pulsesnum;
     783           0 :         move16();
     784             :     }
     785             : 
     786           0 :     IF( pulsesnum > 0 )
     787             :     {
     788             :         /* Initial quantization */
     789           0 :         m_fx = L_deposit_l( 0 );
     790           0 :         FOR( i = 0; i < size; i++ )
     791             :         {
     792           0 :             aquants_fx[i] = L_abs( quants_fx[i] ); /*Q12 */
     793           0 :             move32();
     794           0 :             m_fx = L_add( m_fx, L_shr( aquants_fx[i], 2 ) ); /*Q12 - 2*/
     795             :         }
     796             : 
     797           0 :         IF( m_fx == 0 )
     798             :         {
     799           0 :             scale_fx = 0;
     800           0 :             move16();
     801           0 :             FOR( i = 0; i < size; i++ )
     802             :             {
     803           0 :                 magn_fx[i] = 0;
     804           0 :                 move16();
     805             :             }
     806           0 :             t_fx = 0;
     807           0 :             move16();
     808             :         }
     809             :         ELSE
     810             :         {
     811           0 :             exp1 = sub( norm_s( pulsesnum ), 1 );
     812           0 :             exp2 = norm_l( m_fx );
     813           0 :             scale_fx = div_s( shl( pulsesnum, exp1 ), extract_h( L_shl( m_fx, exp2 ) ) ); /*15 + exp1 - (exp2 + 12 - 16) */
     814             : 
     815           0 :             exp = add( sub( add( 15, exp1 ), sub( add( exp2, 12 ), 16 ) ), 2 );
     816           0 :             move16();
     817           0 :             t_fx = 0;
     818           0 :             move16();
     819           0 :             FOR( i = 0; i < size; i++ )
     820             :             {
     821           0 :                 tmp32 = Mult_32_16( aquants_fx[i], scale_fx );          /*12 + exp - 15 */
     822           0 :                 tmp32 = L_shl( tmp32, sub( 16, add( 12 - 15, exp ) ) ); /*16 */
     823           0 :                 magn_fx[i] = extract_h( L_add( 32768, tmp32 ) );
     824           0 :                 move16();
     825           0 :                 t_fx = add( t_fx, magn_fx[i] );
     826             :             }
     827             :         }
     828             : 
     829             :         /* Pulses redistribution */
     830           0 :         WHILE( NE_16( t_fx, pulsesnum ) )
     831             :         {
     832           0 :             pn_fx = 0;
     833           0 :             move16();
     834           0 :             pt_fx = L_deposit_l( 0 );
     835             : 
     836           0 :             nzpos = 0;
     837           0 :             move16();
     838           0 :             FOR( i = 0; i < size; i++ )
     839             :             {
     840           0 :                 IF( magn_fx[i] > 0 )
     841             :                 {
     842           0 :                     pn_fx = add( pn_fx, magn_fx[i] );                  /*0 */
     843           0 :                     pt_fx = L_add( pt_fx, L_shr( aquants_fx[i], 2 ) ); /*12 */
     844             :                 }
     845             :             }
     846             : 
     847           0 :             direction = -1;
     848           0 :             move16();
     849           0 :             if ( GT_16( pulsesnum, t_fx ) )
     850             :             {
     851           0 :                 direction = 1;
     852           0 :                 move16();
     853             :             }
     854             : 
     855             :             /* new alg */
     856             :             {
     857           0 :                 FOR( i = 0; i < size; i++ )
     858             :                 {
     859           0 :                     sxy_fx = L_add( sxy_fx, L_shl( Mult_32_16( aquants_fx[i], magn_fx[i] ), add( Qsxy, 3 ) ) ); /* 12+0-15 +9 -> 6 */
     860           0 :                     sy2_fx = L_add( sy2_fx, L_mult0( magn_fx[i], magn_fx[i] ) );                                /*0 */
     861             :                 }
     862           0 :                 Q_temp = 32;
     863           0 :                 move16();
     864           0 :                 FOR( i = 0; i < size; i++ )
     865             :                 {
     866           0 :                     IF( magn_fx[i] > 0 )
     867             :                     {
     868           0 :                         tmp16 = add( pn_fx, direction );
     869           0 :                         tmp32 = L_add( pt_fx, 0 );
     870             :                     }
     871             :                     ELSE
     872             :                     {
     873           0 :                         tmp16 = add( pn_fx, direction );
     874           0 :                         tmp32 = L_add( pt_fx, L_shr( aquants_fx[i], 2 ) );
     875             :                     }
     876             : 
     877           0 :                     IF( tmp32 == 0 )
     878             :                     {
     879           0 :                         g_fx = 0;
     880           0 :                         move16();
     881             :                     }
     882             :                     ELSE
     883             :                     {
     884           0 :                         exp1 = sub( norm_l( tmp32 ), 1 );
     885           0 :                         exp2 = norm_s( tmp16 );
     886           0 :                         tmp32 = L_shl( tmp32, exp1 );
     887           0 :                         IF( tmp16 == 0 )
     888             :                         {
     889           0 :                             tmp16 = 1;
     890           0 :                             move16();
     891           0 :                             exp2 = 16;
     892           0 :                             move16();
     893             :                         }
     894             :                         ELSE
     895             :                         {
     896           0 :                             tmp16 = shl( tmp16, exp2 );
     897             :                         }
     898           0 :                         g_fx = div_s( extract_h( tmp32 ), tmp16 );        /*15 + 12 + exp1 - 16 - exp2; */
     899           0 :                         exp = add( 15 + 12 - 16 - 2, sub( exp1, exp2 ) ); /*exp = 15 + 12 + exp1 - 16 - exp2 - 2*/
     900           0 :                         move16();
     901             :                     }
     902             : 
     903           0 :                     IF( g_fx == 0 )
     904             :                     {
     905           0 :                         dist_fx[i] = L_deposit_l( 0 );
     906           0 :                         move32();
     907             :                     }
     908             :                     ELSE
     909             :                     {
     910           0 :                         IF( direction > 0 )
     911             :                         {
     912           0 :                             tmp32 = L_add( sxy_fx, L_shr( aquants_fx[i], sub( 12, Qsxy ) ) ); /*Qsxy */
     913           0 :                             t32 = L_add( sy2_fx, L_add( 1, L_deposit_l( shl( magn_fx[i], 1 ) ) ) );
     914             : 
     915           0 :                             IF( LT_16( norm_l( t32 ), 15 ) )
     916             :                             {
     917           0 :                                 SafeExp = sub( 16, norm_l( t32 ) );
     918           0 :                                 tmp16 = extract_l( L_shr( t32, SafeExp ) );
     919             :                             }
     920             :                             ELSE
     921             :                             {
     922           0 :                                 SafeExp = 0;
     923           0 :                                 move16();
     924           0 :                                 tmp16 = extract_l( t32 );
     925             :                             }
     926             :                         }
     927             :                         ELSE
     928             :                         {
     929           0 :                             tmp32 = L_sub( sxy_fx, L_shr( aquants_fx[i], sub( 12, Qsxy ) ) ); /*Qsxy */
     930           0 :                             t32 = L_add( sy2_fx, L_sub( 1, L_deposit_l( shl( magn_fx[i], 1 ) ) ) );
     931           0 :                             SafeExp = norm_l( t32 );
     932             : 
     933           0 :                             IF( LE_16( norm_l( t32 ), 15 ) )
     934             :                             {
     935           0 :                                 SafeExp = sub( 16, norm_l( t32 ) );
     936           0 :                                 tmp16 = extract_l( L_shr( t32, SafeExp ) );
     937             :                             }
     938             :                             ELSE
     939             :                             {
     940           0 :                                 SafeExp = 0;
     941           0 :                                 move16();
     942           0 :                                 tmp16 = extract_l( t32 );
     943             :                             }
     944             :                         }
     945           0 :                         tmp32 = L_shl_sat( tmp32, sub( 1, SafeExp ) );                                     /* *2 */
     946           0 :                         tmp32 = L_sub_sat( L_shl_sat( L_mult0( g_fx, tmp16 ), sub( Qsxy, exp ) ), tmp32 ); /*Qsxy */
     947           0 :                         dist_fx[i] = Mult_32_16( tmp32, g_fx );                                            /*Qsxy + exp - 15 */
     948           0 :                         move32();
     949           0 :                         exp_dist[i] = add( sub( Qsxy, 15 ), exp );
     950           0 :                         move16();
     951           0 :                         if ( LT_16( exp_dist[i], Q_temp ) )
     952             :                         {
     953           0 :                             Q_temp = exp_dist[i];
     954           0 :                             move16();
     955             :                         }
     956             :                     }
     957             :                 }
     958           0 :                 FOR( i = 0; i < size; i++ )
     959             :                 {
     960           0 :                     dist_fx[i] = L_shr( dist_fx[i], s_min( sub( exp_dist[i], Q_temp ), 31 ) );
     961           0 :                     move32();
     962             :                 }
     963             :             }
     964             : 
     965             :             {
     966             :                 /* find min */
     967           0 :                 pos = L_deposit_l( 0 );
     968           0 :                 dmin_fx = L_add( dist_fx[0], 0 );
     969           0 :                 FOR( i = 1; i < size; i++ )
     970             :                 {
     971           0 :                     IF( GT_32( dmin_fx, dist_fx[i] ) )
     972             :                     {
     973           0 :                         pos = L_deposit_l( i );
     974           0 :                         dmin_fx = L_add( dist_fx[i], 0 );
     975             :                     }
     976             :                 }
     977             :                 /*IF (magn_fx[i] == 0 && direction < 0) */
     978           0 :                 test();
     979           0 :                 IF( magn_fx[pos] == 0 && direction < 0 )
     980             :                 {
     981           0 :                     pos = L_deposit_l( 0 );
     982           0 :                     FOR( i = 0; i < size; i++ )
     983             :                     {
     984           0 :                         IF( magn_fx[i] != 0 )
     985             :                         {
     986           0 :                             pos = L_deposit_l( i );
     987           0 :                             BREAK;
     988             :                         }
     989             :                     }
     990           0 :                     dmin_fx = L_add( dist_fx[i], 0 );
     991           0 :                     FOR( ; i < size; i++ )
     992             :                     {
     993           0 :                         test();
     994           0 :                         IF( magn_fx[i] != 0 && LT_32( dmin_fx, dist_fx[i] ) )
     995             :                         {
     996           0 :                             pos = L_deposit_l( i );
     997           0 :                             dmin_fx = L_add( dist_fx[i], 0 );
     998             :                         }
     999             :                     }
    1000             :                 }
    1001             : 
    1002           0 :                 magn_fx[pos] = add( magn_fx[pos], direction );
    1003           0 :                 move16();
    1004           0 :                 t_fx = add( t_fx, direction );
    1005             :             }
    1006             :         }
    1007             : 
    1008             :         /* calculate actual nz positions */
    1009           0 :         actualt_fx = L_deposit_l( 0 );
    1010           0 :         nzpos = 0;
    1011           0 :         move16();
    1012           0 :         FOR( i = 0; i < size; i++ )
    1013             :         {
    1014           0 :             IF( magn_fx[i] > 0 )
    1015             :             {
    1016           0 :                 if ( quants_fx[i] < 0 )
    1017             :                 {
    1018           0 :                     magn_fx[i] = negate( magn_fx[i] );
    1019           0 :                     move16();
    1020             :                 }
    1021           0 :                 actualt_fx = L_add( actualt_fx, L_shr( aquants_fx[i], 2 ) ); /*12 */
    1022           0 :                 nzpos++;
    1023             :             }
    1024             :             /*magn[i] = (float)magn_fx[i]; */
    1025             :         }
    1026             : 
    1027             :         /* calculate scale */
    1028           0 :         IF( actualt_fx == 0 )
    1029             :         {
    1030           0 :             scale_fx32 = L_add( MAX_32, 0 );
    1031             :         }
    1032             :         ELSE
    1033             :         {
    1034           0 :             exp1 = norm_l( actualt_fx );
    1035           0 :             exp2 = sub( norm_l( pulsesnum ), 1 );
    1036           0 :             lo = L_Extract_lc( L_shl( actualt_fx, exp1 ), &hi );
    1037           0 :             scale_fx32 = Div_32( L_shl( pulsesnum, exp2 ), hi, lo ); /*31 + exp2 - exp1 - 12 */
    1038           0 :             Qscale = add( 31 - 12 + 2, sub( exp2, exp1 ) );          /*31 + exp2 - exp1 - 12 + 2*/
    1039           0 :             move16();
    1040             :         }
    1041             : 
    1042           0 :         *qscale_fx = scale_fx32;
    1043           0 :         move32();
    1044           0 :         *nzpout = nzpos;
    1045           0 :         move16();
    1046             : 
    1047             : 
    1048           0 :         test();
    1049           0 :         test();
    1050           0 :         IF( ( NE_16( nzpos, pulsesnum ) && GT_16( nzpos, 1 ) ) && noTCQ == 0 )
    1051             :         {
    1052           0 :             terminate = L_deposit_l( 1 );
    1053             :             /*TCQnew( quants, scale, size, magn, pulsesnum, &pulsescurr, &nzposcurr, savedstates, &lasttrellislevel, terminate); */
    1054           0 :             TCQnew_fx( quants_fx, scale_fx32, Qscale,
    1055             :                        size, magn_fx, pulsesnum, &pulsescurr, &nzposcurr, savedstates, &lasttrellislevel, terminate );
    1056           0 :             IF( GT_16( pulsesnum, pulsescurr ) )
    1057             :             {
    1058             :                 Word32 L_tmp;
    1059           0 :                 IF( GT_32( 1952247030, scale_fx32 ) )
    1060             :                 {
    1061           0 :                     scale_fx32 = L_add( scale_fx32, Mult_32_16( scale_fx32, 3277 /*0.1 in Q15*/ ) );
    1062             :                 }
    1063             :                 ELSE
    1064             :                 {
    1065           0 :                     L_tmp = L_shr( scale_fx32, 1 );
    1066           0 :                     scale_fx32 = L_add( L_tmp, Mult_32_16( L_tmp, 3277 /*0.1 in Q15*/ ) );
    1067           0 :                     Qscale = sub( Qscale, 1 );
    1068             :                 }
    1069             :             }
    1070             : 
    1071           0 :             if ( LT_16( pulsesnum, pulsescurr ) )
    1072             :             {
    1073           0 :                 scale_fx32 = Mult_32_16( scale_fx32, 29491 /*0.9 in Q15*/ );
    1074             :             }
    1075           0 :             IF( GT_16( pulsesnum, pulsescurr ) )
    1076             :             {
    1077           0 :                 diff = sub( pulsesnum, pulsescurr );
    1078             : 
    1079           0 :                 FOR( i = size - 1; i >= 0; i-- )
    1080             :                 {
    1081           0 :                     IF( abs_s( magn_fx[i] ) > 0 )
    1082             :                     {
    1083           0 :                         sign = -1;
    1084           0 :                         move16();
    1085           0 :                         if ( magn_fx[i] > 0 )
    1086             :                         {
    1087           0 :                             sign = 1;
    1088           0 :                             move16();
    1089             :                         }
    1090             :                         /*magn_fx[i] = sign * abs_s(add(magn_fx[i], diff));  move32(); */
    1091           0 :                         IF( sign > 0 )
    1092             :                         {
    1093           0 :                             magn_fx[i] = abs_s( add( magn_fx[i], diff ) );
    1094           0 :                             move16();
    1095             :                         }
    1096             :                         ELSE
    1097             :                         {
    1098           0 :                             magn_fx[i] = negate( abs_s( add( magn_fx[i], diff ) ) );
    1099           0 :                             move16();
    1100             :                         }
    1101             : 
    1102           0 :                         BREAK;
    1103             :                     }
    1104             :                 }
    1105             :             }
    1106           0 :             ELSE IF( LT_16( pulsesnum, pulsescurr ) )
    1107             :             {
    1108           0 :                 diff = sub( pulsescurr, pulsesnum );
    1109             : 
    1110           0 :                 FOR( i = size - 1; i >= 0; i-- )
    1111             :                 {
    1112           0 :                     IF( diff <= 0 )
    1113             :                     {
    1114           0 :                         BREAK;
    1115             :                     }
    1116             : 
    1117           0 :                     IF( abs_s( magn_fx[i] ) > 0 )
    1118             :                     {
    1119           0 :                         sign = -1;
    1120           0 :                         move16();
    1121           0 :                         if ( magn_fx[i] > 0 )
    1122             :                         {
    1123           0 :                             sign = 1;
    1124           0 :                             move16();
    1125             :                         }
    1126           0 :                         m_int = abs_s( magn_fx[i] );
    1127             : 
    1128           0 :                         IF( LT_16( diff, m_int ) )
    1129             :                         {
    1130             :                             /*magn_fx[i] = sign * sub(abs_s(magn_fx[i]), diff);  move16(); */
    1131           0 :                             IF( sign > 0 )
    1132             :                             {
    1133           0 :                                 magn_fx[i] = sub( abs_s( magn_fx[i] ), diff );
    1134           0 :                                 move16();
    1135             :                             }
    1136             :                             ELSE
    1137             :                             {
    1138           0 :                                 magn_fx[i] = negate( sub( abs_s( magn_fx[i] ), diff ) );
    1139           0 :                                 move16();
    1140             :                             }
    1141           0 :                             BREAK;
    1142             :                         }
    1143             :                         ELSE
    1144             :                         {
    1145           0 :                             diff = sub( diff, m_int );
    1146           0 :                             magn_fx[i] = 0;
    1147           0 :                             move16();
    1148           0 :                             nzposcurr = sub( nzposcurr, 1 );
    1149             :                         }
    1150             :                     }
    1151             :                 }
    1152             :             }
    1153             : 
    1154           0 :             pulsescurr = pulsesnum;
    1155           0 :             move16();
    1156             : 
    1157             :             /* Magnitudes coding */
    1158             :             {
    1159           0 :                 leftp = pulsescurr;
    1160           0 :                 move16(); /*pulsesnum; */
    1161           0 :                 leftnz = nzposcurr;
    1162           0 :                 move16(); /*nzpos; */
    1163           0 :                 trellislevel = L_deposit_l( 0 );
    1164             : 
    1165           0 :                 FOR( i = 0; i < size; i++ )
    1166             :                 {
    1167           0 :                     IF( LE_16( leftnz, 1 ) )
    1168             :                     {
    1169           0 :                         BREAK;
    1170             :                     }
    1171             : 
    1172           0 :                     IF( magn_fx[i] != 0 )
    1173             :                     {
    1174           0 :                         FOR( j = 0; j < leftp; j++ )
    1175             :                         {
    1176           0 :                             num = sub( leftnz, 1 );
    1177           0 :                             denum = sub( leftp, add( j, 1 ) );
    1178           0 :                             IF( GE_16( num, denum ) )
    1179             :                             {
    1180           0 :                                 prob1_fx = MAX_16;
    1181           0 :                                 move16();
    1182           0 :                                 prob0_fx = 0;
    1183           0 :                                 move16();
    1184             :                             }
    1185             :                             ELSE
    1186             :                             {
    1187           0 :                                 exp1 = sub( norm_s( num ), 1 );
    1188           0 :                                 exp2 = norm_s( denum );
    1189           0 :                                 prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
    1190           0 :                                 exp = add( 15, sub( exp1, exp2 ) );
    1191           0 :                                 prob1_fx = shl( prob1_fx, sub( 15, exp ) );
    1192           0 :                                 prob0_fx = sub( MAX_16, prob1_fx );
    1193             :                             }
    1194             : 
    1195           0 :                             st = L_add( savedstates[trellislevel], 0 );
    1196           0 :                             quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
    1197           0 :                             quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
    1198             : 
    1199           0 :                             test();
    1200           0 :                             IF( NE_16( quantum1_fx, add( j, 1 ) ) && NE_16( quantum2_fx, add( j, 1 ) ) )
    1201             :                             {
    1202             :                                 /* this magnitude is not possible so set probabilities */
    1203           0 :                                 prob0_fx = MAX_16;
    1204           0 :                                 move16();
    1205           0 :                                 prob1_fx = 0;
    1206           0 :                                 move16();
    1207             :                             }
    1208             : 
    1209           0 :                             IF( LT_16( j, sub( abs_s( magn_fx[i] ), 1 ) ) )
    1210             :                             {
    1211           0 :                                 exp1 = norm_s( prob0_fx );
    1212           0 :                                 tmp32 = L_deposit_h( shl( prob0_fx, exp1 ) );                                    /*exp1 + 15 + 16 */
    1213           0 :                                 tmp16 = Log2_norm_lc( tmp32 );                                                   /*15 */
    1214           0 :                                 magnbits_fx = L_sub( magnbits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
    1215             :                             }
    1216             :                             ELSE
    1217             :                             {
    1218           0 :                                 exp1 = norm_s( prob1_fx );
    1219           0 :                                 tmp32 = L_deposit_h( shl( prob1_fx, exp1 ) );                                    /*exp1 + 15 + 16 */
    1220           0 :                                 tmp16 = Log2_norm_lc( tmp32 );                                                   /*15 */
    1221           0 :                                 magnbits_fx = L_sub( magnbits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
    1222           0 :                                 BREAK;
    1223             :                             }
    1224             :                         }
    1225             : 
    1226           0 :                         leftnz = sub( leftnz, 1 );
    1227           0 :                         leftp = sub( leftp, abs_s( magn_fx[i] ) );
    1228             :                     }
    1229             : 
    1230           0 :                     trellislevel = L_add( trellislevel, 1 );
    1231             :                 }
    1232             : 
    1233             :                 /* Update actual occurred surplus */
    1234           0 :                 tcqmagnbits_fx = L_sub( L_sub( table_logcum_fx[pulsescurr], table_logcum_fx[nzposcurr] ), table_logcum_fx[pulsescurr - ( nzposcurr - 1 )] );
    1235           0 :                 *surplus_fx = L_add( *surplus_fx, L_sub( tcqmagnbits_fx, L_shl( magnbits_fx, 1 ) ) );
    1236           0 :                 move32();
    1237           0 :                 *nzpout = nzposcurr;
    1238           0 :                 move16();
    1239             :             } /*magnitude coding */
    1240             :         }     /*TCQ */
    1241             : 
    1242           0 :         IF( actualt_fx == 0 )
    1243             :         {
    1244           0 :             scale_fx32 = L_add( MAX_32, 0 );
    1245             :         }
    1246             :         ELSE
    1247             :         {
    1248           0 :             exp1 = norm_l( actualt_fx );
    1249           0 :             exp2 = sub( norm_l( pulsesnum ), 1 );
    1250           0 :             lo = L_Extract_lc( L_shl( actualt_fx, exp1 ), &hi );
    1251           0 :             scale_fx32 = Div_32( L_shl( pulsesnum, exp2 ), hi, lo ); /*31 + exp2 - exp1 - 12 */
    1252           0 :             Qscale = add( 31 - 12, sub( exp2, exp1 ) );              /*31 + exp2 - exp1 - 12*/
    1253           0 :             move16();
    1254             :         }
    1255           0 :         test();
    1256           0 :         IF( GT_16( *nzpout, 1 ) && bcount != NULL )
    1257             :         {
    1258           0 :             flag_g1 = 0;
    1259           0 :             move16();
    1260             : 
    1261           0 :             FOR( i = 0; i < size; i++ )
    1262             :             {
    1263           0 :                 if ( GT_16( abs_s( magn_fx[i] ), 1 ) )
    1264             :                 {
    1265           0 :                     flag_g1 = 1;
    1266           0 :                     move16();
    1267             :                 }
    1268             :             }
    1269             :             /* prepare vector for TCQ */
    1270           0 :             FOR( i = 0; i < size; i++ )
    1271             :             {
    1272           0 :                 test();
    1273           0 :                 IF( flag_g1 == 0 || GE_16( *bcount, 2 * TCQ_AMP ) )
    1274             :                 {
    1275             :                     BREAK;
    1276             :                 }
    1277             : 
    1278           0 :                 IF( abs_s( magn_fx[i] ) > 0 )
    1279             :                 {
    1280           0 :                     abuffer[*bcount] = quants_fx[i];
    1281           0 :                     move32();
    1282           0 :                     mbuffer[*bcount] = magn_fx[i];
    1283           0 :                     move16();
    1284             :                     /*sbuffer[*bcount] = scale_fx32;*/
    1285           0 :                     exp = norm_s( pulsesnum );
    1286           0 :                     tmp16 = div_l( actualt_fx, shl( pulsesnum, sub( exp, 1 ) ) );
    1287           0 :                     tmp32 = L_shl( L_deposit_l( tmp16 ), exp );
    1288             :                     /*sbuffer[*bcount] = 1/((float)tmp32/pow(2.0, 12));*/
    1289           0 :                     sbuffer[*bcount] = tmp32; /*Q12*/
    1290           0 :                     move32();
    1291             :                     /*sbuffer[*bcount] = (float)scale_fx32 / pow(2.0, Qscale);*/
    1292             : 
    1293           0 :                     ( *bcount ) = add( *bcount, 1 );
    1294           0 :                     move16();
    1295             :                 }
    1296             :             }
    1297             :         }
    1298           0 :         *qscale_fx = scale_fx32;
    1299           0 :         move32();
    1300             :     }
    1301             : 
    1302           0 :     return L_shl( magnbits_fx, 1 );
    1303             : }
    1304             : 
    1305           0 : void TCQLSB_fx(
    1306             :     Word16 bcount,
    1307             :     Word32 *abuffer_fx,
    1308             :     Word16 *mbuffer_fx,
    1309             :     Word32 *sbuffer_fx,
    1310             :     Word16 *dpath )
    1311             : {
    1312             :     Word16 i, st, dminpos, position;
    1313           0 :     Word16 q_fx = 6554; /*Q15*/
    1314           0 :     move16();
    1315             :     Word32 dmin_fx, curdist1_fx, curdist2_fx, newdist1_fx, newdist2_fx;
    1316             :     Word16 path[STATES_LSB][TCQ_LSB_SIZE];
    1317             :     Word16 quant[STATES_LSB][TCQ_LSB_SIZE];
    1318             :     Word16 dquant[STATES_LSB][TCQ_LSB_SIZE];
    1319             :     Word16 qout[TCQ_LSB_SIZE];
    1320             :     Word32 s1_fx, s2_fx, a1_fx, a2_fx;
    1321             :     Word16 s1_fx16, s2_fx16;
    1322             :     Word16 q1_fx, q2_fx, sign1_fx, sign2_fx;
    1323             :     Word16 dbuffer_fx[MAX_PULSES];
    1324             : 
    1325             :     Word32 tmp1, tmp2;
    1326             :     Word16 exp1, exp2;
    1327             :     Word32 metric_fx[STATES_LSB][TCQ_LSB_SIZE];
    1328             :     Word32 MaxPath;
    1329             : 
    1330           0 :     set32_fx( *metric_fx, 0, STATES_LSB * TCQ_LSB_SIZE );
    1331           0 :     set16_fx( *path, 0, STATES_LSB * TCQ_LSB_SIZE );
    1332           0 :     set16_fx( *quant, 0, STATES_LSB * TCQ_LSB_SIZE );
    1333           0 :     set16_fx( *dquant, 0, STATES_LSB * TCQ_LSB_SIZE );
    1334           0 :     set16_fx( qout, 0, TCQ_LSB_SIZE );
    1335             : 
    1336           0 :     metric_fx[1][0] = MAX_32 >> 8;
    1337           0 :     move32();
    1338           0 :     metric_fx[2][0] = MAX_32 >> 8;
    1339           0 :     move32();
    1340           0 :     metric_fx[3][0] = MAX_32 >> 8;
    1341           0 :     move32();
    1342             : 
    1343           0 :     FOR( i = 0; i < 2 * TCQ_AMP; i += 2 )
    1344             :     {
    1345           0 :         q1_fx = mbuffer_fx[i];
    1346           0 :         move16();
    1347           0 :         q2_fx = mbuffer_fx[i + 1];
    1348           0 :         move16();
    1349             : 
    1350           0 :         s1_fx = L_add( sbuffer_fx[i], 0 );     /*12*/
    1351           0 :         s2_fx = L_add( sbuffer_fx[i + 1], 0 ); /*12*/
    1352           0 :         exp1 = norm_l( s1_fx );
    1353           0 :         exp2 = norm_l( s2_fx );
    1354           0 :         s1_fx16 = extract_h( L_shl( s1_fx, exp1 ) ); /*12 + exp1 - 16*/
    1355           0 :         s2_fx16 = extract_h( L_shl( s2_fx, exp2 ) ); /*12 + exp2 - 16*/
    1356           0 :         exp1 = add( 12 - 16, exp1 );
    1357           0 :         move16();
    1358           0 :         exp2 = add( 12 - 16, exp2 );
    1359           0 :         move16();
    1360             : 
    1361           0 :         a1_fx = L_add( abuffer_fx[i], 0 );
    1362           0 :         a2_fx = L_add( abuffer_fx[i + 1], 0 );
    1363             : 
    1364           0 :         MaxPath = L_add( MAX_32, 0 );
    1365             : 
    1366             :         /* cycle over conditions */
    1367           0 :         FOR( st = 0; st < 4; st++ )
    1368             :         {
    1369           0 :             curdist1_fx = L_add( metric_fx[step_LSB[st][0]][i / 2], 0 );
    1370           0 :             curdist2_fx = L_add( metric_fx[step_LSB[st][1]][i / 2], 0 );
    1371             : 
    1372             :             /* step 1 */
    1373             :             /*sign1_fx = (denc_LSB[st][0] & 0x1)?(q_fx):(-q_fx);*/
    1374           0 :             IF( s_and( denc_LSB[st][0], 0x1 ) )
    1375             :             {
    1376           0 :                 sign1_fx = q_fx;
    1377           0 :                 move16();
    1378             :             }
    1379             :             ELSE
    1380             :             {
    1381           0 :                 sign1_fx = negate( q_fx );
    1382             :             }
    1383             :             /*sign2_fx = (denc_LSB[st][0] & 0x2)?(q_fx):(-q_fx);*/
    1384           0 :             IF( s_and( denc_LSB[st][0], 0x2 ) )
    1385             :             {
    1386           0 :                 sign2_fx = q_fx;
    1387           0 :                 move16();
    1388             :             }
    1389             :             ELSE
    1390             :             {
    1391           0 :                 sign2_fx = negate( q_fx );
    1392             :             }
    1393           0 :             tmp1 = L_sub( a1_fx, L_shl( Mult_32_16( L_add( L_shl( q1_fx, 15 ), sign1_fx ), s1_fx16 ), sub( 12 + 2, exp1 ) ) ); /*12*/
    1394           0 :             tmp2 = L_sub( a2_fx, L_shl( Mult_32_16( L_add( L_shl( q2_fx, 15 ), sign2_fx ), s2_fx16 ), sub( 12 + 2, exp2 ) ) ); /*12*/
    1395           0 :             newdist1_fx = L_add( Mult_32_32( tmp1, tmp1 ), Mult_32_32( tmp2, tmp2 ) );                                         /* -7 */
    1396             : 
    1397             :             /* step 2 */
    1398             :             /*sign1_fx = (denc_LSB[st][1] & 0x1)?(q_fx):(-q_fx);*/
    1399           0 :             IF( s_and( denc_LSB[st][1], 0x1 ) )
    1400             :             {
    1401           0 :                 sign1_fx = q_fx;
    1402           0 :                 move16();
    1403             :             }
    1404             :             ELSE
    1405             :             {
    1406           0 :                 sign1_fx = negate( q_fx );
    1407             :             }
    1408             :             /*sign2_fx = (denc_LSB[st][1] & 0x2)?(q_fx):(-q_fx);*/
    1409           0 :             IF( s_and( denc_LSB[st][1], 0x2 ) )
    1410             :             {
    1411           0 :                 sign2_fx = q_fx;
    1412           0 :                 move16();
    1413             :             }
    1414             :             ELSE
    1415             :             {
    1416           0 :                 sign2_fx = negate( q_fx );
    1417             :             }
    1418           0 :             tmp1 = L_sub( a1_fx, L_shl( Mult_32_16( L_add( L_shl( q1_fx, 15 ), sign1_fx ), s1_fx16 ), sub( 12 + 2, exp1 ) ) ); /*12*/
    1419           0 :             tmp2 = L_sub( a2_fx, L_shl( Mult_32_16( L_add( L_shl( q2_fx, 15 ), sign2_fx ), s2_fx16 ), sub( 12 + 2, exp2 ) ) ); /*12*/
    1420           0 :             newdist2_fx = L_add( Mult_32_32( tmp1, tmp1 ), Mult_32_32( tmp2, tmp2 ) );                                         /*-7*/
    1421             : 
    1422             :             /* decision */
    1423           0 :             IF( LT_32( L_add( curdist1_fx, newdist1_fx ), L_add( curdist2_fx, newdist2_fx ) ) )
    1424             :             {
    1425           0 :                 path[st][i / 2 + 1] = step_LSB[st][0];
    1426           0 :                 move16();
    1427           0 :                 metric_fx[st][i / 2 + 1] = L_add( curdist1_fx, newdist1_fx );
    1428           0 :                 move32();
    1429           0 :                 quant[st][i / 2 + 1] = 0;
    1430           0 :                 move16();
    1431           0 :                 dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st];
    1432           0 :                 move16();
    1433             :             }
    1434             :             ELSE
    1435             :             {
    1436           0 :                 path[st][i / 2 + 1] = step_LSB[st][1];
    1437           0 :                 move16();
    1438           0 :                 metric_fx[st][i / 2 + 1] = L_add( curdist2_fx, newdist2_fx );
    1439           0 :                 move32();
    1440           0 :                 quant[st][i / 2 + 1] = 1;
    1441           0 :                 move16();
    1442           0 :                 dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st];
    1443           0 :                 move16();
    1444             :             }
    1445             : 
    1446           0 :             if ( GT_32( MaxPath, metric_fx[st][i / 2 + 1] ) )
    1447             :             {
    1448           0 :                 MaxPath = L_add( metric_fx[st][i / 2 + 1], 0 );
    1449             :             }
    1450             :         }
    1451             :         /* Metric renormalization to prevent overflow */
    1452           0 :         FOR( st = 0; st < 4; st++ )
    1453             :         {
    1454           0 :             metric_fx[st][i / 2 + 1] = L_sub( metric_fx[st][i / 2 + 1], MaxPath );
    1455           0 :             move32();
    1456             :         }
    1457             :     }
    1458             : 
    1459             :     /* Find path with minimal metric */
    1460           0 :     dminpos = 0;
    1461           0 :     move16();
    1462           0 :     dmin_fx = L_add( metric_fx[dminpos][i / 2], 0 );
    1463           0 :     FOR( st = 1; st < 4; st++ )
    1464             :     {
    1465           0 :         IF( GT_32( dmin_fx, metric_fx[st][i / 2] ) )
    1466             :         {
    1467           0 :             dmin_fx = L_add( metric_fx[st][i / 2], 0 );
    1468           0 :             dminpos = st;
    1469           0 :             move16();
    1470             :         }
    1471             :     }
    1472             : 
    1473             :     /* Trace back to get output */
    1474           0 :     position = dminpos;
    1475           0 :     move16();
    1476             : 
    1477           0 :     FOR( ; i >= 0; i -= 2 )
    1478             :     {
    1479           0 :         qout[i / 2] = quant[position][i / 2 + 1];
    1480           0 :         move16();
    1481           0 :         dpath[i / 2] = dquant[position][i / 2 + 1];
    1482           0 :         move16();
    1483             : 
    1484           0 :         IF( s_and( denc_LSB[position][qout[i / 2]], 0x1 ) )
    1485             :         {
    1486           0 :             dbuffer_fx[i] = 1;
    1487           0 :             move16();
    1488             :         }
    1489             :         ELSE
    1490             :         {
    1491           0 :             dbuffer_fx[i] = -1;
    1492           0 :             move16();
    1493             :         }
    1494           0 :         IF( s_and( denc_LSB[position][qout[i / 2]], 0x2 ) )
    1495             :         {
    1496           0 :             dbuffer_fx[i + 1] = 1;
    1497           0 :             move16();
    1498             :         }
    1499             :         ELSE
    1500             :         {
    1501           0 :             dbuffer_fx[i + 1] = -1;
    1502           0 :             move16();
    1503             :         }
    1504             : 
    1505           0 :         position = path[position][i / 2 + 1];
    1506           0 :         move16();
    1507             :     }
    1508             : 
    1509             :     /* add decoded sequence to quanta */
    1510           0 :     FOR( i = 0; i < bcount; i++ )
    1511             :     {
    1512           0 :         mbuffer_fx[i] = add( add( mbuffer_fx[i], shl( mbuffer_fx[i], 2 ) ), dbuffer_fx[i] );
    1513           0 :         move16();
    1514             :     }
    1515             : 
    1516           0 :     return;
    1517             : }
    1518          32 : void TCQLSBdec_fx(
    1519             :     Word16 *dpath,
    1520             :     Word16 *mbuffer,
    1521             :     Word16 bcount )
    1522             : {
    1523             :     /*float q = QTCQ;*/
    1524          32 :     Word16 q = 1; /*x5*/
    1525          32 :     move16();
    1526          32 :     Word16 i, tmp, state = 0;
    1527          32 :     move16();
    1528          32 :     tmp = shr( bcount, 1 );
    1529         352 :     FOR( i = 0; i < tmp; i++ )
    1530             :     {
    1531         320 :         IF( s_and( ddec_LSB[state][dpath[i]], 0x1 ) )
    1532             :         {
    1533         146 :             mbuffer[2 * i] = q;
    1534         146 :             move16();
    1535             :         }
    1536             :         ELSE
    1537             :         {
    1538         174 :             mbuffer[2 * i] = negate( q );
    1539         174 :             move16();
    1540             :         }
    1541             : 
    1542         320 :         IF( s_and( ddec_LSB[state][dpath[i]], 0x2 ) )
    1543             :         {
    1544         191 :             mbuffer[2 * i + 1] = q;
    1545         191 :             move16();
    1546             :         }
    1547             :         ELSE
    1548             :         {
    1549         129 :             mbuffer[2 * i + 1] = negate( q );
    1550         129 :             move16();
    1551             :         }
    1552             : 
    1553         320 :         state = dstep_LSB[state][dpath[i]];
    1554         320 :         move16();
    1555             :     }
    1556             : 
    1557          32 :     return;
    1558             : }
    1559           0 : void RestoreTCQ_fx(
    1560             :     Word16 *magn,
    1561             :     Word16 size,
    1562             :     Word16 *bcount,
    1563             :     Word16 *mbuffer )
    1564             : {
    1565           0 :     Word16 i, nzpos = 0, flag_g1 = 0;
    1566           0 :     move16();
    1567           0 :     move16();
    1568             :     /* calculate actual nz positions */
    1569           0 :     nzpos = 0;
    1570           0 :     move16();
    1571           0 :     FOR( i = 0; i < size; i++ )
    1572             :     {
    1573           0 :         IF( magn[i] != 0 )
    1574             :         {
    1575           0 :             nzpos = add( nzpos, 1 );
    1576           0 :             if ( GT_16( abs_s( magn[i] ), 5 ) )
    1577             :             {
    1578           0 :                 flag_g1 = 1;
    1579           0 :                 move16();
    1580             :             }
    1581             :         }
    1582             :     }
    1583             : 
    1584           0 :     IF( GT_16( nzpos, 1 ) )
    1585             :     {
    1586           0 :         FOR( i = 0; i < size; i++ )
    1587             :         {
    1588           0 :             test();
    1589           0 :             IF( flag_g1 == 0 || GE_16( *bcount, 2 * TCQ_AMP ) )
    1590             :             {
    1591             :                 BREAK;
    1592             :             }
    1593             : 
    1594           0 :             IF( abs_s( magn[i] ) > 0 )
    1595             :             {
    1596           0 :                 magn[i] = mbuffer[*bcount];
    1597           0 :                 move16();
    1598           0 :                 *bcount = add( *bcount, 1 );
    1599           0 :                 move16();
    1600             :             }
    1601             :         }
    1602             :     }
    1603             : 
    1604           0 :     return;
    1605             : }
    1606         515 : void RestoreTCQdec_fx(
    1607             :     Word16 *magn,
    1608             :     Word16 size,
    1609             :     Word16 *bcount,
    1610             :     Word16 *mbuffer )
    1611             : {
    1612         515 :     Word16 i, nzpos = 0, flag_g1 = 0;
    1613         515 :     move16();
    1614         515 :     move16();
    1615             :     /* calculate actual nz positions */
    1616         515 :     nzpos = 0;
    1617         515 :     move16();
    1618        7491 :     FOR( i = 0; i < size; i++ )
    1619             :     {
    1620        6976 :         IF( magn[i] != 0 )
    1621             :         {
    1622         934 :             nzpos = add( nzpos, 1 );
    1623         934 :             if ( GT_16( abs_s( magn[i] ), 1 ) )
    1624             :             {
    1625         191 :                 flag_g1 = 1;
    1626         191 :                 move16();
    1627             :             }
    1628         934 :             magn[i] = extract_l( L_mult0( magn[i], 5 ) );
    1629         934 :             move16();
    1630             :         }
    1631             :     }
    1632             : 
    1633         515 :     IF( GT_16( nzpos, 1 ) )
    1634             :     {
    1635         996 :         FOR( i = 0; i < size; i++ )
    1636             :         {
    1637         897 :             test();
    1638         897 :             IF( !( flag_g1 && LT_16( *bcount, 2 * TCQ_AMP ) ) )
    1639             :             {
    1640             :                 BREAK;
    1641             :             }
    1642             : 
    1643         718 :             IF( magn[i] != 0 )
    1644             :             {
    1645         302 :                 mbuffer[*bcount] = add( magn[i], mbuffer[*bcount] );
    1646         302 :                 move16();
    1647         302 :                 magn[i] = mbuffer[*bcount];
    1648         302 :                 move16();
    1649         302 :                 *bcount = add( *bcount, 1 );
    1650         302 :                 move16();
    1651             :             }
    1652             :         }
    1653             :     }
    1654             : 
    1655         515 :     return;
    1656             : }
    1657             : 
    1658           0 : void InitLSBTCQ_fx(
    1659             :     Word16 *bcount )
    1660             : {
    1661           0 :     *bcount = 0;
    1662           0 :     move16();
    1663             : 
    1664           0 :     return;
    1665             : }
    1666           0 : void SaveTCQdata_fx(
    1667             :     PARCODEC arInst,
    1668             :     Word16 *dpath,
    1669             :     Word16 bcount )
    1670             : {
    1671             :     Word16 i;
    1672           0 :     FOR( i = 0; i < bcount; i++ )
    1673             :     {
    1674           0 :         ar_encode_uniform_fx( arInst, dpath[i], 1 );
    1675             :     }
    1676             : 
    1677           0 :     return;
    1678             : }
    1679          32 : void LoadTCQdata_fx(
    1680             :     PARCODEC arInst,
    1681             :     Word16 *dpath,
    1682             :     Word16 bcount )
    1683             : {
    1684             :     Word32 i;
    1685         352 :     FOR( i = 0; i < bcount; i++ )
    1686             :     {
    1687         320 :         dpath[i] = ar_decode_fx( arInst, uniform_model );
    1688         320 :         move16();
    1689             :     }
    1690             : 
    1691          32 :     return;
    1692             : }
    1693             : 
    1694             : 
    1695           0 : Word32 encode_position_ari_fx(
    1696             :     PARCODEC parenc,
    1697             :     Word16 *quants,
    1698             :     Word16 size,
    1699             :     Word32 *est_bits_frame_fx )
    1700             : {
    1701             :     Word16 i, tmp;
    1702           0 :     Word16 nz = 0, pulses = 0;
    1703           0 :     move16();
    1704           0 :     move16();
    1705             :     Word16 prob[TCQ_MAX_BAND_SIZE];
    1706             :     Word16 model_num_nz[TCQ_MAX_BAND_SIZE];
    1707           0 :     Word16 *cur_quants = quants;
    1708             :     Word16 integer, frac;
    1709           0 :     Word32 /*est_bits_frame_fx, */ btcq_fx = 0, bits_fx = 0, pnzp_fx;
    1710           0 :     move16();
    1711           0 :     move16();
    1712             :     Word32 cp, scp, fxone, fxp1;
    1713             :     Word16 pos;
    1714             : 
    1715           0 :     fxone = 32768;
    1716           0 :     move32();
    1717           0 :     fxp1 = 512 * 32768;
    1718           0 :     move32();
    1719             : 
    1720             : 
    1721           0 :     set16_fx( prob, 0, TCQ_MAX_BAND_SIZE );
    1722           0 :     set16_fx( model_num_nz, 0, TCQ_MAX_BAND_SIZE );
    1723             : 
    1724           0 :     FOR( i = 0; i < size; i++ )
    1725             :     {
    1726           0 :         pulses = add( pulses, abs_s( cur_quants[i] ) );
    1727           0 :         if ( cur_quants[i] != 0 )
    1728             :         {
    1729           0 :             nz = add( nz, 1 );
    1730             :         }
    1731             :     }
    1732             : 
    1733           0 :     btcq_fx = GetBitsFromPulses_fx( pulses, size );
    1734             :     /* Estimate TCQ bits */
    1735           0 :     bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) );
    1736           0 :     bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) ) ) );
    1737           0 :     bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[pulses - ( nz - 1 )] ) ) );
    1738           0 :     bits_fx = L_sub( bits_fx, nz );
    1739           0 :     *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx );
    1740           0 :     move32();
    1741             :     /*caculate the #nz probability */
    1742           0 :     tmp = s_min( pulses, size );
    1743           0 :     FOR( i = 0; i < tmp; i++ )
    1744             :     {
    1745           0 :         pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx );
    1746           0 :         pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ),
    1747           0 :                                          L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[pulses - i] ) ) ) );
    1748           0 :         pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */
    1749           0 :         IF( pnzp_fx > 0 )
    1750             :         {
    1751           0 :             integer = extract_h( pnzp_fx );
    1752           0 :             frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */
    1753           0 :             prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) );                /*0 */
    1754           0 :             move16();
    1755             :             /*zero probability will incur problems in ar_make_model() */
    1756           0 :             if ( prob[i] == 0 )
    1757             :             {
    1758           0 :                 prob[i] = 1;
    1759           0 :                 move16();
    1760             :             }
    1761             :         }
    1762             :         ELSE
    1763             :         {
    1764           0 :             prob[i] = 1;
    1765           0 :             move16();
    1766             :         }
    1767             :     }
    1768             : 
    1769           0 :     ar_make_model_fx( prob, model_num_nz, s_min( pulses, size ) );
    1770             : 
    1771           0 :     IF( GT_16( nz, 1 ) )
    1772             :     {
    1773           0 :         ar_encode_fx( parenc, model_num_nz, sub( nz, 1 ) ); /*encode #nz */
    1774           0 :         scp = L_add( fxp1, 0 );
    1775           0 :         pos = 0;
    1776           0 :         move16();
    1777           0 :         FOR( i = 0; i < size; i++ )
    1778             :         {
    1779           0 :             IF( nz <= 0 )
    1780             :             {
    1781           0 :                 BREAK;
    1782             :             }
    1783             : 
    1784           0 :             IF( EQ_16( nz, sub( size, i ) ) )
    1785             :             {
    1786           0 :                 cp = L_deposit_l( 0 );
    1787             :             }
    1788             :             ELSE
    1789             :             {
    1790           0 :                 cp = L_sub( fxone, div_l( L_deposit_h( nz ), sub( size, i ) ) );
    1791             :             }
    1792           0 :             scp = Mult_32_16( scp, extract_l( cp ) );
    1793           0 :             model_num_nz[pos + 1] = round_fx( L_shl( scp, 6 ) );
    1794           0 :             move16();
    1795           0 :             test();
    1796           0 :             test();
    1797           0 :             IF( ( model_num_nz[pos + 1] == 0 && scp > 0 ) || EQ_16( model_num_nz[pos], model_num_nz[pos + 1] ) )
    1798             :             {
    1799           0 :                 model_num_nz[pos + 1] = 0;
    1800           0 :                 move16();
    1801           0 :                 ar_encode_fx( parenc, model_num_nz, pos );
    1802           0 :                 i--;
    1803           0 :                 move16();
    1804           0 :                 scp = L_add( fxp1, 0 );
    1805           0 :                 pos = 0;
    1806           0 :                 move16();
    1807           0 :                 CONTINUE;
    1808             :             }
    1809             : 
    1810           0 :             IF( cur_quants[i] != 0 )
    1811             :             {
    1812           0 :                 ar_encode_fx( parenc, model_num_nz, pos );
    1813           0 :                 pos = 0;
    1814           0 :                 move16();
    1815           0 :                 scp = L_add( fxp1, 0 );
    1816           0 :                 nz--;
    1817           0 :                 move16();
    1818             :             }
    1819             :             ELSE
    1820             :             {
    1821           0 :                 pos++;
    1822           0 :                 move16();
    1823             :             }
    1824             :         }
    1825             :     }
    1826           0 :     ELSE IF( EQ_16( nz, 1 ) )
    1827             :     {
    1828           0 :         IF( GT_16( pulses, 1 ) )
    1829             :         {
    1830             :             /*temp -= log2_f((float)(model_num_nz[nz-1] - model_num_nz[nz]) / MAX_AR_FREQ); */
    1831           0 :             ar_encode_fx( parenc, model_num_nz, 0 ); /*encode #nz */
    1832             :         }
    1833           0 :         pos = 0;
    1834           0 :         move16();
    1835           0 :         FOR( i = 0; i < size; i++ )
    1836             :         {
    1837           0 :             model_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) );
    1838           0 :             move16();
    1839           0 :             if ( cur_quants[i] != 0 )
    1840             :             {
    1841           0 :                 pos = i;
    1842           0 :                 move16();
    1843             :             }
    1844             :         }
    1845           0 :         ar_encode_fx( parenc, model_num_nz, pos ); /* encode pos */
    1846             :     }
    1847           0 :     return bits_fx;
    1848             : }
    1849           0 : Word32 encode_magnitude_usq_fx(
    1850             :     ARCODEC *parenc,
    1851             :     Word16 *magn_fx,
    1852             :     Word16 size,
    1853             :     Word16 npulses,
    1854             :     Word16 nzpos,
    1855             :     Word32 *est_frame_bits_fx )
    1856             : {
    1857             :     Word16 i, j, k, tmp, magnp, magnzp;
    1858             :     Word16 magn_position[MAX_PULSES];
    1859             :     Word32 /*est_frame_bits_fx, */ bits_fx;
    1860             :     Word16 pos, model_m[MAX_PULSES + 2];
    1861             :     Word32 fxone, fxp1, cp, scp;
    1862             : 
    1863           0 :     fxone = 32768;
    1864           0 :     move32();
    1865           0 :     fxp1 = 512 * 32768;
    1866           0 :     move32();
    1867             : 
    1868             : 
    1869             :     /*estimate fac bits */
    1870           0 :     bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - nzpos + 1] ) );
    1871           0 :     *est_frame_bits_fx = L_add( *est_frame_bits_fx, bits_fx );
    1872             : 
    1873           0 :     test();
    1874           0 :     IF( EQ_16( npulses, nzpos ) || EQ_16( nzpos, 1 ) )
    1875             :     {
    1876           0 :         return bits_fx;
    1877             :     }
    1878           0 :     magnp = sub( npulses, 1 );
    1879           0 :     magnzp = sub( nzpos, 1 );
    1880             : 
    1881             :     /*generate the binary sequences of magnitudes */
    1882           0 :     k = 0;
    1883           0 :     move16();
    1884           0 :     FOR( i = 0; i < size; i++ )
    1885             :     {
    1886           0 :         IF( magn_fx[i] != 0 )
    1887             :         {
    1888           0 :             tmp = sub( abs_s( magn_fx[i] ), 1 );
    1889           0 :             FOR( j = 0; j < tmp; j++ )
    1890             :             {
    1891           0 :                 magn_position[k] = 0;
    1892           0 :                 move16();
    1893           0 :                 k = add( k, 1 );
    1894             :             }
    1895           0 :             magn_position[k] = 1;
    1896           0 :             move16();
    1897           0 :             k = add( k, 1 );
    1898             :         }
    1899             :     }
    1900             : 
    1901           0 :     set16_fx( model_m, 0, MAX_PULSES + 2 );
    1902           0 :     scp = L_add( fxp1, 0 );
    1903           0 :     model_m[0] = MAX_AR_FREQ;
    1904           0 :     move16();
    1905           0 :     pos = 0;
    1906           0 :     move16();
    1907           0 :     tmp = sub( npulses, 1 );
    1908           0 :     FOR( i = 0; i < tmp; i++ )
    1909             :     {
    1910           0 :         IF( magnzp <= 0 )
    1911             :         {
    1912           0 :             BREAK;
    1913             :         }
    1914             : 
    1915           0 :         IF( magnzp == magnp )
    1916             :         {
    1917           0 :             cp = L_deposit_l( 0 );
    1918             :         }
    1919             :         ELSE
    1920             :         {
    1921           0 :             cp = L_sub( fxone, div_l( L_deposit_h( magnzp ), magnp ) );
    1922             :         }
    1923           0 :         scp = Mult_32_16( scp, extract_l( cp ) );
    1924           0 :         model_m[pos + 1] = round_fx( L_shl( scp, 6 ) );
    1925           0 :         move16();
    1926           0 :         test();
    1927           0 :         test();
    1928           0 :         IF( ( model_m[pos + 1] == 0 && scp > 0 ) || EQ_16( model_m[pos], model_m[pos + 1] ) )
    1929             :         {
    1930           0 :             model_m[pos + 1] = 0;
    1931           0 :             move16();
    1932             : 
    1933           0 :             ar_encode_fx( parenc, model_m, pos );
    1934           0 :             pos = 0;
    1935           0 :             move16();
    1936           0 :             i = sub( i, 1 );
    1937           0 :             scp = L_add( fxp1, 0 );
    1938           0 :             CONTINUE;
    1939             :         }
    1940             : 
    1941           0 :         IF( magn_position[i] != 0 )
    1942             :         {
    1943           0 :             ar_encode_fx( parenc, model_m, pos );
    1944           0 :             pos = 0;
    1945           0 :             move16();
    1946           0 :             magnzp = sub( magnzp, 1 );
    1947           0 :             move16();
    1948           0 :             scp = L_add( fxp1, 0 );
    1949             :         }
    1950             :         ELSE
    1951             :         {
    1952           0 :             pos = add( pos, 1 );
    1953             :         }
    1954             : 
    1955           0 :         magnp = sub( magnp, 1 );
    1956           0 :         move16();
    1957             :     }
    1958           0 :     return bits_fx;
    1959             : }
    1960           0 : Word32 encode_magnitude_tcq_fx(
    1961             :     ARCODEC *parenc,
    1962             :     Word16 *magn_fx,
    1963             :     Word16 size,
    1964             :     Word16 npulses,
    1965             :     Word16 nzpos,
    1966             :     Word32 *savedstates,
    1967             :     Word32 *est_frame_bits_fx )
    1968             : {
    1969             :     Word32 tcq_bits_fx, bits_fx /*, est_frame_bits_fx*/;
    1970             :     Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
    1971             :     Word16 exp, exp1, exp2;
    1972             : 
    1973             :     Word16 i, j;
    1974             :     Word32 st;
    1975           0 :     Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 };
    1976           0 :     move16();
    1977           0 :     move16();
    1978           0 :     move16();
    1979             : 
    1980           0 :     Word16 leftp = npulses; /*pulsesnum; */
    1981           0 :     Word16 leftnz = nzpos;  /*nzpos; */
    1982           0 :     move16();
    1983           0 :     move16();
    1984             : 
    1985           0 :     bits_fx = L_deposit_l( 0 );
    1986           0 :     tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) );
    1987           0 :     *est_frame_bits_fx = L_add( *est_frame_bits_fx, tcq_bits_fx );
    1988           0 :     move32();
    1989             : 
    1990           0 :     test();
    1991           0 :     IF( EQ_16( nzpos, npulses ) || EQ_16( nzpos, 1 ) )
    1992             :     {
    1993           0 :         return bits_fx;
    1994             :     }
    1995             : 
    1996           0 :     st = L_deposit_l( 0 );
    1997           0 :     FOR( i = 0; i < size; i++ )
    1998             :     {
    1999           0 :         IF( LE_16( leftnz, 1 ) )
    2000             :         {
    2001           0 :             BREAK;
    2002             :         }
    2003             : 
    2004           0 :         st = L_add( savedstates[i], 0 );
    2005           0 :         IF( magn_fx[i] != 0 )
    2006             :         {
    2007           0 :             FOR( j = 0; j < leftp; j++ )
    2008             :             {
    2009             :                 /*calculate the two path probs point to next two states */
    2010           0 :                 num = sub( leftnz, 1 );
    2011           0 :                 denum = sub( leftp, add( j, 0x1 ) );
    2012           0 :                 IF( GE_16( num, denum ) )
    2013             :                 {
    2014           0 :                     prob1_fx = MAX_16;
    2015           0 :                     move16();
    2016           0 :                     prob0_fx = 0;
    2017           0 :                     move16();
    2018             :                 }
    2019             :                 ELSE
    2020             :                 {
    2021           0 :                     exp1 = sub( norm_s( num ), 1 );
    2022           0 :                     exp2 = norm_s( denum );
    2023           0 :                     prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
    2024           0 :                     exp = add( 15, sub( exp1, exp2 ) );
    2025           0 :                     move16();
    2026           0 :                     prob1_fx = shl( prob1_fx, sub( 15, exp ) );
    2027           0 :                     prob0_fx = sub( MAX_16, prob1_fx );
    2028             :                 }
    2029             : 
    2030           0 :                 quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
    2031           0 :                 quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
    2032             : 
    2033           0 :                 test();
    2034           0 :                 IF( NE_16( quantum1_fx, add( j, 1 ) ) && NE_16( quantum2_fx, add( j, 1 ) ) )
    2035             :                 {
    2036           0 :                     prob0_fx = MAX_16;
    2037           0 :                     move16();
    2038           0 :                     prob1_fx = 0;
    2039           0 :                     move16();
    2040             :                 }
    2041             : 
    2042           0 :                 test();
    2043           0 :                 IF( EQ_16( prob0_fx, MAX_16 ) || EQ_16( prob1_fx, MAX_16 ) )
    2044             :                 {
    2045           0 :                     CONTINUE;
    2046             :                 }
    2047             : 
    2048           0 :                 magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ );
    2049           0 :                 move16();
    2050           0 :                 IF( LT_16( j, sub( abs_s( magn_fx[i] ), 1 ) ) )
    2051             :                 {
    2052           0 :                     ar_encode_fx( parenc, magn_mode, 0 );
    2053             :                 }
    2054             :                 ELSE
    2055             :                 {
    2056           0 :                     IF( sub( leftp, j ) > leftnz )
    2057             :                     {
    2058           0 :                         ar_encode_fx( parenc, magn_mode, 1 );
    2059             :                     }
    2060           0 :                     BREAK;
    2061             :                 }
    2062             :             }
    2063             : 
    2064           0 :             leftnz = sub( leftnz, 1 );
    2065           0 :             move16();
    2066           0 :             leftp = sub( leftp, abs_s( magn_fx[i] ) );
    2067             :         }
    2068             :     }
    2069             : 
    2070           0 :     return bits_fx;
    2071             : }
    2072           0 : Word32 encode_signs_fx(
    2073             :     ARCODEC *parenc,
    2074             :     Word16 *magn,
    2075             :     Word16 size,
    2076             :     Word16 npos,
    2077             :     Word32 *est_frame_bits_fx )
    2078             : {
    2079             :     Word32 i, sign;
    2080             : 
    2081           0 :     *est_frame_bits_fx = L_add( *est_frame_bits_fx, L_deposit_h( npos ) );
    2082           0 :     move32();
    2083           0 :     FOR( i = 0; i < size; i++ )
    2084             :     {
    2085           0 :         IF( magn[i] != 0 )
    2086             :         {
    2087           0 :             sign = L_deposit_l( 0 );
    2088           0 :             if ( magn[i] > 0 )
    2089             :             {
    2090           0 :                 sign = L_deposit_l( 1 );
    2091             :             }
    2092           0 :             ar_encode_uniform_fx( parenc, sign, 1 );
    2093             :         }
    2094             :     }
    2095             : 
    2096           0 :     return L_deposit_h( npos );
    2097             : }
    2098         515 : void decode_position_ari_fx(
    2099             :     PARCODEC pardec,
    2100             :     Word16 size,
    2101             :     Word16 npulses,
    2102             :     Word16 *nz,
    2103             :     Word16 *position )
    2104             : {
    2105             :     Word16 i, tmp, nzp;
    2106             :     Word16 mode_num_nz[TCQ_MAX_BAND_SIZE];
    2107             :     Word16 prob[TCQ_MAX_BAND_SIZE];
    2108             : 
    2109             :     Word32 btcq_fx, pnzp_fx;
    2110             :     Word16 integer, frac;
    2111             :     Word32 cp, scp, fxone, fxp1;
    2112         515 :     Word16 stpos = 0, pos, ovrflag = 0, temppos, storepos;
    2113         515 :     move16();
    2114         515 :     move16();
    2115             : 
    2116         515 :     fxone = 32768;
    2117         515 :     move32();
    2118         515 :     fxp1 = 512 * 32768;
    2119         515 :     move32();
    2120         515 :     temppos = 0;
    2121         515 :     move16();
    2122         515 :     storepos = 0;
    2123         515 :     move16();
    2124             : 
    2125         515 :     set16_fx( mode_num_nz, 0, TCQ_MAX_BAND_SIZE );
    2126         515 :     set16_fx( prob, 0, TCQ_MAX_BAND_SIZE );
    2127             : 
    2128        7491 :     FOR( i = 0; i < size; i++ )
    2129             :     {
    2130        6976 :         position[i] = 0;
    2131        6976 :         move16();
    2132             :     }
    2133             : 
    2134         515 :     IF( GT_32( npulses, 1 ) )
    2135             :     {
    2136         316 :         btcq_fx = GetBitsFromPulses_fx( npulses, size );
    2137         316 :         tmp = s_min( npulses, size );
    2138        1312 :         FOR( i = 0; i < tmp; i++ )
    2139             :         {
    2140             :             /*calculate the probability of #nz */
    2141             : 
    2142         996 :             pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx );
    2143         996 :             pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ),
    2144         996 :                                              L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[npulses - i] ) ) ) );
    2145         996 :             pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */
    2146         996 :             IF( GT_32( pnzp_fx, 0 ) )
    2147             :             {
    2148         990 :                 integer = extract_h( pnzp_fx );
    2149         990 :                 frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */
    2150         990 :                 prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) );                /*0 */
    2151         990 :                 move16();
    2152         990 :                 if ( prob[i] == 0 )
    2153             :                 {
    2154           0 :                     prob[i] = 1;
    2155           0 :                     move16();
    2156             :                 }
    2157             :             }
    2158             :             ELSE
    2159             :             {
    2160           6 :                 prob[i] = 1;
    2161           6 :                 move16();
    2162             :             }
    2163             :         }
    2164             : 
    2165         316 :         ar_make_model_fx( prob, mode_num_nz, s_min( npulses, size ) );
    2166         316 :         *nz = add( 1, ar_decode_fx( pardec, mode_num_nz ) ); /*get #nz */
    2167         316 :         move16();
    2168         316 :         nzp = *nz;
    2169         316 :         move16();
    2170         316 :         IF( EQ_16( nzp, 1 ) )
    2171             :         {
    2172          38 :             mode_num_nz[0] = MAX_AR_FREQ;
    2173          38 :             move16();
    2174         372 :             FOR( i = 0; i < size; i++ )
    2175             :             {
    2176         334 :                 mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) );
    2177         334 :                 move16();
    2178             :             }
    2179             : 
    2180          38 :             position[ar_decode_fx( pardec, mode_num_nz )] = 1;
    2181          38 :             move16();
    2182             :         }
    2183             :         ELSE
    2184             :         {
    2185         278 :             mode_num_nz[0] = MAX_AR_FREQ;
    2186         278 :             move16();
    2187             : 
    2188         998 :             FOR( ; nzp > 0; nzp-- )
    2189             :             {
    2190         720 :                 scp = L_add( fxp1, 0 );
    2191         720 :                 temppos = 0;
    2192         720 :                 move16();
    2193         720 :                 storepos = 0;
    2194         720 :                 move16();
    2195             : 
    2196        6276 :                 FOR( i = stpos; i < size; i++ )
    2197             :                 {
    2198        5998 :                     ovrflag = 0;
    2199        5998 :                     move16();
    2200             : 
    2201        5998 :                     IF( nzp == sub( size, i ) )
    2202             :                     {
    2203         720 :                         cp = L_deposit_l( 0 );
    2204             :                     }
    2205             :                     ELSE
    2206             :                     {
    2207        5278 :                         cp = L_sub( fxone, div_l( L_deposit_h( nzp ), sub( size, i ) ) );
    2208             :                     }
    2209        5998 :                     scp = Mult_32_16( scp, extract_l( cp ) );
    2210        5998 :                     mode_num_nz[i + 1 - storepos - stpos] = round_fx( L_shl( scp, 6 ) );
    2211             : 
    2212        5998 :                     test();
    2213        5998 :                     test();
    2214        5998 :                     IF( ( mode_num_nz[i + 1 - storepos - stpos] == 0 && scp > 0 ) || EQ_16( mode_num_nz[i - storepos - stpos], mode_num_nz[i + 1 - storepos - stpos] ) )
    2215             :                     {
    2216         442 :                         mode_num_nz[i + 1 - storepos - stpos] = 0;
    2217         442 :                         move16();
    2218         442 :                         ovrflag = 1;
    2219         442 :                         move16();
    2220         442 :                         temppos = ar_decode_fx( pardec, mode_num_nz );
    2221         442 :                         storepos = add( storepos, temppos );
    2222         442 :                         scp = L_add( fxp1, 0 );
    2223             : 
    2224         442 :                         IF( EQ_16( temppos, sub( i, stpos ) ) ) /* esc transmitted */
    2225             :                         {
    2226           0 :                             i = sub( i, 1 );
    2227           0 :                             move16();
    2228             :                         }
    2229             :                         ELSE
    2230             :                         {
    2231         442 :                             BREAK;
    2232             :                         }
    2233             :                     }
    2234             :                 }
    2235         720 :                 IF( !ovrflag )
    2236             :                 {
    2237         278 :                     pos = add( ar_decode_fx( pardec, mode_num_nz ), storepos );
    2238         278 :                     move16();
    2239             :                 }
    2240             :                 ELSE
    2241             :                 {
    2242         442 :                     pos = storepos;
    2243         442 :                     move16();
    2244             :                 }
    2245             : 
    2246         720 :                 position[add( stpos, pos )] = 1;
    2247         720 :                 move16();
    2248         720 :                 stpos = add( stpos, add( pos, 1 ) );
    2249             :             }
    2250             :         }
    2251             :     }
    2252         199 :     ELSE IF( EQ_32( npulses, 1 ) )
    2253             :     {
    2254         176 :         *nz = npulses;
    2255         176 :         move16();
    2256         176 :         nzp = *nz;
    2257         176 :         move16();
    2258         176 :         mode_num_nz[0] = MAX_AR_FREQ;
    2259         176 :         move16();
    2260        3055 :         FOR( i = 0; i < size; i++ )
    2261             :         {
    2262        2879 :             mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) );
    2263        2879 :             move16();
    2264             :         }
    2265             : 
    2266         176 :         position[ar_decode_fx( pardec, mode_num_nz )] = 1;
    2267         176 :         move16();
    2268             :     }
    2269             :     ELSE
    2270             :     {
    2271          23 :         *nz = 0;
    2272          23 :         move16();
    2273             :     }
    2274             : 
    2275         515 :     return;
    2276             : }
    2277         515 : void decode_magnitude_usq_fx(
    2278             :     ARCODEC *pardec,
    2279             :     Word16 size,
    2280             :     Word16 npulses,
    2281             :     Word16 nzpos,
    2282             :     Word16 *positions,
    2283             :     Word16 *out )
    2284             : {
    2285             :     Word16 i, magnp, magnzp;
    2286         515 :     Word16 magns[TCQ_MAX_BAND_SIZE], magncout = 0;
    2287         515 :     move16();
    2288         515 :     Word16 storemagn, ovrflag = 0, pos, tempmagn = 0, mmodel[MAX_PULSES + 2];
    2289         515 :     move16();
    2290         515 :     move16();
    2291             :     Word32 cp, scp, fxone, fxp1;
    2292             : 
    2293         515 :     fxone = 32768;
    2294         515 :     move32();
    2295         515 :     fxp1 = 512 * 32768;
    2296         515 :     move32();
    2297             : 
    2298         515 :     set16_fx( magns, 1, TCQ_MAX_BAND_SIZE );
    2299         515 :     IF( EQ_16( nzpos, npulses ) )
    2300             :     {
    2301        6293 :         FOR( i = 0; i < size; i++ )
    2302             :         {
    2303        5917 :             out[i] = positions[i];
    2304        5917 :             move16();
    2305             :         }
    2306         376 :         return;
    2307             :     }
    2308         139 :     ELSE IF( EQ_16( nzpos, 1 ) )
    2309             :     {
    2310         226 :         FOR( i = 0; i < size; i++ )
    2311             :         {
    2312         226 :             IF( positions[i] != 0 )
    2313             :             {
    2314          38 :                 out[i] = npulses;
    2315          38 :                 move16();
    2316          38 :                 return;
    2317             :             }
    2318             :         }
    2319             :     }
    2320             : 
    2321         101 :     magnzp = sub( nzpos, 1 );
    2322         101 :     magnp = sub( npulses, 1 );
    2323             : 
    2324         101 :     magncout = 0;
    2325         101 :     move16();
    2326             : 
    2327         101 :     set16_fx( out, 0, size );
    2328         101 :     set16_fx( mmodel, 0, MAX_PULSES + 2 );
    2329             : 
    2330         101 :     mmodel[0] = MAX_AR_FREQ;
    2331         101 :     move16();
    2332         101 :     magncout = 0;
    2333         101 :     move16();
    2334         326 :     FOR( pos = 0; pos < size; pos++ )
    2335             :     {
    2336         326 :         scp = L_add( fxp1, 0 );
    2337         326 :         IF( positions[pos] != 0 )
    2338             :         {
    2339         187 :             storemagn = 0;
    2340         187 :             move16();
    2341             : 
    2342         865 :             FOR( i = 0; i < magnp; i++ )
    2343             :             {
    2344         780 :                 ovrflag = 0;
    2345         780 :                 move16();
    2346             : 
    2347         780 :                 IF( magnzp == sub( magnp, i ) )
    2348             :                 {
    2349         187 :                     cp = L_deposit_l( 0 );
    2350             :                 }
    2351             :                 ELSE
    2352             :                 {
    2353         593 :                     cp = L_sub( fxone, div_l( L_deposit_h( magnzp ), sub( magnp, i ) ) );
    2354             :                 }
    2355             : 
    2356         780 :                 IF( EQ_32( cp, fxone ) )
    2357             :                 {
    2358           0 :                     BREAK;
    2359             :                 }
    2360             : 
    2361         780 :                 scp = Mult_32_16( scp, extract_l( cp ) );
    2362         780 :                 mmodel[i + 1 - storemagn] = round_fx( L_shl( scp, 6 ) );
    2363         780 :                 move16();
    2364         780 :                 test();
    2365         780 :                 test();
    2366         780 :                 IF( ( mmodel[i + 1 - storemagn] == 0 && scp > 0 ) || EQ_16( mmodel[i - storemagn], mmodel[i + 1 - storemagn] ) )
    2367             :                 {
    2368         102 :                     mmodel[sub( add( i, 1 ), storemagn )] = 0;
    2369         102 :                     move16();
    2370             :                     /* read data */
    2371         102 :                     tempmagn = ar_decode_fx( pardec, mmodel );
    2372         102 :                     storemagn = add( storemagn, tempmagn );
    2373             : 
    2374         102 :                     IF( LT_16( tempmagn, i ) )
    2375             :                     {
    2376             :                         /* just magnitude */
    2377         102 :                         ovrflag = 1;
    2378         102 :                         move16();
    2379         102 :                         BREAK;
    2380             :                     }
    2381             :                     ELSE
    2382             :                     {
    2383             :                         /* esc code */
    2384           0 :                         scp = L_add( fxp1, 0 );
    2385           0 :                         i = sub( i, 1 );
    2386             :                     }
    2387             :                 }
    2388             :             }
    2389             : 
    2390         187 :             IF( ovrflag )
    2391             :             {
    2392         102 :                 out[magncout] = add( storemagn, 1 );
    2393         102 :                 move16();
    2394             :             }
    2395             :             ELSE
    2396             :             {
    2397          85 :                 out[magncout] = add( add( ar_decode_fx( pardec, mmodel ), storemagn ), 1 );
    2398          85 :                 move16();
    2399             :             }
    2400         187 :             magnp = sub( magnp, out[magncout] );
    2401         187 :             magnzp = sub( magnzp, 1 );
    2402         187 :             magncout = add( magncout, 1 );
    2403             : 
    2404         187 :             IF( magnzp == 0 ) /* last magnitude generation */
    2405             :             {
    2406         155 :                 FOR( pos = add( pos, 1 ); pos < size; pos++ )
    2407             :                 {
    2408         155 :                     IF( positions[pos] != 0 )
    2409             :                     {
    2410          85 :                         out[magncout] = add( magnp, 1 );
    2411          85 :                         move16();
    2412          85 :                         return;
    2413             :                     }
    2414             :                     ELSE
    2415             :                     {
    2416          70 :                         out[magncout] = 0;
    2417          70 :                         move16();
    2418          70 :                         magncout = add( magncout, 1 );
    2419          70 :                         move16();
    2420             :                     }
    2421             :                 }
    2422             :             }
    2423         102 :             ELSE IF( EQ_16( magnzp, magnp ) ) /* rest magnitudes generation */
    2424             :             {
    2425          81 :                 FOR( pos = add( pos, 1 ); pos < size; pos++ )
    2426             :                 {
    2427          65 :                     out[magncout] = positions[pos];
    2428          65 :                     move16();
    2429          65 :                     magncout = add( magncout, 1 );
    2430             :                 }
    2431          16 :                 return;
    2432             :             }
    2433             :         }
    2434             :         ELSE
    2435             :         {
    2436         139 :             out[magncout] = 0;
    2437         139 :             move16();
    2438         139 :             magncout = add( magncout, 1 );
    2439             :         }
    2440             :     }
    2441             : 
    2442           0 :     return;
    2443             : }
    2444           0 : void decode_mangitude_tcq_fx(
    2445             :     ARCODEC *pardec,
    2446             :     Word16 size,
    2447             :     Word16 npulses,
    2448             :     Word16 nzpos,
    2449             :     Word16 *positions,
    2450             :     Word16 *out,
    2451             :     Word32 *surplus_fx )
    2452             : {
    2453             :     Word32 tcq_bits_fx, bits_fx /*, surplus_fx*/;
    2454             :     Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
    2455             :     Word16 exp, exp1, exp2, tmp16;
    2456             :     Word32 tmp32;
    2457             : 
    2458             :     Word16 i, j, symbol, st;
    2459           0 :     Word16 leftp = npulses; /*pulsesnum; */
    2460           0 :     move16();
    2461           0 :     Word16 leftnz = nzpos; /*nzpos; */
    2462           0 :     move16();
    2463           0 :     Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 };
    2464           0 :     move16();
    2465           0 :     move16();
    2466           0 :     move16();
    2467             : 
    2468           0 :     bits_fx = L_deposit_l( 0 );
    2469           0 :     tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) );
    2470             : 
    2471           0 :     IF( EQ_16( nzpos, npulses ) )
    2472             :     {
    2473           0 :         FOR( i = 0; i < size; i++ )
    2474             :         {
    2475           0 :             out[i] = positions[i];
    2476           0 :             move16();
    2477             :         }
    2478             : 
    2479           0 :         return;
    2480             :     }
    2481           0 :     ELSE IF( EQ_16( nzpos, 1 ) )
    2482             :     {
    2483           0 :         FOR( i = 0; i < size; i++ )
    2484             :         {
    2485           0 :             IF( positions[i] != 0 )
    2486             :             {
    2487           0 :                 out[i] = npulses;
    2488           0 :                 move16();
    2489           0 :                 return;
    2490             :             }
    2491             :         }
    2492             :     }
    2493           0 :     st = 0;
    2494           0 :     move16();
    2495           0 :     FOR( i = 0; i < size; i++ )
    2496             :     {
    2497           0 :         IF( LE_16( leftnz, 1 ) )
    2498             :         {
    2499           0 :             BREAK;
    2500             :         }
    2501             : 
    2502           0 :         out[i] = positions[i];
    2503           0 :         move16();
    2504           0 :         IF( positions[i] != 0 )
    2505             :         {
    2506             :             /*generate the trellis path */
    2507           0 :             symbol = 0;
    2508           0 :             move16();
    2509           0 :             FOR( j = 0; j < leftp; j++ )
    2510             :             {
    2511           0 :                 num = sub( leftnz, 1 );
    2512           0 :                 denum = sub( leftp, add( j, 1 ) );
    2513           0 :                 IF( GE_16( num, denum ) )
    2514             :                 {
    2515           0 :                     prob1_fx = MAX_16;
    2516           0 :                     move16();
    2517           0 :                     prob0_fx = 0;
    2518           0 :                     move16();
    2519             :                 }
    2520             :                 ELSE
    2521             :                 {
    2522           0 :                     exp1 = sub( norm_s( num ), 1 );
    2523           0 :                     exp2 = norm_s( denum );
    2524           0 :                     prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
    2525           0 :                     exp = add( 15, sub( exp1, exp2 ) );
    2526           0 :                     prob1_fx = shl( prob1_fx, sub( 15, exp ) );
    2527           0 :                     prob0_fx = sub( MAX_16, prob1_fx );
    2528             :                 }
    2529           0 :                 IF( EQ_32( sub( leftp, j ), leftnz ) )
    2530             :                 {
    2531           0 :                     symbol = add( j, 1 );
    2532           0 :                     BREAK;
    2533             :                 }
    2534             : 
    2535           0 :                 quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
    2536           0 :                 quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
    2537             : 
    2538           0 :                 test();
    2539           0 :                 IF( NE_16( quantum1_fx, add( j, 1 ) ) && NE_16( quantum2_fx, add( j, 1 ) ) )
    2540             :                 {
    2541           0 :                     prob0_fx = MAX_16;
    2542           0 :                     move16();
    2543           0 :                     prob1_fx = 0;
    2544           0 :                     move16();
    2545             :                 }
    2546             : 
    2547           0 :                 test();
    2548           0 :                 IF( EQ_16( prob0_fx, MAX_16 ) || EQ_16( prob1_fx, MAX_16 ) )
    2549             :                 {
    2550           0 :                     symbol = add( j, 1 );
    2551           0 :                     CONTINUE;
    2552             :                 }
    2553             : 
    2554             :                 /*magn_mode[1] = (short)(prob1 * MAX_AR_FREQ); */
    2555           0 :                 magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ );
    2556           0 :                 move16();
    2557           0 :                 IF( ar_decode_fx( pardec, magn_mode ) )
    2558             :                 {
    2559           0 :                     exp1 = norm_s( prob1_fx );
    2560           0 :                     tmp32 = L_deposit_h( shl( prob1_fx, exp1 ) );                            /*exp1 + 15 + 16 */
    2561           0 :                     tmp16 = Log2_norm_lc( tmp32 );                                           /*15 */
    2562           0 :                     bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
    2563             : 
    2564           0 :                     symbol = add( j, 1 );
    2565           0 :                     BREAK;
    2566             :                 }
    2567             :                 ELSE
    2568             :                 {
    2569           0 :                     exp1 = norm_s( prob0_fx );
    2570           0 :                     tmp32 = L_deposit_h( shl( prob0_fx, exp1 ) );                            /*exp1 + 15 + 16 */
    2571           0 :                     tmp16 = Log2_norm_lc( tmp32 );                                           /*15 */
    2572           0 :                     bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
    2573             :                 }
    2574             :             }
    2575           0 :             out[i] = symbol;
    2576           0 :             move16();
    2577             :             /*leftp -= symbol; */
    2578           0 :             leftp = sub( leftp, symbol );
    2579           0 :             leftnz = sub( leftnz, 1 );
    2580             :         }
    2581             : 
    2582           0 :         quantum1_fx = quantize_fx( out[i], ddec[st][0] );
    2583           0 :         quantum2_fx = quantize_fx( out[i], ddec[st][1] );
    2584             : 
    2585             :         /*generate the next state */
    2586           0 :         IF( EQ_16( quantum1_fx, out[i] ) )
    2587             :         {
    2588           0 :             st = nextstate[st][0];
    2589           0 :             move16();
    2590             :         }
    2591             :         ELSE
    2592             :         {
    2593           0 :             st = nextstate[st][1];
    2594           0 :             move16();
    2595             :         }
    2596             :     }
    2597             : 
    2598             :     /*generate the magnitudes */
    2599           0 :     FOR( ; i < size; i++ )
    2600             :     {
    2601           0 :         out[i] = 0;
    2602           0 :         move16();
    2603           0 :         IF( positions[i] != 0 )
    2604             :         {
    2605           0 :             out[i] = add( sub( leftp, leftnz ), 1 );
    2606           0 :             move16();
    2607             :         }
    2608             :     }
    2609             : 
    2610           0 :     test();
    2611           0 :     IF( NE_16( nzpos, npulses ) && GT_16( nzpos, 1 ) )
    2612             :     {
    2613             :         /*update the surplus */
    2614           0 :         *surplus_fx = L_add( *surplus_fx, L_sub( tcq_bits_fx, L_shl( bits_fx, 1 ) ) );
    2615           0 :         move32();
    2616             :     }
    2617             : 
    2618           0 :     return;
    2619             : }
    2620             : 
    2621         515 : void decode_signs_fx(
    2622             :     ARCODEC *pardec,
    2623             :     Word16 size,
    2624             :     Word16 *out )
    2625             : {
    2626             :     Word16 i;
    2627             : 
    2628        7491 :     FOR( i = 0; i < size; i++ )
    2629             :     {
    2630        6976 :         IF( out[i] != 0 )
    2631             :         {
    2632             :             Word16 tmp;
    2633         934 :             tmp = ar_decode_fx( pardec, uniform_model );
    2634             : 
    2635         934 :             if ( tmp <= 0 )
    2636             :             {
    2637         455 :                 out[i] = negate( out[i] );
    2638         455 :                 move16();
    2639             :             }
    2640             :         }
    2641             :     }
    2642             : 
    2643         515 :     return;
    2644             : }
    2645             : 
    2646         515 : Word16 GetScale_fx(
    2647             :     Word16 blen,
    2648             :     Word32 bits_fx /*Q16*/,
    2649             :     Word32 *surplus_fx /*Q16*/
    2650             : )
    2651             : {
    2652         515 :     Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum;
    2653         515 :     move16();
    2654         515 :     Word32 t, a, b, ab, estbits_fx = 0;
    2655         515 :     move32();
    2656         515 :     magicnum = 24773;
    2657         515 :     move16(); /*Q17: 0.188992013101951f; */
    2658             : 
    2659         515 :     t = L_shr( L_mult( magicnum, blen ), 2 );
    2660         515 :     exp = norm_l( t );
    2661         515 :     a = L_add( L_shl( sub( 14, exp ), 15 ), Log2_norm_lc( L_shl( t, exp ) ) );
    2662             : 
    2663         515 :     exp1 = sub( norm_l( bits_fx ), 1 );
    2664         515 :     exp2 = norm_s( sub( blen, 1 ) );
    2665         515 :     b = L_shr( L_deposit_l( div_l( L_shl( bits_fx, exp1 ), shl( sub( blen, 1 ), exp2 ) ) ), sub( exp1, exp2 ) );
    2666             : 
    2667         515 :     ab = L_add( a, b );
    2668             : 
    2669         515 :     p_est = extract_h( L_shl( Pow2( extract_l( L_shr( ab, 15 ) ), extract_l( L_and( ab, 0x7FFF ) ) ), 16 ) ); /* enable saturationof pow2 result  */
    2670             : 
    2671         515 :     pulses = s_min( p_est, MAX_PULSES );
    2672             : 
    2673        1822 :     FOR( ; pulses >= 0; pulses-- )
    2674             :     {
    2675        1822 :         estbits_fx = GetBitsFromPulses_fx( pulses, blen );
    2676        1822 :         IF( GE_32( bits_fx, estbits_fx ) )
    2677             :         {
    2678         515 :             BREAK;
    2679             :         }
    2680             :     }
    2681             : 
    2682         515 :     IF( surplus_fx != 0 )
    2683             :     {
    2684         515 :         *surplus_fx = L_add( *surplus_fx, L_sub( bits_fx, estbits_fx ) );
    2685         515 :         move16();
    2686             :     }
    2687             : 
    2688         515 :     return pulses;
    2689             : }
    2690             : 
    2691          32 : void srt_vec_ind_fx(
    2692             :     const Word32 *linear, /* linear input */
    2693             :     Word32 *srt,          /* sorted output*/
    2694             :     Word16 *I,            /* index for sorted output  */
    2695             :     Word16 length )
    2696             : {
    2697             :     Word16 pos, npos, tmp;
    2698             :     Word16 idxMem;
    2699             :     Word32 valMem;
    2700             : 
    2701             :     /*initilize */
    2702         756 :     FOR( pos = 0; pos < length; pos++ )
    2703             :     {
    2704         724 :         I[pos] = pos;
    2705         724 :         move16();
    2706             :     }
    2707             : 
    2708          32 :     Copy32( linear, srt, length );
    2709             : 
    2710             :     /* now iterate */
    2711          32 :     tmp = sub( length, 1 );
    2712         724 :     FOR( pos = 0; pos < tmp; pos++ )
    2713             :     {
    2714        8614 :         FOR( npos = add( pos, 1 ); npos < length; npos++ )
    2715             :         {
    2716        7922 :             IF( LT_32( srt[npos], srt[pos] ) )
    2717             :             {
    2718        3113 :                 idxMem = I[pos];
    2719        3113 :                 move16();
    2720        3113 :                 I[pos] = I[npos];
    2721        3113 :                 move16();
    2722        3113 :                 I[npos] = idxMem;
    2723        3113 :                 move16();
    2724             : 
    2725        3113 :                 valMem = L_add( srt[pos], 0 );
    2726        3113 :                 srt[pos] = srt[npos];
    2727        3113 :                 move32();
    2728        3113 :                 srt[npos] = valMem;
    2729        3113 :                 move32();
    2730             :             }
    2731             :         }
    2732             :     }
    2733             : 
    2734          32 :     return;
    2735             : }

Generated by: LCOV version 1.14