LCOV - code coverage report
Current view: top level - lib_lc3plus - quantize_spec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 0 321 0.0 %
Date: 2025-08-23 01:22:27 Functions: 0 1 0.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             : *                        ETSI TS 103 634 V1.5.1                               *
       3             : *              Low Complexity Communication Codec Plus (LC3plus)              *
       4             : *                                                                             *
       5             : * Copyright licence is solely granted through ETSI Intellectual Property      *
       6             : * Rights Policy, 3rd April 2019. No patent licence is granted by implication, *
       7             : * estoppel or otherwise.                                                      *
       8             : ******************************************************************************/
       9             : 
      10             : #include "functions.h"
      11             : 
      12             : #ifdef ENABLE_HR_MODE
      13           0 : void processQuantizeSpec_fx(Word32 x[], Word16 x_e, Word32 gain, Word16 gain_e, Word32 xq[], Word16 nt, Word16 target,
      14             :                             Word16 totalBits, Word16 *nBits, Word16 *nBits2, Word16 fs_idx, Word16 *lastnzout,
      15             :                             Word16 *codingdata, Word16 *lsbMode, Word16 mode, Word16 hrmode)
      16             : {
      17             : 
      18             :     Word32  a1, b1, a1_i, b1_i;
      19             :     Word16  t, lev1;
      20             :     Word16  lastnz, lastnz2;
      21             :     Word16  rateFlag;
      22             :     Word32  nbits32, nbits232, target32;
      23             :     Word16  nt_half;
      24             :     Word32  c, ab_max, msb, a1_msb, b1_msb;
      25             :     Word16  levmax;
      26             :     Word16  s;
      27             :     Word16  totBits, nbits_lsb;
      28             :     Counter k, lev;
      29             :     Word16  maxlevs;
      30             : #ifndef FUNCTION_quantizeSpec_func1
      31             :     Word16  tmp16;
      32             :     Word32  offs32;
      33             :     Counter i;
      34             : #else
      35             :     Word32 ARM_params[3];
      36             : #endif
      37             : 
      38             : #ifdef DYNMEM_COUNT
      39             :     Dyn_Mem_In("processQuantizeSpec_fx", sizeof(struct {
      40             :                    Word32  a1, b1, a1_i, b1_i, ab_max, c;
      41             :                    Word16  t, lev1;
      42             :                    Word16  lastnz, lastnz2;
      43             :                    Word16  rateFlag;
      44             :                    Word32  nbits32, nbits232;
      45             :                    Word16  nt_half;
      46             :                    Word16  msb, a1_msb, b1_msb, levmax;
      47             :                    Counter k, lev, i;
      48             :                    Word16  s;
      49             :                    Word16  tmp16;
      50             :                    Word32  offs32, target32;
      51             :                    Word16  totBits, nbits_lsb;
      52             :                    Word16  maxlevs;
      53             :                }));
      54             : #endif
      55             : 
      56           0 :     assert(target >= 0);
      57             :     
      58             :     /* Quantization */
      59           0 :     gain = invFixp(gain, &gain_e);
      60             : 
      61           0 :     maxlevs = 21;
      62           0 :     IF (hrmode)
      63             :     {
      64           0 :         s = sub(add(x_e, gain_e), 23);
      65           0 :         s = s_min(s, 31);
      66             : #ifdef FUNCTION_quantizeSpec_func1
      67             :             ARM_params[0] = gain;
      68             :             ARM_params[1] = s;
      69             : 
      70             :             quantizeSpec_func1_hr_ip(xq, x, nt, ARM_params);
      71             : #else
      72           0 :             IF(s > 4)
      73             :             {
      74           0 :                 s = sub(s, 4); /* Use extra bits of precision for fine calculation */
      75           0 :                 FOR(i = 0; i < nt; i++)
      76             :                 {
      77           0 :                     offs32 = Mpy_32_32_lc3plus(L_shl_pos(x[i], s), gain); /* multiply */
      78           0 :                     xq[i] =     L_shr_r_pos(offs32, 4);    /* Convert to Q0 with rounding */
      79             :                     /* rounding is the equivalent of adding 0.5, which is the offset in hrmode */
      80             : 
      81           0 :                     move32();
      82             :                 }
      83             :             }
      84             :             ELSE
      85             :             {
      86           0 :                 FOR(i = 0; i < nt; i++)
      87             :                 {
      88           0 :                     offs32 = Mpy_32_32_lc3plus(x[i], gain); /* multiply */
      89           0 :                     offs32 = L_shl(offs32, s);      /* convert to 23Q8 */
      90           0 :                     xq[i] = L_shr_r_pos(offs32, 8);    /* Convert to Q0 with rounding */
      91             :                     /* rounding is the equivalent of adding 0.5, which is the offset in hrmode */
      92             : 
      93           0 :                     move32();
      94             :                 }
      95             :             }
      96             : #endif /* FUNCTION_quantizeSpec_func1 */
      97             :     }
      98             :     ELSE
      99             :     {
     100           0 :         s = sub(add(x_e, gain_e), 15);
     101           0 :         s = s_max(s_min(s, 15), -15);
     102             : #ifdef FUNCTION_quantizeSpec_func1
     103             :             ARM_params[0] = gain;
     104             :             ARM_params[1] = s;
     105             :             ARM_params[2] = -4096;
     106             :             quantizeSpec_func1_ip(xq, x, nt, ARM_params);
     107             : #else
     108           0 :         FOR (i = 0; i < nt; i++)
     109             :         {
     110           0 :                 offs32 = Mpy_32_32_lc3plus(L_abs(x[i]), gain); /* multiply */
     111           0 :                 offs32 = L_shl(offs32, s);             /* convert to 15Q16 */
     112           0 :                 tmp16  = mac_r(offs32, -4096, 1);      /* add offset and truncate */
     113             : 
     114           0 :                 if (x[i] < 0)
     115           0 :                     tmp16 = negate(tmp16); /* restore sign */
     116             : 
     117             :                 /* Normal quantization: xq[i] =  x[i] / gg + sign(x[i]) * 0.375
     118             :                    quant_offset is -0.125 in Q15 and round adds 0.5 in Q16. Hence
     119             :                    mac_r results in abs(x[i])/gain - 0.125 + 0.5 = abs(x[i])/gain + 0.375.
     120             :                    Due to the abs and negate combination this achieves the same result
     121             :                    as spec.
     122             :                 */
     123             : 
     124           0 :                 xq[i] = tmp16;
     125           0 :                 move16();
     126             :             }
     127             : #endif /* FUNCTION_quantizeSpec_func1 */
     128             :     }
     129             :     /* Rate flag */
     130           0 :     rateFlag = 0;
     131           0 :     move16();
     132           0 :     if (fs_idx != 5)
     133             :     {
     134           0 :         if (sub(totalBits, add(160, DEPR_i_mult(fs_idx, 160))) > 0)
     135             :         {
     136           0 :             rateFlag = 2 << NBITS_CONTEXT;
     137           0 :             move16();
     138             :         }
     139             :     }
     140             : 
     141             :     /* Init */
     142           0 :     nt_half = shr_pos(nt, 1);
     143           0 :     c       = 0;
     144           0 :     move16();
     145           0 :     t = 0;
     146           0 :     move16();
     147           0 :     a1_i = 0;
     148           0 :     move16();
     149           0 :     b1_i = 1;
     150           0 :     move16();
     151           0 :     target32 = L_shl_pos(L_deposit_l(target), SYM_BITS_Q);
     152           0 :     nbits32  = L_negate(target32);
     153           0 :     nbits232 = 0;
     154           0 :     move32();
     155           0 :     nbits_lsb = 0;
     156           0 :     move16();
     157             : 
     158           0 :     if (fs_idx != 5)
     159             :     {
     160           0 :         IF (mode == 0 && sub(totalBits, add(480, DEPR_i_mult(fs_idx, 160))) >= 0)
     161             :         {
     162           0 :             mode = 1;
     163           0 :             move16();
     164             :         }
     165             :     }
     166             : 
     167             :     /* Find last non-zero tuple */
     168           0 :     lastnz = find_last_nz_pair(xq, nt);
     169           0 :     IF (mode >= 0)
     170             :     {
     171           0 :         lastnz2 = 2;
     172             :     }
     173             :     ELSE
     174             :     {
     175           0 :         lastnz2 = lastnz;
     176             :     }
     177             : 
     178           0 :     IF (mode < 0)
     179             :     {
     180             :         /* Main Loop through the 2-tuples */
     181           0 :         FOR (k = 0; k < lastnz; k += 2)
     182             :         {
     183             : 
     184             :             /* Get context */
     185           0 :             t = add(c, rateFlag);
     186           0 :             if (sub(k, nt_half) > 0)
     187             :             {
     188           0 :                 t = add(t, 1 << NBITS_CONTEXT);
     189             :             }
     190           0 :             codingdata[0] = t;
     191           0 :             move16();
     192             : 
     193             :             /* Init current 2-tuple encoding */
     194           0 :             a1     = L_abs(xq[a1_i]);
     195           0 :             b1     = L_abs(xq[b1_i]);
     196           0 :             ab_max = L_max(a1, b1);
     197             : 
     198           0 :             IF (ab_max == 0)
     199             :             {
     200           0 :                 codingdata[1] = -1;
     201           0 :                 move16();
     202           0 :                 codingdata[2] = 0;
     203           0 :                 move16();
     204           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]);
     205           0 :                 c       = add(shl_pos(s_and(c, 0xf), 4), 1);
     206             :             }
     207           0 :             ELSE IF (L_sub(ab_max, A_THRES) < 0)
     208             :             {
     209           0 :                 codingdata[1] = 0;
     210           0 :                 move16();
     211           0 :                 msb           = L_add(a1, L_shl_pos(b1, A_THRES_SHIFT));
     212           0 :                 codingdata[2] = msb;
     213           0 :                 move16();
     214           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]);
     215           0 :                 if (a1 != 0)
     216             :                 {
     217           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     218             :                 }
     219           0 :                 if (b1 != 0)
     220             :                 {
     221           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     222             :                 }
     223           0 :                 c = L_add(shl_pos(s_and(c, 0xf), 4), L_add(L_add(a1, b1), 1));
     224             :             }
     225           0 :             ELSE IF (L_sub(ab_max, 2 * A_THRES) < 0)
     226             :             {
     227           0 :                 codingdata[1] = 1;
     228           0 :                 move16();
     229           0 :                 nbits32       = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]);
     230           0 :                 nbits32       = L_add(nbits32, 2 << SYM_BITS_Q);
     231           0 :                 a1_msb        = L_shr_pos_pos(a1, 1);
     232           0 :                 b1_msb        = L_shr_pos_pos(b1, 1);
     233           0 :                 msb           = L_add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT));
     234           0 :                 codingdata[2] = msb;
     235           0 :                 move16();
     236           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]);
     237           0 :                 if (a1 != 0)
     238             :                 {
     239           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     240             :                 }
     241           0 :                 if (b1 != 0)
     242             :                 {
     243           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     244             :                 }
     245           0 :                 c = L_add(shl_pos(s_and(c, 0xf), 4), L_add(L_shl_pos(L_add(a1_msb, b1_msb), 1), 1));
     246             :             }
     247             :             ELSE
     248             :             {
     249           0 :                 levmax        = sub(maxlevs, sub(norm_l(ab_max), 8));
     250           0 :                 codingdata[1] = levmax;
     251           0 :                 move16();
     252           0 :                 FOR (lev = 0; lev < levmax; lev++)
     253             :                 {
     254           0 :                     lev1    = s_min(lev, 3);
     255           0 :                     nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]);
     256             :                 }
     257           0 :                 nbits32       = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1));
     258           0 :                 a1_msb        = L_shr(a1, levmax);
     259           0 :                 b1_msb        = L_shr(b1, levmax);
     260           0 :                 msb           = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT));
     261           0 :                 codingdata[2] = msb;
     262           0 :                 move16();
     263           0 :                 lev1    = s_min(levmax, 3);
     264           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]);
     265           0 :                 if (a1 != 0)
     266             :                 {
     267           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     268             :                 }
     269           0 :                 if (b1 != 0)
     270             :                 {
     271           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     272             :                 }
     273           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3)));
     274             :             }
     275             : 
     276           0 :             a1_i += 2;
     277           0 :             b1_i += 2;
     278           0 :             codingdata += 3;
     279             : 
     280             :         } /* end of the 2-tuples loop */
     281             :     }
     282           0 :     ELSE IF (mode == 0)
     283             :     {
     284             :         /* Main Loop through the 2-tuples */
     285           0 :         FOR (k = 0; k < lastnz; k += 2)
     286             :         {
     287             : 
     288             :             /* Get context */
     289           0 :             t = add(c, rateFlag);
     290           0 :             if (sub(k, nt_half) > 0)
     291             :             {
     292           0 :                 t = add(t, 1 << NBITS_CONTEXT);
     293             :             }
     294             : 
     295           0 :             codingdata[0] = t;
     296           0 :             move16();
     297             : 
     298             :             /* Init current 2-tuple encoding */
     299           0 :             a1     = L_abs(xq[a1_i]);
     300           0 :             b1     = L_abs(xq[b1_i]);
     301           0 :             ab_max = L_max(a1, b1);
     302             : 
     303           0 :             IF (ab_max == 0)
     304             :             {
     305           0 :                 codingdata[1] = -1;
     306           0 :                 move16();
     307           0 :                 codingdata[2] = 0;
     308           0 :                 move16();
     309           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]);
     310           0 :                 c       = add(shl_pos(s_and(c, 0xf), 4), 1);
     311             :             }
     312           0 :             ELSE IF (L_sub(ab_max, A_THRES) < 0)
     313             :             {
     314           0 :                 codingdata[1] = 0;
     315           0 :                 move16();
     316           0 :                 msb           = L_add(a1, L_shl_pos(b1, A_THRES_SHIFT));
     317           0 :                 codingdata[2] = msb;
     318           0 :                 move16();
     319           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]);
     320           0 :                 if (a1 != 0)
     321             :                 {
     322           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     323             :                 }
     324           0 :                 if (b1 != 0)
     325             :                 {
     326           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     327             :                 }
     328             : 
     329           0 :                 if (nbits32 <= 0)
     330             :                 {
     331           0 :                     lastnz2 = add(k, 2);
     332             :                 }
     333           0 :                 if (nbits32 <= 0)
     334             :                 {
     335           0 :                     nbits232 = nbits32;
     336           0 :                     move32();
     337             :                 }
     338             : 
     339           0 :                 c = L_add(shl_pos(s_and(c, 0xf), 4), L_add(L_add(a1, b1), 1));
     340             :             }
     341           0 :             ELSE IF (L_sub(ab_max, 2 * A_THRES) < 0)
     342             :             {
     343           0 :                 codingdata[1] = 1;
     344           0 :                 move16();
     345           0 :                 nbits32       = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]);
     346           0 :                 nbits32       = L_add(nbits32, 2 << SYM_BITS_Q);
     347           0 :                 a1_msb        = L_shr_pos_pos(a1, 1);
     348           0 :                 b1_msb        = L_shr_pos_pos(b1, 1);
     349           0 :                 msb           = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT));
     350           0 :                 codingdata[2] = msb;
     351           0 :                 move16();
     352           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]);
     353           0 :                 if (a1 != 0)
     354             :                 {
     355           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     356             :                 }
     357           0 :                 if (b1 != 0)
     358             :                 {
     359           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     360             :                 }
     361             : 
     362           0 :                 if (nbits32 <= 0)
     363             :                 {
     364           0 :                     lastnz2 = add(k, 2);
     365             :                 }
     366           0 :                 if (nbits32 <= 0)
     367             :                 {
     368           0 :                     nbits232 = nbits32;
     369           0 :                     move32();
     370             :                 }
     371             : 
     372           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), L_add(L_shl_pos(L_add(a1_msb, b1_msb), 1), 1));
     373             :             }
     374             :             ELSE
     375             :             {
     376           0 :                 levmax        = sub(maxlevs, sub(norm_l(ab_max), 8));
     377           0 :                 codingdata[1] = levmax;
     378           0 :                 move16();
     379           0 :                 FOR (lev = 0; lev < levmax; lev++)
     380             :                 {
     381           0 :                     lev1    = s_min(lev, 3);
     382           0 :                     nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]);
     383             :                 }
     384           0 :                 nbits32       = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1));
     385           0 :                 a1_msb        = L_shr(a1, levmax);
     386           0 :                 b1_msb        = L_shr(b1, levmax);
     387           0 :                 msb           = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT));
     388           0 :                 codingdata[2] = msb;
     389           0 :                 move16();
     390           0 :                 lev1    = s_min(levmax, 3);
     391           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]);
     392           0 :                 if (a1 != 0)
     393             :                 {
     394           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     395             :                 }
     396           0 :                 if (b1 != 0)
     397             :                 {
     398           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     399             :                 }
     400             : 
     401           0 :                 if (nbits32 <= 0)
     402             :                 {
     403           0 :                     lastnz2 = add(k, 2);
     404             :                 }
     405           0 :                 if (nbits32 <= 0)
     406             :                 {
     407           0 :                     nbits232 = nbits32;
     408           0 :                     move32();
     409             :                 }
     410             : 
     411           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3)));
     412             :             }
     413             : 
     414           0 :             a1_i += 2;
     415           0 :             b1_i += 2;
     416           0 :             codingdata += 3;
     417             : 
     418             :         } /* end of the 2-tuples loop */
     419             :     }
     420             :     ELSE
     421             :     {
     422             :         /* Main Loop through the 2-tuples */
     423           0 :         FOR (k = 0; k < lastnz; k += 2)
     424             :         {
     425             : 
     426             :             /* Get context */
     427           0 :             t = add(c, rateFlag);
     428             : 
     429           0 :             if (sub(k, nt_half) > 0)
     430             :             {
     431           0 :                 t = add(t, 1 << NBITS_CONTEXT);
     432             :             }
     433             : 
     434           0 :             codingdata[0] = t;
     435           0 :             move16();
     436             : 
     437             :             /* Init current 2-tuple encoding */
     438           0 :             a1     = L_abs(xq[a1_i]);
     439           0 :             b1     = L_abs(xq[b1_i]);
     440           0 :             ab_max = L_max(a1, b1);
     441             : 
     442           0 :             IF (ab_max == 0)
     443             :             {
     444           0 :                 codingdata[1] = -1;
     445           0 :                 move16();
     446           0 :                 codingdata[2] = 0;
     447           0 :                 move16();
     448           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]);
     449           0 :                 c       = add(shl_pos(s_and(c, 0xf), 4), 1);
     450             :             }
     451           0 :             ELSE IF (L_sub(ab_max, A_THRES) < 0)
     452             :             {
     453           0 :                 codingdata[1] = 0;
     454           0 :                 move16();
     455           0 :                 msb           = L_add(a1, L_shl_pos(b1, A_THRES_SHIFT));
     456           0 :                 codingdata[2] = msb;
     457           0 :                 move16();
     458           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]);
     459           0 :                 if (a1 != 0)
     460             :                 {
     461           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     462             :                 }
     463           0 :                 if (b1 != 0)
     464             :                 {
     465           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     466             :                 }
     467             : 
     468           0 :                 if (nbits32 <= 0)
     469             :                 {
     470           0 :                     lastnz2 = add(k, 2);
     471             :                 }
     472           0 :                 if (nbits32 <= 0)
     473             :                 {
     474           0 :                     nbits232 = nbits32;
     475           0 :                     move32();
     476             :                 }
     477             : 
     478           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1));
     479             :             }
     480           0 :             ELSE IF (L_sub(ab_max, 2 * A_THRES) < 0)
     481             :             {
     482           0 :                 codingdata[1] = 1;
     483           0 :                 move16();
     484           0 :                 nbits32       = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]);
     485           0 :                 a1_msb        = L_shr_pos_pos(a1, 1);
     486           0 :                 b1_msb        = L_shr_pos_pos(b1, 1);
     487           0 :                 msb           = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT));
     488           0 :                 codingdata[2] = msb;
     489           0 :                 move16();
     490           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]);
     491           0 :                 if (a1_msb != 0)
     492             :                 {
     493           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     494             :                 }
     495           0 :                 if (b1_msb != 0)
     496             :                 {
     497           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     498             :                 }
     499           0 :                 nbits_lsb = add(nbits_lsb, 2);
     500           0 :                 if (L_sub(a1, 1) == 0)
     501             :                 {
     502           0 :                     nbits_lsb = add(nbits_lsb, 1);
     503             :                 }
     504           0 :                 if (L_sub(b1, 1) == 0)
     505             :                 {
     506           0 :                     nbits_lsb = add(nbits_lsb, 1);
     507             :                 }
     508             : 
     509           0 :                 if (nbits32 <= 0)
     510             :                 {
     511           0 :                     lastnz2 = add(k, 2);
     512             :                 }
     513           0 :                 if (nbits32 <= 0)
     514             :                 {
     515           0 :                     nbits232 = nbits32;
     516           0 :                     move32();
     517             :                 }
     518             : 
     519           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1));
     520             :             }
     521             :             ELSE
     522             :             {
     523           0 :                 levmax        = sub(maxlevs, sub(norm_l(ab_max), 8));
     524           0 :                 codingdata[1] = levmax;
     525           0 :                 move16();
     526           0 :                 FOR (lev = 0; lev < levmax; lev++)
     527             :                 {
     528           0 :                     lev1    = s_min(lev, 3);
     529           0 :                     nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]);
     530             :                 }
     531           0 :                 nbits32       = L_add(nbits32, L_shl_pos(L_deposit_l(sub(levmax, 1)), SYM_BITS_Q + 1));
     532           0 :                 a1_msb        = L_shr(a1, levmax);
     533           0 :                 b1_msb        = L_shr(b1, levmax);
     534           0 :                 msb           = L_add(a1_msb, L_shl_pos(b1_msb, A_THRES_SHIFT));
     535           0 :                 codingdata[2] = msb;
     536           0 :                 move16();
     537           0 :                 lev1    = s_min(levmax, 3);
     538           0 :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]);
     539           0 :                 a1_msb  = L_shr_pos(a1, 1);
     540           0 :                 b1_msb  = L_shr_pos(b1, 1);
     541           0 :                 if (a1_msb != 0)
     542             :                 {
     543           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     544             :                 }
     545           0 :                 if (b1_msb != 0)
     546             :                 {
     547           0 :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     548             :                 }
     549           0 :                 nbits_lsb = add(nbits_lsb, 2);
     550           0 :                 if (L_sub(a1, 1) == 0)
     551             :                 {
     552           0 :                     nbits_lsb = add(nbits_lsb, 1);
     553             :                 }
     554           0 :                 if (L_sub(b1, 1) == 0)
     555             :                 {
     556           0 :                     nbits_lsb = add(nbits_lsb, 1);
     557             :                 }
     558             : 
     559           0 :                 if (nbits32 <= 0)
     560             :                 {
     561           0 :                     lastnz2 = add(k, 2);
     562             :                 }
     563           0 :                 if (nbits32 <= 0)
     564             :                 {
     565           0 :                     nbits232 = nbits32;
     566           0 :                     move32();
     567             :                 }
     568             : 
     569           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3)));
     570             :             }
     571             : 
     572           0 :             a1_i += 2;
     573           0 :             b1_i += 2;
     574           0 :             codingdata += 3;
     575             : 
     576             :         } /* end of the 2-tuples loop */
     577             :     }
     578             : 
     579             :     /* Number of consumed bits */
     580           0 :     nbits32 = L_add(nbits32, target32);
     581           0 :     totBits = add(extract_l(L_shr_pos_pos(L_sub(nbits32, 1), SYM_BITS_Q)), 1);
     582           0 :     IF (mode > 0)
     583             :     {
     584           0 :         totBits = add(totBits, nbits_lsb);
     585             :     }
     586           0 :     IF (nBits != NULL)
     587             :     {
     588           0 :         *nBits = totBits;
     589             :     }
     590           0 :     IF (mode >= 0)
     591             :     {
     592           0 :         nbits232 = L_add(nbits232, target32);
     593           0 :         *nBits2  = add(extract_l(L_shr_pos(L_sub(nbits232, 1), SYM_BITS_Q)), 1);
     594             :     }
     595             :     ELSE
     596             :     {
     597           0 :         *nBits2 = *nBits;
     598           0 :         move16();
     599             :     }
     600           0 :     IF (mode > 0)
     601             :     {
     602           0 :         *nBits2 = add(*nBits2, nbits_lsb);
     603             :     }
     604           0 :     *lastnzout = lastnz2;
     605             : 
     606             :     /* Truncation of high frequency coefficients */
     607           0 :     IF (lastnz > lastnz2)
     608             :     {
     609           0 :         basop_memset(&xq[lastnz2], 0, (lastnz - lastnz2) * sizeof(*xq));
     610             :     }
     611             : 
     612             :     /* Truncation of LSBs */
     613           0 :     test();
     614           0 :     IF (mode > 0 && sub(totBits, target) > 0)
     615             :     {
     616           0 :         *lsbMode = 1;
     617           0 :         move16();
     618             :     }
     619             :     ELSE
     620             :     {
     621           0 :         *lsbMode = 0;
     622           0 :         move16();
     623             :     }
     624             : 
     625             : #ifdef DYNMEM_COUNT
     626             :     Dyn_Mem_Out();
     627             : #endif
     628           0 : }
     629             : 
     630             : #else /* ENABLE_HR_MODE */
     631             : 
     632             : void processQuantizeSpec_fx(Word32 x[], Word16 x_e, Word16 gain, Word16 gain_e, Word16 xq[], Word16 nt, Word16 target,
     633             :                             Word16 totalBits, Word16 *nBits, Word16 *nBits2, Word16 fs_idx, Word16 *lastnzout,
     634             :                             Word16 *codingdata, Word16 *lsbMode, Word16 mode
     635             : )
     636             : {
     637             : 
     638             :     Word16  a1, b1, a1_i, b1_i;
     639             :     Word16  t, lev1;
     640             :     Word16  lastnz, lastnz2;
     641             :     Word16  rateFlag;
     642             :     Word32  nbits32, nbits232, target32;
     643             :     Word16  nt_half;
     644             :     Word16  c, ab_max, msb, a1_msb, b1_msb, levmax;
     645             :     Word16  s;
     646             :     Word16  totBits, nbits_lsb;
     647             :     Counter k, lev;
     648             :     Word16  tmp16;
     649             :     Word32  offs32;
     650             :     Counter i;
     651             : 
     652             : #ifdef DYNMEM_COUNT
     653             :     Dyn_Mem_In("processQuantizeSpec_fx", sizeof(struct {
     654             :                    Word16  a1, b1, a1_i, b1_i;
     655             :                    Word16  t, lev1;
     656             :                    Word16  lastnz, lastnz2;
     657             :                    Word16  rateFlag;
     658             :                    Word32  nbits32, nbits232;
     659             :                    Word16  nt_half;
     660             :                    Word16  c, ab_max, msb, a1_msb, b1_msb, levmax;
     661             :                    Counter k, lev, i;
     662             :                    Word16  s;
     663             :                    Word16  tmp16;
     664             :                    Word32  offs32, target32;
     665             :                    Word16  totBits, nbits_lsb;
     666             :                }));
     667             : #endif
     668             : 
     669             :     /* Quantization */
     670             :     gain = Inv16_lc3plus(gain, &gain_e);
     671             :     s    = sub(add(x_e, gain_e), 15);
     672             :     s = s_max(s_min(s, 15), -15);
     673             :      
     674             :     FOR (i = 0; i < nt; i++)
     675             :     {
     676             :         offs32 = Mpy_32_16_lc3plus(L_abs(x[i]), gain);          /* multiply */
     677             :         offs32 = L_shl(offs32, s);                      /* convert to 15Q16 */
     678             :         tmp16 = extract_h(L_add(offs32, 0x00006000));   /* add offset and truncate */
     679             :         Word16 x_sign = (Word16) L_shr(x[i], 31);
     680             :         xq[i] = sub(s_xor(tmp16, x_sign), x_sign);
     681             :         move16();
     682             :         /*
     683             :            Normal quantization: xq[i] =  x[i] / gg + sign(x[i]) * 0.375
     684             :            -> 0.375 = 0x00006000 in 15Q16
     685             :         */
     686             :     }
     687             : 
     688             :     /* Rate flag */
     689             :     rateFlag = 0;
     690             :     move16();
     691             :     if (sub(totalBits, add(160, DEPR_i_mult(fs_idx, 160))) > 0)
     692             :     {
     693             :         rateFlag = 2 << NBITS_CONTEXT;
     694             :         move16();
     695             :     }
     696             : 
     697             :     /* Init */
     698             :     nt_half = shr_pos(nt, 1);
     699             :     c       = 0;
     700             :     move16();
     701             :     t = 0;
     702             :     move16();
     703             :     a1_i = 0;
     704             :     move16();
     705             :     b1_i = 1;
     706             :     move16();
     707             :     target32 = L_shl_pos(L_deposit_l(target), SYM_BITS_Q);
     708             :     nbits32  = L_negate(target32);
     709             :     nbits232 = 0;
     710             :     move32();
     711             :     nbits_lsb = 0;
     712             :     move16();
     713             :     IF (mode == 0 && sub(totalBits, add(480, DEPR_i_mult(fs_idx, 160))) >= 0)
     714             :     {
     715             :         mode = 1;
     716             :         move16();
     717             :     }
     718             : 
     719             :     /* Find last non-zero tuple */
     720             :     lastnz = find_last_nz_pair(xq, nt);
     721             :     IF (mode >= 0)
     722             :     {
     723             :         lastnz2 = 2;
     724             :     }
     725             :     ELSE
     726             :     {
     727             :         lastnz2 = lastnz;
     728             :     }
     729             : 
     730             :     IF (mode < 0)
     731             :     {
     732             :         /* Main Loop through the 2-tuples */
     733             :         FOR (k = 0; k < lastnz; k += 2)
     734             :         {
     735             : 
     736             :             /* Get context */
     737             :             t = add(c, rateFlag);
     738             :             if (sub(k, nt_half) > 0)
     739             :             {
     740             :                 t = add(t, 1 << NBITS_CONTEXT);
     741             :             }
     742             :             codingdata[0] = t;
     743             :             move16();
     744             : 
     745             :             /* Init current 2-tuple encoding */
     746             :             a1     = abs_s(xq[a1_i]);
     747             :             b1     = abs_s(xq[b1_i]);
     748             :             ab_max = s_max(a1, b1);
     749             : 
     750             :             IF (ab_max == 0)
     751             :             {
     752             :                 codingdata[1] = -1;
     753             :                 move16();
     754             :                 codingdata[2] = 0;
     755             :                 move16();
     756             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]);
     757             :                 c       = add(shl_pos(s_and(c, 0xf), 4), 1);
     758             :             }
     759             :             ELSE IF (sub(ab_max, A_THRES) < 0)
     760             :             {
     761             :                 codingdata[1] = 0;
     762             :                 move16();
     763             :                 msb           = add(a1, shl_pos(b1, A_THRES_SHIFT));
     764             :                 codingdata[2] = msb;
     765             :                 move16();
     766             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]);
     767             :                 if (a1 != 0)
     768             :                 {
     769             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     770             :                 }
     771             :                 if (b1 != 0)
     772             :                 {
     773             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     774             :                 }
     775             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1));
     776             :             }
     777             :             ELSE IF (sub(ab_max, 2 * A_THRES) < 0)
     778             :             {
     779             :                 codingdata[1] = 1;
     780             :                 move16();
     781             :                 nbits32       = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]);
     782             :                 nbits32       = L_add(nbits32, 2 << SYM_BITS_Q);
     783             :                 a1_msb        = shr_pos_pos(a1, 1);
     784             :                 b1_msb        = shr_pos_pos(b1, 1);
     785             :                 msb           = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT));
     786             :                 codingdata[2] = msb;
     787             :                 move16();
     788             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]);
     789             :                 if (a1 != 0)
     790             :                 {
     791             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     792             :                 }
     793             :                 if (b1 != 0)
     794             :                 {
     795             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     796             :                 }
     797             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1));
     798             :             }
     799             :             ELSE
     800             :             {
     801             :                 levmax        = sub(13, norm_s(ab_max));
     802             :                 codingdata[1] = levmax;
     803             :                 move16();
     804             :                 FOR (lev = 0; lev < levmax; lev++)
     805             :                 {
     806             :                     lev1    = s_min(lev, 3);
     807             :                     nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]);
     808             :                 }
     809             :                 nbits32       = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1));
     810             :                 a1_msb        = shr(a1, levmax);
     811             :                 b1_msb        = shr(b1, levmax);
     812             :                 msb           = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT));
     813             :                 codingdata[2] = msb;
     814             :                 move16();
     815             :                 lev1    = s_min(levmax, 3);
     816             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]);
     817             :                 if (a1 != 0)
     818             :                 {
     819             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     820             :                 }
     821             :                 if (b1 != 0)
     822             :                 {
     823             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     824             :                 }
     825             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3)));
     826             :             }
     827             : 
     828             :             a1_i += 2;
     829             :             b1_i += 2;
     830             :             codingdata += 3;
     831             : 
     832             :         } /* end of the 2-tuples loop */
     833             :     }
     834             :     ELSE IF (mode == 0)
     835             :     {
     836             :         /* Main Loop through the 2-tuples */
     837             :         FOR (k = 0; k < lastnz; k += 2)
     838             :         {
     839             : 
     840             :             /* Get context */
     841             :             t = add(c, rateFlag);
     842             :             if (sub(k, nt_half) > 0)
     843             :             {
     844             :                 t = add(t, 1 << NBITS_CONTEXT);
     845             :             }
     846             :             codingdata[0] = t;
     847             :             move16();
     848             : 
     849             :             /* Init current 2-tuple encoding */
     850             :             a1     = abs_s(xq[a1_i]);
     851             :             b1     = abs_s(xq[b1_i]);
     852             :             ab_max = s_max(a1, b1);
     853             : 
     854             :             IF (ab_max == 0)
     855             :             {
     856             :                 codingdata[1] = -1;
     857             :                 move16();
     858             :                 codingdata[2] = 0;
     859             :                 move16();
     860             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]);
     861             :                 c       = add(shl_pos(s_and(c, 0xf), 4), 1);
     862             :             }
     863             :             ELSE IF (sub(ab_max, A_THRES) < 0)
     864             :             {
     865             :                 codingdata[1] = 0;
     866             :                 move16();
     867             :                 msb           = add(a1, shl_pos(b1, A_THRES_SHIFT));
     868             :                 codingdata[2] = msb;
     869             :                 move16();
     870             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]);
     871             :                 if (a1 != 0)
     872             :                 {
     873             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     874             :                 }
     875             :                 if (b1 != 0)
     876             :                 {
     877             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     878             :                 }
     879             :                 if (nbits32 <= 0)
     880             :                 {
     881             :                     lastnz2 = add(k, 2);
     882             :                 }
     883             :                 if (nbits32 <= 0)
     884             :                 {
     885             :                     nbits232 = nbits32;
     886             :                     move32();
     887             :                 }
     888             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1));
     889             :             }
     890             :             ELSE IF (sub(ab_max, 2 * A_THRES) < 0)
     891             :             {
     892             :                 codingdata[1] = 1;
     893             :                 move16();
     894             :                 nbits32       = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]);
     895             :                 nbits32       = L_add(nbits32, 2 << SYM_BITS_Q);
     896             :                 a1_msb        = shr_pos_pos(a1, 1);
     897             :                 b1_msb        = shr_pos_pos(b1, 1);
     898             :                 msb           = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT));
     899             :                 codingdata[2] = msb;
     900             :                 move16();
     901             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]);
     902             :                 if (a1 != 0)
     903             :                 {
     904             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     905             :                 }
     906             :                 if (b1 != 0)
     907             :                 {
     908             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     909             :                 }
     910             :                 if (nbits32 <= 0)
     911             :                 {
     912             :                     lastnz2 = add(k, 2);
     913             :                 }
     914             :                 if (nbits32 <= 0)
     915             :                 {
     916             :                     nbits232 = nbits32;
     917             :                     move32();
     918             :                 }
     919             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1));
     920             :             }
     921             :             ELSE
     922             :             {
     923             :                 levmax        = sub(13, norm_s(ab_max));
     924             :                 codingdata[1] = levmax;
     925             :                 move16();
     926             :                 FOR (lev = 0; lev < levmax; lev++)
     927             :                 {
     928             :                     lev1    = s_min(lev, 3);
     929             :                     nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]);
     930             :                 }
     931             :                 nbits32       = L_add(nbits32, L_shl_pos(L_deposit_l(levmax), SYM_BITS_Q + 1));
     932             :                 a1_msb        = shr(a1, levmax);
     933             :                 b1_msb        = shr(b1, levmax);
     934             :                 msb           = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT));
     935             :                 codingdata[2] = msb;
     936             :                 move16();
     937             :                 lev1    = s_min(levmax, 3);
     938             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]);
     939             :                 if (a1 != 0)
     940             :                 {
     941             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     942             :                 }
     943             :                 if (b1 != 0)
     944             :                 {
     945             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
     946             :                 }
     947             :                 if (nbits32 <= 0)
     948             :                 {
     949             :                     lastnz2 = add(k, 2);
     950             :                 }
     951             :                 if (nbits32 <= 0)
     952             :                 {
     953             :                     nbits232 = nbits32;
     954             :                     move32();
     955             :                 }
     956             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3)));
     957             :             }
     958             : 
     959             :             a1_i += 2;
     960             :             b1_i += 2;
     961             :             codingdata += 3;
     962             : 
     963             :         } /* end of the 2-tuples loop */
     964             :     }
     965             :     ELSE
     966             :     {
     967             :         /* Main Loop through the 2-tuples */
     968             :         FOR (k = 0; k < lastnz; k += 2)
     969             :         {
     970             : 
     971             :             /* Get context */
     972             :             t = add(c, rateFlag);
     973             :             if (sub(k, nt_half) > 0)
     974             :             {
     975             :                 t = add(t, 1 << NBITS_CONTEXT);
     976             :             }
     977             :             codingdata[0] = t;
     978             :             move16();
     979             : 
     980             :             /* Init current 2-tuple encoding */
     981             :             a1     = abs_s(xq[a1_i]);
     982             :             b1     = abs_s(xq[b1_i]);
     983             :             ab_max = s_max(a1, b1);
     984             : 
     985             :             IF (ab_max == 0)
     986             :             {
     987             :                 codingdata[1] = -1;
     988             :                 move16();
     989             :                 codingdata[2] = 0;
     990             :                 move16();
     991             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][0]);
     992             :                 c       = add(shl_pos(s_and(c, 0xf), 4), 1);
     993             :             }
     994             :             ELSE IF (sub(ab_max, A_THRES) < 0)
     995             :             {
     996             :                 codingdata[1] = 0;
     997             :                 move16();
     998             :                 msb           = add(a1, shl_pos(b1, A_THRES_SHIFT));
     999             :                 codingdata[2] = msb;
    1000             :                 move16();
    1001             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][msb]);
    1002             :                 if (a1 != 0)
    1003             :                 {
    1004             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
    1005             :                 }
    1006             :                 if (b1 != 0)
    1007             :                 {
    1008             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
    1009             :                 }
    1010             :                 if (nbits32 <= 0)
    1011             :                 {
    1012             :                     lastnz2 = add(k, 2);
    1013             :                 }
    1014             :                 if (nbits32 <= 0)
    1015             :                 {
    1016             :                     nbits232 = nbits32;
    1017             :                     move32();
    1018             :                 }
    1019             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(add(a1, b1), 1));
    1020             :             }
    1021             :             ELSE IF (sub(ab_max, 2 * A_THRES) < 0)
    1022             :             {
    1023             :                 codingdata[1] = 1;
    1024             :                 move16();
    1025             :                 nbits32       = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t]][VAL_ESC]);
    1026             :                 a1_msb        = shr_pos_pos(a1, 1);
    1027             :                 b1_msb        = shr_pos_pos(b1, 1);
    1028             :                 msb           = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT));
    1029             :                 codingdata[2] = msb;
    1030             :                 move16();
    1031             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[1]]][msb]);
    1032             :                 if (a1_msb != 0)
    1033             :                 {
    1034             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
    1035             :                 }
    1036             :                 if (b1_msb != 0)
    1037             :                 {
    1038             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
    1039             :                 }
    1040             :                 nbits_lsb = add(nbits_lsb, 2);
    1041             :                 if (sub(a1, 1) == 0)
    1042             :                 {
    1043             :                     nbits_lsb = add(nbits_lsb, 1);
    1044             :                 }
    1045             :                 if (sub(b1, 1) == 0)
    1046             :                 {
    1047             :                     nbits_lsb = add(nbits_lsb, 1);
    1048             :                 }
    1049             :                 if (nbits32 <= 0)
    1050             :                 {
    1051             :                     lastnz2 = add(k, 2);
    1052             :                 }
    1053             :                 if (nbits32 <= 0)
    1054             :                 {
    1055             :                     nbits232 = nbits32;
    1056             :                     move32();
    1057             :                 }
    1058             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1_msb, b1_msb), 1), 1));
    1059             :             }
    1060             :             ELSE
    1061             :             {
    1062             :                 levmax        = sub(13, norm_s(ab_max));
    1063             :                 codingdata[1] = levmax;
    1064             :                 move16();
    1065             :                 FOR (lev = 0; lev < levmax; lev++)
    1066             :                 {
    1067             :                     lev1    = s_min(lev, 3);
    1068             :                     nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][VAL_ESC]);
    1069             :                 }
    1070             :                 nbits32       = L_add(nbits32, L_shl_pos(L_deposit_l(sub(levmax, 1)), SYM_BITS_Q + 1));
    1071             :                 a1_msb        = shr(a1, levmax);
    1072             :                 b1_msb        = shr(b1, levmax);
    1073             :                 msb           = add(a1_msb, shl_pos(b1_msb, A_THRES_SHIFT));
    1074             :                 codingdata[2] = msb;
    1075             :                 move16();
    1076             :                 lev1    = s_min(levmax, 3);
    1077             :                 nbits32 = L_add(nbits32, ari_spec_bits[ari_spec_lookup[t + Tab_esc_nb[lev1]]][msb]);
    1078             :                 a1_msb  = shr_pos(a1, 1);
    1079             :                 b1_msb  = shr_pos(b1, 1);
    1080             :                 if (a1_msb != 0)
    1081             :                 {
    1082             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
    1083             :                 }
    1084             :                 if (b1_msb != 0)
    1085             :                 {
    1086             :                     nbits32 = L_add(nbits32, 1 << SYM_BITS_Q);
    1087             :                 }
    1088             :                 nbits_lsb = add(nbits_lsb, 2);
    1089             :                 if (sub(a1, 1) == 0)
    1090             :                 {
    1091             :                     nbits_lsb = add(nbits_lsb, 1);
    1092             :                 }
    1093             :                 if (sub(b1, 1) == 0)
    1094             :                 {
    1095             :                     nbits_lsb = add(nbits_lsb, 1);
    1096             :                 }
    1097             :                 if (nbits32 <= 0)
    1098             :                 {
    1099             :                     lastnz2 = add(k, 2);
    1100             :                 }
    1101             :                 if (nbits32 <= 0)
    1102             :                 {
    1103             :                     nbits232 = nbits32;
    1104             :                     move32();
    1105             :                 }
    1106             :                 c = add(shl_pos(s_and(c, 0xf), 4), add(12, s_min(levmax, 3)));
    1107             :             }
    1108             : 
    1109             :             a1_i += 2;
    1110             :             b1_i += 2;
    1111             :             codingdata += 3;
    1112             : 
    1113             :         } /* end of the 2-tuples loop */
    1114             :     }
    1115             : 
    1116             :     /* Number of consumed bits */
    1117             :     nbits32 = L_add(nbits32, target32);
    1118             :     totBits = add(extract_l(L_shr_pos_pos(L_sub(nbits32, 1), SYM_BITS_Q)), 1);
    1119             :     IF (mode > 0)
    1120             :     {
    1121             :         totBits = add(totBits, nbits_lsb);
    1122             :     }
    1123             :     IF (nBits != NULL)
    1124             :     {
    1125             :         *nBits = totBits;
    1126             :     }
    1127             :     IF (mode >= 0)
    1128             :     {
    1129             :         nbits232 = L_add(nbits232, target32);
    1130             :         *nBits2  = add(extract_l(L_shr_pos(L_sub(nbits232, 1), SYM_BITS_Q)), 1);
    1131             :     }
    1132             :     ELSE
    1133             :     {
    1134             :         *nBits2 = *nBits;
    1135             :         move16();
    1136             :     }
    1137             :     IF (mode > 0)
    1138             :     {
    1139             :         *nBits2 = add(*nBits2, nbits_lsb);
    1140             :     }
    1141             :     *lastnzout = lastnz2;
    1142             : 
    1143             :     /* Truncation of high frequency coefficients */
    1144             :     IF (lastnz > lastnz2)
    1145             :     {
    1146             :         basop_memset(&xq[lastnz2], 0, (lastnz - lastnz2) * sizeof(*xq));
    1147             :     }
    1148             : 
    1149             :     /* Truncation of LSBs */
    1150             :     test();
    1151             :     IF (mode > 0 && sub(totBits, target) > 0)
    1152             :     {
    1153             :         *lsbMode = 1;
    1154             :         move16();
    1155             :     }
    1156             :     ELSE
    1157             :     {
    1158             :         *lsbMode = 0;
    1159             :         move16();
    1160             :     }
    1161             : 
    1162             : #ifdef DYNMEM_COUNT
    1163             :     Dyn_Mem_Out();
    1164             : #endif
    1165             : }
    1166             : 
    1167             : #endif /* ENABLE_HR_MODE */

Generated by: LCOV version 1.14