aboutsummaryrefslogtreecommitdiff
path: root/C/BraIA64.c
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2021-12-27 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2022-03-18 15:35:13 +0500
commitf19f813537c7aea1c20749c914e756b54a9c3cf5 (patch)
tree816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /C/BraIA64.c
parent98e06a519b63b81986abe76d28887f6984a7732b (diff)
download7zip-21.07.tar.gz
7zip-21.07.tar.bz2
7zip-21.07.zip
'21.07'21.07
Diffstat (limited to 'C/BraIA64.c')
-rw-r--r--C/BraIA64.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/C/BraIA64.c b/C/BraIA64.c
new file mode 100644
index 0000000..d1dbc62
--- /dev/null
+++ b/C/BraIA64.c
@@ -0,0 +1,53 @@
1/* BraIA64.c -- Converter for IA-64 code
22017-01-26 : Igor Pavlov : Public domain */
3
4#include "Precomp.h"
5
6#include "CpuArch.h"
7#include "Bra.h"
8
9SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
10{
11 SizeT i;
12 if (size < 16)
13 return 0;
14 size -= 16;
15 i = 0;
16 do
17 {
18 unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3;
19 if (m)
20 {
21 m++;
22 do
23 {
24 Byte *p = data + (i + (size_t)m * 5 - 8);
25 if (((p[3] >> m) & 15) == 5
26 && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0)
27 {
28 unsigned raw = GetUi32(p);
29 unsigned v = raw >> m;
30 v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3);
31
32 v <<= 4;
33 if (encoding)
34 v += ip + (UInt32)i;
35 else
36 v -= ip + (UInt32)i;
37 v >>= 4;
38
39 v &= 0x1FFFFF;
40 v += 0x700000;
41 v &= 0x8FFFFF;
42 raw &= ~((UInt32)0x8FFFFF << m);
43 raw |= (v << m);
44 SetUi32(p, raw);
45 }
46 }
47 while (++m <= 4);
48 }
49 i += 16;
50 }
51 while (i <= size);
52 return i;
53}