Merge pull request #461 from negativeExponent/libchdr
[pcsx_rearmed.git] / deps / lzma-16.04 / C / Bra.c
1 /* Bra.c -- Converters for RISC code\r
2 2010-04-16 : Igor Pavlov : Public domain */\r
3 \r
4 #include "Precomp.h"\r
5 \r
6 #include "Bra.h"\r
7 \r
8 SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
9 {\r
10   SizeT i;\r
11   if (size < 4)\r
12     return 0;\r
13   size -= 4;\r
14   ip += 8;\r
15   for (i = 0; i <= size; i += 4)\r
16   {\r
17     if (data[i + 3] == 0xEB)\r
18     {\r
19       UInt32 dest;\r
20       UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]);\r
21       src <<= 2;\r
22       if (encoding)\r
23         dest = ip + (UInt32)i + src;\r
24       else\r
25         dest = src - (ip + (UInt32)i);\r
26       dest >>= 2;\r
27       data[i + 2] = (Byte)(dest >> 16);\r
28       data[i + 1] = (Byte)(dest >> 8);\r
29       data[i + 0] = (Byte)dest;\r
30     }\r
31   }\r
32   return i;\r
33 }\r
34 \r
35 SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
36 {\r
37   SizeT i;\r
38   if (size < 4)\r
39     return 0;\r
40   size -= 4;\r
41   ip += 4;\r
42   for (i = 0; i <= size; i += 2)\r
43   {\r
44     if ((data[i + 1] & 0xF8) == 0xF0 &&\r
45         (data[i + 3] & 0xF8) == 0xF8)\r
46     {\r
47       UInt32 dest;\r
48       UInt32 src =\r
49         (((UInt32)data[i + 1] & 0x7) << 19) |\r
50         ((UInt32)data[i + 0] << 11) |\r
51         (((UInt32)data[i + 3] & 0x7) << 8) |\r
52         (data[i + 2]);\r
53       \r
54       src <<= 1;\r
55       if (encoding)\r
56         dest = ip + (UInt32)i + src;\r
57       else\r
58         dest = src - (ip + (UInt32)i);\r
59       dest >>= 1;\r
60       \r
61       data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7));\r
62       data[i + 0] = (Byte)(dest >> 11);\r
63       data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7));\r
64       data[i + 2] = (Byte)dest;\r
65       i += 2;\r
66     }\r
67   }\r
68   return i;\r
69 }\r
70 \r
71 SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
72 {\r
73   SizeT i;\r
74   if (size < 4)\r
75     return 0;\r
76   size -= 4;\r
77   for (i = 0; i <= size; i += 4)\r
78   {\r
79     if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1)\r
80     {\r
81       UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) |\r
82         ((UInt32)data[i + 1] << 16) |\r
83         ((UInt32)data[i + 2] << 8) |\r
84         ((UInt32)data[i + 3] & (~3));\r
85       \r
86       UInt32 dest;\r
87       if (encoding)\r
88         dest = ip + (UInt32)i + src;\r
89       else\r
90         dest = src - (ip + (UInt32)i);\r
91       data[i + 0] = (Byte)(0x48 | ((dest >> 24) &  0x3));\r
92       data[i + 1] = (Byte)(dest >> 16);\r
93       data[i + 2] = (Byte)(dest >> 8);\r
94       data[i + 3] &= 0x3;\r
95       data[i + 3] |= dest;\r
96     }\r
97   }\r
98   return i;\r
99 }\r
100 \r
101 SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
102 {\r
103   UInt32 i;\r
104   if (size < 4)\r
105     return 0;\r
106   size -= 4;\r
107   for (i = 0; i <= size; i += 4)\r
108   {\r
109     if ((data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00) ||\r
110         (data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0))\r
111     {\r
112       UInt32 src =\r
113         ((UInt32)data[i + 0] << 24) |\r
114         ((UInt32)data[i + 1] << 16) |\r
115         ((UInt32)data[i + 2] << 8) |\r
116         ((UInt32)data[i + 3]);\r
117       UInt32 dest;\r
118       \r
119       src <<= 2;\r
120       if (encoding)\r
121         dest = ip + i + src;\r
122       else\r
123         dest = src - (ip + i);\r
124       dest >>= 2;\r
125       \r
126       dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000;\r
127 \r
128       data[i + 0] = (Byte)(dest >> 24);\r
129       data[i + 1] = (Byte)(dest >> 16);\r
130       data[i + 2] = (Byte)(dest >> 8);\r
131       data[i + 3] = (Byte)dest;\r
132     }\r
133   }\r
134   return i;\r
135 }\r