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 Workervoid 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 WorkerSRes 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