Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/Branch/BranchIA64.c, revision 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>