attempt to fix build
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / src / Bra.c
CommitLineData
9e052883 1/* Bra.c -- Converters for RISC code\r
22021-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
9SizeT 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
64SizeT 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
151SizeT 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
185SizeT 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