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