Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/Branch/BranchIA64.c, revision 1.1.1.1
1.1 misho 1: // BranchIA64.c
2:
3: #include "BranchIA64.h"
4:
5: const Byte kBranchTable[32] =
6: {
7: 0, 0, 0, 0, 0, 0, 0, 0,
8: 0, 0, 0, 0, 0, 0, 0, 0,
9: 4, 4, 6, 6, 0, 0, 7, 7,
10: 4, 4, 0, 0, 4, 4, 0, 0
11: };
12:
13: UInt32 IA64_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding)
14: {
15: UInt32 i;
16: for (i = 0; i + 16 <= size; i += 16)
17: {
18: UInt32 instrTemplate = data[i] & 0x1F;
19: UInt32 mask = kBranchTable[instrTemplate];
20: UInt32 bitPos = 5;
21: for (int slot = 0; slot < 3; slot++, bitPos += 41)
22: {
23: if (((mask >> slot) & 1) == 0)
24: continue;
25: UInt32 bytePos = (bitPos >> 3);
26: UInt32 bitRes = bitPos & 0x7;
27: // UInt64 instruction = *(UInt64 *)(data + i + bytePos);
28: UInt64 instruction = 0;
29: int j;
30: for (j = 0; j < 6; j++)
31: instruction += (UInt64)(data[i + j + bytePos]) << (8 * j);
32:
33: UInt64 instNorm = instruction >> bitRes;
34: if (((instNorm >> 37) & 0xF) == 0x5
35: && ((instNorm >> 9) & 0x7) == 0
36: // && (instNorm & 0x3F)== 0
37: )
38: {
39: UInt32 src = UInt32((instNorm >> 13) & 0xFFFFF);
40: src |= ((instNorm >> 36) & 1) << 20;
41:
42: src <<= 4;
43:
44: UInt32 dest;
45: if (encoding)
46: dest = nowPos + i + src;
47: else
48: dest = src - (nowPos + i);
49:
50: dest >>= 4;
51:
52: instNorm &= ~(UInt64(0x8FFFFF) << 13);
53: instNorm |= (UInt64(dest & 0xFFFFF) << 13);
54: instNorm |= (UInt64(dest & 0x100000) << (36 - 20));
55:
56: instruction &= (1 << bitRes) - 1;
57: instruction |= (instNorm << bitRes);
58: // *(UInt64 *)(data + i + bytePos) = instruction;
59: for (j = 0; j < 6; j++)
60: data[i + j + bytePos] = Byte(instruction >> (8 * j));
61: }
62: }
63: }
64: return i;
65: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>