9e052883 |
1 | /* BraIA64.c -- Converter for IA-64 code\r |
2 | 2017-01-26 : Igor Pavlov : Public domain */\r |
3 | \r |
4 | #include "Precomp.h"\r |
5 | \r |
6 | #include "CpuArch.h"\r |
7 | #include "Bra.h"\r |
8 | \r |
9 | SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r |
10 | {\r |
11 | SizeT i;\r |
12 | if (size < 16)\r |
13 | return 0;\r |
14 | size -= 16;\r |
15 | i = 0;\r |
16 | do\r |
17 | {\r |
18 | unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3;\r |
19 | if (m)\r |
20 | {\r |
21 | m++;\r |
22 | do\r |
23 | {\r |
24 | Byte *p = data + (i + (size_t)m * 5 - 8);\r |
25 | if (((p[3] >> m) & 15) == 5\r |
26 | && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0)\r |
27 | {\r |
28 | unsigned raw = GetUi32(p);\r |
29 | unsigned v = raw >> m;\r |
30 | v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3);\r |
31 | \r |
32 | v <<= 4;\r |
33 | if (encoding)\r |
34 | v += ip + (UInt32)i;\r |
35 | else\r |
36 | v -= ip + (UInt32)i;\r |
37 | v >>= 4;\r |
38 | \r |
39 | v &= 0x1FFFFF;\r |
40 | v += 0x700000;\r |
41 | v &= 0x8FFFFF;\r |
42 | raw &= ~((UInt32)0x8FFFFF << m);\r |
43 | raw |= (v << m);\r |
44 | SetUi32(p, raw);\r |
45 | }\r |
46 | }\r |
47 | while (++m <= 4);\r |
48 | }\r |
49 | i += 16;\r |
50 | }\r |
51 | while (i <= size);\r |
52 | return i;\r |
53 | }\r |