/src/lzma-fuzz/sdk/C/BraIA64.c
Line | Count | Source |
1 | | /* BraIA64.c -- Converter for IA-64 code |
2 | | 2017-01-26 : Igor Pavlov : Public domain */ |
3 | | |
4 | | #include "Precomp.h" |
5 | | |
6 | | #include "CpuArch.h" |
7 | | #include "Bra.h" |
8 | | |
9 | | SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) |
10 | 8.71k | { |
11 | 8.71k | SizeT i; |
12 | 8.71k | if (size < 16) |
13 | 2.50k | return 0; |
14 | 6.20k | size -= 16; |
15 | 6.20k | i = 0; |
16 | 6.20k | do |
17 | 9.03M | { |
18 | 9.03M | unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3; |
19 | 9.03M | if (m) |
20 | 2.33M | { |
21 | 2.33M | m++; |
22 | 2.33M | do |
23 | 4.45M | { |
24 | 4.45M | Byte *p = data + (i + (size_t)m * 5 - 8); |
25 | 4.45M | if (((p[3] >> m) & 15) == 5 |
26 | 4.45M | && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0) |
27 | 70.6k | { |
28 | 70.6k | unsigned raw = GetUi32(p); |
29 | 70.6k | unsigned v = raw >> m; |
30 | 70.6k | v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3); |
31 | | |
32 | 70.6k | v <<= 4; |
33 | 70.6k | if (encoding) |
34 | 34.8k | v += ip + (UInt32)i; |
35 | 35.8k | else |
36 | 35.8k | v -= ip + (UInt32)i; |
37 | 70.6k | v >>= 4; |
38 | | |
39 | 70.6k | v &= 0x1FFFFF; |
40 | 70.6k | v += 0x700000; |
41 | 70.6k | v &= 0x8FFFFF; |
42 | 70.6k | raw &= ~((UInt32)0x8FFFFF << m); |
43 | 70.6k | raw |= (v << m); |
44 | 70.6k | SetUi32(p, raw); |
45 | 70.6k | } |
46 | 4.45M | } |
47 | 4.45M | while (++m <= 4); |
48 | 2.33M | } |
49 | 9.03M | i += 16; |
50 | 9.03M | } |
51 | 9.03M | while (i <= size); |
52 | 6.20k | return i; |
53 | 8.71k | } |