12
12
13
13
#include < cstddef>
14
14
#include < cstdint>
15
+ #include < cstring>
15
16
16
17
#include " ./crc32c_internal.h"
17
18
#ifdef CRC32C_HAVE_CONFIG_H
29
30
// compute 8bytes for each segment parallelly
30
31
#define CRC32C32BYTES (P, IND ) \
31
32
do { \
32
- crc1 = __crc32cd ( \
33
- crc1, *(( const uint64_t *)(P) + (SEGMENTBYTES / 8 ) * 1 + (IND))); \
34
- crc2 = __crc32cd ( \
35
- crc2, *(( const uint64_t *)(P) + (SEGMENTBYTES / 8 ) * 2 + (IND))); \
36
- crc3 = __crc32cd ( \
37
- crc3, *(( const uint64_t *)(P) + (SEGMENTBYTES / 8 ) * 3 + (IND))); \
38
- crc0 = __crc32cd ( \
39
- crc0, *(( const uint64_t *)(P) + (SEGMENTBYTES / 8 ) * 0 + (IND))); \
33
+ std::memcpy (&d64, (P) + SEGMENTBYTES * 1 + (IND) * 8 , sizeof (d64)); \
34
+ crc1 = __crc32cd ( crc1, d64); \
35
+ std::memcpy (&d64, (P) + SEGMENTBYTES * 2 + (IND) * 8 , sizeof (d64)); \
36
+ crc2 = __crc32cd ( crc2, d64); \
37
+ std::memcpy (&d64, (P) + SEGMENTBYTES * 3 + (IND) * 8 , sizeof (d64)); \
38
+ crc3 = __crc32cd ( crc3, d64); \
39
+ std::memcpy (&d64, (P) + SEGMENTBYTES * 0 + (IND) * 8 , sizeof (d64)); \
40
+ crc0 = __crc32cd ( crc0, d64); \
40
41
} while (0 );
41
42
42
43
// compute 8*8 bytes for each segment parallelly
@@ -68,6 +69,9 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
68
69
int64_t length = size;
69
70
uint32_t crc0, crc1, crc2, crc3;
70
71
uint64_t t0, t1, t2;
72
+ uint16_t d16;
73
+ uint32_t d32;
74
+ uint64_t d64;
71
75
72
76
// k0=CRC(x^(3*SEGMENTBYTES*8)), k1=CRC(x^(2*SEGMENTBYTES*8)),
73
77
// k2=CRC(x^(SEGMENTBYTES*8))
@@ -88,7 +92,8 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
88
92
t2 = (uint64_t )vmull_p64 (crc2, k2);
89
93
t1 = (uint64_t )vmull_p64 (crc1, k1);
90
94
t0 = (uint64_t )vmull_p64 (crc0, k0);
91
- crc = __crc32cd (crc3, *(uint64_t *)data);
95
+ std::memcpy (&d64, data, sizeof (d64));
96
+ crc = __crc32cd (crc3, d64);
92
97
data += sizeof (uint64_t );
93
98
crc ^= __crc32cd (0 , t2);
94
99
crc ^= __crc32cd (0 , t1);
@@ -98,18 +103,21 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
98
103
}
99
104
100
105
while (length >= 8 ) {
101
- crc = __crc32cd (crc, *(uint64_t *)data);
106
+ std::memcpy (&d64, data, sizeof (d64));
107
+ crc = __crc32cd (crc, d64);
102
108
data += 8 ;
103
109
length -= 8 ;
104
110
}
105
111
106
112
if (length & 4 ) {
107
- crc = __crc32cw (crc, *(uint32_t *)data);
113
+ std::memcpy (&d32, data, sizeof (d32));
114
+ crc = __crc32cw (crc, d32);
108
115
data += 4 ;
109
116
}
110
117
111
118
if (length & 2 ) {
112
- crc = __crc32ch (crc, *(uint16_t *)data);
119
+ std::memcpy (&d16, data, sizeof (d16));
120
+ crc = __crc32ch (crc, d16);
113
121
data += 2 ;
114
122
}
115
123
0 commit comments