9e052883 |
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 |