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