3 #include "BranchX86_2.h"
5 #include "../../Alloc.h"
13 #define IsJcc(b0, b1) ((b0) == 0x0F && ((b1) & 0xF0) == 0x80)
14 #define IsJ(b0, b1) ((b1 & 0xFE) == 0xE8 || IsJcc(b0, b1))
16 #define kNumTopBits 24
17 #define kTopValue ((UInt32)1 << kNumTopBits)
19 #define kNumBitModelTotalBits 11
20 #define kBitModelTotal (1 << kNumBitModelTotalBits)
21 #define kNumMoveBits 5
23 #define RC_READ_BYTE (*Buffer++)
25 #define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \
26 { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }}
28 #define RC_TEST { if (Buffer == BufferLim) return BCJ2_RESULT_DATA_ERROR; }
30 #define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
32 #define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
34 #define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
35 #define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
36 #define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
37 // #define UpdateBit0(p) Range = bound; *(p) = (CProb)(*(p) + ((kBitModelTotal - *(p)) >> kNumMoveBits));
38 // #define UpdateBit1(p) Range -= bound; Code -= bound; *(p) = (CProb)(*(p) - (*(p) >> kNumMoveBits));
41 const Byte *buf0, SizeT size0,
42 const Byte *buf1, SizeT size1,
43 const Byte *buf2, SizeT size2,
44 const Byte *buf3, SizeT size3,
45 Byte *outBuf, SizeT outSize)
48 SizeT inPos = 0, outPos = 0;
50 const Byte *Buffer, *BufferLim;
55 for (i = 0; i < sizeof(p) / sizeof(p[0]); i++)
56 p[i] = kBitModelTotal >> 1;
60 return BCJ2_RESULT_OK;
68 SizeT limit = size0 - inPos;
69 if (outSize - outPos < limit)
70 limit = outSize - outPos;
82 if (limit == 0 || outPos == outSize)
108 return BCJ2_RESULT_DATA_ERROR;
116 return BCJ2_RESULT_DATA_ERROR;
120 dest = (((UInt32)v[0] << 24) | ((UInt32)v[1] << 16) |
121 ((UInt32)v[2] << 8) | ((UInt32)v[3])) - ((UInt32)outPos + 4);
122 outBuf[outPos++] = (Byte)dest;
123 if (outPos == outSize)
125 outBuf[outPos++] = (Byte)(dest >> 8);
126 if (outPos == outSize)
128 outBuf[outPos++] = (Byte)(dest >> 16);
129 if (outPos == outSize)
131 outBuf[outPos++] = prevByte = (Byte)(dest >> 24);
134 return (outPos == outSize) ? BCJ2_RESULT_OK : BCJ2_RESULT_DATA_ERROR;