/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 | 12.1M | #define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0) |
9 | | |
10 | | SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding) |
11 | 21.4k | { |
12 | 21.4k | SizeT pos = 0; |
13 | 21.4k | UInt32 mask = *state & 7; |
14 | 21.4k | if (size < 5) |
15 | 5.40k | return 0; |
16 | 16.0k | size -= 4; |
17 | 16.0k | ip += 5; |
18 | | |
19 | 16.0k | for (;;) |
20 | 20.6M | { |
21 | 20.6M | Byte *p = data + pos; |
22 | 20.6M | const Byte *limit = data + size; |
23 | 247M | for (; p < limit; p++) |
24 | 247M | if ((*p & 0xFE) == 0xE8) |
25 | 20.6M | break; |
26 | | |
27 | 20.6M | { |
28 | 20.6M | SizeT d = (SizeT)(p - data - pos); |
29 | 20.6M | pos = (SizeT)(p - data); |
30 | 20.6M | if (p >= limit) |
31 | 16.0k | { |
32 | 16.0k | *state = (d > 2 ? 0 : mask >> (unsigned)d); |
33 | 16.0k | return pos; |
34 | 16.0k | } |
35 | 20.6M | if (d > 2) |
36 | 2.73M | mask = 0; |
37 | 17.9M | else |
38 | 17.9M | { |
39 | 17.9M | mask >>= (unsigned)d; |
40 | 17.9M | if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1) + 1]))) |
41 | 11.5M | { |
42 | 11.5M | mask = (mask >> 1) | 4; |
43 | 11.5M | pos++; |
44 | 11.5M | continue; |
45 | 11.5M | } |
46 | 17.9M | } |
47 | 20.6M | } |
48 | | |
49 | 9.13M | if (Test86MSByte(p[4])) |
50 | 5.42M | { |
51 | 5.42M | UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); |
52 | 5.42M | UInt32 cur = ip + (UInt32)pos; |
53 | 5.42M | pos += 5; |
54 | 5.42M | if (encoding) |
55 | 2.70M | v += cur; |
56 | 2.71M | else |
57 | 2.71M | v -= cur; |
58 | 5.42M | if (mask != 0) |
59 | 912k | { |
60 | 912k | unsigned sh = (mask & 6) << 2; |
61 | 912k | if (Test86MSByte((Byte)(v >> sh))) |
62 | 17.4k | { |
63 | 17.4k | v ^= (((UInt32)0x100 << sh) - 1); |
64 | 17.4k | if (encoding) |
65 | 8.57k | v += cur; |
66 | 8.84k | else |
67 | 8.84k | v -= cur; |
68 | 17.4k | } |
69 | 912k | mask = 0; |
70 | 912k | } |
71 | 5.42M | p[1] = (Byte)v; |
72 | 5.42M | p[2] = (Byte)(v >> 8); |
73 | 5.42M | p[3] = (Byte)(v >> 16); |
74 | 5.42M | p[4] = (Byte)(0 - ((v >> 24) & 1)); |
75 | 5.42M | } |
76 | 3.70M | else |
77 | 3.70M | { |
78 | 3.70M | mask = (mask >> 1) | 4; |
79 | 3.70M | pos++; |
80 | 3.70M | } |
81 | 9.13M | } |
82 | 16.0k | } |