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