obligatory forgotten android fixup
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / src / Bra.c
1 /* Bra.c -- Converters for RISC code\r
2 2021-02-09 : 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 ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
10 {\r
11   Byte *p;\r
12   const Byte *lim;\r
13   size &= ~(size_t)3;\r
14   ip += 4;\r
15   p = data;\r
16   lim = data + size;\r
17 \r
18   if (encoding)\r
19 \r
20   for (;;)\r
21   {\r
22     for (;;)\r
23     {\r
24       if (p >= lim)\r
25         return (SizeT)(p - data);\r
26       p += 4;\r
27       if (p[-1] == 0xEB)\r
28         break;\r
29     }\r
30     {\r
31       UInt32 v = GetUi32(p - 4);\r
32       v <<= 2;\r
33         v += ip + (UInt32)(p - data);\r
34       v >>= 2;\r
35       v &= 0x00FFFFFF;\r
36       v |= 0xEB000000;\r
37       SetUi32(p - 4, v);\r
38     }\r
39   }\r
40 \r
41   for (;;)\r
42   {\r
43     for (;;)\r
44     {\r
45       if (p >= lim)\r
46         return (SizeT)(p - data);\r
47       p += 4;\r
48       if (p[-1] == 0xEB)\r
49         break;\r
50     }\r
51     {\r
52       UInt32 v = GetUi32(p - 4);\r
53       v <<= 2;\r
54         v -= ip + (UInt32)(p - data);\r
55       v >>= 2;\r
56       v &= 0x00FFFFFF;\r
57       v |= 0xEB000000;\r
58       SetUi32(p - 4, v);\r
59     }\r
60   }\r
61 }\r
62 \r
63 \r
64 SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
65 {\r
66   Byte *p;\r
67   const Byte *lim;\r
68   size &= ~(size_t)1;\r
69   p = data;\r
70   lim = data + size - 4;\r
71 \r
72   if (encoding)\r
73   \r
74   for (;;)\r
75   {\r
76     UInt32 b1;\r
77     for (;;)\r
78     {\r
79       UInt32 b3;\r
80       if (p > lim)\r
81         return (SizeT)(p - data);\r
82       b1 = p[1];\r
83       b3 = p[3];\r
84       p += 2;\r
85       b1 ^= 8;\r
86       if ((b3 & b1) >= 0xF8)\r
87         break;\r
88     }\r
89     {\r
90       UInt32 v =\r
91              ((UInt32)b1 << 19)\r
92           + (((UInt32)p[1] & 0x7) << 8)\r
93           + (((UInt32)p[-2] << 11))\r
94           + (p[0]);\r
95 \r
96       p += 2;\r
97       {\r
98         UInt32 cur = (ip + (UInt32)(p - data)) >> 1;\r
99           v += cur;\r
100       }\r
101 \r
102       p[-4] = (Byte)(v >> 11);\r
103       p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));\r
104       p[-2] = (Byte)v;\r
105       p[-1] = (Byte)(0xF8 | (v >> 8));\r
106     }\r
107   }\r
108   \r
109   for (;;)\r
110   {\r
111     UInt32 b1;\r
112     for (;;)\r
113     {\r
114       UInt32 b3;\r
115       if (p > lim)\r
116         return (SizeT)(p - data);\r
117       b1 = p[1];\r
118       b3 = p[3];\r
119       p += 2;\r
120       b1 ^= 8;\r
121       if ((b3 & b1) >= 0xF8)\r
122         break;\r
123     }\r
124     {\r
125       UInt32 v =\r
126              ((UInt32)b1 << 19)\r
127           + (((UInt32)p[1] & 0x7) << 8)\r
128           + (((UInt32)p[-2] << 11))\r
129           + (p[0]);\r
130 \r
131       p += 2;\r
132       {\r
133         UInt32 cur = (ip + (UInt32)(p - data)) >> 1;\r
134           v -= cur;\r
135       }\r
136 \r
137       /*\r
138       SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000));\r
139       SetUi16(p - 2, (UInt16)(v | 0xF800));\r
140       */\r
141       \r
142       p[-4] = (Byte)(v >> 11);\r
143       p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));\r
144       p[-2] = (Byte)v;\r
145       p[-1] = (Byte)(0xF8 | (v >> 8));\r
146     }\r
147   }\r
148 }\r
149 \r
150 \r
151 SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
152 {\r
153   Byte *p;\r
154   const Byte *lim;\r
155   size &= ~(size_t)3;\r
156   ip -= 4;\r
157   p = data;\r
158   lim = data + size;\r
159 \r
160   for (;;)\r
161   {\r
162     for (;;)\r
163     {\r
164       if (p >= lim)\r
165         return (SizeT)(p - data);\r
166       p += 4;\r
167       /* if ((v & 0xFC000003) == 0x48000001) */\r
168       if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1)\r
169         break;\r
170     }\r
171     {\r
172       UInt32 v = GetBe32(p - 4);\r
173       if (encoding)\r
174         v += ip + (UInt32)(p - data);\r
175       else\r
176         v -= ip + (UInt32)(p - data);\r
177       v &= 0x03FFFFFF;\r
178       v |= 0x48000000;\r
179       SetBe32(p - 4, v);\r
180     }\r
181   }\r
182 }\r
183 \r
184 \r
185 SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
186 {\r
187   Byte *p;\r
188   const Byte *lim;\r
189   size &= ~(size_t)3;\r
190   ip -= 4;\r
191   p = data;\r
192   lim = data + size;\r
193 \r
194   for (;;)\r
195   {\r
196     for (;;)\r
197     {\r
198       if (p >= lim)\r
199         return (SizeT)(p - data);\r
200       /*\r
201       v = GetBe32(p);\r
202       p += 4;\r
203       m = v + ((UInt32)5 << 29);\r
204       m ^= (UInt32)7 << 29;\r
205       m += (UInt32)1 << 22;\r
206       if ((m & ((UInt32)0x1FF << 23)) == 0)\r
207         break;\r
208       */\r
209       p += 4;\r
210       if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) ||\r
211           (p[-4] == 0x7F && (p[-3] >= 0xC0)))\r
212         break;\r
213     }\r
214     {\r
215       UInt32 v = GetBe32(p - 4);\r
216       v <<= 2;\r
217       if (encoding)\r
218         v += ip + (UInt32)(p - data);\r
219       else\r
220         v -= ip + (UInt32)(p - data);\r
221       \r
222       v &= 0x01FFFFFF;\r
223       v -= (UInt32)1 << 24;\r
224       v ^= 0xFF000000;\r
225       v >>= 2;\r
226       v |= 0x40000000;\r
227       SetBe32(p - 4, v);\r
228     }\r
229   }\r
230 }\r