/src/lzma-fuzz/sdk/C/7zCrcOpt.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* 7zCrcOpt.c -- CRC32 calculation |
2 | | 2017-04-03 : Igor Pavlov : Public domain */ |
3 | | |
4 | | #include "Precomp.h" |
5 | | |
6 | | #include "CpuArch.h" |
7 | | |
8 | | #ifndef MY_CPU_BE |
9 | | |
10 | 31.6k | #define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) |
11 | | |
12 | | UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table) |
13 | 0 | { |
14 | 0 | const Byte *p = (const Byte *)data; |
15 | 0 | for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) |
16 | 0 | v = CRC_UPDATE_BYTE_2(v, *p); |
17 | 0 | for (; size >= 4; size -= 4, p += 4) |
18 | 0 | { |
19 | 0 | v ^= *(const UInt32 *)p; |
20 | 0 | v = |
21 | 0 | (table + 0x300)[((v ) & 0xFF)] |
22 | 0 | ^ (table + 0x200)[((v >> 8) & 0xFF)] |
23 | 0 | ^ (table + 0x100)[((v >> 16) & 0xFF)] |
24 | 0 | ^ (table + 0x000)[((v >> 24))]; |
25 | 0 | } |
26 | 0 | for (; size > 0; size--, p++) |
27 | 0 | v = CRC_UPDATE_BYTE_2(v, *p); |
28 | 0 | return v; |
29 | 0 | } |
30 | | |
31 | | UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table) |
32 | 10.8k | { |
33 | 10.8k | const Byte *p = (const Byte *)data; |
34 | 34.8k | for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) |
35 | 23.9k | v = CRC_UPDATE_BYTE_2(v, *p); |
36 | 104k | for (; size >= 8; size -= 8, p += 8) |
37 | 93.4k | { |
38 | 93.4k | UInt32 d; |
39 | 93.4k | v ^= *(const UInt32 *)p; |
40 | 93.4k | v = |
41 | 93.4k | (table + 0x700)[((v ) & 0xFF)] |
42 | 93.4k | ^ (table + 0x600)[((v >> 8) & 0xFF)] |
43 | 93.4k | ^ (table + 0x500)[((v >> 16) & 0xFF)] |
44 | 93.4k | ^ (table + 0x400)[((v >> 24))]; |
45 | 93.4k | d = *((const UInt32 *)p + 1); |
46 | 93.4k | v ^= |
47 | 93.4k | (table + 0x300)[((d ) & 0xFF)] |
48 | 93.4k | ^ (table + 0x200)[((d >> 8) & 0xFF)] |
49 | 93.4k | ^ (table + 0x100)[((d >> 16) & 0xFF)] |
50 | 93.4k | ^ (table + 0x000)[((d >> 24))]; |
51 | 93.4k | } |
52 | 18.6k | for (; size > 0; size--, p++) |
53 | 7.74k | v = CRC_UPDATE_BYTE_2(v, *p); |
54 | 10.8k | return v; |
55 | 10.8k | } |
56 | | |
57 | | #endif |
58 | | |
59 | | |
60 | | #ifndef MY_CPU_LE |
61 | | |
62 | | #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (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, const 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, const 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 |