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

          Line data    Source code
       1             : /******************************************************************************
       2             : *                        ETSI TS 103 634 V1.4.5                               *
       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             : 
      13             : typedef struct
      14             : {
      15             :     Word16 inv_bin;
      16             :     Word16 numbytes;
      17             :     Word16 c_bp;
      18             :     Word16 c_bp_side;
      19             :     Word16 bytes;
      20             :     Word16 b_left;
      21             :     Word16 b_right;
      22             :     Word16 enc;
      23             :     Word16 sim_dec;
      24             :     Word16 bfi;
      25             :     Word16 be_bp_left;
      26             :     Word16 be_bp_right;
      27             : } Pc_State_fx;
      28             : 
      29             : typedef struct
      30             : {
      31             :     UWord32 ac_low_fx;
      32             :     UWord32 ac_range_fx;
      33             :     Word16  ac_cache_fx;
      34             :     Word16  ac_carry_fx;
      35             :     Word16  ac_carry_count_fx;
      36             : } Encoder_State_fx;
      37             : 
      38             : typedef struct
      39             : {
      40             :     UWord32 ac_low_fx;
      41             :     UWord32 ac_range_fx;
      42             :     UWord32 ac_help_fx;
      43             :     Word16  BER_detect;
      44             :     Pc_State_fx pc;
      45             : } Decoder_State_fx;
      46             : 
      47             : static void ac_dec_init_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side,
      48             :                            Decoder_State_fx *st_fx /* i/o: Decoder State       */
      49             : );
      50             : 
      51             : static __forceinline void pc_init_fx(Word16 n_pc, Word16 numbytes, Word16 be_bp_left, Word16 be_bp_right, Word16 L_spec,
      52             :                                         Word16 enc, Word16 sim_dec, Word16 bfi, Pc_State_fx *pc /* i/o: Pc State */
      53             : );
      54             : static __forceinline Word16 check_pc_bytes(Word16 *bp, Word16 *bp_side, Word16 *mask_side, Word16 cur_bin,
      55             :                                            Word16 from_left, Pc_State_fx *pc /* i/o: Pc State */
      56             : );
      57             : 
      58             : static void ac_enc_init_fx(Encoder_State_fx *st_fx /* i/o: Encoder state       */
      59             : );
      60             : 
      61             : static void ac_enc_shift_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx /* i/o: Encoder state       */
      62             : );
      63             : 
      64             : static void write_indice_forward(UWord8 *ptr, Word16 bp, Word16 indice, Word16 numbits);
      65             : 
      66             : static void ac_encode_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx, /* i/o: Encoder state */
      67             :                          UWord32 cum_freq, /* i  : Cumulative frequency up to symbol   */
      68             :                          UWord32 sym_freq  /* i  : Symbol probability                  */
      69             : );
      70             : 
      71             : static Word16 ac_enc_finish_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx /* i/o: Encoder state       */
      72             : );
      73             : 
      74             : static Word16 ac_decode_fx(                         /* o  : Decoded cumulative frequency    */
      75             :                            Decoder_State_fx *st_fx, /* i/o: Decoder State                   */
      76             :                            Word16            pki);
      77             : static Word16 ac_decode_tns_order(                         /* o  : Decoded cumulative frequency    */
      78             :                                   Decoder_State_fx *st_fx, /* i/o: Decoder State                   */
      79             :                                   Word16            enable_lpc_weighting);
      80             : static Word16 ac_decode_tns_coef(                         /* o  : Decoded cumulative frequency    */
      81             :                                  Decoder_State_fx *st_fx, /* i/o: Decoder State                   */
      82             :                                  Word16            pki);
      83             : static Word16 ac_dec_update_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side, Word16 cur_bin,
      84             :                                Decoder_State_fx *st_fx,    /* i/o: Decoder State           */
      85             :                                UWord32           cum_freq, /* i  : Cumulative frequency    */
      86             :                                UWord32           sym_freq  /* i  : Symbol frequency        */
      87             : );
      88             : 
      89             : /*************************************************************************/
      90             : 
      91             : #ifdef ENABLE_HR_MODE
      92             : 
      93           0 : Word16 processAriEncoder_fx(UWord8 *bytes, Word16 bp_side_in, Word16 mask_side_in, Word16 nbbits, Word32 xq[],
      94             :                             Word16 *tns_order, Word16 tns_numfilters, Word16 *tns_idx, Word16 lastnz,
      95             :                             Word16 *codingdata, UWord8 *resBits, Word16 numResBits, Word16 lsbMode,
      96             :                             Word16 enable_lpc_weighting, Word8 *scratchBuffer)
      97             : {
      98             :     Word16 resbit, i1, i2;
      99             : 
     100             :     Dyn_Mem_Deluxe_In(Encoder_State_fx st; Word16 bp, bp_side, mask_side, extra_bits;
     101             :                       Word32 a1, b1, a1_i, b1_i, a1_msb, b1_msb; Word16 lev1; Word16 nbits_side; Word16 tmp;
     102             :                       Word16 fill_bits; UWord8 * ptr; Word16 numResBitsEnc; Word16 * lsb, nlsbs; Word32 i, n, k, lev;);
     103             : 
     104           0 :     lsb = (Word16 *)scratchAlign(scratchBuffer, 0); /* size = 2 * lastnz */
     105             : 
     106             :     /* Init */
     107           0 :     a1_i = 0;
     108           0 :     move16();
     109           0 :     b1_i = 1;
     110           0 :     move16();
     111           0 :     bp = 0;
     112           0 :     move16();
     113           0 :     numResBitsEnc = 0;
     114           0 :     move16();
     115           0 :     nlsbs = 0;
     116           0 :     move16();
     117           0 :     ptr     = bytes;
     118           0 :     bp_side = bp_side_in;
     119           0 :     move16();
     120           0 :     mask_side = mask_side_in;
     121           0 :     move16();
     122             : 
     123             :     /*Start Encoding*/
     124           0 :     ac_enc_init_fx(&st);
     125             : 
     126             :     /* TNS data */
     127           0 :     FOR (n = 0; n < tns_numfilters; n++)
     128             :     {
     129           0 :         IF (tns_order[n] > 0)
     130             :         {      
     131           0 :             ac_encode_fx(ptr, &bp, &st, ac_tns_order_cumfreq[enable_lpc_weighting][tns_order[n] - 1],
     132           0 :                          ac_tns_order_freq[enable_lpc_weighting][tns_order[n] - 1]);
     133           0 :             FOR (k = 0; k < tns_order[n]; k++)
     134             :             {
     135           0 :                 ac_encode_fx(ptr, &bp, &st, ac_tns_coef_cumfreq[k][tns_idx[MAXLAG * n + k]],
     136           0 :                              ac_tns_coef_freq[k][tns_idx[MAXLAG * n + k]]);
     137             :             }
     138             :         }
     139             :     }
     140             : 
     141           0 :     IF (lsbMode == 0)
     142             :     {
     143             : 
     144             :         /*Main Loop through the 2-tuples*/
     145           0 :         FOR (k = 0; k < lastnz; k += 2)
     146             :         {
     147           0 :             IF (codingdata[1] < 0)
     148             :             {            
     149           0 :                 ac_encode_fx(ptr, &bp, &st, 0,
     150           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]);
     151             :             }
     152           0 :             ELSE IF (codingdata[1] == 0)
     153             :             {               
     154           0 :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]],
     155           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]);
     156           0 :                 IF (xq[a1_i] != 0)
     157             :                 {
     158           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31));
     159             :                 }
     160           0 :                 IF (xq[b1_i] != 0)
     161             :                 {
     162           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31));
     163             :                 }
     164             :             }
     165           0 :             ELSE IF (sub(codingdata[1], 1) == 0)
     166             :             {
     167           0 :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC],
     168           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]);
     169           0 :                 ac_encode_fx(ptr, &bp, &st,
     170           0 :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]],
     171           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]);
     172           0 :                 write_bit_backward(ptr, &bp_side, &mask_side, L_and(xq[a1_i], 1));
     173           0 :                 write_bit_backward(ptr, &bp_side, &mask_side, L_and(xq[b1_i], 1));
     174           0 :                 IF (xq[a1_i] != 0)
     175             :                 {
     176           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31));
     177             :                 }
     178           0 :                 IF (xq[b1_i] != 0)
     179             :                 {
     180           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31));
     181             :                 }
     182             :             }
     183             :             ELSE
     184             :             {
     185           0 :                 a1 = L_abs(xq[a1_i]);
     186           0 :                 b1 = L_abs(xq[b1_i]);
     187           0 :                 FOR (lev = 0; lev < codingdata[1]; lev++)
     188             :                 {
     189           0 :                     lev1 = s_min(lev, 3);
     190           0 :                     ac_encode_fx(ptr, &bp, &st,
     191           0 :                                  ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC],
     192           0 :                                  ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]);
     193           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(a1, lev), 1));
     194           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(b1, lev), 1));
     195             :                 }
     196           0 :                 lev1 = s_min(codingdata[1], 3);
     197           0 :                 ac_encode_fx(ptr, &bp, &st,
     198           0 :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]],
     199           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]);
     200           0 :                 IF (xq[a1_i] != 0)
     201             :                 {
     202           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31));
     203             :                 }
     204           0 :                 IF (xq[b1_i] != 0)
     205             :                 {
     206           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31));
     207             :                 }
     208             :             }
     209             : 
     210           0 :             a1_i += 2;
     211           0 :             b1_i += 2;
     212           0 :             codingdata += 3;
     213             : 
     214             :         } /*end of the 2-tuples loop*/
     215             :     }
     216             :     ELSE
     217             :     {
     218             :         /*Main Loop through the 2-tuples*/
     219           0 :         FOR (k = 0; k < lastnz; k += 2)
     220             :         {
     221           0 :             IF (codingdata[1] < 0)
     222             :             {
     223           0 :                 ac_encode_fx(ptr, &bp, &st, 0,
     224           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]);
     225             :             }
     226           0 :             ELSE IF (codingdata[1] == 0)
     227             :             {
     228           0 :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]],
     229           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]);
     230           0 :                 IF (xq[a1_i] != 0)
     231             :                 {
     232           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31));
     233             :                 }
     234           0 :                 IF (xq[b1_i] != 0)
     235             :                 {
     236           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31));
     237             :                 }
     238             :             }
     239           0 :             ELSE IF (sub(codingdata[1], 1) == 0)
     240             :             {
     241           0 :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC],
     242           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]);
     243           0 :                 ac_encode_fx(ptr, &bp, &st,
     244           0 :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]],
     245           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]);
     246           0 :                 a1_msb       = s_and(codingdata[2], 0x3);
     247           0 :                 tmp          = L_and(xq[a1_i], 1);
     248           0 :                 lsb[nlsbs++] = tmp;
     249           0 :                 move16();
     250           0 :                 test();
     251           0 :                 IF (a1_msb == 0 && tmp > 0)
     252             :                 {
     253           0 :                     if (xq[a1_i] > 0)
     254             :                     {
     255           0 :                         lsb[nlsbs++] = 0;
     256           0 :                         move16();
     257             :                     }
     258           0 :                     if (xq[a1_i] < 0)
     259             :                     {
     260           0 :                         lsb[nlsbs++] = 1;
     261           0 :                         move16();
     262             :                     }
     263             :                 }
     264           0 :                 IF (a1_msb != 0)
     265             :                 {
     266           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31));
     267             :                 }
     268           0 :                 b1_msb       = shr_pos(codingdata[2], 2);
     269           0 :                 tmp          = L_and(xq[b1_i], 1);
     270           0 :                 lsb[nlsbs++] = tmp;
     271           0 :                 move16();
     272           0 :                 test();
     273           0 :                 IF (b1_msb == 0 && tmp > 0)
     274             :                 {
     275           0 :                     if (xq[b1_i] > 0)
     276             :                     {
     277           0 :                         lsb[nlsbs++] = 0;
     278           0 :                         move16();
     279             :                     }
     280           0 :                     if (xq[b1_i] < 0)
     281             :                     {
     282           0 :                         lsb[nlsbs++] = 1;
     283           0 :                         move16();
     284             :                     }
     285             :                 }
     286           0 :                 IF (b1_msb != 0)
     287             :                 {
     288           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31));
     289             :                 }
     290             :             }
     291             :             ELSE
     292             :             {
     293           0 :                 a1           = L_abs(xq[a1_i]);
     294           0 :                 b1           = L_abs(xq[b1_i]);
     295           0 :                 a1_msb       = L_shr_pos(a1, 1);
     296           0 :                 tmp          = L_and(a1, 1);
     297           0 :                 lsb[nlsbs++] = tmp;
     298           0 :                 move16();
     299           0 :                 test();
     300           0 :                 IF (a1_msb == 0 && tmp > 0)
     301             :                 {
     302           0 :                     if (xq[a1_i] > 0)
     303             :                     {
     304           0 :                         lsb[nlsbs++] = 0;
     305           0 :                         move16();
     306             :                     }
     307           0 :                     if (xq[a1_i] < 0)
     308             :                     {
     309           0 :                         lsb[nlsbs++] = 1;
     310           0 :                         move16();
     311             :                     }
     312             :                 }
     313           0 :                 b1_msb       = L_shr_pos(b1, 1);
     314           0 :                 tmp          = s_and(b1, 1);
     315           0 :                 lsb[nlsbs++] = tmp;
     316           0 :                 move16();
     317           0 :                 test();
     318           0 :                 IF (b1_msb == 0 && tmp > 0)
     319             :                 {
     320           0 :                     if (xq[b1_i] > 0)
     321             :                     {
     322           0 :                         lsb[nlsbs++] = 0;
     323           0 :                         move16();
     324             :                     }
     325           0 :                     if (xq[b1_i] < 0)
     326             :                     {
     327           0 :                         lsb[nlsbs++] = 1;
     328           0 :                         move16();
     329             :                     }
     330             :                 }
     331           0 :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC],
     332           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC]);
     333           0 :                 FOR (lev = 1; lev < codingdata[1]; lev++)
     334             :                 {
     335           0 :                     lev1 = s_min(lev, 3);
     336           0 :                     ac_encode_fx(ptr, &bp, &st,
     337           0 :                                  ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC],
     338           0 :                                  ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]);
     339           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(a1, lev), 1));
     340           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(L_shr_pos(b1, lev), 1));
     341             :                 }
     342           0 :                 lev1 = s_min(codingdata[1], 3);
     343           0 :                 ac_encode_fx(ptr, &bp, &st,
     344           0 :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]],
     345           0 :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]);
     346           0 :                 IF (a1_msb != 0)
     347             :                 {
     348           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[a1_i], 31));
     349             :                 }
     350           0 :                 IF (b1_msb != 0)
     351             :                 {
     352           0 :                     write_bit_backward(ptr, &bp_side, &mask_side, L_lshr(xq[b1_i], 31));
     353             :                 }
     354             :             }
     355             : 
     356           0 :             a1_i += 2;
     357           0 :             b1_i += 2;
     358           0 :             codingdata += 3;
     359             : 
     360             :         } /*end of the 2-tuples loop*/
     361             :     }
     362             : 
     363             :     /* Side bits (in sync with the decoder) */
     364           0 :     nbits_side = sub(nbbits, add(shl_pos(bp_side, 3), sub(norm_s(mask_side), 6)));
     365             : 
     366             :     /* Residual bits (in sync with the decoder) */
     367           0 :     extra_bits = sub(norm_ul(st.ac_range_fx), 6);
     368           0 :     if (st.ac_cache_fx >= 0)
     369             :     {
     370           0 :         extra_bits = add(extra_bits, 8);
     371             :     }
     372           0 :     if (st.ac_carry_count_fx > 0)
     373             :     {
     374           0 :         extra_bits = add(extra_bits, shl_pos(st.ac_carry_count_fx, 3));
     375             :     }
     376             :     
     377           0 :     n = s_max(sub(nbbits, add(shl_pos(bp, 3), add(extra_bits, nbits_side))), 0);
     378           0 :     move16();
     379             : 
     380           0 :     IF (lsbMode == 0)
     381             :     {
     382           0 :         numResBitsEnc = s_min(numResBits, n);
     383           0 :         FOR (i = 0; i < numResBitsEnc; i++)
     384             :         {
     385           0 :             resbit = 0; move16();
     386           0 :             i1 = shr(i, RESBITS_PACK_SHIFT);
     387           0 :             i2 = s_and(i, RESBITS_PACK_MASK);
     388           0 :             if (s_and(resBits[i1], shl(1, i2)))
     389             :             {
     390           0 :                 resbit = 1;
     391             :             }
     392           0 :             write_bit_backward(ptr, &bp_side, &mask_side, resbit);
     393             :         }
     394             :     }
     395             :     ELSE
     396             :     {
     397           0 :         nlsbs = s_min(nlsbs, n);
     398           0 :         FOR (k = 0; k < nlsbs; k++)
     399             :         {
     400           0 :             write_bit_backward(ptr, &bp_side, &mask_side, lsb[k]);
     401             :         }
     402             :     }
     403             : 
     404             :     /* End arithmetic coder, overflow management */
     405           0 :     extra_bits = ac_enc_finish_fx(ptr, &bp, &st);
     406             : 
     407             :     /* Fill bits (for debugging, the exact number of fill bits cannot be computed in the decoder)*/
     408           0 :     fill_bits = nbbits - (bp * 8 + extra_bits + nbits_side + nlsbs + numResBitsEnc);
     409             : 
     410             :     Dyn_Mem_Deluxe_Out();
     411             : 
     412           0 :     return fill_bits;
     413             : }
     414             : 
     415             : #else /* ENABLE_HR_MODE */
     416             : 
     417             : Word16 processAriEncoder_fx(UWord8 *bytes, Word16 bp_side_in, Word16 mask_side_in, Word16 nbbits, Word16 xq[],
     418             :                             Word16 *tns_order, Word16 tns_numfilters, Word16 *tns_idx, Word16 lastnz,
     419             :                             Word16 *codingdata, UWord8 *resBits, Word16 numResBits, Word16 lsbMode,
     420             :                             Word16 enable_lpc_weighting, Word8 *scratchBuffer)
     421             : {
     422             : #ifdef ENABLE_HR_MODE
     423             :     Dyn_Mem_Deluxe_In(Encoder_State_fx st; Word16 bp, bp_side, mask_side, extra_bits;
     424             :                       Word16 a1, b1, a1_i, b1_i, a1_msb, b1_msb; Word16 lev1; Word16 nbits_side; Word16 tmp;
     425             :                       Word16 fill_bits; UWord8 * ptr; Word16 numResBitsEnc; Word16 * lsb, nlsbs; Counter i, n, k, lev;
     426             :                       );
     427             : #else
     428             :     Dyn_Mem_Deluxe_In(Encoder_State_fx st; Word16 bp, bp_side, mask_side, extra_bits;
     429             :                       Word16 a1, b1, a1_i, b1_i, a1_msb, b1_msb; Word16 lev1; Word16 nbits_side; Word16 tmp;
     430             :                       Word16 fill_bits; UWord8 * ptr; Word16 numResBitsEnc; Word16 * lsb, nlsbs; Counter i, n, k, lev;
     431             :                       );
     432             : #endif
     433             : 
     434             : 
     435             :     lsb = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size = 2 * MAX_LEN * 2 bytes */
     436             : 
     437             :     /* Init */
     438             :     a1_i = 0;
     439             :     move16();
     440             :     b1_i = 1;
     441             :     move16();
     442             :     bp = 0;
     443             :     move16();
     444             :     numResBitsEnc = 0;
     445             :     move16();
     446             :     nlsbs = 0;
     447             :     move16();
     448             :     ptr     = bytes;
     449             :     bp_side = bp_side_in;
     450             :     move16();
     451             :     mask_side = mask_side_in;
     452             :     move16();
     453             : 
     454             :     /*Start Encoding*/
     455             :     ac_enc_init_fx(&st);
     456             : 
     457             :     /* TNS data */
     458             :     FOR (n = 0; n < tns_numfilters; n++)
     459             :     {
     460             :         IF (tns_order[n] > 0)
     461             :         {
     462             :             ac_encode_fx(ptr, &bp, &st, ac_tns_order_cumfreq[enable_lpc_weighting][tns_order[n] - 1],
     463             :                          ac_tns_order_freq[enable_lpc_weighting][tns_order[n] - 1]);
     464             :             FOR (k = 0; k < tns_order[n]; k++)
     465             :             {
     466             :                 ac_encode_fx(ptr, &bp, &st, ac_tns_coef_cumfreq[k][tns_idx[MAXLAG * n + k]],
     467             :                              ac_tns_coef_freq[k][tns_idx[MAXLAG * n + k]]);
     468             :             }
     469             :         }
     470             :     }
     471             : 
     472             :     IF (lsbMode == 0)
     473             :     {
     474             : 
     475             :         /*Main Loop through the 2-tuples*/
     476             :         FOR (k = 0; k < lastnz; k += 2)
     477             :         {
     478             :             IF (codingdata[1] < 0)
     479             :             {
     480             :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][0],
     481             :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]);
     482             :             }
     483             :             ELSE IF (codingdata[1] == 0)
     484             :             {
     485             :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]],
     486             :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]);
     487             :                 IF (xq[a1_i] != 0)
     488             :                 {
     489             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15));
     490             :                 }
     491             :                 IF (xq[b1_i] != 0)
     492             :                 {
     493             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15));
     494             :                 }
     495             :             }
     496             :             ELSE IF (sub(codingdata[1], 1) == 0)
     497             :             {
     498             :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC],
     499             :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]);
     500             :                 ac_encode_fx(ptr, &bp, &st,
     501             :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]],
     502             :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]);
     503             :                 write_bit_backward(ptr, &bp_side, &mask_side, s_and(xq[a1_i], 1));
     504             :                 write_bit_backward(ptr, &bp_side, &mask_side, s_and(xq[b1_i], 1));
     505             :                 IF (xq[a1_i] != 0)
     506             :                 {
     507             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15));
     508             :                 }
     509             :                 IF (xq[b1_i] != 0)
     510             :                 {
     511             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15));
     512             :                 }
     513             :             }
     514             :             ELSE
     515             :             {
     516             :                 a1 = abs_s(xq[a1_i]);
     517             :                 b1 = abs_s(xq[b1_i]);
     518             :                 FOR (lev = 0; lev < codingdata[1]; lev++)
     519             :                 {
     520             :                     lev1 = s_min(lev, 3);
     521             :                     ac_encode_fx(ptr, &bp, &st,
     522             :                                  ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC],
     523             :                                  ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]);
     524             :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(a1, lev), 1));
     525             :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(b1, lev), 1));
     526             :                 }
     527             :                 lev1 = s_min(codingdata[1], 3);
     528             :                 ac_encode_fx(ptr, &bp, &st,
     529             :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]],
     530             :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]);
     531             :                 IF (xq[a1_i] != 0)
     532             :                 {
     533             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15));
     534             :                 }
     535             :                 IF (xq[b1_i] != 0)
     536             :                 {
     537             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15));
     538             :                 }
     539             :             }
     540             : 
     541             :             a1_i += 2;
     542             :             b1_i += 2;
     543             :             codingdata += 3;
     544             : 
     545             :         } /*end of the 2-tuples loop*/
     546             :     }
     547             :     ELSE
     548             :     {
     549             :         /*Main Loop through the 2-tuples*/
     550             :         FOR (k = 0; k < lastnz; k += 2)
     551             :         {
     552             :             IF (codingdata[1] < 0)
     553             :             {
     554             :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][0],
     555             :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][0]);
     556             :             }
     557             :             ELSE IF (codingdata[1] == 0)
     558             :             {
     559             :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][codingdata[2]],
     560             :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][codingdata[2]]);
     561             :                 IF (xq[a1_i] != 0)
     562             :                 {
     563             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15));
     564             :                 }
     565             :                 IF (xq[b1_i] != 0)
     566             :                 {
     567             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15));
     568             :                 }
     569             :             }
     570             :             ELSE IF (sub(codingdata[1], 1) == 0)
     571             :             {
     572             :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0]]][VAL_ESC],
     573             :                              ari_spec_freq[ari_spec_lookup[codingdata[0]]][VAL_ESC]);
     574             :                 ac_encode_fx(ptr, &bp, &st,
     575             :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]],
     576             :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[1]]][codingdata[2]]);
     577             :                 a1_msb       = s_and(codingdata[2], 0x3);
     578             :                 tmp          = s_and(xq[a1_i], 1);
     579             :                 lsb[nlsbs++] = tmp;
     580             :                 move16();
     581             :                 test();
     582             :                 IF (a1_msb == 0 && tmp > 0)
     583             :                 {
     584             :                     if (xq[a1_i] > 0)
     585             :                     {
     586             :                         lsb[nlsbs++] = 0;
     587             :                         move16();
     588             :                     }
     589             :                     if (xq[a1_i] < 0)
     590             :                     {
     591             :                         lsb[nlsbs++] = 1;
     592             :                         move16();
     593             :                     }
     594             :                 }
     595             :                 IF (a1_msb != 0)
     596             :                 {
     597             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15));
     598             :                 }
     599             :                 b1_msb       = shr_pos(codingdata[2], 2);
     600             :                 tmp          = s_and(xq[b1_i], 1);
     601             :                 lsb[nlsbs++] = tmp;
     602             :                 move16();
     603             :                 test();
     604             :                 IF (b1_msb == 0 && tmp > 0)
     605             :                 {
     606             :                     if (xq[b1_i] > 0)
     607             :                     {
     608             :                         lsb[nlsbs++] = 0;
     609             :                         move16();
     610             :                     }
     611             :                     if (xq[b1_i] < 0)
     612             :                     {
     613             :                         lsb[nlsbs++] = 1;
     614             :                         move16();
     615             :                     }
     616             :                 }
     617             :                 IF (b1_msb != 0)
     618             :                 {
     619             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15));
     620             :                 }
     621             :             }
     622             :             ELSE
     623             :             {
     624             :                 a1           = abs_s(xq[a1_i]);
     625             :                 b1           = abs_s(xq[b1_i]);
     626             :                 a1_msb       = shr_pos(a1, 1);
     627             :                 tmp          = s_and(a1, 1);
     628             :                 lsb[nlsbs++] = tmp;
     629             :                 move16();
     630             :                 test();
     631             :                 IF (a1_msb == 0 && tmp > 0)
     632             :                 {
     633             :                     if (xq[a1_i] > 0)
     634             :                     {
     635             :                         lsb[nlsbs++] = 0;
     636             :                         move16();
     637             :                     }
     638             :                     if (xq[a1_i] < 0)
     639             :                     {
     640             :                         lsb[nlsbs++] = 1;
     641             :                         move16();
     642             :                     }
     643             :                 }
     644             :                 b1_msb       = shr_pos(b1, 1);
     645             :                 tmp          = s_and(b1, 1);
     646             :                 lsb[nlsbs++] = tmp;
     647             :                 move16();
     648             :                 test();
     649             :                 IF (b1_msb == 0 && tmp > 0)
     650             :                 {
     651             :                     if (xq[b1_i] > 0)
     652             :                     {
     653             :                         lsb[nlsbs++] = 0;
     654             :                         move16();
     655             :                     }
     656             :                     if (xq[b1_i] < 0)
     657             :                     {
     658             :                         lsb[nlsbs++] = 1;
     659             :                         move16();
     660             :                     }
     661             :                 }
     662             :                 ac_encode_fx(ptr, &bp, &st, ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC],
     663             :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[0]]][VAL_ESC]);
     664             :                 FOR (lev = 1; lev < codingdata[1]; lev++)
     665             :                 {
     666             :                     lev1 = s_min(lev, 3);
     667             :                     ac_encode_fx(ptr, &bp, &st,
     668             :                                  ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC],
     669             :                                  ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][VAL_ESC]);
     670             :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(a1, lev), 1));
     671             :                     write_bit_backward(ptr, &bp_side, &mask_side, s_and(shr_pos(b1, lev), 1));
     672             :                 }
     673             :                 lev1 = s_min(codingdata[1], 3);
     674             :                 ac_encode_fx(ptr, &bp, &st,
     675             :                              ari_spec_cumfreq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]],
     676             :                              ari_spec_freq[ari_spec_lookup[codingdata[0] + Tab_esc_nb[lev1]]][codingdata[2]]);
     677             :                 IF (a1_msb != 0)
     678             :                 {
     679             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[a1_i], 15));
     680             :                 }
     681             :                 IF (b1_msb != 0)
     682             :                 {
     683             :                     write_bit_backward(ptr, &bp_side, &mask_side, lshr(xq[b1_i], 15));
     684             :                 }
     685             :             }
     686             : 
     687             :             a1_i += 2;
     688             :             b1_i += 2;
     689             :             codingdata += 3;
     690             : 
     691             :         } /*end of the 2-tuples loop*/
     692             :     }
     693             : 
     694             :     /* Side bits (in sync with the decoder) */
     695             :     nbits_side = sub(nbbits, add(shl_pos(bp_side, 3), sub(norm_s(mask_side), 6)));
     696             : 
     697             :     /* Residual bits (in sync with the decoder) */
     698             :     extra_bits = sub(norm_ul(st.ac_range_fx), 6);
     699             :     if (st.ac_cache_fx >= 0)
     700             :     {
     701             :         extra_bits = add(extra_bits, 8);
     702             :     }
     703             :     if (st.ac_carry_count_fx > 0)
     704             :     {
     705             :         extra_bits = add(extra_bits, shl_pos(st.ac_carry_count_fx, 3));
     706             :     }
     707             :     
     708             :     n = s_max(sub(nbbits, add(shl_pos(bp, 3), add(extra_bits, nbits_side))), 0);
     709             :     move16();
     710             : 
     711             :     IF (lsbMode == 0)
     712             :     {
     713             :         numResBitsEnc = s_min(numResBits, n);
     714             :         FOR (i = 0; i < numResBitsEnc; i++)
     715             :         {
     716             :             FOR (i = 0; i < numResBitsEnc; i++)
     717             :             {
     718             :                 write_bit_backward(ptr, &bp_side, &mask_side, resBits[i]);
     719             :             }
     720             :         }
     721             :     }
     722             :     ELSE
     723             :     {
     724             :         nlsbs = s_min(nlsbs, n);
     725             :         FOR (k = 0; k < nlsbs; k++)
     726             :         {
     727             :             write_bit_backward(ptr, &bp_side, &mask_side, lsb[k]);
     728             :         }
     729             :     }
     730             : 
     731             :     /* End arithmetic coder, overflow management */
     732             :     extra_bits = ac_enc_finish_fx(ptr, &bp, &st);
     733             : 
     734             :     /* Fill bits (for debugging, the exact number of fill bits cannot be computed in the decoder)*/
     735             :     fill_bits = nbbits - (bp * 8 + extra_bits + nbits_side + nlsbs + numResBitsEnc);
     736             : 
     737             :     Dyn_Mem_Deluxe_Out();
     738             :     return fill_bits;
     739             : }
     740             : 
     741             : #endif /* ENABLE_HR_MODE */
     742             : 
     743           0 : void processAriDecoder_fx(UWord8 *bytes, Word16 *bp_side, Word16 *mask_side, Word16 nbbits, Word16 L_spec,
     744             :     Word16 fs_idx, Word16 enable_lpc_weighting, Word16 tns_numfilters, Word16 lsbMode,
     745             :     Word16 lastnz, Word16 *bfi, Word16 *tns_order, Word16 fac_ns_idx, Word16 gg_idx,
     746             :     Word16 frame_dms,
     747             :                           Word16 n_pc, Word16 be_bp_left, Word16 be_bp_right, Word16 mode, Word16 *spec_inv_idx,
     748             :                           Word16 *b_left,
     749             :                           Word16 *resBits,
     750             : #ifdef ENABLE_HR_MODE
     751             :                           Word32 *x,
     752             : #else
     753             :                           Word16 *x,
     754             : #endif
     755             :                           Word16 *nf_seed, UWord8 *resQdata, Word16 *tns_idx, Word16 *zero_frame, Word8 *scratchBuffer
     756             : #ifdef ENABLE_HR_MODE
     757             :                           , Word16 hrmode
     758             : #endif
     759             : )
     760             : {
     761             :     Decoder_State_fx st;
     762             : #ifdef ENABLE_HR_MODE
     763             :     Word16           resbit, i1, i2;
     764             :     Word32           a, b;
     765             : #else
     766             :     Word16           a, b;
     767             : #endif
     768             :     Word16           t, a1, b1, a1_i, b1_i, bp;
     769             :     Word16           esc_nb;
     770             :     Word16           rateFlag;
     771             :     Word16           r;
     772             :     Word16           nt_half;
     773             :     Word16           c;
     774             :     Word16           nbits_side, extra_bits, nbits_ari;
     775             :     UWord8 *         ptr;
     776             :     Word32           tmp32;
     777             :     Word16           lsb_ind_c;
     778             :     Word16 *         lsb_ind;
     779             :     Word16           tmp;
     780             :     Word32          n, k, lev;
     781             :     Word32          i;
     782           0 :     Word16           max_lev = 14;
     783             : 
     784             : #ifdef DYNMEM_COUNT
     785             : struct _dynmem
     786             : {
     787             : Decoder_State_fx st;
     788             :         Pc_State_fx      pc;
     789             :         Word16           resbit, i1, i2;
     790             : #ifdef ENABLE_HR_MODE
     791             :         Word32           a, b;
     792             : #else
     793             :         Word16           a, b;
     794             : #endif
     795             :         Word16           t, a1, b1, a1_i, b1_i, bp;
     796             :         Word16           esc_nb;
     797             :         Word16           rateFlag;
     798             :         Word16           r;
     799             :         Word16           nt_half;
     800             :         Word16           c;
     801             :         Word16           nbits_side, extra_bits, nbits_ari;
     802             :         UWord8 *         ptr;
     803             :         Word32           tmp32;
     804             :         Word16           lsb_ind_c;
     805             :         Word16 *         lsb_ind;
     806             :         Word16           tmp;
     807             :         Counter          i, n, k, lev;
     808             :     };
     809             :     Dyn_Mem_In("processAriDecoder_fx", sizeof(struct _dynmem));
     810             : #endif
     811             : 
     812             : #ifdef ENABLE_HR_MODE
     813           0 :     if (hrmode == 1)
     814             :     {
     815           0 :         max_lev = max_lev + 8;
     816             :     }
     817             : #endif
     818             : 
     819           0 :     lsb_ind = (Word16 *)scratchAlign(scratchBuffer, 0); /* Size 2 * MAX_LEN bytes */
     820             : 
     821             :     /* Rate flag */
     822           0 :     rateFlag = 0;
     823           0 :     move16();
     824             : #ifdef ENABLE_HR_MODE
     825           0 :     if (fs_idx != 5) /* Don't update rateFlag for 96000 Hz */
     826             : #endif
     827             :     {
     828           0 :         if (sub(nbbits, add(160, DEPR_i_mult(fs_idx, 160))) > 0)
     829             :         {
     830           0 :             rateFlag = 2 << NBITS_CONTEXT;
     831           0 :             move16();
     832             :         }
     833             :     }
     834             : 
     835           0 :     pc_init_fx(n_pc, shr_pos(nbbits, 3), be_bp_left, be_bp_right, L_spec, mode==1, mode==2, *bfi, &st.pc);
     836             : 
     837             :     /* Init */
     838           0 :     nt_half = shr_pos(L_spec, 1);
     839           0 :     c       = 0;
     840           0 :     move16();
     841           0 :     t = 0;
     842           0 :     move16();
     843           0 :     a1_i = 0;
     844           0 :     move16();
     845           0 :     b1_i = 1;
     846           0 :     move16();
     847           0 :     bp = 0;
     848           0 :     move16();
     849           0 :     if (mode != 1)
     850             :     {
     851           0 :         bp = add(bp, st.pc.bytes);
     852           0 :         move16();
     853             :     }
     854           0 :     *spec_inv_idx = L_spec;
     855           0 :     move16();
     856           0 :     *b_left = -1;
     857           0 :     move16();
     858           0 :     lsb_ind_c = 0;
     859           0 :     move16();
     860             : 
     861           0 : ptr = bytes;
     862             : 
     863             : /* Start Decoding */
     864           0 : ac_dec_init_fx(ptr, &bp, bp_side, mask_side, &st);
     865             : 
     866             :     /* Decode TNS data */
     867           0 :     tmp = MAXLAG;
     868           0 : IF (sub(frame_dms, 25) == 0)
     869             : {
     870           0 : tmp = shr_pos(tmp, 1);
     871             : }
     872           0 : IF (sub(frame_dms, 50) == 0)
     873             : {
     874           0 : tmp = shr_pos(tmp, 1);
     875             : }
     876             : 
     877           0 :     FOR (n = 0; n < tns_numfilters; n++)
     878             :     {
     879           0 :         IF (tns_order[n] > 0)
     880             :         {
     881           0 :             tns_order[n] = ac_decode_tns_order(&st, enable_lpc_weighting);
     882           0 :             move16();
     883           0 :             tns_order[n] = add(tns_order[n], 1);
     884           0 :             move16();
     885           0 :             IF (tns_order[n] > tmp)
     886             :             {
     887           0 :                 GOTO ber_detect;
     888             :             }
     889           0 :             if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, 0, &st,
     890           0 :                                  ac_tns_order_cumfreq[enable_lpc_weighting][tns_order[n] - 1],
     891           0 :                                  ac_tns_order_freq[enable_lpc_weighting][tns_order[n] - 1]) != 0)
     892             :             {
     893           0 :                 GOTO ber_detect;
     894             :             }
     895           0 :             FOR (k = 0; k < tns_order[n]; k++)
     896             :             {
     897           0 :                 IF (sub(*bp_side, bp) < 0)
     898             :                 {
     899           0 :                     GOTO ber_detect;
     900             :                 }
     901           0 :                 tns_idx[MAXLAG * n + k] = ac_decode_tns_coef(&st, k);
     902           0 :                 move16();
     903           0 :                 if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, 0, &st,
     904           0 :                                      ac_tns_coef_cumfreq[k][tns_idx[MAXLAG * n + k]],
     905           0 :                                      ac_tns_coef_freq[k][tns_idx[MAXLAG * n + k]]) != 0)
     906             :                 {
     907           0 :                     GOTO ber_detect;
     908             :                 }
     909             :             }
     910             :         }
     911             :     }
     912           0 :     IF (st.BER_detect > 0)
     913             :     {
     914           0 :         GOTO ber_detect;
     915             :     }
     916             : 
     917           0 : IF (lsbMode == 0)
     918             : {
     919             : 
     920             : /*Main Loop through the 2-tuples*/
     921           0 : FOR (k = 0; k < lastnz; k += 2)
     922             : {
     923             : 
     924             : /* Get context */
     925           0 : t = add(c, rateFlag);
     926           0 : if (sub(k, nt_half) > 0)
     927             : {
     928           0 : t = add(t, 1 << NBITS_CONTEXT);
     929             : }
     930             : 
     931           0 :             r = ac_decode_fx(&st, ari_spec_lookup[t]);
     932           0 :             if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, ari_spec_cumfreq[ari_spec_lookup[t]][r],
     933           0 :                                  ari_spec_freq[ari_spec_lookup[t]][r]) != 0)
     934             :             {
     935           0 :                 GOTO ber_detect;
     936             :             }
     937             : 
     938           0 :             IF (r == 0)
     939             :             {
     940           0 :                 x[a1_i] = 0;
     941           0 :                 move16();
     942           0 :                 x[b1_i] = 0;
     943           0 :                 move16();
     944           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), 1);
     945             :             }
     946           0 :             ELSE IF (sub(r, VAL_ESC) < 0)
     947             :             {
     948           0 :                 a = s_and(r, 0x3);
     949           0 :                 b = shr_pos(r, 2);
     950           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), add(add(a, b), 1));
     951           0 :                 IF (a > 0)
     952             :                 {
     953           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
     954             : {
     955           0 :   GOTO ber_detect;
     956             : }
     957           0 :                     if (read_bit(ptr, bp_side, mask_side) != 0)
     958             :                     {
     959           0 :                         a = negate(a);
     960             :                     }
     961             :                 }
     962           0 :                 x[a1_i] = a;
     963           0 :                 move16();
     964           0 :                 IF (b > 0)
     965             :                 {
     966           0 : if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0)
     967             : {
     968           0 :   GOTO ber_detect;
     969             : }
     970           0 :                     if (read_bit(ptr, bp_side, mask_side) != 0)
     971             :                     {
     972           0 :                         b = negate(b);
     973             :                     }
     974             :                 }
     975           0 :                 x[b1_i] = b;
     976           0 :                 move16();
     977             :             }
     978             :             ELSE
     979             :             {
     980           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
     981             : {
     982           0 : GOTO ber_detect;
     983             : }
     984           0 : a = read_bit(ptr, bp_side, mask_side);
     985           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
     986             : {
     987           0 : GOTO ber_detect;
     988             : }
     989           0 :                 b = read_bit(ptr, bp_side, mask_side);
     990           0 :                 r = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[1]]);
     991           0 :                 if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st,
     992           0 :                                      ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[1]]][r],
     993           0 :                                      ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[1]]][r]) != 0)
     994             :                 {
     995           0 :                     GOTO ber_detect;
     996             :                 }
     997           0 :                 IF (sub(r, VAL_ESC) < 0)
     998             :                 {
     999           0 :                     a1 = s_and(r, 0x3);
    1000           0 :                     b1 = shr_pos(r, 2);
    1001           0 :                     a  = add(shl_pos(a1, 1), a);
    1002           0 :                     b  = add(shl_pos(b1, 1), b);
    1003           0 :                     IF (a > 0)
    1004             :                     {
    1005           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1006             :   {
    1007           0 :       GOTO ber_detect;
    1008             :   }
    1009           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1010             :                         {
    1011           0 :                             a = negate(a);
    1012             :                         }
    1013             :                     }
    1014           0 :                     x[a1_i] = a;
    1015           0 :                     move16();
    1016           0 :                     IF (b > 0)
    1017             :                     {
    1018           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0)
    1019             :   {
    1020           0 :       GOTO ber_detect;
    1021             :   }
    1022           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1023             :                         {
    1024           0 :                             b = negate(b);
    1025             :                         }
    1026             :                     }
    1027           0 :                     x[b1_i] = b;
    1028           0 :                     move16();
    1029           0 :                     c = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1, b1), 1), 1));
    1030             :                 }
    1031             :                 ELSE
    1032             :                 {
    1033           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1034             : {
    1035           0 :   GOTO ber_detect;
    1036             : }
    1037           0 : a = add(shl_pos(read_bit(ptr, bp_side, mask_side), 1), a);
    1038           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1039             : {
    1040           0 :   GOTO ber_detect;
    1041             : }
    1042           0 :                     b = add(shl_pos(read_bit(ptr, bp_side, mask_side), 1), b);
    1043           0 :                     FOR (lev = 2; lev < max_lev; lev++)
    1044             :                     {
    1045           0 :                         esc_nb = s_min(lev, 3);
    1046           0 :                         r      = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[esc_nb]]);
    1047           0 :                         if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st,
    1048           0 :                                              ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r],
    1049           0 :                                              ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r]) != 0)
    1050             :                         {
    1051           0 :                             GOTO ber_detect;
    1052             :                         }
    1053           0 :                         IF (sub(r, VAL_ESC) < 0)
    1054             :                         {
    1055           0 :                             BREAK;
    1056             :                         }
    1057           0 :                         if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1058             :                         {
    1059           0 :                             GOTO ber_detect;
    1060             :                         }
    1061             :   
    1062             : #ifdef ENABLE_HR_MODE
    1063           0 :                         a = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), a);
    1064             : #else
    1065             :                         a = add(shl(read_bit(ptr, bp_side, mask_side), lev), a);
    1066             : #endif
    1067             : 
    1068           0 :                         if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1069             :                         {
    1070           0 :                             GOTO ber_detect;
    1071             :                         }
    1072             : #ifdef ENABLE_HR_MODE
    1073           0 :                         b = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), b);
    1074             : #else
    1075             :                         b = add(shl(read_bit(ptr, bp_side, mask_side), lev), b);
    1076             : #endif
    1077             :                     }
    1078             :                     /* check for bitflip */
    1079           0 :                     IF (sub(lev, max_lev) == 0)
    1080             :                     {
    1081           0 :                         GOTO ber_detect;
    1082             :                     }
    1083             : 
    1084           0 :                     b1 = shr_pos(r, 2);
    1085           0 :                     a1 = s_and(r, 0x3);
    1086             : 
    1087             : #ifdef ENABLE_HR_MODE
    1088           0 :                     a  = L_add(L_shl(a1, lev), a);
    1089           0 :                     b  = L_add(L_shl(b1, lev), b);
    1090             : #else
    1091             :                     a = add(shl(a1, lev), a);
    1092             :                     b = add(shl(b1, lev), b);
    1093             : #endif
    1094           0 :                     IF (a > 0)
    1095             :                     {
    1096           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1097             :   {
    1098           0 :       GOTO ber_detect;
    1099             :   }
    1100           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1101             :                         {
    1102             : #ifdef ENABLE_HR_MODE
    1103           0 :                             a = L_negate(a);
    1104             : #else
    1105             :                             a = negate(a);
    1106             : #endif
    1107             :                         }
    1108             :                     }
    1109           0 :                     x[a1_i] = a;
    1110           0 :                     move16();
    1111           0 :                     IF (b > 0)
    1112             :                     {
    1113           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0)
    1114             :   {
    1115           0 :       GOTO ber_detect;
    1116             :   }
    1117           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1118             :                         {
    1119             : #ifdef ENABLE_HR_MODE
    1120           0 :                             b = L_negate(b);
    1121             : #else
    1122             :                             b = negate(b);
    1123             : #endif
    1124             :                         }
    1125             :                     }
    1126           0 :                     x[b1_i] = b;
    1127           0 :                     move16();
    1128           0 :                     c = add(shl_pos(s_and(c, 0xf), 4), add(esc_nb, 12));
    1129             :                 }
    1130             :             }
    1131             : 
    1132           0 :             test();
    1133           0 :             test();
    1134           0 :             IF ((sub(sub(bp, *bp_side), 3) > 0 && sub(st.pc.c_bp, st.pc.c_bp_side) == 0) || st.BER_detect > 0)
    1135             : {
    1136           0 : GOTO ber_detect;
    1137             : }
    1138             : 
    1139           0 : a1_i += 2;
    1140           0 : b1_i += 2;
    1141             : }
    1142             : }
    1143             : ELSE
    1144             : {
    1145             : /*Main Loop through the 2-tuples*/
    1146           0 : FOR (k = 0; k < lastnz; k += 2)
    1147             : {
    1148             : 
    1149             : /* Get context */
    1150           0 : t = add(c, rateFlag);
    1151           0 : if (sub(k, nt_half) > 0)
    1152             : {
    1153           0 : t = add(t, 1 << NBITS_CONTEXT);
    1154             : }
    1155             : 
    1156           0 :             r = ac_decode_fx(&st, ari_spec_lookup[t]);
    1157           0 :             if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st, ari_spec_cumfreq[ari_spec_lookup[t]][r],
    1158           0 :                                  ari_spec_freq[ari_spec_lookup[t]][r]) != 0)
    1159             :             {
    1160           0 :                 GOTO ber_detect;
    1161             :             }
    1162             : 
    1163           0 :             IF (r == 0)
    1164             :             {
    1165           0 :                 x[a1_i] = 0;
    1166           0 :                 move16();
    1167           0 :                 x[b1_i] = 0;
    1168           0 :                 move16();
    1169           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), 1);
    1170             :             }
    1171           0 :             ELSE IF (sub(r, VAL_ESC) < 0)
    1172             :             {
    1173           0 :                 a = s_and(r, 0x3);
    1174           0 :                 b = shr_pos(r, 2);
    1175           0 :                 c = add(shl_pos(s_and(c, 0xf), 4), add(add(a, b), 1));
    1176           0 :                 IF (a > 0)
    1177             :                 {
    1178           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1179             : {
    1180           0 :   GOTO ber_detect;
    1181             : }
    1182           0 :                     if (read_bit(ptr, bp_side, mask_side) != 0)
    1183             :                     {
    1184           0 :                         a = negate(a);
    1185             :                     }
    1186             :                 }
    1187           0 :                 x[a1_i] = a;
    1188           0 :                 move16();
    1189           0 :                 IF (b > 0)
    1190             :                 {
    1191           0 : if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0)
    1192             : {
    1193           0 :   GOTO ber_detect;
    1194             : }
    1195           0 :                     if (read_bit(ptr, bp_side, mask_side) != 0)
    1196             :                     {
    1197           0 :                         b = negate(b);
    1198             :                     }
    1199             :                 }
    1200           0 :                 x[b1_i] = b;
    1201           0 :                 move16();
    1202             :             }
    1203             :             ELSE
    1204             :             {
    1205           0 :                 r = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[1]]);
    1206           0 :                 if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st,
    1207           0 :                                      ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[1]]][r],
    1208           0 :                                      ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[1]]][r]) != 0)
    1209             :                 {
    1210           0 :                     GOTO ber_detect;
    1211             :                 }
    1212           0 :                 IF (sub(r, VAL_ESC) < 0)
    1213             :                 {
    1214           0 :                     a1 = s_and(r, 0x3);
    1215           0 :                     b1 = shr_pos(r, 2);
    1216           0 :                     a  = shl_pos(a1, 1);
    1217           0 :                     b  = shl_pos(b1, 1);
    1218           0 :                     IF (a > 0)
    1219             :                     {
    1220           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1221             :   {
    1222           0 :       GOTO ber_detect;
    1223             :   }
    1224           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1225             :                         {
    1226           0 :                             a = negate(a);
    1227             :                         }
    1228             :                     }
    1229           0 :                     x[a1_i] = a;
    1230           0 :                     move16();
    1231           0 :                     IF (b > 0)
    1232             :                     {
    1233           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0)
    1234             :   {
    1235           0 :       GOTO ber_detect;
    1236             :   }
    1237           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1238             :                         {
    1239           0 :                             b = negate(b);
    1240             :                         }
    1241             :                     }
    1242           0 :                     x[b1_i] = b;
    1243           0 :                     move16();
    1244           0 :                     c                    = add(shl_pos(s_and(c, 0xf), 4), add(shl_pos(add(a1, b1), 1), 1));
    1245           0 :                     lsb_ind[lsb_ind_c++] = k;
    1246           0 :                     move16();
    1247             :                 }
    1248             :                 ELSE
    1249             :                 {
    1250           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1251             : {
    1252           0 :   GOTO ber_detect;
    1253             : }
    1254           0 : a = shl_pos(read_bit(ptr, bp_side, mask_side), 1);
    1255           0 : if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1256             : {
    1257           0 :   GOTO ber_detect;
    1258             : }
    1259           0 :                     b = shl_pos(read_bit(ptr, bp_side, mask_side), 1);
    1260           0 :                     FOR (lev = 2; lev < max_lev; lev++)
    1261             :                     {
    1262           0 :                         esc_nb = s_min(lev, 3);
    1263           0 :                         r      = ac_decode_fx(&st, ari_spec_lookup[t + Tab_esc_nb[esc_nb]]);
    1264           0 :                         if (ac_dec_update_fx(ptr, &bp, bp_side, mask_side, k, &st,
    1265           0 :                                              ari_spec_cumfreq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r],
    1266           0 :                                              ari_spec_freq[ari_spec_lookup[t + Tab_esc_nb[esc_nb]]][r]) != 0)
    1267             :                         {
    1268           0 :                             GOTO ber_detect;
    1269             :                         }
    1270           0 :                         IF (sub(r, VAL_ESC) < 0)
    1271             :                         {
    1272           0 :                             BREAK;
    1273             :                         }
    1274           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1275             :   {
    1276           0 :       GOTO ber_detect;
    1277             :   }
    1278             : #ifdef ENABLE_HR_MODE
    1279           0 :                         a = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), a);
    1280             : #else
    1281             :                         a = add(shl(read_bit(ptr, bp_side, mask_side), lev), a);
    1282             : #endif
    1283           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1284             :   {
    1285           0 :       GOTO ber_detect;
    1286             :   }
    1287             : #ifdef ENABLE_HR_MODE
    1288           0 :                         b = L_add(L_shl(read_bit(ptr, bp_side, mask_side), lev), b);
    1289             : #else
    1290             :                         b = add(shl(read_bit(ptr, bp_side, mask_side), lev), b);
    1291             : #endif
    1292             :                     }
    1293             :                     /* check for bitflip */
    1294           0 :                     IF (sub(lev, max_lev) == 0)
    1295             :                     {
    1296           0 :                         GOTO ber_detect;
    1297             :                     }
    1298             : 
    1299           0 :                     b1 = shr_pos(r, 2);
    1300           0 :                     a1 = s_and(r, 0x3);
    1301             : #ifdef ENABLE_HR_MODE
    1302           0 :                     a  = L_add(L_shl(a1, lev), a);
    1303           0 :                     b  = L_add(L_shl(b1, lev), b);
    1304             : #else
    1305             :                     a = add(shl(a1, lev), a);
    1306             :                     b = add(shl(b1, lev), b);
    1307             : #endif
    1308           0 :                     IF (a > 0)
    1309             :                     {
    1310           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, a1_i, 0, &st.pc) != 0)
    1311             :   {
    1312           0 :       GOTO ber_detect;
    1313             :   }
    1314           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1315             :                         {
    1316             : #ifdef ENABLE_HR_MODE
    1317           0 :                             a = L_negate(a);
    1318             : #else
    1319             :                             a = negate(a);
    1320             : #endif
    1321             :                         }
    1322             :                     }
    1323           0 :                     x[a1_i] = a;
    1324           0 :                     move16();
    1325           0 :                     IF (b > 0)
    1326             :                     {
    1327           0 :   if (check_pc_bytes(&bp, bp_side, mask_side, b1_i, 0, &st.pc) != 0)
    1328             :   {
    1329           0 :       GOTO ber_detect;
    1330             :   }
    1331           0 :                         if (read_bit(ptr, bp_side, mask_side) != 0)
    1332             :                         {
    1333             : #ifdef ENABLE_HR_MODE
    1334           0 :                             b = L_negate(b);
    1335             : #else
    1336             :                             b = negate(b);
    1337             : #endif
    1338             :                         }
    1339             :                     }
    1340           0 :                     x[b1_i] = b;
    1341           0 :                     move16();
    1342           0 :                     c                    = add(shl_pos(s_and(c, 0xf), 4), add(esc_nb, 12));
    1343           0 :                     lsb_ind[lsb_ind_c++] = k;
    1344           0 :                     move16();
    1345             :                 }
    1346             :             }
    1347             : 
    1348           0 :             test();
    1349           0 :             test();
    1350           0 :             IF ((sub(sub(bp, *bp_side), 3) > 0 && sub(st.pc.c_bp, st.pc.c_bp_side) == 0) || st.BER_detect > 0)
    1351             : {
    1352           0 : GOTO ber_detect;
    1353             : }
    1354             : 
    1355           0 : a1_i += 2;
    1356           0 : b1_i += 2;
    1357             : }
    1358             : }
    1359             : 
    1360           0 : IF (L_spec > k)
    1361             : {
    1362           0 : basop_memset(&x[k], 0, (L_spec - k) * sizeof(*x));
    1363             : }
    1364             : 
    1365           0 :     nbits_side = sub(nbbits, add(shl_pos(*bp_side, 3), sub(norm_s(*mask_side), 6)));
    1366           0 :     extra_bits = sub(norm_ul(st.ac_range_fx), 6);
    1367           0 :     nbits_ari  = shl_pos(sub(bp, 3), 3);
    1368           0 : IF (mode != 1)
    1369             : {
    1370           0 : IF (st.pc.c_bp == 0)
    1371             : {
    1372           0 : nbits_ari = shl_pos(sub(sub(bp, st.pc.bytes), 3), 3);
    1373             : }
    1374             : ELSE
    1375             : {
    1376           0 : nbits_ari = shl_pos(add(bp, sub(sub(st.pc.b_left, st.pc.bytes), 3)), 3);
    1377             : }
    1378             : 
    1379           0 :         IF (st.pc.c_bp_side != 0)
    1380             :         {
    1381           0 :             nbits_side = sub(add(sub(nbbits, shl_pos(st.pc.b_left, 3)), shl_pos(sub(st.pc.bytes, *bp_side), 3)),
    1382           0 :                              sub(norm_s(*mask_side), 6));
    1383             :         }
    1384             :     }
    1385             : 
    1386           0 :     n = sub(nbbits, add(nbits_ari, add(extra_bits, nbits_side)));
    1387           0 :     move16();
    1388             : 
    1389           0 : IF (n < 0)
    1390             : {
    1391           0 : GOTO ber_detect;
    1392             : }
    1393             : 
    1394           0 :     IF (lsbMode == 0)
    1395             :     {
    1396           0 :         *resBits = n;
    1397           0 :         move16();
    1398           0 :         i=0;
    1399             : 
    1400             : #ifdef ENABLE_HR_MODE
    1401           0 :         FOR (k = 0; k < L_spec; k++)
    1402             :         {
    1403           0 :             IF (x[k] != 0)
    1404             :             {
    1405           0 :                 IF (n == 0)
    1406             :                 {
    1407           0 :                     BREAK;
    1408             :                 }
    1409           0 :                 if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0)
    1410             :                 {
    1411           0 :                     GOTO ber_detect_res;
    1412             :                 }
    1413           0 :                 i1 = shr(i, RESBITS_PACK_SHIFT);
    1414           0 :                 i2 = s_and(i, RESBITS_PACK_MASK);
    1415           0 :                 resbit = read_bit(ptr, bp_side, mask_side);
    1416           0 :                 if (resbit)
    1417             :                 {
    1418           0 :                     resQdata[i1] = (UWord8) s_or(resQdata[i1], shl(1, i2));
    1419             :                 }
    1420           0 :                 i = add(i, 1);
    1421           0 :                 move16();
    1422           0 :                 n = sub(n, 1);
    1423             :             }
    1424             :         }
    1425             : #else
    1426             :         FOR (k = 0; k < L_spec; k++)
    1427             :         {
    1428             :             IF (x[k] != 0)
    1429             :             {
    1430             :                 IF (n == 0)
    1431             :                 {
    1432             :                     BREAK;
    1433             :                 }
    1434             :                 
    1435             :                 if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0)
    1436             :                 {
    1437             :                     GOTO ber_detect_res;
    1438             :                 }
    1439             :                 
    1440             :                 *resQdata++ = (UWord8) read_bit(ptr, bp_side, mask_side);
    1441             :                 move16();
    1442             :                 n = sub(n, 1);
    1443             :             }
    1444             :         }
    1445             : #endif
    1446             :         
    1447             : #ifdef ENABLE_HR_MODE
    1448           0 :         if (hrmode)
    1449             :         {
    1450           0 :             Word16 idx_len     = sub(*resBits, n); /* Number of nonzero bits */
    1451           0 :             Word16 idx_len_lim = idx_len * EXT_RES_ITER_MAX;
    1452             : 
    1453           0 :             Word16 res_bits_hrmode = s_min(idx_len_lim, *resBits) - idx_len;
    1454             :             /* idx_len bits have been read in the previous loop */
    1455             : 
    1456           0 :             for (k = 0; k < res_bits_hrmode; k++)
    1457             :             {
    1458           0 :                 if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0)
    1459             :                 {
    1460           0 :                     GOTO ber_detect_res;
    1461             :                 }
    1462           0 :                 i1 = shr(i, RESBITS_PACK_SHIFT);
    1463           0 :                 i2 = s_and(i, RESBITS_PACK_MASK);
    1464           0 :                 resbit = read_bit(ptr, bp_side, mask_side);
    1465           0 :                 if (resbit)
    1466             :                 {
    1467           0 :                     resQdata[i1] = (UWord8) s_or(resQdata[i1], shl(1, i2));
    1468             :                 }
    1469           0 :                 i = add(i, 1);
    1470           0 :                 move16();
    1471           0 :                 n = sub(n, 1);
    1472             :             }
    1473             :         }
    1474             : #endif
    1475             :         
    1476           0 :         *resBits = sub(*resBits, n);
    1477             :     }
    1478             :     ELSE
    1479             :     {
    1480           0 :         *resBits = 0;
    1481           0 :         FOR (k = 0; k < lsb_ind_c; k++)
    1482             :         {
    1483           0 :             a = x[lsb_ind[k]];
    1484           0 :             move16();
    1485           0 :             IF (n == 0)
    1486             :             {
    1487           0 :                 BREAK;
    1488             :             }
    1489           0 : if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0)
    1490             : {
    1491           0 : GOTO ber_detect_res;
    1492             : }
    1493           0 :             tmp = read_bit(ptr, bp_side, mask_side);
    1494           0 :             n   = sub(n, 1);
    1495           0 :             IF (tmp > 0)
    1496             :             {
    1497             : #ifdef ENABLE_HR_MODE
    1498           0 :                 if (a > 0)
    1499             :                 {
    1500           0 :                     a = L_add(a, 1);
    1501             :                 }
    1502           0 :                 if (a < 0)
    1503             :                 {
    1504           0 :                     a = L_sub(a, 1);
    1505             :                 }
    1506             : #else
    1507             :                 if (a > 0)
    1508             :                 {
    1509             :                     a = add(a, 1);
    1510             :                 }
    1511             :                 if (a < 0)
    1512             :                 {
    1513             :                     a = sub(a, 1);
    1514             :                 }
    1515             : #endif
    1516           0 :                 IF (a == 0)
    1517             :                 {
    1518           0 :                     IF (n == 0)
    1519             :                     {
    1520           0 :                         BREAK;
    1521             :                     }
    1522           0 :                     a = 1;
    1523           0 : if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0)
    1524             : {
    1525           0 :   GOTO ber_detect_res;
    1526             : }
    1527           0 : if (read_bit(ptr, bp_side, mask_side) != 0)
    1528             : {
    1529           0 :   a = negate(a);
    1530             : }
    1531           0 : n = sub(n, 1);
    1532             : }
    1533             : }
    1534             : 
    1535           0 :             x[lsb_ind[k]] = a;
    1536           0 :             move16();
    1537           0 :             b = x[lsb_ind[k] + 1];
    1538           0 :             move16();
    1539           0 :             IF (n == 0)
    1540             :             {
    1541           0 :                 BREAK;
    1542             :             }
    1543           0 : if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0)
    1544             : {
    1545           0 : GOTO ber_detect_res;
    1546             : }
    1547           0 :             tmp = read_bit(ptr, bp_side, mask_side);
    1548           0 :             n   = sub(n, 1);
    1549           0 :             IF (tmp > 0)
    1550             :             {
    1551             : #ifdef ENABLE_HR_MODE
    1552           0 :                 if (b > 0)
    1553             :                 {
    1554           0 :                     b = L_add(b, 1);
    1555             :                 }
    1556           0 :                 if (b < 0)
    1557             :                 {
    1558           0 :                     b = L_sub(b, 1);
    1559             :                 }
    1560             : #else
    1561             :                 if (b > 0)
    1562             :                 {
    1563             :                     b = add(b, 1);
    1564             :                 }
    1565             :                 if (b < 0)
    1566             :                 {
    1567             :                     b = sub(b, 1);
    1568             :                 }
    1569             : #endif
    1570           0 :                 IF (b == 0)
    1571             :                 {
    1572           0 :                     IF (n == 0)
    1573             :                     {
    1574           0 :                         BREAK;
    1575             :                     }
    1576           0 :                     b = 1;
    1577           0 : if (check_pc_bytes(&bp, bp_side, mask_side, st.pc.inv_bin, 0, &st.pc) != 0)
    1578             : {
    1579           0 :   GOTO ber_detect_res;
    1580             : }
    1581           0 :                     if (read_bit(ptr, bp_side, mask_side) != 0)
    1582             :                     {
    1583           0 :                         b = negate(b);
    1584             :                     }
    1585           0 :                     n = sub(n, 1);
    1586             :                 }
    1587             :             }
    1588           0 :             x[lsb_ind[k] + 1] = b;
    1589           0 :             move16();
    1590             :         }
    1591             :     }
    1592             : 
    1593             : /* Noise Filling seed */
    1594           0 :     tmp32 = L_deposit_l(0);
    1595           0 :     FOR (i = 0; i < L_spec; i++)
    1596             :     {
    1597             : #ifdef ENABLE_HR_MODE
    1598           0 :         tmp32 = L_mac0(tmp32, L_and(L_abs(x[i]), 32767), i);
    1599             : #else
    1600             :         tmp32 = L_mac0(tmp32, abs_s(x[i]), i);
    1601             : #endif
    1602             :     }
    1603           0 :     *nf_seed = extract_l(tmp32);
    1604           0 :     move16();
    1605             : 
    1606             :     /* Detect zero frame */
    1607           0 :     test();
    1608           0 :     test();
    1609           0 :     test();
    1610           0 :     test();
    1611           0 :     IF (sub(lastnz, 2) == 0 && sub(x[0], 0) == 0 && sub(x[1], 0) == 0 && sub(gg_idx, 0) == 0 && sub(fac_ns_idx, 7) == 0)
    1612             :     {
    1613           0 :         *zero_frame = 1;
    1614           0 :         move16();
    1615             :     }
    1616             :     ELSE
    1617             :     {
    1618           0 :         *zero_frame = 0;
    1619           0 :         move16();
    1620             :     }
    1621             : 
    1622           0 : IF (mode == 1)
    1623             :     {
    1624           0 :         IF (st.pc.bytes > 0)
    1625             :         {
    1626           0 :             IF (sub(st.pc.b_left, shr_pos(nbbits, 3)) > 0)
    1627             :             {
    1628           0 :                 *b_left = sub(*bp_side, st.pc.bytes);
    1629             :             }
    1630             :         }
    1631             :     }
    1632           0 : IF (mode == 2)
    1633             : {
    1634           0 : IF (st.pc.bytes > 0)
    1635             : {
    1636           0 : IF (sub(st.pc.b_left, shr_pos(nbbits,3)) > 0)
    1637             : {
    1638           0 : *b_left = *bp_side;
    1639             : }
    1640             : }
    1641             : }
    1642             : 
    1643           0 : IF (sub(*bfi, 2) == 0)
    1644             : {
    1645           0 : IF (sub(*spec_inv_idx, L_spec) == 0)
    1646             : {
    1647           0 : *bfi = 0;
    1648             : }
    1649             : }
    1650           0 : GOTO bail;
    1651             : 
    1652             : /* goto for bit error handling */
    1653           0 : ber_detect:
    1654           0 :     *bfi = 1;
    1655           0 :     move16();
    1656           0 :     *b_left = st.pc.b_left;
    1657           0 :     move16();
    1658           0 :     test();
    1659           0 :     IF (st.pc.inv_bin > 0 && sub(st.pc.inv_bin, L_spec) <= 0)
    1660             :     {
    1661           0 :         *spec_inv_idx = st.pc.inv_bin;
    1662           0 :         move16();
    1663           0 :         *bfi = 2;
    1664           0 :         move16();
    1665           0 :         *resBits = 0;
    1666           0 :         move16();
    1667           0 :         *zero_frame = 0;
    1668           0 :         move16();
    1669             :         /* Noise Filling seed */
    1670           0 :         tmp32 = L_deposit_l(0);
    1671           0 :         FOR (i = 0; i < *spec_inv_idx; i++)
    1672             :         {
    1673           0 :             tmp32 = L_mac0(tmp32, abs_s(x[i]), i);
    1674             :         }
    1675           0 :         *nf_seed = extract_l(tmp32);
    1676           0 :         move16();
    1677             :     }
    1678           0 : GOTO bail;
    1679             : 
    1680             : /* goto for bit error handling in residual signal */
    1681           0 : ber_detect_res:
    1682           0 :     *b_left = st.pc.b_left;
    1683           0 :     move16();
    1684           0 :     *resBits = 0;
    1685           0 :     move16();
    1686           0 :     *bfi = 0;
    1687           0 :     move16();
    1688           0 :     *zero_frame = 0;
    1689           0 :     move16();
    1690             :     /* Noise Filling seed */
    1691           0 :     tmp32 = L_deposit_l(0);
    1692           0 :     FOR (i = 0; i < *spec_inv_idx; i++)
    1693             :     {
    1694           0 :         tmp32 = L_mac0(tmp32, abs_s(x[i]), i);
    1695             :     }
    1696           0 :     *nf_seed = extract_l(tmp32);
    1697           0 :     move16();
    1698           0 :     GOTO bail;
    1699             : 
    1700             : /* goto, because of dynmem out */
    1701           0 : bail:
    1702             : Dyn_Mem_Deluxe_Out();
    1703           0 : }
    1704             : 
    1705             : 
    1706           0 : void processAriDecoderScaling_fx(
    1707             : #ifdef ENABLE_HR_MODE
    1708             :     Word32 *datain,
    1709             : #else
    1710             :     Word16 *data16,
    1711             : #endif
    1712             :     Word16 dataLen, Word32 *data32, Word16 *data_e)
    1713             : {
    1714             :     Word32 i;
    1715             :     
    1716             : #ifdef ENABLE_HR_MODE
    1717             :     Dyn_Mem_Deluxe_In(Word16 shift; Word32 tmp, x_min, x_max;);
    1718             : #else
    1719             :     Dyn_Mem_Deluxe_In(Word16 shift; Word16 tmp, x_min, x_max;);
    1720             : #endif
    1721             : 
    1722             : 
    1723             : #ifdef ENABLE_HR_MODE
    1724           0 :     x_max = 0;
    1725           0 :     move32();
    1726           0 :     x_min = 0;
    1727           0 :     move32();
    1728             : #else
    1729             :     x_max = 0;
    1730             :     move16();
    1731             :     x_min = 0;
    1732             :     move16();
    1733             : #endif
    1734             : 
    1735           0 :     FOR (i = 0; i < dataLen; i++)
    1736             :     {
    1737             : #ifdef ENABLE_HR_MODE
    1738           0 :         if (datain[i] > 0)
    1739           0 :             x_max = L_max(x_max, datain[i]);
    1740           0 :         if (datain[i] < 0)
    1741           0 :             x_min = L_min(x_min, datain[i]);
    1742             : #else
    1743             :         if (data16[i] > 0)
    1744             :             x_max = s_max(x_max, data16[i]);
    1745             :         if (data16[i] < 0)
    1746             :             x_min = s_min(x_min, data16[i]);
    1747             : #endif
    1748             :     }
    1749             : 
    1750             : #ifdef ENABLE_HR_MODE
    1751           0 :     tmp   = L_max(x_max, L_negate(x_min));
    1752           0 :     shift = norm_l(tmp);
    1753           0 :     if (tmp == 0)
    1754             :     {
    1755           0 :         shift = 31;
    1756           0 :         move32();
    1757             :     }
    1758             : #else
    1759             :     tmp = s_max(x_max, negate(x_min));
    1760             :     shift = norm_s(tmp);
    1761             :     if (tmp == 0)
    1762             :     {
    1763             :         shift = 15;
    1764             :         move16();
    1765             :     }
    1766             : #endif
    1767             : 
    1768           0 :     FOR (i = 0; i < dataLen; i++)
    1769             :     {
    1770             : #ifdef ENABLE_HR_MODE
    1771           0 :         data32[i] = L_shl_pos(datain[i], shift);
    1772             : #else
    1773             :         data32[i] = L_shl_pos(L_deposit_h(data16[i]), shift);
    1774             : #endif
    1775             :     }
    1776             : 
    1777             : #ifdef ENABLE_HR_MODE
    1778           0 :     *data_e = sub(31, shift);
    1779           0 :     move16();
    1780             : #else
    1781             :     *data_e = sub(15, shift);
    1782             :     move16();
    1783             : #endif
    1784             : 
    1785             :     Dyn_Mem_Deluxe_Out();
    1786           0 : }
    1787             : 
    1788             : 
    1789             : /*************************************************************************/
    1790             : /*************************************************************************/
    1791             : /*************************************************************************/
    1792             : 
    1793             : /*************************************************************************/
    1794             : 
    1795           0 : static __forceinline UWord32 UL_addNs24(UWord32 UL_var1, UWord32 UL_var2, UWord16 *wrap)
    1796             : {
    1797           0 :     return UL_lshr(UL_addNs(UL_lshl(UL_var1, 8), UL_lshl(UL_var2, 8), wrap), 8);
    1798             : }
    1799             : #ifdef ENABLE_HR_MODE
    1800           0 : Word16 find_last_nz_pair(const Word32 x[], Word16 length)
    1801             : #else
    1802             : Word16 find_last_nz_pair(const Word16 x[], Word16 length)
    1803             : #endif
    1804             : {
    1805             :     Dyn_Mem_Deluxe_In(Word16 last_nz, lobs[4]; Word32 stage, i;);
    1806             : 
    1807           0 :     lobs[0] = 4;
    1808           0 :     move16();
    1809           0 :     lobs[1] = shr_pos(length, 1); /* length/2 */
    1810           0 :     move16();
    1811           0 :     lobs[2] = add(lobs[1], shr_pos(length, 2));
    1812           0 :     move16();
    1813           0 :     lobs[3] = add(lobs[2], shr_pos(length, 3));
    1814           0 :     move16();
    1815             : 
    1816           0 :     last_nz = 0;
    1817           0 :     move16();
    1818           0 :     i = length;
    1819           0 :     move16();
    1820           0 :     FOR (stage = 3; stage >= 0; --stage)
    1821             :     {
    1822             :         /* unmapped kernel */
    1823           0 :         FOR (; i >= lobs[stage]; i -= 2)
    1824             :         {
    1825           0 :             if (x[i - 2] != 0)
    1826             :             {
    1827           0 :                 last_nz = s_max(last_nz, i);
    1828             :             }
    1829           0 :             if (x[i - 1] != 0)
    1830             :             {
    1831           0 :                 last_nz = s_max(last_nz, i);
    1832             :             }
    1833             :         }
    1834           0 :         IF (last_nz > 0)
    1835             :         {
    1836           0 :             BREAK;
    1837             :         }
    1838             :     }
    1839             : 
    1840             :     Dyn_Mem_Deluxe_Out();
    1841           0 :     return s_max(last_nz, 2);
    1842             : }
    1843             : 
    1844             : 
    1845           0 : void write_bit_backward(UWord8 *ptr, Word16 *bp, Word16 *mask, Word16 bit)
    1846             : {
    1847           0 :     if (bit > 0)
    1848             :     {
    1849           0 :         ptr[*bp] = (UWord8)s_or((Word16)ptr[*bp], *mask);
    1850           0 :         move16();
    1851             :     }
    1852           0 :     *mask = lshl_pos(*mask, 1);
    1853           0 :     move16();
    1854           0 :     if (sub(*mask, 0x100) == 0)
    1855             :     {
    1856           0 :         *mask = 1;
    1857           0 :         move16();
    1858             :     }
    1859           0 :     if (sub(*mask, 1) == 0)
    1860             :     {
    1861           0 :         *bp = sub(*bp, 1);
    1862           0 :         move16();
    1863             :     }
    1864           0 : }
    1865             : 
    1866             : 
    1867           0 : void write_indice_backward(UWord8 *ptr, Word16 *bp, Word16 *mask, Word16 indice, Word16 numbits)
    1868             : {
    1869             :     Dyn_Mem_Deluxe_In(Word32 k; Word16 bit;);
    1870             : 
    1871           0 :     FOR (k = 0; k < numbits; k++)
    1872             :     {
    1873           0 :         bit = s_and(indice, 1);
    1874           0 :         write_bit_backward(ptr, bp, mask, bit);
    1875           0 :         indice = lshr(indice, 1);
    1876             :     }
    1877             : 
    1878             :     Dyn_Mem_Deluxe_Out();
    1879           0 : }
    1880             : 
    1881             : 
    1882           0 : static __forceinline void write_indice_forward(UWord8 *ptr, Word16 bp, Word16 indice, Word16 numbits)
    1883             : {
    1884             :     Dyn_Mem_Deluxe_In(Word32 k; Word16 bit, mask, tmp;);
    1885             : 
    1886           0 :     tmp = (Word16)ptr[bp];
    1887           0 :     move16();
    1888           0 :     mask = 0x80;
    1889           0 :     move16();
    1890           0 :     FOR (k = 0; k < numbits; k++)
    1891             :     {
    1892           0 :         bit = s_and(indice, mask);
    1893           0 :         tmp = s_or(tmp, mask);
    1894           0 :         if (bit == 0)
    1895             :         {
    1896           0 :             tmp = sub(tmp, mask);
    1897             :         }
    1898           0 :         mask = lshr(mask, 1);
    1899             :     }
    1900           0 :     ptr[bp] = (UWord8)tmp;
    1901           0 :     move16();
    1902             : 
    1903             :     Dyn_Mem_Deluxe_Out();
    1904           0 : }
    1905             : 
    1906           0 : static __forceinline void ac_enc_init_fx(Encoder_State_fx *st_fx) /* i/o: Encoder state       */
    1907             : {
    1908           0 :     st_fx->ac_low_fx = L_deposit_l(0);
    1909           0 :     move32();
    1910           0 :     st_fx->ac_range_fx = 0x00ffffff;
    1911           0 :     move32();
    1912           0 :     st_fx->ac_cache_fx = -1;
    1913           0 :     move16();
    1914           0 :     st_fx->ac_carry_fx = 0;
    1915           0 :     move16();
    1916           0 :     st_fx->ac_carry_count_fx = 0;
    1917           0 :     move16();
    1918           0 : }
    1919             : 
    1920           0 : static __forceinline void ac_enc_shift_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx) /* i/o: Encoder state */
    1921             : {
    1922           0 :     test();
    1923           0 :     L_sub(0, 0); /* For comparision in if */
    1924           0 :     IF (st_fx->ac_low_fx < (0x00ff0000UL) || sub(st_fx->ac_carry_fx, 1) == 0)
    1925             :     {
    1926           0 :         IF (st_fx->ac_cache_fx >= 0)
    1927             :         {
    1928           0 :             ptr[(*bp)++] = (UWord8)add(st_fx->ac_cache_fx, st_fx->ac_carry_fx);
    1929           0 :             move16();
    1930             :         }
    1931             : 
    1932           0 :         WHILE (st_fx->ac_carry_count_fx > 0)
    1933             :         {
    1934           0 :             ptr[(*bp)++] = (UWord8)s_and(add(st_fx->ac_carry_fx, 0xff), 255);
    1935           0 :             move16();
    1936           0 :             st_fx->ac_carry_count_fx = sub(st_fx->ac_carry_count_fx, 1);
    1937           0 :             move16();
    1938             :         }
    1939             : 
    1940           0 :         st_fx->ac_cache_fx = u_extract_l(UL_lshr_pos(st_fx->ac_low_fx, 16));
    1941           0 :         move16();
    1942           0 :         st_fx->ac_carry_fx = 0;
    1943           0 :         move16();
    1944             :     }
    1945             :     ELSE
    1946             :     {
    1947           0 :         st_fx->ac_carry_count_fx = add(st_fx->ac_carry_count_fx, 1);
    1948           0 :         move16();
    1949             :     }
    1950           0 :     st_fx->ac_low_fx = UL_and(UL_lshl_pos(st_fx->ac_low_fx, 8), 0x00ffffff);
    1951           0 :     move32();
    1952           0 : }
    1953             : 
    1954           0 : static __forceinline void ac_encode_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx, /* i/o: Encoder state */
    1955             :                                        UWord32 cum_freq, /* i  : Cumulative frequency up to symbol   */
    1956             :                                        UWord32 sym_freq) /* i  : Symbol probability                  */
    1957             : {
    1958             :     Dyn_Mem_Deluxe_In(UWord32 r, tmp; UWord16 carry;);
    1959             : 
    1960           0 :     r   = UL_lshr_pos(st_fx->ac_range_fx, 10);
    1961           0 :     tmp = UL_Mpy_32_32(r, cum_freq);
    1962             : 
    1963           0 :     assert(r < (1U << 24));
    1964           0 :     assert(cum_freq < (1U << 24));
    1965           0 :     assert(tmp < (1U << 24));
    1966           0 :     assert(st_fx->ac_low_fx < (1U << 24));
    1967           0 :     st_fx->ac_low_fx = UL_addNs24(st_fx->ac_low_fx, tmp, &carry);
    1968           0 :     move32();
    1969             : 
    1970           0 :     if (carry != 0)
    1971             :     {
    1972           0 :         st_fx->ac_carry_fx = carry;
    1973           0 :         move16();
    1974             :     }
    1975             : 
    1976           0 :     st_fx->ac_range_fx = UL_Mpy_32_32(r, sym_freq);
    1977           0 :     move32();
    1978             : 
    1979           0 :     assert(cum_freq < (1U << 24));
    1980           0 :     assert(st_fx->ac_range_fx < (1U << 24));
    1981           0 :     WHILE (st_fx->ac_range_fx < (1U << 16))
    1982             :     {
    1983           0 :         L_sub(0, 0); /* Comparison in while */
    1984           0 :         st_fx->ac_range_fx = UL_lshl_pos(st_fx->ac_range_fx, 8);
    1985           0 :         move32();
    1986             : 
    1987           0 :         assert(st_fx->ac_range_fx < (1U << 24));
    1988             : 
    1989           0 :         ac_enc_shift_fx(ptr, bp, st_fx);
    1990             :     }
    1991             : 
    1992             :     Dyn_Mem_Deluxe_Out();
    1993           0 : }
    1994             : 
    1995           0 : static __forceinline Word16 ac_enc_finish_fx(UWord8 *ptr, Word16 *bp, Encoder_State_fx *st_fx) /* i/o: Encoder state */
    1996             : {
    1997             :     Dyn_Mem_Deluxe_In(UWord32 val, mask, high; Word16 bits; UWord16 over1, over2;);
    1998             : 
    1999             :     /*bits = 24 - log2_i(st->ac_range); */
    2000           0 :     bits = sub(norm_ul(st_fx->ac_range_fx), 7);
    2001             : 
    2002           0 :     mask = UL_lshr(0x00ffffff, bits);
    2003             : 
    2004           0 :     val  = UL_addNs24(st_fx->ac_low_fx, mask, &over1);
    2005           0 :     high = UL_addNs24(st_fx->ac_low_fx, st_fx->ac_range_fx, &over2);
    2006             : 
    2007           0 :     L_xor(0, 0);    /* For bit not */
    2008           0 :     UL_and(1U, 1U); /* added counters */
    2009           0 :     val = L_and(val, (~mask) & 0x00ffffff);
    2010             : 
    2011           0 :     L_xor(0, 0); /* For bit not */
    2012           0 :     IF ((L_xor(over1, over2)) == 0)
    2013             :     {
    2014           0 :         L_sub(0, 0); /* For comparision in if */
    2015           0 :         IF (UL_addNsD(val, mask) >= high)
    2016             :         {
    2017           0 :             bits = add(bits, 1);
    2018           0 :             mask = UL_lshr_pos(mask, 1);
    2019           0 :             val  = UL_and(UL_addNsD(st_fx->ac_low_fx, mask), (~mask) & 0x00ffffff);
    2020           0 :             L_xor(0, 0);
    2021           0 :             UL_and(1, 1); /* For bit not , mask */
    2022             :         }
    2023             : 
    2024           0 :         if (val < st_fx->ac_low_fx)
    2025             :         {
    2026           0 :             st_fx->ac_carry_fx = 1;
    2027           0 :             move16();
    2028             :         }
    2029             :     }
    2030             : 
    2031           0 :     st_fx->ac_low_fx = val;
    2032           0 :     move32();
    2033             : 
    2034           0 :     FOR (; bits > 0; bits -= 8)
    2035             :     {
    2036           0 :         ac_enc_shift_fx(ptr, bp, st_fx);
    2037             :     }
    2038           0 :     bits = add(bits, 8);
    2039             : 
    2040           0 :     assert(st_fx->ac_carry_fx == 0);
    2041             : 
    2042           0 :     IF (st_fx->ac_carry_count_fx > 0)
    2043             :     {
    2044           0 :         ptr[(*bp)++] = (UWord8)st_fx->ac_cache_fx;
    2045           0 :         move16();
    2046             : 
    2047           0 :         FOR (; st_fx->ac_carry_count_fx > 1; st_fx->ac_carry_count_fx--)
    2048             :         {
    2049           0 :             ptr[(*bp)++] = 0xff;
    2050           0 :             move16();
    2051             :         }
    2052           0 :         write_indice_forward(ptr, *bp, lshr(0xff, sub(8, bits)), bits);
    2053             :     }
    2054             :     ELSE
    2055             :     {
    2056           0 :         write_indice_forward(ptr, *bp, st_fx->ac_cache_fx, bits);
    2057             :     }
    2058             : 
    2059             :     Dyn_Mem_Deluxe_Out();
    2060           0 :     return bits;
    2061             : }
    2062             : 
    2063             : 
    2064           0 : __forceinline Word16 read_bit(UWord8 *ptr, Word16 *bp, Word16 *mask)
    2065             : {
    2066             :     Dyn_Mem_Deluxe_In(Word16 bit;);
    2067             : 
    2068           0 :     bit = 0;
    2069           0 :     move16();
    2070           0 :     if (s_and((Word16)ptr[*bp], *mask) > 0)
    2071             :     {
    2072           0 :         bit = 1;
    2073           0 :         move16();
    2074             :     }
    2075           0 :     *mask = lshl_pos(*mask, 1);
    2076           0 :     move16();
    2077           0 :     if (sub(*mask, 0x100) == 0)
    2078             :     {
    2079           0 :         *mask = 1;
    2080           0 :         move16();
    2081             :     }
    2082           0 :     if (sub(*mask, 1) == 0)
    2083             :     {
    2084           0 :         *bp = sub(*bp, 1);
    2085           0 :         move16();
    2086             :     }
    2087             : 
    2088             :     Dyn_Mem_Deluxe_Out();
    2089           0 :     return bit;
    2090             : }
    2091             : 
    2092             : 
    2093           0 : static __forceinline void ac_dec_init_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side,
    2094             :                                          Decoder_State_fx *st_fx) /* i/o: Decoder State */
    2095             : {
    2096             :     Dyn_Mem_Deluxe_In(Word32 i;);
    2097             : 
    2098             : 
    2099           0 :     st_fx->ac_low_fx = L_deposit_l(0);
    2100           0 :     move32();
    2101             : 
    2102           0 :     st_fx->ac_range_fx = 0x00ffffff;
    2103           0 :     move32();
    2104           0 :     FOR (i = 0; i < 3; i++)
    2105             :     {
    2106           0 :         if (check_pc_bytes(bp, bp_side, mask_side, 0, 1, &st_fx->pc) != 0)
    2107             :         {
    2108             :             Dyn_Mem_Deluxe_Out();
    2109           0 :             return;
    2110             :         }
    2111           0 :         st_fx->ac_low_fx = UL_addNsD(UL_lshl_pos(st_fx->ac_low_fx, 8), UL_deposit_l((Word16)ptr[(*bp)++]));
    2112           0 :         move32();
    2113           0 :         assert(st_fx->ac_low_fx < (1U << 24));
    2114             :     }
    2115             : 
    2116           0 :     st_fx->BER_detect = 0;
    2117           0 :     move16();
    2118             : 
    2119             :     Dyn_Mem_Deluxe_Out();
    2120             : }
    2121             : 
    2122             : /* o  : Decoded cumulative frequency    */
    2123           0 : static __forceinline Word16 ac_decode_fx(Decoder_State_fx *st_fx, /* i/o: Decoder State                   */
    2124             :                                          Word16            pki)
    2125             : {
    2126             :     Dyn_Mem_Deluxe_In(UWord16 sgn; Word16 val, r;);
    2127             : 
    2128           0 :     st_fx->ac_help_fx = UL_lshr_pos(st_fx->ac_range_fx, 10);
    2129           0 :     move32();
    2130           0 :     val = 0;
    2131           0 :     move16();
    2132             : 
    2133           0 :     r = add(val, 8);
    2134           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn);
    2135           0 :     if (sgn == 0)
    2136             :     {
    2137           0 :         val = r;
    2138           0 :         move16();
    2139             :     }
    2140             : 
    2141           0 :     r = add(val, 4);
    2142           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn);
    2143           0 :     if (sgn == 0)
    2144             :     {
    2145           0 :         val = r;
    2146           0 :         move16();
    2147             :     }
    2148             : 
    2149           0 :     r = add(val, 2);
    2150           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn);
    2151           0 :     if (sgn == 0)
    2152             :     {
    2153           0 :         val = r;
    2154           0 :         move16();
    2155             :     }
    2156             : 
    2157           0 :     r = add(val, 1);
    2158           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][r]), &sgn);
    2159           0 :     IF (sgn == 0)
    2160             :     {
    2161           0 :         val = r;
    2162           0 :         move16();
    2163           0 :         IF (sub(val, 15) == 0)
    2164             :         {
    2165           0 :             UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ari_spec_cumfreq[pki][16]), &sgn);
    2166           0 :             if (sgn == 0)
    2167             :             {
    2168           0 :                 val = 16;
    2169           0 :                 move16();
    2170             :             }
    2171           0 :             UL_subNs(st_fx->ac_low_fx, UL_lshl(st_fx->ac_help_fx, 10), &sgn);
    2172           0 :             if (sgn == 0)
    2173             :             {
    2174           0 :                 st_fx->BER_detect = 1;
    2175           0 :                 move16();
    2176             :             }
    2177             :         }
    2178             :     }
    2179             : 
    2180             :     Dyn_Mem_Deluxe_Out();
    2181           0 :     return val;
    2182             : }
    2183             : 
    2184             : /* o  : Decoded cumulative frequency    */
    2185           0 : static __forceinline Word16 ac_decode_tns_order(Decoder_State_fx *st_fx, /* i/o: Decoder State                   */
    2186             :                                                 Word16            enable_lpc_weighting)
    2187             : {
    2188             :     Dyn_Mem_Deluxe_In(UWord16 sgn; Word16 val, r;);
    2189             : 
    2190           0 :     st_fx->ac_help_fx = UL_lshr_pos(st_fx->ac_range_fx, 10);
    2191           0 :     move32();
    2192           0 :     val = 0;
    2193           0 :     move16();
    2194             : 
    2195           0 :     r = add(val, 4);
    2196           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_order_cumfreq[enable_lpc_weighting][r]), &sgn);
    2197           0 :     if (sgn == 0)
    2198             :     {
    2199           0 :         val = r;
    2200           0 :         move16();
    2201             :     }
    2202             : 
    2203           0 :     r = add(val, 2);
    2204           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_order_cumfreq[enable_lpc_weighting][r]), &sgn);
    2205           0 :     if (sgn == 0)
    2206             :     {
    2207           0 :         val = r;
    2208           0 :         move16();
    2209             :     }
    2210             : 
    2211           0 :     r = add(val, 1);
    2212           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_order_cumfreq[enable_lpc_weighting][r]), &sgn);
    2213           0 :     if (sgn == 0)
    2214             :     {
    2215           0 :         val = r;
    2216           0 :         move16();
    2217             :     }
    2218             : 
    2219           0 :     UL_subNs(st_fx->ac_low_fx, UL_lshl(st_fx->ac_help_fx, 10), &sgn);
    2220           0 :     if (sgn == 0)
    2221             :     {
    2222           0 :         st_fx->BER_detect = 1;
    2223           0 :         move16();
    2224             :     }
    2225             : 
    2226             :     Dyn_Mem_Deluxe_Out();
    2227           0 :     return val;
    2228             : }
    2229             : 
    2230             : /* o  : Decoded cumulative frequency    */
    2231           0 : static __forceinline Word16 ac_decode_tns_coef(Decoder_State_fx *st_fx, /* i/o: Decoder State                   */
    2232             :                                                Word16            pki)
    2233             : {
    2234             :     Dyn_Mem_Deluxe_In(UWord16 sgn; Word16 val, r;);
    2235             : 
    2236           0 :     st_fx->ac_help_fx = UL_lshr_pos(st_fx->ac_range_fx, 10);
    2237           0 :     move32();
    2238           0 :     val = 0;
    2239           0 :     move16();
    2240             : 
    2241           0 :     r = add(val, 8);
    2242           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn);
    2243           0 :     if (sgn == 0)
    2244             :     {
    2245           0 :         val = r;
    2246           0 :         move16();
    2247             :     }
    2248             : 
    2249           0 :     r = add(val, 4);
    2250           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn);
    2251           0 :     if (sgn == 0)
    2252             :     {
    2253           0 :         val = r;
    2254           0 :         move16();
    2255             :     }
    2256             : 
    2257           0 :     r = add(val, 2);
    2258           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn);
    2259           0 :     if (sgn == 0)
    2260             :     {
    2261           0 :         val = r;
    2262           0 :         move16();
    2263             :     }
    2264             : 
    2265           0 :     r = add(val, 1);
    2266           0 :     UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][r]), &sgn);
    2267           0 :     if (sgn == 0)
    2268             :     {
    2269           0 :         val = r;
    2270           0 :         move16();
    2271           0 :         IF (sub(val, 15) == 0)
    2272             :         {
    2273           0 :             UL_subNs(st_fx->ac_low_fx, UL_Mpy_32_32(st_fx->ac_help_fx, ac_tns_coef_cumfreq[pki][16]), &sgn);
    2274           0 :             if (sgn == 0)
    2275             :             {
    2276           0 :                 val = 16;
    2277           0 :                 move16();
    2278             :             }
    2279           0 :             UL_subNs(st_fx->ac_low_fx, UL_lshl(st_fx->ac_help_fx, 10), &sgn);
    2280           0 :             if (sgn == 0)
    2281             :             {
    2282           0 :                 st_fx->BER_detect = 1;
    2283           0 :                 move16();
    2284             :             }
    2285             :         }
    2286             :     }
    2287             : 
    2288             :     Dyn_Mem_Deluxe_Out();
    2289           0 :     return val;
    2290             : }
    2291             : 
    2292           0 : static __forceinline Word16 ac_dec_update_fx(UWord8 *ptr, Word16 *bp, Word16 *bp_side, Word16 *mask_side,
    2293             :                                              Word16 cur_bin, Decoder_State_fx *st_fx, /* i/o: Decoder State */
    2294             :                                              UWord32 cum_freq,                        /* i  : Cumulative frequency    */
    2295             :                                              UWord32 sym_freq                         /* i  : Symbol frequency        */
    2296             : )
    2297             : {
    2298             :     UWord32 UL_tmp;
    2299             : 
    2300             : 
    2301           0 :     assert(st_fx->ac_help_fx < (1U << 24));
    2302           0 :     assert(cum_freq < (1U << 24));
    2303             : 
    2304           0 :     UL_tmp = UL_Mpy_32_32(cum_freq, st_fx->ac_help_fx);
    2305           0 :     assert(UL_tmp < (1U << 24));
    2306             : 
    2307           0 :     st_fx->ac_low_fx = UL_subNsD(st_fx->ac_low_fx, UL_tmp);
    2308           0 :     move32(); /*0+0*/
    2309           0 :     assert(st_fx->ac_low_fx < (1U << 24));
    2310             : 
    2311           0 :     st_fx->ac_range_fx = UL_Mpy_32_32(st_fx->ac_help_fx, sym_freq);
    2312           0 :     move32();
    2313             : 
    2314           0 :     assert(st_fx->ac_range_fx < (1U << 24));
    2315             :     /* updated to 16 from 24 */
    2316           0 :     WHILE (st_fx->ac_range_fx < (1U << 16))
    2317             :     {
    2318           0 :         L_sub(0, 0); /* For comparision in while*/
    2319             : 
    2320           0 :         st_fx->ac_low_fx =
    2321           0 :             UL_and(st_fx->ac_low_fx, 0x0000ffFF); /*  make sure upshift doe not lead to more than 24 bits */
    2322           0 :         assert(st_fx->ac_low_fx < 1U << 16);
    2323             : 
    2324           0 :         if (check_pc_bytes(bp, bp_side, mask_side, cur_bin, 1, &st_fx->pc) != 0)
    2325           0 :             return 1;
    2326             : 
    2327             :         /*shift in 8 bits */
    2328           0 :         st_fx->ac_low_fx = UL_addNsD(UL_lshl_pos(st_fx->ac_low_fx, 8), UL_deposit_l((Word16)ptr[(*bp)++]));
    2329           0 :         move32();
    2330             : 
    2331           0 :         assert(st_fx->ac_low_fx < (1U << 24));
    2332           0 :         st_fx->ac_range_fx = UL_lshl_pos(st_fx->ac_range_fx, 8);
    2333           0 :         move32();
    2334           0 :         assert(st_fx->ac_range_fx < (1U << 24));
    2335             :     }
    2336           0 :     return 0;
    2337             : }
    2338             : 
    2339           0 : static __forceinline void pc_init_fx(Word16 n_pc, Word16 numbytes, Word16 be_bp_left, Word16 be_bp_right, Word16 L_spec,
    2340             :     Word16 enc, Word16 sim_dec, Word16 bfi, Pc_State_fx *pc /* i/o: Pc State */
    2341             : )
    2342             : {
    2343           0 : pc->inv_bin     = add(L_spec, 1);       move16();
    2344           0 : pc->numbytes    = numbytes;             move16();
    2345           0 : pc->c_bp        = 0;                    move16();
    2346           0 : pc->c_bp_side   = 0;                    move16();
    2347           0 : pc->bytes       = shr(add(n_pc, 1),1);  move16();
    2348           0 : pc->b_left      = add(numbytes,1);      move16();
    2349           0 : pc->b_right     = -1;                   move16();
    2350           0 : pc->enc         = enc;                  move16();
    2351           0 : pc->sim_dec     = sim_dec;              move16();
    2352           0 : pc->bfi         = bfi;                  move16();
    2353           0 : pc->be_bp_left  = shr(be_bp_left, 3);   move16();
    2354           0 : pc->be_bp_right = shr(be_bp_right, 3);  move16();
    2355           0 :     assert(pc->be_bp_right < pc->bytes || pc->bytes == 0);
    2356           0 : }
    2357             : 
    2358           0 : static __forceinline Word16 check_pc_bytes(Word16 *bp, Word16 *bp_side, Word16 *mask_side, Word16 cur_bin,
    2359             :                                            Word16 from_left, Pc_State_fx *pc /* i/o: Pc State */)
    2360             : {
    2361             :     Dyn_Mem_Deluxe_In(Word16 bp_local, bp_side_local, offset;);
    2362             : 
    2363           0 :     IF (pc->bytes > 0)
    2364             :     {
    2365           0 :         test();
    2366           0 :         IF (from_left == 0 && sub(*mask_side, 1) != 0)
    2367             :         {
    2368             :             Dyn_Mem_Deluxe_Out();
    2369           0 :             return 0;
    2370             :         }
    2371           0 :         test();
    2372           0 :         IF (pc->c_bp_side > 0 && *bp_side < 0)
    2373             :         {
    2374           0 :             assert(*mask_side == 1);
    2375           0 :             assert(pc->b_right != -1);
    2376           0 :             *bp_side = pc->b_right;
    2377             :             Dyn_Mem_Deluxe_Out();
    2378           0 :             return 0;
    2379             :         }
    2380           0 :         bp_local      = *bp;
    2381           0 :         bp_side_local = *bp_side;
    2382             : 
    2383           0 :         IF (from_left != 0)
    2384             :         {
    2385           0 :             if (sub(*mask_side, 1) == 0)
    2386             :             {
    2387           0 :                 bp_side_local = add(bp_side_local, 1);
    2388             :             }
    2389             :         }
    2390             :         ELSE
    2391             :         {
    2392           0 :             bp_local = sub(bp_local, 1);
    2393             :         }
    2394             : 
    2395           0 :         IF (pc->b_right < 0)
    2396             :         {
    2397           0 :             offset = -1;
    2398           0 :             move16();
    2399           0 :             if (pc->enc == 0)
    2400             :             {
    2401           0 :                 offset = add(offset, pc->bytes);
    2402             :             }
    2403             : 
    2404           0 :             IF (add(bp_side_local, sub(offset, bp_local)) == pc->bytes)
    2405             :             {
    2406           0 :                 pc->b_left  = add(bp_local, 1);
    2407           0 :                 pc->b_right = sub(bp_side_local, 1);
    2408           0 :                 IF (pc->enc != 0)
    2409             :                 {
    2410           0 :                     assert(pc->b_right - pc->b_left + 1 == pc->bytes);
    2411             :                     Dyn_Mem_Deluxe_Out();
    2412           0 :                     return 1;
    2413             :                 }
    2414             :             }
    2415             :         }
    2416             : 
    2417           0 :         test();
    2418           0 :         IF (pc->enc == 0 && pc->b_right >= 0)
    2419             :         {
    2420           0 :             test();
    2421           0 :             IF (from_left != 0 && sub(*bp, pc->b_left) == 0)
    2422             :             {
    2423           0 :                 IF (pc->sim_dec == 1)
    2424             :                 {
    2425           0 :                     pc->b_left = *bp;
    2426             :                     Dyn_Mem_Deluxe_Out();
    2427           0 :                     return 1;
    2428             :                 }
    2429           0 :                 *bp = 0;  move16();
    2430           0 :                 pc->c_bp = 1;  move16();
    2431             :             }
    2432           0 :             test();
    2433           0 :             IF (from_left == 0 && sub(bp_side_local, pc->b_right) == 0)
    2434             :             {
    2435           0 :                 *bp_side = sub(pc->bytes, 1);
    2436           0 :                 move16();
    2437           0 :                 pc->c_bp_side = 1;
    2438           0 :                 move16();
    2439             :             }
    2440           0 :             IF (sub(pc->bfi, 2) == 0)
    2441             :             {
    2442           0 :                 test();
    2443           0 :                 test();
    2444           0 :                 IF ((pc->c_bp != 0 && sub(*bp, pc->be_bp_left) >= 0) ||
    2445             :                     (pc->c_bp_side != 0 && sub(*bp_side, pc->be_bp_right) <= 0))
    2446             :                 {
    2447           0 :                     pc->inv_bin = cur_bin;
    2448           0 :                     move16();
    2449             :                     Dyn_Mem_Deluxe_Out();
    2450           0 :                     return 1;
    2451             :                 }
    2452           0 :                 ELSE IF ((pc->c_bp != 0 && *bp >= 0) || (pc->c_bp_side != 0 && sub(*bp_side, sub(pc->bytes, 1)) <= 0))
    2453             :                 {
    2454           0 :                     pc->inv_bin = s_min(pc->inv_bin, cur_bin);
    2455             :                     Dyn_Mem_Deluxe_Out();
    2456           0 :                     return 0;
    2457             :                 }
    2458             :             }
    2459             :         }
    2460             :     }
    2461             : 
    2462             :     Dyn_Mem_Deluxe_Out();
    2463           0 :     return 0;
    2464             : }
    2465             : 

Generated by: LCOV version 1.14