/src/lzma-fuzz/sdk/C/Bra86.c
Line | Count | Source |
1 | | /* Bra86.c -- Converter for x86 code (BCJ) |
2 | | 2017-04-03 : Igor Pavlov : Public domain */ |
3 | | |
4 | | #include "Precomp.h" |
5 | | |
6 | | #include "Bra.h" |
7 | | |
8 | 9.56M | #define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0) |
9 | | |
10 | | SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding) |
11 | 19.0k | { |
12 | 19.0k | SizeT pos = 0; |
13 | 19.0k | UInt32 mask = *state & 7; |
14 | 19.0k | if (size < 5) |
15 | 5.34k | return 0; |
16 | 13.7k | size -= 4; |
17 | 13.7k | ip += 5; |
18 | | |
19 | 13.7k | for (;;) |
20 | 17.0M | { |
21 | 17.0M | Byte *p = data + pos; |
22 | 17.0M | const Byte *limit = data + size; |
23 | 210M | for (; p < limit; p++) |
24 | 210M | if ((*p & 0xFE) == 0xE8) |
25 | 17.0M | break; |
26 | | |
27 | 17.0M | { |
28 | 17.0M | SizeT d = (SizeT)(p - data - pos); |
29 | 17.0M | pos = (SizeT)(p - data); |
30 | 17.0M | if (p >= limit) |
31 | 13.7k | { |
32 | 13.7k | *state = (d > 2 ? 0 : mask >> (unsigned)d); |
33 | 13.7k | return pos; |
34 | 13.7k | } |
35 | 17.0M | if (d > 2) |
36 | 2.27M | mask = 0; |
37 | 14.7M | else |
38 | 14.7M | { |
39 | 14.7M | mask >>= (unsigned)d; |
40 | 14.7M | if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1) + 1]))) |
41 | 9.53M | { |
42 | 9.53M | mask = (mask >> 1) | 4; |
43 | 9.53M | pos++; |
44 | 9.53M | continue; |
45 | 9.53M | } |
46 | 14.7M | } |
47 | 17.0M | } |
48 | | |
49 | 7.52M | if (Test86MSByte(p[4])) |
50 | 4.91M | { |
51 | 4.91M | UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); |
52 | 4.91M | UInt32 cur = ip + (UInt32)pos; |
53 | 4.91M | pos += 5; |
54 | 4.91M | if (encoding) |
55 | 2.45M | v += cur; |
56 | 2.45M | else |
57 | 2.45M | v -= cur; |
58 | 4.91M | if (mask != 0) |
59 | 609k | { |
60 | 609k | unsigned sh = (mask & 6) << 2; |
61 | 609k | if (Test86MSByte((Byte)(v >> sh))) |
62 | 19.4k | { |
63 | 19.4k | v ^= (((UInt32)0x100 << sh) - 1); |
64 | 19.4k | if (encoding) |
65 | 9.54k | v += cur; |
66 | 9.87k | else |
67 | 9.87k | v -= cur; |
68 | 19.4k | } |
69 | 609k | mask = 0; |
70 | 609k | } |
71 | 4.91M | p[1] = (Byte)v; |
72 | 4.91M | p[2] = (Byte)(v >> 8); |
73 | 4.91M | p[3] = (Byte)(v >> 16); |
74 | 4.91M | p[4] = (Byte)(0 - ((v >> 24) & 1)); |
75 | 4.91M | } |
76 | 2.61M | else |
77 | 2.61M | { |
78 | 2.61M | mask = (mask >> 1) | 4; |
79 | 2.61M | pos++; |
80 | 2.61M | } |
81 | 7.52M | } |
82 | 13.7k | } |