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