obligatory forgotten android fixup
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / src / BraIA64.c
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