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