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>