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