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