xref: /aosp_15_r20/external/lzma/C/Bcj2.c (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* Bcj2.c -- BCJ2 Decoder (Converter for x86 code)
2*f6dc9357SAndroid Build Coastguard Worker 2023-03-01 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #include "Precomp.h"
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "Bcj2.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "CpuArch.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #define kTopValue ((UInt32)1 << 24)
10*f6dc9357SAndroid Build Coastguard Worker #define kNumBitModelTotalBits 11
11*f6dc9357SAndroid Build Coastguard Worker #define kBitModelTotal (1 << kNumBitModelTotalBits)
12*f6dc9357SAndroid Build Coastguard Worker #define kNumMoveBits 5
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker // UInt32 bcj2_stats[256 + 2][2];
15*f6dc9357SAndroid Build Coastguard Worker 
Bcj2Dec_Init(CBcj2Dec * p)16*f6dc9357SAndroid Build Coastguard Worker void Bcj2Dec_Init(CBcj2Dec *p)
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
19*f6dc9357SAndroid Build Coastguard Worker   p->state = BCJ2_STREAM_RC; // BCJ2_DEC_STATE_OK;
20*f6dc9357SAndroid Build Coastguard Worker   p->ip = 0;
21*f6dc9357SAndroid Build Coastguard Worker   p->temp = 0;
22*f6dc9357SAndroid Build Coastguard Worker   p->range = 0;
23*f6dc9357SAndroid Build Coastguard Worker   p->code = 0;
24*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++)
25*f6dc9357SAndroid Build Coastguard Worker     p->probs[i] = kBitModelTotal >> 1;
26*f6dc9357SAndroid Build Coastguard Worker }
27*f6dc9357SAndroid Build Coastguard Worker 
Bcj2Dec_Decode(CBcj2Dec * p)28*f6dc9357SAndroid Build Coastguard Worker SRes Bcj2Dec_Decode(CBcj2Dec *p)
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker   UInt32 v = p->temp;
31*f6dc9357SAndroid Build Coastguard Worker   // const Byte *src;
32*f6dc9357SAndroid Build Coastguard Worker   if (p->range <= 5)
33*f6dc9357SAndroid Build Coastguard Worker   {
34*f6dc9357SAndroid Build Coastguard Worker     UInt32 code = p->code;
35*f6dc9357SAndroid Build Coastguard Worker     p->state = BCJ2_DEC_STATE_ERROR; /* for case if we return SZ_ERROR_DATA; */
36*f6dc9357SAndroid Build Coastguard Worker     for (; p->range != 5; p->range++)
37*f6dc9357SAndroid Build Coastguard Worker     {
38*f6dc9357SAndroid Build Coastguard Worker       if (p->range == 1 && code != 0)
39*f6dc9357SAndroid Build Coastguard Worker         return SZ_ERROR_DATA;
40*f6dc9357SAndroid Build Coastguard Worker       if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC])
41*f6dc9357SAndroid Build Coastguard Worker       {
42*f6dc9357SAndroid Build Coastguard Worker         p->state = BCJ2_STREAM_RC;
43*f6dc9357SAndroid Build Coastguard Worker         return SZ_OK;
44*f6dc9357SAndroid Build Coastguard Worker       }
45*f6dc9357SAndroid Build Coastguard Worker       code = (code << 8) | *(p->bufs[BCJ2_STREAM_RC])++;
46*f6dc9357SAndroid Build Coastguard Worker       p->code = code;
47*f6dc9357SAndroid Build Coastguard Worker     }
48*f6dc9357SAndroid Build Coastguard Worker     if (code == 0xffffffff)
49*f6dc9357SAndroid Build Coastguard Worker       return SZ_ERROR_DATA;
50*f6dc9357SAndroid Build Coastguard Worker     p->range = 0xffffffff;
51*f6dc9357SAndroid Build Coastguard Worker   }
52*f6dc9357SAndroid Build Coastguard Worker   // else
53*f6dc9357SAndroid Build Coastguard Worker   {
54*f6dc9357SAndroid Build Coastguard Worker     unsigned state = p->state;
55*f6dc9357SAndroid Build Coastguard Worker     // we check BCJ2_IS_32BIT_STREAM() here instead of check in the main loop
56*f6dc9357SAndroid Build Coastguard Worker     if (BCJ2_IS_32BIT_STREAM(state))
57*f6dc9357SAndroid Build Coastguard Worker     {
58*f6dc9357SAndroid Build Coastguard Worker       const Byte *cur = p->bufs[state];
59*f6dc9357SAndroid Build Coastguard Worker       if (cur == p->lims[state])
60*f6dc9357SAndroid Build Coastguard Worker         return SZ_OK;
61*f6dc9357SAndroid Build Coastguard Worker       p->bufs[state] = cur + 4;
62*f6dc9357SAndroid Build Coastguard Worker       {
63*f6dc9357SAndroid Build Coastguard Worker         const UInt32 ip = p->ip + 4;
64*f6dc9357SAndroid Build Coastguard Worker         v = GetBe32a(cur) - ip;
65*f6dc9357SAndroid Build Coastguard Worker         p->ip = ip;
66*f6dc9357SAndroid Build Coastguard Worker       }
67*f6dc9357SAndroid Build Coastguard Worker       state = BCJ2_DEC_STATE_ORIG_0;
68*f6dc9357SAndroid Build Coastguard Worker     }
69*f6dc9357SAndroid Build Coastguard Worker     if ((unsigned)(state - BCJ2_DEC_STATE_ORIG_0) < 4)
70*f6dc9357SAndroid Build Coastguard Worker     {
71*f6dc9357SAndroid Build Coastguard Worker       Byte *dest = p->dest;
72*f6dc9357SAndroid Build Coastguard Worker       for (;;)
73*f6dc9357SAndroid Build Coastguard Worker       {
74*f6dc9357SAndroid Build Coastguard Worker         if (dest == p->destLim)
75*f6dc9357SAndroid Build Coastguard Worker         {
76*f6dc9357SAndroid Build Coastguard Worker           p->state = state;
77*f6dc9357SAndroid Build Coastguard Worker           p->temp = v;
78*f6dc9357SAndroid Build Coastguard Worker           return SZ_OK;
79*f6dc9357SAndroid Build Coastguard Worker         }
80*f6dc9357SAndroid Build Coastguard Worker         *dest++ = (Byte)v;
81*f6dc9357SAndroid Build Coastguard Worker         p->dest = dest;
82*f6dc9357SAndroid Build Coastguard Worker         if (++state == BCJ2_DEC_STATE_ORIG_3 + 1)
83*f6dc9357SAndroid Build Coastguard Worker           break;
84*f6dc9357SAndroid Build Coastguard Worker         v >>= 8;
85*f6dc9357SAndroid Build Coastguard Worker       }
86*f6dc9357SAndroid Build Coastguard Worker     }
87*f6dc9357SAndroid Build Coastguard Worker   }
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   // src = p->bufs[BCJ2_STREAM_MAIN];
90*f6dc9357SAndroid Build Coastguard Worker   for (;;)
91*f6dc9357SAndroid Build Coastguard Worker   {
92*f6dc9357SAndroid Build Coastguard Worker     /*
93*f6dc9357SAndroid Build Coastguard Worker     if (BCJ2_IS_32BIT_STREAM(p->state))
94*f6dc9357SAndroid Build Coastguard Worker       p->state = BCJ2_DEC_STATE_OK;
95*f6dc9357SAndroid Build Coastguard Worker     else
96*f6dc9357SAndroid Build Coastguard Worker     */
97*f6dc9357SAndroid Build Coastguard Worker     {
98*f6dc9357SAndroid Build Coastguard Worker       if (p->range < kTopValue)
99*f6dc9357SAndroid Build Coastguard Worker       {
100*f6dc9357SAndroid Build Coastguard Worker         if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC])
101*f6dc9357SAndroid Build Coastguard Worker         {
102*f6dc9357SAndroid Build Coastguard Worker           p->state = BCJ2_STREAM_RC;
103*f6dc9357SAndroid Build Coastguard Worker           p->temp = v;
104*f6dc9357SAndroid Build Coastguard Worker           return SZ_OK;
105*f6dc9357SAndroid Build Coastguard Worker         }
106*f6dc9357SAndroid Build Coastguard Worker         p->range <<= 8;
107*f6dc9357SAndroid Build Coastguard Worker         p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++;
108*f6dc9357SAndroid Build Coastguard Worker       }
109*f6dc9357SAndroid Build Coastguard Worker       {
110*f6dc9357SAndroid Build Coastguard Worker         const Byte *src = p->bufs[BCJ2_STREAM_MAIN];
111*f6dc9357SAndroid Build Coastguard Worker         const Byte *srcLim;
112*f6dc9357SAndroid Build Coastguard Worker         Byte *dest = p->dest;
113*f6dc9357SAndroid Build Coastguard Worker         {
114*f6dc9357SAndroid Build Coastguard Worker           const SizeT rem = (SizeT)(p->lims[BCJ2_STREAM_MAIN] - src);
115*f6dc9357SAndroid Build Coastguard Worker           SizeT num = (SizeT)(p->destLim - dest);
116*f6dc9357SAndroid Build Coastguard Worker           if (num >= rem)
117*f6dc9357SAndroid Build Coastguard Worker             num = rem;
118*f6dc9357SAndroid Build Coastguard Worker         #define NUM_ITERS 4
119*f6dc9357SAndroid Build Coastguard Worker         #if (NUM_ITERS & (NUM_ITERS - 1)) == 0
120*f6dc9357SAndroid Build Coastguard Worker           num &= ~((SizeT)NUM_ITERS - 1);   // if (NUM_ITERS == (1 << x))
121*f6dc9357SAndroid Build Coastguard Worker         #else
122*f6dc9357SAndroid Build Coastguard Worker           num -= num % NUM_ITERS; // if (NUM_ITERS != (1 << x))
123*f6dc9357SAndroid Build Coastguard Worker         #endif
124*f6dc9357SAndroid Build Coastguard Worker           srcLim = src + num;
125*f6dc9357SAndroid Build Coastguard Worker         }
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker         #define NUM_SHIFT_BITS  24
128*f6dc9357SAndroid Build Coastguard Worker         #define ONE_ITER(indx) { \
129*f6dc9357SAndroid Build Coastguard Worker           const unsigned b = src[indx]; \
130*f6dc9357SAndroid Build Coastguard Worker           *dest++ = (Byte)b; \
131*f6dc9357SAndroid Build Coastguard Worker           v = (v << NUM_SHIFT_BITS) | b; \
132*f6dc9357SAndroid Build Coastguard Worker           if (((b + (0x100 - 0xe8)) & 0xfe) == 0) break; \
133*f6dc9357SAndroid Build Coastguard Worker           if (((v - (((UInt32)0x0f << (NUM_SHIFT_BITS)) + 0x80)) & \
134*f6dc9357SAndroid Build Coastguard Worker               ((((UInt32)1 << (4 + NUM_SHIFT_BITS)) - 0x1) << 4)) == 0) break; \
135*f6dc9357SAndroid Build Coastguard Worker             /* ++dest */; /* v = b; */ }
136*f6dc9357SAndroid Build Coastguard Worker 
137*f6dc9357SAndroid Build Coastguard Worker         if (src != srcLim)
138*f6dc9357SAndroid Build Coastguard Worker         for (;;)
139*f6dc9357SAndroid Build Coastguard Worker         {
140*f6dc9357SAndroid Build Coastguard Worker             /* The dependency chain of 2-cycle for (v) calculation is not big problem here.
141*f6dc9357SAndroid Build Coastguard Worker                But we can remove dependency chain with v = b in the end of loop. */
142*f6dc9357SAndroid Build Coastguard Worker           ONE_ITER(0)
143*f6dc9357SAndroid Build Coastguard Worker           #if (NUM_ITERS > 1)
144*f6dc9357SAndroid Build Coastguard Worker             ONE_ITER(1)
145*f6dc9357SAndroid Build Coastguard Worker           #if (NUM_ITERS > 2)
146*f6dc9357SAndroid Build Coastguard Worker             ONE_ITER(2)
147*f6dc9357SAndroid Build Coastguard Worker           #if (NUM_ITERS > 3)
148*f6dc9357SAndroid Build Coastguard Worker             ONE_ITER(3)
149*f6dc9357SAndroid Build Coastguard Worker           #if (NUM_ITERS > 4)
150*f6dc9357SAndroid Build Coastguard Worker             ONE_ITER(4)
151*f6dc9357SAndroid Build Coastguard Worker           #if (NUM_ITERS > 5)
152*f6dc9357SAndroid Build Coastguard Worker             ONE_ITER(5)
153*f6dc9357SAndroid Build Coastguard Worker           #if (NUM_ITERS > 6)
154*f6dc9357SAndroid Build Coastguard Worker             ONE_ITER(6)
155*f6dc9357SAndroid Build Coastguard Worker           #if (NUM_ITERS > 7)
156*f6dc9357SAndroid Build Coastguard Worker             ONE_ITER(7)
157*f6dc9357SAndroid Build Coastguard Worker           #endif
158*f6dc9357SAndroid Build Coastguard Worker           #endif
159*f6dc9357SAndroid Build Coastguard Worker           #endif
160*f6dc9357SAndroid Build Coastguard Worker           #endif
161*f6dc9357SAndroid Build Coastguard Worker           #endif
162*f6dc9357SAndroid Build Coastguard Worker           #endif
163*f6dc9357SAndroid Build Coastguard Worker           #endif
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker           src += NUM_ITERS;
166*f6dc9357SAndroid Build Coastguard Worker           if (src == srcLim)
167*f6dc9357SAndroid Build Coastguard Worker             break;
168*f6dc9357SAndroid Build Coastguard Worker         }
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker         if (src == srcLim)
171*f6dc9357SAndroid Build Coastguard Worker       #if (NUM_ITERS > 1)
172*f6dc9357SAndroid Build Coastguard Worker         for (;;)
173*f6dc9357SAndroid Build Coastguard Worker       #endif
174*f6dc9357SAndroid Build Coastguard Worker         {
175*f6dc9357SAndroid Build Coastguard Worker         #if (NUM_ITERS > 1)
176*f6dc9357SAndroid Build Coastguard Worker           if (src == p->lims[BCJ2_STREAM_MAIN] || dest == p->destLim)
177*f6dc9357SAndroid Build Coastguard Worker         #endif
178*f6dc9357SAndroid Build Coastguard Worker           {
179*f6dc9357SAndroid Build Coastguard Worker             const SizeT num = (SizeT)(src - p->bufs[BCJ2_STREAM_MAIN]);
180*f6dc9357SAndroid Build Coastguard Worker             p->bufs[BCJ2_STREAM_MAIN] = src;
181*f6dc9357SAndroid Build Coastguard Worker             p->dest = dest;
182*f6dc9357SAndroid Build Coastguard Worker             p->ip += (UInt32)num;
183*f6dc9357SAndroid Build Coastguard Worker             /* state BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */
184*f6dc9357SAndroid Build Coastguard Worker             p->state =
185*f6dc9357SAndroid Build Coastguard Worker               src == p->lims[BCJ2_STREAM_MAIN] ?
186*f6dc9357SAndroid Build Coastguard Worker                 (unsigned)BCJ2_STREAM_MAIN :
187*f6dc9357SAndroid Build Coastguard Worker                 (unsigned)BCJ2_DEC_STATE_ORIG;
188*f6dc9357SAndroid Build Coastguard Worker             p->temp = v;
189*f6dc9357SAndroid Build Coastguard Worker             return SZ_OK;
190*f6dc9357SAndroid Build Coastguard Worker           }
191*f6dc9357SAndroid Build Coastguard Worker         #if (NUM_ITERS > 1)
192*f6dc9357SAndroid Build Coastguard Worker           ONE_ITER(0)
193*f6dc9357SAndroid Build Coastguard Worker           src++;
194*f6dc9357SAndroid Build Coastguard Worker         #endif
195*f6dc9357SAndroid Build Coastguard Worker         }
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker         {
198*f6dc9357SAndroid Build Coastguard Worker           const SizeT num = (SizeT)(dest - p->dest);
199*f6dc9357SAndroid Build Coastguard Worker           p->dest = dest; // p->dest += num;
200*f6dc9357SAndroid Build Coastguard Worker           p->bufs[BCJ2_STREAM_MAIN] += num; // = src;
201*f6dc9357SAndroid Build Coastguard Worker           p->ip += (UInt32)num;
202*f6dc9357SAndroid Build Coastguard Worker         }
203*f6dc9357SAndroid Build Coastguard Worker         {
204*f6dc9357SAndroid Build Coastguard Worker           UInt32 bound, ttt;
205*f6dc9357SAndroid Build Coastguard Worker           CBcj2Prob *prob; // unsigned index;
206*f6dc9357SAndroid Build Coastguard Worker           /*
207*f6dc9357SAndroid Build Coastguard Worker           prob = p->probs + (unsigned)((Byte)v == 0xe8 ?
208*f6dc9357SAndroid Build Coastguard Worker               2 + (Byte)(v >> 8) :
209*f6dc9357SAndroid Build Coastguard Worker               ((v >> 5) & 1));  // ((Byte)v < 0xe8 ? 0 : 1));
210*f6dc9357SAndroid Build Coastguard Worker           */
211*f6dc9357SAndroid Build Coastguard Worker           {
212*f6dc9357SAndroid Build Coastguard Worker             const unsigned c = ((v + 0x17) >> 6) & 1;
213*f6dc9357SAndroid Build Coastguard Worker             prob = p->probs + (unsigned)
214*f6dc9357SAndroid Build Coastguard Worker                 (((0 - c) & (Byte)(v >> NUM_SHIFT_BITS)) + c + ((v >> 5) & 1));
215*f6dc9357SAndroid Build Coastguard Worker                 // (Byte)
216*f6dc9357SAndroid Build Coastguard Worker                 // 8x->0     : e9->1     : xxe8->xx+2
217*f6dc9357SAndroid Build Coastguard Worker                 // 8x->0x100 : e9->0x101 : xxe8->xx
218*f6dc9357SAndroid Build Coastguard Worker                 // (((0x100 - (e & ~v)) & (0x100 | (v >> 8))) + (e & v));
219*f6dc9357SAndroid Build Coastguard Worker                 // (((0x101 + (~e | v)) & (0x100 | (v >> 8))) + (e & v));
220*f6dc9357SAndroid Build Coastguard Worker           }
221*f6dc9357SAndroid Build Coastguard Worker           ttt = *prob;
222*f6dc9357SAndroid Build Coastguard Worker           bound = (p->range >> kNumBitModelTotalBits) * ttt;
223*f6dc9357SAndroid Build Coastguard Worker           if (p->code < bound)
224*f6dc9357SAndroid Build Coastguard Worker           {
225*f6dc9357SAndroid Build Coastguard Worker             // bcj2_stats[prob - p->probs][0]++;
226*f6dc9357SAndroid Build Coastguard Worker             p->range = bound;
227*f6dc9357SAndroid Build Coastguard Worker             *prob = (CBcj2Prob)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
228*f6dc9357SAndroid Build Coastguard Worker             continue;
229*f6dc9357SAndroid Build Coastguard Worker           }
230*f6dc9357SAndroid Build Coastguard Worker           {
231*f6dc9357SAndroid Build Coastguard Worker             // bcj2_stats[prob - p->probs][1]++;
232*f6dc9357SAndroid Build Coastguard Worker             p->range -= bound;
233*f6dc9357SAndroid Build Coastguard Worker             p->code -= bound;
234*f6dc9357SAndroid Build Coastguard Worker             *prob = (CBcj2Prob)(ttt - (ttt >> kNumMoveBits));
235*f6dc9357SAndroid Build Coastguard Worker           }
236*f6dc9357SAndroid Build Coastguard Worker         }
237*f6dc9357SAndroid Build Coastguard Worker       }
238*f6dc9357SAndroid Build Coastguard Worker     }
239*f6dc9357SAndroid Build Coastguard Worker     {
240*f6dc9357SAndroid Build Coastguard Worker       /* (v == 0xe8 ? 0 : 1) uses setcc instruction with additional zero register usage in x64 MSVC. */
241*f6dc9357SAndroid Build Coastguard Worker       // const unsigned cj = ((Byte)v == 0xe8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP;
242*f6dc9357SAndroid Build Coastguard Worker       const unsigned cj = (((v + 0x57) >> 6) & 1) + BCJ2_STREAM_CALL;
243*f6dc9357SAndroid Build Coastguard Worker       const Byte *cur = p->bufs[cj];
244*f6dc9357SAndroid Build Coastguard Worker       Byte *dest;
245*f6dc9357SAndroid Build Coastguard Worker       SizeT rem;
246*f6dc9357SAndroid Build Coastguard Worker       if (cur == p->lims[cj])
247*f6dc9357SAndroid Build Coastguard Worker       {
248*f6dc9357SAndroid Build Coastguard Worker         p->state = cj;
249*f6dc9357SAndroid Build Coastguard Worker         break;
250*f6dc9357SAndroid Build Coastguard Worker       }
251*f6dc9357SAndroid Build Coastguard Worker       v = GetBe32a(cur);
252*f6dc9357SAndroid Build Coastguard Worker       p->bufs[cj] = cur + 4;
253*f6dc9357SAndroid Build Coastguard Worker       {
254*f6dc9357SAndroid Build Coastguard Worker         const UInt32 ip = p->ip + 4;
255*f6dc9357SAndroid Build Coastguard Worker         v -= ip;
256*f6dc9357SAndroid Build Coastguard Worker         p->ip = ip;
257*f6dc9357SAndroid Build Coastguard Worker       }
258*f6dc9357SAndroid Build Coastguard Worker       dest = p->dest;
259*f6dc9357SAndroid Build Coastguard Worker       rem = (SizeT)(p->destLim - dest);
260*f6dc9357SAndroid Build Coastguard Worker       if (rem < 4)
261*f6dc9357SAndroid Build Coastguard Worker       {
262*f6dc9357SAndroid Build Coastguard Worker         if ((unsigned)rem > 0) { dest[0] = (Byte)v;  v >>= 8;
263*f6dc9357SAndroid Build Coastguard Worker         if ((unsigned)rem > 1) { dest[1] = (Byte)v;  v >>= 8;
264*f6dc9357SAndroid Build Coastguard Worker         if ((unsigned)rem > 2) { dest[2] = (Byte)v;  v >>= 8; }}}
265*f6dc9357SAndroid Build Coastguard Worker         p->temp = v;
266*f6dc9357SAndroid Build Coastguard Worker         p->dest = dest + rem;
267*f6dc9357SAndroid Build Coastguard Worker         p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem;
268*f6dc9357SAndroid Build Coastguard Worker         break;
269*f6dc9357SAndroid Build Coastguard Worker       }
270*f6dc9357SAndroid Build Coastguard Worker       SetUi32(dest, v)
271*f6dc9357SAndroid Build Coastguard Worker       v >>= 24;
272*f6dc9357SAndroid Build Coastguard Worker       p->dest = dest + 4;
273*f6dc9357SAndroid Build Coastguard Worker     }
274*f6dc9357SAndroid Build Coastguard Worker   }
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   if (p->range < kTopValue && p->bufs[BCJ2_STREAM_RC] != p->lims[BCJ2_STREAM_RC])
277*f6dc9357SAndroid Build Coastguard Worker   {
278*f6dc9357SAndroid Build Coastguard Worker     p->range <<= 8;
279*f6dc9357SAndroid Build Coastguard Worker     p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++;
280*f6dc9357SAndroid Build Coastguard Worker   }
281*f6dc9357SAndroid Build Coastguard Worker   return SZ_OK;
282*f6dc9357SAndroid Build Coastguard Worker }
283*f6dc9357SAndroid Build Coastguard Worker 
284*f6dc9357SAndroid Build Coastguard Worker #undef NUM_ITERS
285*f6dc9357SAndroid Build Coastguard Worker #undef ONE_ITER
286*f6dc9357SAndroid Build Coastguard Worker #undef NUM_SHIFT_BITS
287*f6dc9357SAndroid Build Coastguard Worker #undef kTopValue
288*f6dc9357SAndroid Build Coastguard Worker #undef kNumBitModelTotalBits
289*f6dc9357SAndroid Build Coastguard Worker #undef kBitModelTotal
290*f6dc9357SAndroid Build Coastguard Worker #undef kNumMoveBits
291