Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/Branch/BranchX86.c, revision 1.1.1.1
1.1 misho 1: /* BranchX86.c */
2:
3: #include "BranchX86.h"
4:
5: /*
6: static int inline Test86MSByte(Byte b)
7: {
8: return (b == 0 || b == 0xFF);
9: }
10: */
11: #define Test86MSByte(b) ((b) == 0 || (b) == 0xFF)
12:
13: const int kMaskToAllowedStatus[8] = {1, 1, 1, 0, 1, 0, 0, 0};
14: const Byte kMaskToBitNumber[8] = {0, 1, 2, 2, 3, 3, 3, 3};
15:
16: /*
17: void x86_Convert_Init(UInt32 *prevMask, UInt32 *prevPos)
18: {
19: *prevMask = 0;
20: *prevPos = (UInt32)(-5);
21: }
22: */
23:
24: UInt32 x86_Convert(Byte *buffer, UInt32 endPos, UInt32 nowPos,
25: UInt32 *prevMask, UInt32 *prevPos, int encoding)
26: {
27: UInt32 bufferPos = 0;
28: UInt32 limit;
29:
30: if (endPos < 5)
31: return 0;
32:
33: if (nowPos - *prevPos > 5)
34: *prevPos = nowPos - 5;
35:
36: limit = endPos - 5;
37: while(bufferPos <= limit)
38: {
39: Byte b = buffer[bufferPos];
40: UInt32 offset;
41: if (b != 0xE8 && b != 0xE9)
42: {
43: bufferPos++;
44: continue;
45: }
46: offset = (nowPos + bufferPos - *prevPos);
47: *prevPos = (nowPos + bufferPos);
48: if (offset > 5)
49: *prevMask = 0;
50: else
51: {
52: UInt32 i;
53: for (i = 0; i < offset; i++)
54: {
55: *prevMask &= 0x77;
56: *prevMask <<= 1;
57: }
58: }
59: b = buffer[bufferPos + 4];
60: if (Test86MSByte(b) && kMaskToAllowedStatus[(*prevMask >> 1) & 0x7] &&
61: (*prevMask >> 1) < 0x10)
62: {
63: UInt32 src =
64: ((UInt32)(b) << 24) |
65: ((UInt32)(buffer[bufferPos + 3]) << 16) |
66: ((UInt32)(buffer[bufferPos + 2]) << 8) |
67: (buffer[bufferPos + 1]);
68:
69: UInt32 dest;
70: while(1)
71: {
72: UInt32 index;
73: if (encoding)
74: dest = (nowPos + bufferPos + 5) + src;
75: else
76: dest = src - (nowPos + bufferPos + 5);
77: if (*prevMask == 0)
78: break;
79: index = kMaskToBitNumber[*prevMask >> 1];
80: b = (Byte)(dest >> (24 - index * 8));
81: if (!Test86MSByte(b))
82: break;
83: src = dest ^ ((1 << (32 - index * 8)) - 1);
84: }
85: buffer[bufferPos + 4] = (Byte)(~(((dest >> 24) & 1) - 1));
86: buffer[bufferPos + 3] = (Byte)(dest >> 16);
87: buffer[bufferPos + 2] = (Byte)(dest >> 8);
88: buffer[bufferPos + 1] = (Byte)dest;
89: bufferPos += 5;
90: *prevMask = 0;
91: }
92: else
93: {
94: bufferPos++;
95: *prevMask |= 1;
96: if (Test86MSByte(b))
97: *prevMask |= 0x10;
98: }
99: }
100: return bufferPos;
101: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>