OLD | NEW |
1 /* 7zCrcOpt.c -- CRC32 calculation : optimized version | 1 /* 7zCrcOpt.c -- CRC32 calculation |
2 2009-11-23 : Igor Pavlov : Public domain */ | 2 2015-03-01 : Igor Pavlov : Public domain */ |
3 | 3 |
| 4 #include "Precomp.h" |
| 5 |
4 #include "CpuArch.h" | 6 #include "CpuArch.h" |
5 | 7 |
6 #ifdef MY_CPU_LE | 8 #ifndef MY_CPU_BE |
7 | 9 |
8 #define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) | 10 #define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) |
9 | 11 |
10 UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const U
Int32 *table) | 12 UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const U
Int32 *table) |
11 { | 13 { |
12 const Byte *p = (const Byte *)data; | 14 const Byte *p = (const Byte *)data; |
13 for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) | 15 for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) |
14 v = CRC_UPDATE_BYTE_2(v, *p); | 16 v = CRC_UPDATE_BYTE_2(v, *p); |
15 for (; size >= 4; size -= 4, p += 4) | 17 for (; size >= 4; size -= 4, p += 4) |
16 { | 18 { |
17 v ^= *(const UInt32 *)p; | 19 v ^= *(const UInt32 *)p; |
18 v = | 20 v = |
19 table[0x300 + (v & 0xFF)] ^ | 21 table[0x300 + ((v ) & 0xFF)] |
20 table[0x200 + ((v >> 8) & 0xFF)] ^ | 22 ^ table[0x200 + ((v >> 8) & 0xFF)] |
21 table[0x100 + ((v >> 16) & 0xFF)] ^ | 23 ^ table[0x100 + ((v >> 16) & 0xFF)] |
22 table[0x000 + ((v >> 24))]; | 24 ^ table[0x000 + ((v >> 24))]; |
23 } | 25 } |
24 for (; size > 0; size--, p++) | 26 for (; size > 0; size--, p++) |
25 v = CRC_UPDATE_BYTE_2(v, *p); | 27 v = CRC_UPDATE_BYTE_2(v, *p); |
26 return v; | 28 return v; |
27 } | 29 } |
28 | 30 |
29 UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const U
Int32 *table) | 31 UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const U
Int32 *table) |
30 { | 32 { |
31 return CrcUpdateT4(v, data, size, table); | 33 const Byte *p = (const Byte *)data; |
| 34 for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) |
| 35 v = CRC_UPDATE_BYTE_2(v, *p); |
| 36 for (; size >= 8; size -= 8, p += 8) |
| 37 { |
| 38 UInt32 d; |
| 39 v ^= *(const UInt32 *)p; |
| 40 v = |
| 41 table[0x700 + ((v ) & 0xFF)] |
| 42 ^ table[0x600 + ((v >> 8) & 0xFF)] |
| 43 ^ table[0x500 + ((v >> 16) & 0xFF)] |
| 44 ^ table[0x400 + ((v >> 24))]; |
| 45 d = *((const UInt32 *)p + 1); |
| 46 v ^= |
| 47 table[0x300 + ((d ) & 0xFF)] |
| 48 ^ table[0x200 + ((d >> 8) & 0xFF)] |
| 49 ^ table[0x100 + ((d >> 16) & 0xFF)] |
| 50 ^ table[0x000 + ((d >> 24))]; |
| 51 } |
| 52 for (; size > 0; size--, p++) |
| 53 v = CRC_UPDATE_BYTE_2(v, *p); |
| 54 return v; |
32 } | 55 } |
33 | 56 |
34 #endif | 57 #endif |
| 58 |
| 59 |
| 60 #ifndef MY_CPU_LE |
| 61 |
| 62 #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF00
00) | (v << 24)) |
| 63 |
| 64 #define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8
)) |
| 65 |
| 66 UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, co
nst UInt32 *table) |
| 67 { |
| 68 const Byte *p = (const Byte *)data; |
| 69 table += 0x100; |
| 70 v = CRC_UINT32_SWAP(v); |
| 71 for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) |
| 72 v = CRC_UPDATE_BYTE_2_BE(v, *p); |
| 73 for (; size >= 4; size -= 4, p += 4) |
| 74 { |
| 75 v ^= *(const UInt32 *)p; |
| 76 v = |
| 77 table[0x000 + ((v ) & 0xFF)] |
| 78 ^ table[0x100 + ((v >> 8) & 0xFF)] |
| 79 ^ table[0x200 + ((v >> 16) & 0xFF)] |
| 80 ^ table[0x300 + ((v >> 24))]; |
| 81 } |
| 82 for (; size > 0; size--, p++) |
| 83 v = CRC_UPDATE_BYTE_2_BE(v, *p); |
| 84 return CRC_UINT32_SWAP(v); |
| 85 } |
| 86 |
| 87 UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, co
nst UInt32 *table) |
| 88 { |
| 89 const Byte *p = (const Byte *)data; |
| 90 table += 0x100; |
| 91 v = CRC_UINT32_SWAP(v); |
| 92 for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) |
| 93 v = CRC_UPDATE_BYTE_2_BE(v, *p); |
| 94 for (; size >= 8; size -= 8, p += 8) |
| 95 { |
| 96 UInt32 d; |
| 97 v ^= *(const UInt32 *)p; |
| 98 v = |
| 99 table[0x400 + ((v ) & 0xFF)] |
| 100 ^ table[0x500 + ((v >> 8) & 0xFF)] |
| 101 ^ table[0x600 + ((v >> 16) & 0xFF)] |
| 102 ^ table[0x700 + ((v >> 24))]; |
| 103 d = *((const UInt32 *)p + 1); |
| 104 v ^= |
| 105 table[0x000 + ((d ) & 0xFF)] |
| 106 ^ table[0x100 + ((d >> 8) & 0xFF)] |
| 107 ^ table[0x200 + ((d >> 16) & 0xFF)] |
| 108 ^ table[0x300 + ((d >> 24))]; |
| 109 } |
| 110 for (; size > 0; size--, p++) |
| 111 v = CRC_UPDATE_BYTE_2_BE(v, *p); |
| 112 return CRC_UINT32_SWAP(v); |
| 113 } |
| 114 |
| 115 #endif |
OLD | NEW |