Coverage Report

Created: 2025-10-28 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/zlib-ng/arch/generic/crc32_chorba_c.c
Line
Count
Source
1
#include "zbuild.h"
2
#if defined(__EMSCRIPTEN__)
3
#  include "zutil_p.h"
4
#endif
5
#include "crc32_braid_p.h"
6
#include "crc32_braid_tbl.h"
7
#include "generic_functions.h"
8
9
/* Implement Chorba algorithm from https://arxiv.org/abs/2412.16398 */
10
0
#define bitbuffersizebytes (16 * 1024 * sizeof(z_word_t))
11
0
#define bitbuffersizezwords (bitbuffersizebytes / sizeof(z_word_t))
12
0
#define bitbuffersizeqwords (bitbuffersizebytes / sizeof(uint64_t))
13
14
/**
15
 * Implements the Chorba algorithm for CRC32 computation (https://arxiv.org/abs/2412.16398).
16
 *
17
 * This implementation processes data in three phases:
18
 * 1. Initial pass: Zeros out bitbuffer
19
 * 2. Intermediate pass: Processes half the values
20
 * 3. Main pass: Processes remaining data
21
 *
22
 * @param crc Initial CRC value
23
 * @param input Input data buffer
24
 * @param len Length of input data
25
 * @return Computed CRC32 value
26
 *
27
 * @note Requires minimum input size of 118960 + 512 bytes
28
 * @note Uses 128KB temporary buffer
29
 */
30
0
Z_INTERNAL uint32_t crc32_chorba_118960_nondestructive (uint32_t crc, const z_word_t* input, size_t len) {
31
#if defined(__EMSCRIPTEN__)
32
    z_word_t* bitbuffer = (z_word_t*)zng_alloc(bitbuffersizebytes);
33
#else
34
0
    ALIGNED_(16) z_word_t bitbuffer[bitbuffersizezwords];
35
0
#endif
36
0
    const uint8_t* bitbufferbytes = (const uint8_t*) bitbuffer;
37
0
    uint64_t* bitbufferqwords = (uint64_t*) bitbuffer;
38
0
    uint64_t* inputqwords = (uint64_t*) input;
39
40
0
    size_t i = 0;
41
42
0
#if BYTE_ORDER == LITTLE_ENDIAN
43
0
    z_word_t next1 = crc;
44
#else
45
    z_word_t next1 = ZSWAPWORD(crc);
46
#endif
47
48
0
    z_word_t next2 = 0;
49
0
    z_word_t next3 = 0;
50
0
    z_word_t next4 = 0;
51
0
    z_word_t next5 = 0;
52
0
    z_word_t next6 = 0;
53
0
    z_word_t next7 = 0;
54
0
    z_word_t next8 = 0;
55
0
    z_word_t next9 = 0;
56
0
    z_word_t next10 = 0;
57
0
    z_word_t next11 = 0;
58
0
    z_word_t next12 = 0;
59
0
    z_word_t next13 = 0;
60
0
    z_word_t next14 = 0;
61
0
    z_word_t next15 = 0;
62
0
    z_word_t next16 = 0;
63
0
    z_word_t next17 = 0;
64
0
    z_word_t next18 = 0;
65
0
    z_word_t next19 = 0;
66
0
    z_word_t next20 = 0;
67
0
    z_word_t next21 = 0;
68
0
    z_word_t next22 = 0;
69
0
    crc = 0;
70
71
    // do a first pass to zero out bitbuffer
72
0
    for(; i < (14848 * sizeof(z_word_t)); i += (32 * sizeof(z_word_t))) {
73
0
        z_word_t in1, in2, in3, in4, in5, in6, in7, in8;
74
0
        z_word_t in9, in10, in11, in12, in13, in14, in15, in16;
75
0
        z_word_t in17, in18, in19, in20, in21, in22, in23, in24;
76
0
        z_word_t in25, in26, in27, in28, in29, in30, in31, in32;
77
0
        int outoffset1 = ((i / sizeof(z_word_t)) + 14848) % bitbuffersizezwords;
78
0
        int outoffset2 = ((i / sizeof(z_word_t)) + 14880) % bitbuffersizezwords;
79
80
0
        in1 = input[i / sizeof(z_word_t) + 0] ^ next1;
81
0
        in2 = input[i / sizeof(z_word_t) + 1] ^ next2;
82
0
        in3 = input[i / sizeof(z_word_t) + 2] ^ next3;
83
0
        in4 = input[i / sizeof(z_word_t) + 3] ^ next4;
84
0
        in5 = input[i / sizeof(z_word_t) + 4] ^ next5;
85
0
        in6 = input[i / sizeof(z_word_t) + 5] ^ next6;
86
0
        in7 = input[i / sizeof(z_word_t) + 6] ^ next7;
87
0
        in8 = input[i / sizeof(z_word_t) + 7] ^ next8 ^ in1;
88
0
        in9 = input[i / sizeof(z_word_t) + 8] ^ next9 ^ in2;
89
0
        in10 = input[i / sizeof(z_word_t) + 9] ^ next10 ^ in3;
90
0
        in11 = input[i / sizeof(z_word_t) + 10] ^ next11 ^ in4;
91
0
        in12 = input[i / sizeof(z_word_t) + 11] ^ next12 ^ in1 ^ in5;
92
0
        in13 = input[i / sizeof(z_word_t) + 12] ^ next13 ^ in2 ^ in6;
93
0
        in14 = input[i / sizeof(z_word_t) + 13] ^ next14 ^ in3 ^ in7;
94
0
        in15 = input[i / sizeof(z_word_t) + 14] ^ next15 ^ in4 ^ in8;
95
0
        in16 = input[i / sizeof(z_word_t) + 15] ^ next16 ^ in5 ^ in9;
96
0
        in17 = input[i / sizeof(z_word_t) + 16] ^ next17 ^ in6 ^ in10;
97
0
        in18 = input[i / sizeof(z_word_t) + 17] ^ next18 ^ in7 ^ in11;
98
0
        in19 = input[i / sizeof(z_word_t) + 18] ^ next19 ^ in8 ^ in12;
99
0
        in20 = input[i / sizeof(z_word_t) + 19] ^ next20 ^ in9 ^ in13;
100
0
        in21 = input[i / sizeof(z_word_t) + 20] ^ next21 ^ in10 ^ in14;
101
0
        in22 = input[i / sizeof(z_word_t) + 21] ^ next22 ^ in11 ^ in15;
102
0
        in23 = input[i / sizeof(z_word_t) + 22] ^ in1 ^ in12 ^ in16;
103
0
        in24 = input[i / sizeof(z_word_t) + 23] ^ in2 ^ in13 ^ in17;
104
0
        in25 = input[i / sizeof(z_word_t) + 24] ^ in3 ^ in14 ^ in18;
105
0
        in26 = input[i / sizeof(z_word_t) + 25] ^ in4 ^ in15 ^ in19;
106
0
        in27 = input[i / sizeof(z_word_t) + 26] ^ in5 ^ in16 ^ in20;
107
0
        in28 = input[i / sizeof(z_word_t) + 27] ^ in6 ^ in17 ^ in21;
108
0
        in29 = input[i / sizeof(z_word_t) + 28] ^ in7 ^ in18 ^ in22;
109
0
        in30 = input[i / sizeof(z_word_t) + 29] ^ in8 ^ in19 ^ in23;
110
0
        in31 = input[i / sizeof(z_word_t) + 30] ^ in9 ^ in20 ^ in24;
111
0
        in32 = input[i / sizeof(z_word_t) + 31] ^ in10 ^ in21 ^ in25;
112
113
0
        next1 = in11 ^ in22 ^ in26;
114
0
        next2 = in12 ^ in23 ^ in27;
115
0
        next3 = in13 ^ in24 ^ in28;
116
0
        next4 = in14 ^ in25 ^ in29;
117
0
        next5 = in15 ^ in26 ^ in30;
118
0
        next6 = in16 ^ in27 ^ in31;
119
0
        next7 = in17 ^ in28 ^ in32;
120
0
        next8 = in18 ^ in29;
121
0
        next9 = in19 ^ in30;
122
0
        next10 = in20 ^ in31;
123
0
        next11 = in21 ^ in32;
124
0
        next12 = in22;
125
0
        next13 = in23;
126
0
        next14 = in24;
127
0
        next15 = in25;
128
0
        next16 = in26;
129
0
        next17 = in27;
130
0
        next18 = in28;
131
0
        next19 = in29;
132
0
        next20 = in30;
133
0
        next21 = in31;
134
0
        next22 = in32;
135
136
0
        bitbuffer[outoffset1 + 22] = in1;
137
0
        bitbuffer[outoffset1 + 23] = in2;
138
0
        bitbuffer[outoffset1 + 24] = in3;
139
0
        bitbuffer[outoffset1 + 25] = in4;
140
0
        bitbuffer[outoffset1 + 26] = in5;
141
0
        bitbuffer[outoffset1 + 27] = in6;
142
0
        bitbuffer[outoffset1 + 28] = in7;
143
0
        bitbuffer[outoffset1 + 29] = in8;
144
0
        bitbuffer[outoffset1 + 30] = in9;
145
0
        bitbuffer[outoffset1 + 31] = in10;
146
0
        bitbuffer[outoffset2 + 0] = in11;
147
0
        bitbuffer[outoffset2 + 1] = in12;
148
0
        bitbuffer[outoffset2 + 2] = in13;
149
0
        bitbuffer[outoffset2 + 3] = in14;
150
0
        bitbuffer[outoffset2 + 4] = in15;
151
0
        bitbuffer[outoffset2 + 5] = in16;
152
0
        bitbuffer[outoffset2 + 6] = in17;
153
0
        bitbuffer[outoffset2 + 7] = in18;
154
0
        bitbuffer[outoffset2 + 8] = in19;
155
0
        bitbuffer[outoffset2 + 9] = in20;
156
0
        bitbuffer[outoffset2 + 10] = in21;
157
0
        bitbuffer[outoffset2 + 11] = in22;
158
0
        bitbuffer[outoffset2 + 12] = in23;
159
0
        bitbuffer[outoffset2 + 13] = in24;
160
0
        bitbuffer[outoffset2 + 14] = in25;
161
0
        bitbuffer[outoffset2 + 15] = in26;
162
0
        bitbuffer[outoffset2 + 16] = in27;
163
0
        bitbuffer[outoffset2 + 17] = in28;
164
0
        bitbuffer[outoffset2 + 18] = in29;
165
0
        bitbuffer[outoffset2 + 19] = in30;
166
0
        bitbuffer[outoffset2 + 20] = in31;
167
0
        bitbuffer[outoffset2 + 21] = in32;
168
0
    }
169
170
    // one intermediate pass where we pull half the values
171
0
    for(; i < (14880 * sizeof(z_word_t)); i += (32 * sizeof(z_word_t))) {
172
0
        z_word_t in1, in2, in3, in4, in5, in6, in7, in8;
173
0
        z_word_t in9, in10, in11, in12, in13, in14, in15, in16;
174
0
        z_word_t in17, in18, in19, in20, in21, in22, in23, in24;
175
0
        z_word_t in25, in26, in27, in28, in29, in30, in31, in32;
176
0
        int inoffset = (i / sizeof(z_word_t)) % bitbuffersizezwords;
177
0
        int outoffset1 = ((i / sizeof(z_word_t)) + 14848) % bitbuffersizezwords;
178
0
        int outoffset2 = ((i / sizeof(z_word_t)) + 14880) % bitbuffersizezwords;
179
180
0
        in1 = input[i / sizeof(z_word_t) + 0] ^ next1;
181
0
        in2 = input[i / sizeof(z_word_t) + 1] ^ next2;
182
0
        in3 = input[i / sizeof(z_word_t) + 2] ^ next3;
183
0
        in4 = input[i / sizeof(z_word_t) + 3] ^ next4;
184
0
        in5 = input[i / sizeof(z_word_t) + 4] ^ next5;
185
0
        in6 = input[i / sizeof(z_word_t) + 5] ^ next6;
186
0
        in7 = input[i / sizeof(z_word_t) + 6] ^ next7;
187
0
        in8 = input[i / sizeof(z_word_t) + 7] ^ next8 ^ in1;
188
0
        in9 = input[i / sizeof(z_word_t) + 8] ^ next9 ^ in2;
189
0
        in10 = input[i / sizeof(z_word_t) + 9] ^ next10 ^ in3;
190
0
        in11 = input[i / sizeof(z_word_t) + 10] ^ next11 ^ in4;
191
0
        in12 = input[i / sizeof(z_word_t) + 11] ^ next12 ^ in1 ^ in5;
192
0
        in13 = input[i / sizeof(z_word_t) + 12] ^ next13 ^ in2 ^ in6;
193
0
        in14 = input[i / sizeof(z_word_t) + 13] ^ next14 ^ in3 ^ in7;
194
0
        in15 = input[i / sizeof(z_word_t) + 14] ^ next15 ^ in4 ^ in8;
195
0
        in16 = input[i / sizeof(z_word_t) + 15] ^ next16 ^ in5 ^ in9;
196
0
        in17 = input[i / sizeof(z_word_t) + 16] ^ next17 ^ in6 ^ in10;
197
0
        in18 = input[i / sizeof(z_word_t) + 17] ^ next18 ^ in7 ^ in11;
198
0
        in19 = input[i / sizeof(z_word_t) + 18] ^ next19 ^ in8 ^ in12;
199
0
        in20 = input[i / sizeof(z_word_t) + 19] ^ next20 ^ in9 ^ in13;
200
0
        in21 = input[i / sizeof(z_word_t) + 20] ^ next21 ^ in10 ^ in14;
201
0
        in22 = input[i / sizeof(z_word_t) + 21] ^ next22 ^ in11 ^ in15;
202
0
        in23 = input[i / sizeof(z_word_t) + 22] ^ in1 ^ in12 ^ in16 ^ bitbuffer[inoffset + 22];
203
0
        in24 = input[i / sizeof(z_word_t) + 23] ^ in2 ^ in13 ^ in17 ^ bitbuffer[inoffset + 23];
204
0
        in25 = input[i / sizeof(z_word_t) + 24] ^ in3 ^ in14 ^ in18 ^ bitbuffer[inoffset + 24];
205
0
        in26 = input[i / sizeof(z_word_t) + 25] ^ in4 ^ in15 ^ in19 ^ bitbuffer[inoffset + 25];
206
0
        in27 = input[i / sizeof(z_word_t) + 26] ^ in5 ^ in16 ^ in20 ^ bitbuffer[inoffset + 26];
207
0
        in28 = input[i / sizeof(z_word_t) + 27] ^ in6 ^ in17 ^ in21 ^ bitbuffer[inoffset + 27];
208
0
        in29 = input[i / sizeof(z_word_t) + 28] ^ in7 ^ in18 ^ in22 ^ bitbuffer[inoffset + 28];
209
0
        in30 = input[i / sizeof(z_word_t) + 29] ^ in8 ^ in19 ^ in23 ^ bitbuffer[inoffset + 29];
210
0
        in31 = input[i / sizeof(z_word_t) + 30] ^ in9 ^ in20 ^ in24 ^ bitbuffer[inoffset + 30];
211
0
        in32 = input[i / sizeof(z_word_t) + 31] ^ in10 ^ in21 ^ in25 ^ bitbuffer[inoffset + 31];
212
213
0
        next1 = in11 ^ in22 ^ in26;
214
0
        next2 = in12 ^ in23 ^ in27;
215
0
        next3 = in13 ^ in24 ^ in28;
216
0
        next4 = in14 ^ in25 ^ in29;
217
0
        next5 = in15 ^ in26 ^ in30;
218
0
        next6 = in16 ^ in27 ^ in31;
219
0
        next7 = in17 ^ in28 ^ in32;
220
0
        next8 = in18 ^ in29;
221
0
        next9 = in19 ^ in30;
222
0
        next10 = in20 ^ in31;
223
0
        next11 = in21 ^ in32;
224
0
        next12 = in22;
225
0
        next13 = in23;
226
0
        next14 = in24;
227
0
        next15 = in25;
228
0
        next16 = in26;
229
0
        next17 = in27;
230
0
        next18 = in28;
231
0
        next19 = in29;
232
0
        next20 = in30;
233
0
        next21 = in31;
234
0
        next22 = in32;
235
236
0
        bitbuffer[outoffset1 + 22] = in1;
237
0
        bitbuffer[outoffset1 + 23] = in2;
238
0
        bitbuffer[outoffset1 + 24] = in3;
239
0
        bitbuffer[outoffset1 + 25] = in4;
240
0
        bitbuffer[outoffset1 + 26] = in5;
241
0
        bitbuffer[outoffset1 + 27] = in6;
242
0
        bitbuffer[outoffset1 + 28] = in7;
243
0
        bitbuffer[outoffset1 + 29] = in8;
244
0
        bitbuffer[outoffset1 + 30] = in9;
245
0
        bitbuffer[outoffset1 + 31] = in10;
246
0
        bitbuffer[outoffset2 + 0] = in11;
247
0
        bitbuffer[outoffset2 + 1] = in12;
248
0
        bitbuffer[outoffset2 + 2] = in13;
249
0
        bitbuffer[outoffset2 + 3] = in14;
250
0
        bitbuffer[outoffset2 + 4] = in15;
251
0
        bitbuffer[outoffset2 + 5] = in16;
252
0
        bitbuffer[outoffset2 + 6] = in17;
253
0
        bitbuffer[outoffset2 + 7] = in18;
254
0
        bitbuffer[outoffset2 + 8] = in19;
255
0
        bitbuffer[outoffset2 + 9] = in20;
256
0
        bitbuffer[outoffset2 + 10] = in21;
257
0
        bitbuffer[outoffset2 + 11] = in22;
258
0
        bitbuffer[outoffset2 + 12] = in23;
259
0
        bitbuffer[outoffset2 + 13] = in24;
260
0
        bitbuffer[outoffset2 + 14] = in25;
261
0
        bitbuffer[outoffset2 + 15] = in26;
262
0
        bitbuffer[outoffset2 + 16] = in27;
263
0
        bitbuffer[outoffset2 + 17] = in28;
264
0
        bitbuffer[outoffset2 + 18] = in29;
265
0
        bitbuffer[outoffset2 + 19] = in30;
266
0
        bitbuffer[outoffset2 + 20] = in31;
267
0
        bitbuffer[outoffset2 + 21] = in32;
268
0
    }
269
270
0
    for(; (i + (14870 + 64) * sizeof(z_word_t)) < len; i += (32 * sizeof(z_word_t))) {
271
0
        z_word_t in1, in2, in3, in4, in5, in6, in7, in8;
272
0
        z_word_t in9, in10, in11, in12, in13, in14, in15, in16;
273
0
        z_word_t in17, in18, in19, in20, in21, in22, in23, in24;
274
0
        z_word_t in25, in26, in27, in28, in29, in30, in31, in32;
275
0
        int inoffset = (i / sizeof(z_word_t)) % bitbuffersizezwords;
276
0
        int outoffset1 = ((i / sizeof(z_word_t)) + 14848) % bitbuffersizezwords;
277
0
        int outoffset2 = ((i / sizeof(z_word_t)) + 14880) % bitbuffersizezwords;
278
279
0
        in1 = input[i / sizeof(z_word_t) + 0] ^ next1 ^ bitbuffer[inoffset + 0];
280
0
        in2 = input[i / sizeof(z_word_t) + 1] ^ next2 ^ bitbuffer[inoffset + 1];
281
0
        in3 = input[i / sizeof(z_word_t) + 2] ^ next3 ^ bitbuffer[inoffset + 2];
282
0
        in4 = input[i / sizeof(z_word_t) + 3] ^ next4 ^ bitbuffer[inoffset + 3];
283
0
        in5 = input[i / sizeof(z_word_t) + 4] ^ next5 ^ bitbuffer[inoffset + 4];
284
0
        in6 = input[i / sizeof(z_word_t) + 5] ^ next6 ^ bitbuffer[inoffset + 5];
285
0
        in7 = input[i / sizeof(z_word_t) + 6] ^ next7 ^ bitbuffer[inoffset + 6];
286
0
        in8 = input[i / sizeof(z_word_t) + 7] ^ next8 ^ in1 ^ bitbuffer[inoffset + 7];
287
0
        in9 = input[i / sizeof(z_word_t) + 8] ^ next9 ^ in2 ^ bitbuffer[inoffset + 8];
288
0
        in10 = input[i / sizeof(z_word_t) + 9] ^ next10 ^ in3 ^ bitbuffer[inoffset + 9];
289
0
        in11 = input[i / sizeof(z_word_t) + 10] ^ next11 ^ in4 ^ bitbuffer[inoffset + 10];
290
0
        in12 = input[i / sizeof(z_word_t) + 11] ^ next12 ^ in1 ^ in5 ^ bitbuffer[inoffset + 11];
291
0
        in13 = input[i / sizeof(z_word_t) + 12] ^ next13 ^ in2 ^ in6 ^ bitbuffer[inoffset + 12];
292
0
        in14 = input[i / sizeof(z_word_t) + 13] ^ next14 ^ in3 ^ in7 ^ bitbuffer[inoffset + 13];
293
0
        in15 = input[i / sizeof(z_word_t) + 14] ^ next15 ^ in4 ^ in8 ^ bitbuffer[inoffset + 14];
294
0
        in16 = input[i / sizeof(z_word_t) + 15] ^ next16 ^ in5 ^ in9 ^ bitbuffer[inoffset + 15];
295
0
        in17 = input[i / sizeof(z_word_t) + 16] ^ next17 ^ in6 ^ in10 ^ bitbuffer[inoffset + 16];
296
0
        in18 = input[i / sizeof(z_word_t) + 17] ^ next18 ^ in7 ^ in11 ^ bitbuffer[inoffset + 17];
297
0
        in19 = input[i / sizeof(z_word_t) + 18] ^ next19 ^ in8 ^ in12 ^ bitbuffer[inoffset + 18];
298
0
        in20 = input[i / sizeof(z_word_t) + 19] ^ next20 ^ in9 ^ in13 ^ bitbuffer[inoffset + 19];
299
0
        in21 = input[i / sizeof(z_word_t) + 20] ^ next21 ^ in10 ^ in14 ^ bitbuffer[inoffset + 20];
300
0
        in22 = input[i / sizeof(z_word_t) + 21] ^ next22 ^ in11 ^ in15 ^ bitbuffer[inoffset + 21];
301
0
        in23 = input[i / sizeof(z_word_t) + 22] ^ in1 ^ in12 ^ in16 ^ bitbuffer[inoffset + 22];
302
0
        in24 = input[i / sizeof(z_word_t) + 23] ^ in2 ^ in13 ^ in17 ^ bitbuffer[inoffset + 23];
303
0
        in25 = input[i / sizeof(z_word_t) + 24] ^ in3 ^ in14 ^ in18 ^ bitbuffer[inoffset + 24];
304
0
        in26 = input[i / sizeof(z_word_t) + 25] ^ in4 ^ in15 ^ in19 ^ bitbuffer[inoffset + 25];
305
0
        in27 = input[i / sizeof(z_word_t) + 26] ^ in5 ^ in16 ^ in20 ^ bitbuffer[inoffset + 26];
306
0
        in28 = input[i / sizeof(z_word_t) + 27] ^ in6 ^ in17 ^ in21 ^ bitbuffer[inoffset + 27];
307
0
        in29 = input[i / sizeof(z_word_t) + 28] ^ in7 ^ in18 ^ in22 ^ bitbuffer[inoffset + 28];
308
0
        in30 = input[i / sizeof(z_word_t) + 29] ^ in8 ^ in19 ^ in23 ^ bitbuffer[inoffset + 29];
309
0
        in31 = input[i / sizeof(z_word_t) + 30] ^ in9 ^ in20 ^ in24 ^ bitbuffer[inoffset + 30];
310
0
        in32 = input[i / sizeof(z_word_t) + 31] ^ in10 ^ in21 ^ in25 ^ bitbuffer[inoffset + 31];
311
312
0
        next1 = in11 ^ in22 ^ in26;
313
0
        next2 = in12 ^ in23 ^ in27;
314
0
        next3 = in13 ^ in24 ^ in28;
315
0
        next4 = in14 ^ in25 ^ in29;
316
0
        next5 = in15 ^ in26 ^ in30;
317
0
        next6 = in16 ^ in27 ^ in31;
318
0
        next7 = in17 ^ in28 ^ in32;
319
0
        next8 = in18 ^ in29;
320
0
        next9 = in19 ^ in30;
321
0
        next10 = in20 ^ in31;
322
0
        next11 = in21 ^ in32;
323
0
        next12 = in22;
324
0
        next13 = in23;
325
0
        next14 = in24;
326
0
        next15 = in25;
327
0
        next16 = in26;
328
0
        next17 = in27;
329
0
        next18 = in28;
330
0
        next19 = in29;
331
0
        next20 = in30;
332
0
        next21 = in31;
333
0
        next22 = in32;
334
335
0
        bitbuffer[outoffset1 + 22] = in1;
336
0
        bitbuffer[outoffset1 + 23] = in2;
337
0
        bitbuffer[outoffset1 + 24] = in3;
338
0
        bitbuffer[outoffset1 + 25] = in4;
339
0
        bitbuffer[outoffset1 + 26] = in5;
340
0
        bitbuffer[outoffset1 + 27] = in6;
341
0
        bitbuffer[outoffset1 + 28] = in7;
342
0
        bitbuffer[outoffset1 + 29] = in8;
343
0
        bitbuffer[outoffset1 + 30] = in9;
344
0
        bitbuffer[outoffset1 + 31] = in10;
345
0
        bitbuffer[outoffset2 + 0] = in11;
346
0
        bitbuffer[outoffset2 + 1] = in12;
347
0
        bitbuffer[outoffset2 + 2] = in13;
348
0
        bitbuffer[outoffset2 + 3] = in14;
349
0
        bitbuffer[outoffset2 + 4] = in15;
350
0
        bitbuffer[outoffset2 + 5] = in16;
351
0
        bitbuffer[outoffset2 + 6] = in17;
352
0
        bitbuffer[outoffset2 + 7] = in18;
353
0
        bitbuffer[outoffset2 + 8] = in19;
354
0
        bitbuffer[outoffset2 + 9] = in20;
355
0
        bitbuffer[outoffset2 + 10] = in21;
356
0
        bitbuffer[outoffset2 + 11] = in22;
357
0
        bitbuffer[outoffset2 + 12] = in23;
358
0
        bitbuffer[outoffset2 + 13] = in24;
359
0
        bitbuffer[outoffset2 + 14] = in25;
360
0
        bitbuffer[outoffset2 + 15] = in26;
361
0
        bitbuffer[outoffset2 + 16] = in27;
362
0
        bitbuffer[outoffset2 + 17] = in28;
363
0
        bitbuffer[outoffset2 + 18] = in29;
364
0
        bitbuffer[outoffset2 + 19] = in30;
365
0
        bitbuffer[outoffset2 + 20] = in31;
366
0
        bitbuffer[outoffset2 + 21] = in32;
367
0
    }
368
369
0
    bitbuffer[(i / sizeof(z_word_t) + 0) % bitbuffersizezwords] ^= next1;
370
0
    bitbuffer[(i / sizeof(z_word_t) + 1) % bitbuffersizezwords] ^= next2;
371
0
    bitbuffer[(i / sizeof(z_word_t) + 2) % bitbuffersizezwords] ^= next3;
372
0
    bitbuffer[(i / sizeof(z_word_t) + 3) % bitbuffersizezwords] ^= next4;
373
0
    bitbuffer[(i / sizeof(z_word_t) + 4) % bitbuffersizezwords] ^= next5;
374
0
    bitbuffer[(i / sizeof(z_word_t) + 5) % bitbuffersizezwords] ^= next6;
375
0
    bitbuffer[(i / sizeof(z_word_t) + 6) % bitbuffersizezwords] ^= next7;
376
0
    bitbuffer[(i / sizeof(z_word_t) + 7) % bitbuffersizezwords] ^= next8;
377
0
    bitbuffer[(i / sizeof(z_word_t) + 8) % bitbuffersizezwords] ^= next9;
378
0
    bitbuffer[(i / sizeof(z_word_t) + 9) % bitbuffersizezwords] ^= next10;
379
0
    bitbuffer[(i / sizeof(z_word_t) + 10) % bitbuffersizezwords] ^= next11;
380
0
    bitbuffer[(i / sizeof(z_word_t) + 11) % bitbuffersizezwords] ^= next12;
381
0
    bitbuffer[(i / sizeof(z_word_t) + 12) % bitbuffersizezwords] ^= next13;
382
0
    bitbuffer[(i / sizeof(z_word_t) + 13) % bitbuffersizezwords] ^= next14;
383
0
    bitbuffer[(i / sizeof(z_word_t) + 14) % bitbuffersizezwords] ^= next15;
384
0
    bitbuffer[(i / sizeof(z_word_t) + 15) % bitbuffersizezwords] ^= next16;
385
0
    bitbuffer[(i / sizeof(z_word_t) + 16) % bitbuffersizezwords] ^= next17;
386
0
    bitbuffer[(i / sizeof(z_word_t) + 17) % bitbuffersizezwords] ^= next18;
387
0
    bitbuffer[(i / sizeof(z_word_t) + 18) % bitbuffersizezwords] ^= next19;
388
0
    bitbuffer[(i / sizeof(z_word_t) + 19) % bitbuffersizezwords] ^= next20;
389
0
    bitbuffer[(i / sizeof(z_word_t) + 20) % bitbuffersizezwords] ^= next21;
390
0
    bitbuffer[(i / sizeof(z_word_t) + 21) % bitbuffersizezwords] ^= next22;
391
392
0
    for (int j = 14870; j < 14870 + 60; j++) {
393
0
        bitbuffer[(j + (i / sizeof(z_word_t))) % bitbuffersizezwords] = 0;
394
0
    }
395
396
0
    uint64_t next1_64 = 0;
397
0
    uint64_t next2_64 = 0;
398
0
    uint64_t next3_64 = 0;
399
0
    uint64_t next4_64 = 0;
400
0
    uint64_t next5_64 = 0;
401
0
    uint64_t final[9] = {0};
402
403
0
    for(; (i + 72 < len); i += 32) {
404
0
        uint64_t in1;
405
0
        uint64_t in2;
406
0
        uint64_t in3;
407
0
        uint64_t in4;
408
0
        uint64_t a1, a2, a3, a4;
409
0
        uint64_t b1, b2, b3, b4;
410
0
        uint64_t c1, c2, c3, c4;
411
0
        uint64_t d1, d2, d3, d4;
412
413
0
        uint64_t out1;
414
0
        uint64_t out2;
415
0
        uint64_t out3;
416
0
        uint64_t out4;
417
0
        uint64_t out5;
418
419
0
        in1 = inputqwords[i / sizeof(uint64_t)] ^ bitbufferqwords[(i / sizeof(uint64_t)) % bitbuffersizeqwords];
420
0
        in2 = inputqwords[i / sizeof(uint64_t) + 1] ^ bitbufferqwords[(i / sizeof(uint64_t) + 1) % bitbuffersizeqwords];
421
#if BYTE_ORDER == BIG_ENDIAN
422
        in1 = ZSWAP64(in1);
423
        in2 = ZSWAP64(in2);
424
#endif
425
0
        in1 ^= next1_64;
426
0
        in2 ^= next2_64;
427
428
0
        a1 = (in1 << 17) ^ (in1 << 55);
429
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
430
0
        a3 = (in1 >> 45) ^ (in1 << 44);
431
0
        a4 = (in1 >> 20);
432
433
0
        b1 = (in2 << 17) ^ (in2 << 55);
434
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
435
0
        b3 = (in2 >> 45) ^ (in2 << 44);
436
0
        b4 = (in2 >> 20);
437
438
0
        in3 = inputqwords[i / sizeof(uint64_t) + 2] ^ bitbufferqwords[(i / sizeof(uint64_t) + 2) % bitbuffersizeqwords];
439
0
        in4 = inputqwords[i / sizeof(uint64_t) + 3] ^ bitbufferqwords[(i / sizeof(uint64_t) + 3) % bitbuffersizeqwords];
440
#if BYTE_ORDER == BIG_ENDIAN
441
        in3 = ZSWAP64(in3);
442
        in4 = ZSWAP64(in4);
443
#endif
444
0
        in3 ^= next3_64 ^ a1;
445
0
        in4 ^= next4_64 ^ a2 ^ b1;
446
447
0
        c1 = (in3 << 17) ^ (in3 << 55);
448
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
449
0
        c3 = (in3 >> 45) ^ (in3 << 44);
450
0
        c4 = (in3 >> 20);
451
452
0
        d1 = (in4 << 17) ^ (in4 << 55);
453
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
454
0
        d3 = (in4 >> 45) ^ (in4 << 44);
455
0
        d4 = (in4 >> 20);
456
457
0
        out1 = a3 ^ b2 ^ c1;
458
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
459
0
        out3 = b4 ^ c3 ^ d2;
460
0
        out4 = c4 ^ d3;
461
0
        out5 = d4;
462
463
0
        next1_64 = next5_64 ^ out1;
464
0
        next2_64 = out2;
465
0
        next3_64 = out3;
466
0
        next4_64 = out4;
467
0
        next5_64 = out5;
468
469
0
    }
470
471
#if BYTE_ORDER == BIG_ENDIAN
472
    next1_64 = ZSWAP64(next1_64);
473
    next2_64 = ZSWAP64(next2_64);
474
    next3_64 = ZSWAP64(next3_64);
475
    next4_64 = ZSWAP64(next4_64);
476
    next5_64 = ZSWAP64(next5_64);
477
#endif
478
479
0
    memcpy(final, inputqwords + (i / sizeof(uint64_t)), len-i);
480
0
    final[0] ^= next1_64;
481
0
    final[1] ^= next2_64;
482
0
    final[2] ^= next3_64;
483
0
    final[3] ^= next4_64;
484
0
    final[4] ^= next5_64;
485
486
0
    uint8_t* final_bytes = (uint8_t*) final;
487
488
0
    for(size_t j = 0; j < (len-i); j++) {
489
0
        crc = crc_table[(crc ^ final_bytes[j] ^ bitbufferbytes[(j+i) % bitbuffersizebytes]) & 0xff] ^ (crc >> 8);
490
0
    }
491
492
#if defined(__EMSCRIPTEN__)
493
    zng_free(bitbuffer);
494
#endif
495
0
    return crc;
496
0
}
497
498
/* Implement Chorba algorithm from https://arxiv.org/abs/2412.16398 */
499
0
Z_INTERNAL uint32_t crc32_chorba_32768_nondestructive (uint32_t crc, const uint64_t* buf, size_t len) {
500
0
    const uint64_t* input = buf;
501
0
    uint64_t bitbuffer[32768 / sizeof(uint64_t)];
502
0
    const uint8_t* bitbufferbytes = (const uint8_t*) bitbuffer;
503
0
    memset(bitbuffer, 0, 32768);
504
0
#if BYTE_ORDER == LITTLE_ENDIAN
505
0
    bitbuffer[0] = crc;
506
#else
507
    bitbuffer[0] = ZSWAP64(crc);
508
#endif
509
510
0
    crc = 0;
511
512
0
    size_t i = 0;
513
514
0
    for(; i + 300*8+64 < len; i += 64) {
515
0
        uint64_t in1, in2, in3, in4;
516
0
        uint64_t in5, in6, in7, in8;
517
0
        size_t inoffset = (i/8);
518
519
0
        in1 = input[i / sizeof(uint64_t) + 0] ^ bitbuffer[inoffset + 0];
520
0
        in2 = input[i / sizeof(uint64_t) + 1] ^ bitbuffer[inoffset + 1];
521
0
        in3 = input[i / sizeof(uint64_t) + 2] ^ bitbuffer[inoffset + 2];
522
0
        in4 = input[i / sizeof(uint64_t) + 3] ^ bitbuffer[inoffset + 3];
523
0
        in5 = input[i / sizeof(uint64_t) + 4] ^ bitbuffer[inoffset + 4];
524
0
        in6 = input[i / sizeof(uint64_t) + 5] ^ bitbuffer[inoffset + 5];
525
0
        in7 = input[i / sizeof(uint64_t) + 6] ^ bitbuffer[inoffset + 6];
526
0
        in8 = input[i / sizeof(uint64_t) + 7] ^ bitbuffer[inoffset + 7];
527
528
        // [0, 145, 183, 211]
529
530
0
        bitbuffer[(i/8 + 0 + 145)] ^= in1;
531
0
        bitbuffer[(i/8 + 1 + 145)] ^= in2;
532
0
        bitbuffer[(i/8 + 2 + 145)] ^= in3;
533
0
        bitbuffer[(i/8 + 3 + 145)] ^= in4;
534
0
        bitbuffer[(i/8 + 4 + 145)] ^= in5;
535
0
        bitbuffer[(i/8 + 5 + 145)] ^= in6;
536
0
        bitbuffer[(i/8 + 6 + 145)] ^= in7;
537
0
        bitbuffer[(i/8 + 7 + 145)] ^= in8;
538
539
0
        bitbuffer[(i/8 + 0 + 183)] ^= in1;
540
0
        bitbuffer[(i/8 + 1 + 183)] ^= in2;
541
0
        bitbuffer[(i/8 + 2 + 183)] ^= in3;
542
0
        bitbuffer[(i/8 + 3 + 183)] ^= in4;
543
0
        bitbuffer[(i/8 + 4 + 183)] ^= in5;
544
0
        bitbuffer[(i/8 + 5 + 183)] ^= in6;
545
0
        bitbuffer[(i/8 + 6 + 183)] ^= in7;
546
0
        bitbuffer[(i/8 + 7 + 183)] ^= in8;
547
548
0
        bitbuffer[(i/8 + 0 + 211)] ^= in1;
549
0
        bitbuffer[(i/8 + 1 + 211)] ^= in2;
550
0
        bitbuffer[(i/8 + 2 + 211)] ^= in3;
551
0
        bitbuffer[(i/8 + 3 + 211)] ^= in4;
552
0
        bitbuffer[(i/8 + 4 + 211)] ^= in5;
553
0
        bitbuffer[(i/8 + 5 + 211)] ^= in6;
554
0
        bitbuffer[(i/8 + 6 + 211)] ^= in7;
555
0
        bitbuffer[(i/8 + 7 + 211)] ^= in8;
556
557
0
        bitbuffer[(i/8 + 0 + 300)] = in1;
558
0
        bitbuffer[(i/8 + 1 + 300)] = in2;
559
0
        bitbuffer[(i/8 + 2 + 300)] = in3;
560
0
        bitbuffer[(i/8 + 3 + 300)] = in4;
561
0
        bitbuffer[(i/8 + 4 + 300)] = in5;
562
0
        bitbuffer[(i/8 + 5 + 300)] = in6;
563
0
        bitbuffer[(i/8 + 6 + 300)] = in7;
564
0
        bitbuffer[(i/8 + 7 + 300)] = in8;
565
0
    }
566
567
0
    uint64_t next1_64 = 0;
568
0
    uint64_t next2_64 = 0;
569
0
    uint64_t next3_64 = 0;
570
0
    uint64_t next4_64 = 0;
571
0
    uint64_t next5_64 = 0;
572
0
    uint64_t final[9] = {0};
573
574
0
    for(; (i + 72 < len); i += 32) {
575
0
        uint64_t in1;
576
0
        uint64_t in2;
577
0
        uint64_t in3;
578
0
        uint64_t in4;
579
0
        uint64_t a1, a2, a3, a4;
580
0
        uint64_t b1, b2, b3, b4;
581
0
        uint64_t c1, c2, c3, c4;
582
0
        uint64_t d1, d2, d3, d4;
583
584
0
        uint64_t out1;
585
0
        uint64_t out2;
586
0
        uint64_t out3;
587
0
        uint64_t out4;
588
0
        uint64_t out5;
589
590
0
        in1 = input[i / sizeof(z_word_t)] ^ bitbuffer[(i / sizeof(uint64_t))];
591
0
        in2 = input[(i + 8) / sizeof(z_word_t)] ^ bitbuffer[(i / sizeof(uint64_t) + 1)];
592
#if BYTE_ORDER == BIG_ENDIAN
593
        in1 = ZSWAP64(in1);
594
        in2 = ZSWAP64(in2);
595
#endif
596
0
        in1 ^= next1_64;
597
0
        in2 ^= next2_64;
598
599
0
        a1 = (in1 << 17) ^ (in1 << 55);
600
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
601
0
        a3 = (in1 >> 45) ^ (in1 << 44);
602
0
        a4 = (in1 >> 20);
603
604
0
        b1 = (in2 << 17) ^ (in2 << 55);
605
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
606
0
        b3 = (in2 >> 45) ^ (in2 << 44);
607
0
        b4 = (in2 >> 20);
608
609
0
        in3 = input[(i + 16) / sizeof(z_word_t)] ^ bitbuffer[(i / sizeof(uint64_t) + 2)];
610
0
        in4 = input[(i + 24) / sizeof(z_word_t)] ^ bitbuffer[(i / sizeof(uint64_t) + 3)];
611
#if BYTE_ORDER == BIG_ENDIAN
612
        in3 = ZSWAP64(in3);
613
        in4 = ZSWAP64(in4);
614
#endif
615
0
        in3 ^= next3_64 ^ a1;
616
0
        in4 ^= next4_64 ^ a2 ^ b1;
617
618
0
        c1 = (in3 << 17) ^ (in3 << 55);
619
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
620
0
        c3 = (in3 >> 45) ^ (in3 << 44);
621
0
        c4 = (in3 >> 20);
622
623
0
        d1 = (in4 << 17) ^ (in4 << 55);
624
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
625
0
        d3 = (in4 >> 45) ^ (in4 << 44);
626
0
        d4 = (in4 >> 20);
627
628
0
        out1 = a3 ^ b2 ^ c1;
629
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
630
0
        out3 = b4 ^ c3 ^ d2;
631
0
        out4 = c4 ^ d3;
632
0
        out5 = d4;
633
634
0
        next1_64 = next5_64 ^ out1;
635
0
        next2_64 = out2;
636
0
        next3_64 = out3;
637
0
        next4_64 = out4;
638
0
        next5_64 = out5;
639
640
0
    }
641
642
#if BYTE_ORDER == BIG_ENDIAN
643
    next1_64 = ZSWAP64(next1_64);
644
    next2_64 = ZSWAP64(next2_64);
645
    next3_64 = ZSWAP64(next3_64);
646
    next4_64 = ZSWAP64(next4_64);
647
    next5_64 = ZSWAP64(next5_64);
648
#endif
649
650
0
    memcpy(final, input+(i / sizeof(uint64_t)), len-i);
651
0
    final[0] ^= next1_64;
652
0
    final[1] ^= next2_64;
653
0
    final[2] ^= next3_64;
654
0
    final[3] ^= next4_64;
655
0
    final[4] ^= next5_64;
656
657
0
    uint8_t* final_bytes = (uint8_t*) final;
658
659
0
    for (size_t j = 0; j < (len-i); j++) {
660
0
        crc = crc_table[(crc ^ final_bytes[j] ^ bitbufferbytes[(j+i)]) & 0xff] ^ (crc >> 8);
661
0
    }
662
663
0
    return crc;
664
0
}
665
666
/* Implement Chorba algorithm from https://arxiv.org/abs/2412.16398 */
667
0
Z_INTERNAL uint32_t crc32_chorba_small_nondestructive (uint32_t crc, const uint64_t* buf, size_t len) {
668
0
    const uint64_t* input = buf;
669
0
    uint64_t final[9] = {0};
670
0
    uint64_t next1 = crc;
671
0
    crc = 0;
672
0
    uint64_t next2 = 0;
673
0
    uint64_t next3 = 0;
674
0
    uint64_t next4 = 0;
675
0
    uint64_t next5 = 0;
676
677
0
    size_t i = 0;
678
679
    /* This is weird, doing for vs while drops 10% off the exec time */
680
0
    for(; (i + 256 + 40 + 32 + 32) < len; i += 32) {
681
0
        uint64_t in1;
682
0
        uint64_t in2;
683
0
        uint64_t in3;
684
0
        uint64_t in4;
685
0
        uint64_t a1, a2, a3, a4;
686
0
        uint64_t b1, b2, b3, b4;
687
0
        uint64_t c1, c2, c3, c4;
688
0
        uint64_t d1, d2, d3, d4;
689
690
0
        uint64_t out1;
691
0
        uint64_t out2;
692
0
        uint64_t out3;
693
0
        uint64_t out4;
694
0
        uint64_t out5;
695
696
0
        uint64_t chorba1 = input[i / sizeof(uint64_t)];
697
0
        uint64_t chorba2 = input[i / sizeof(uint64_t) + 1];
698
0
        uint64_t chorba3 = input[i / sizeof(uint64_t) + 2];
699
0
        uint64_t chorba4 = input[i / sizeof(uint64_t) + 3];
700
0
        uint64_t chorba5 = input[i / sizeof(uint64_t) + 4];
701
0
        uint64_t chorba6 = input[i / sizeof(uint64_t) + 5];
702
0
        uint64_t chorba7 = input[i / sizeof(uint64_t) + 6];
703
0
        uint64_t chorba8 = input[i / sizeof(uint64_t) + 7];
704
#if BYTE_ORDER == BIG_ENDIAN
705
        chorba1 = ZSWAP64(chorba1);
706
        chorba2 = ZSWAP64(chorba2);
707
        chorba3 = ZSWAP64(chorba3);
708
        chorba4 = ZSWAP64(chorba4);
709
        chorba5 = ZSWAP64(chorba5);
710
        chorba6 = ZSWAP64(chorba6);
711
        chorba7 = ZSWAP64(chorba7);
712
        chorba8 = ZSWAP64(chorba8);
713
#endif
714
0
        chorba1 ^= next1;
715
0
        chorba2 ^= next2;
716
0
        chorba3 ^= next3;
717
0
        chorba4 ^= next4;
718
0
        chorba5 ^= next5;
719
0
        chorba7 ^= chorba1;
720
0
        chorba8 ^= chorba2;
721
0
        i += 8 * 8;
722
723
        /* 0-3 */
724
0
        in1 = input[i / sizeof(uint64_t)];
725
0
        in2 = input[i / sizeof(uint64_t) + 1];
726
#if BYTE_ORDER == BIG_ENDIAN
727
        in1 = ZSWAP64(in1);
728
        in2 = ZSWAP64(in2);
729
#endif
730
0
        in1 ^= chorba3;
731
0
        in2 ^= chorba4 ^ chorba1;
732
733
0
        a1 = (in1 << 17) ^ (in1 << 55);
734
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
735
0
        a3 = (in1 >> 45) ^ (in1 << 44);
736
0
        a4 = (in1 >> 20);
737
738
0
        b1 = (in2 << 17) ^ (in2 << 55);
739
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
740
0
        b3 = (in2 >> 45) ^ (in2 << 44);
741
0
        b4 = (in2 >> 20);
742
743
0
        in3 = input[i / sizeof(uint64_t) + 2];
744
0
        in4 = input[i / sizeof(uint64_t) + 3];
745
#if BYTE_ORDER == BIG_ENDIAN
746
        in3 = ZSWAP64(in3);
747
        in4 = ZSWAP64(in4);
748
#endif
749
0
        in3 ^= a1 ^ chorba5 ^ chorba2 ^ chorba1;
750
0
        in4 ^= a2 ^ b1 ^ chorba6 ^ chorba3 ^ chorba2;
751
752
0
        c1 = (in3 << 17) ^ (in3 << 55);
753
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
754
0
        c3 = (in3 >> 45) ^ (in3 << 44);
755
0
        c4 = (in3 >> 20);
756
757
0
        d1 = (in4 << 17) ^ (in4 << 55);
758
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
759
0
        d3 = (in4 >> 45) ^ (in4 << 44);
760
0
        d4 = (in4 >> 20);
761
762
0
        out1 = a3 ^ b2 ^ c1;
763
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
764
0
        out3 = b4 ^ c3 ^ d2;
765
0
        out4 = c4 ^ d3;
766
0
        out5 = d4;
767
768
0
        next1 = out1;
769
0
        next2 = out2;
770
0
        next3 = out3;
771
0
        next4 = out4;
772
0
        next5 = out5;
773
774
0
        i += 32;
775
776
        /* 4-7 */
777
0
        in1 = input[i / sizeof(uint64_t)];
778
0
        in2 = input[i / sizeof(uint64_t) + 1];
779
#if BYTE_ORDER == BIG_ENDIAN
780
        in1 = ZSWAP64(in1);
781
        in2 = ZSWAP64(in2);
782
#endif
783
0
        in1 ^= next1 ^ chorba7 ^ chorba4 ^ chorba3;
784
0
        in2 ^= next2 ^ chorba8 ^ chorba5 ^ chorba4;
785
786
0
        a1 = (in1 << 17) ^ (in1 << 55);
787
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
788
0
        a3 = (in1 >> 45) ^ (in1 << 44);
789
0
        a4 = (in1 >> 20);
790
791
0
        b1 = (in2 << 17) ^ (in2 << 55);
792
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
793
0
        b3 = (in2 >> 45) ^ (in2 << 44);
794
0
        b4 = (in2 >> 20);
795
796
0
        in3 = input[i / sizeof(uint64_t) + 2];
797
0
        in4 = input[i / sizeof(uint64_t) + 3];
798
#if BYTE_ORDER == BIG_ENDIAN
799
        in3 = ZSWAP64(in3);
800
        in4 = ZSWAP64(in4);
801
#endif
802
0
        in3 ^= next3 ^ a1 ^ chorba6 ^ chorba5;
803
0
        in4 ^= next4 ^ a2 ^ b1 ^ chorba7 ^ chorba6;
804
805
0
        c1 = (in3 << 17) ^ (in3 << 55);
806
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
807
0
        c3 = (in3 >> 45) ^ (in3 << 44);
808
0
        c4 = (in3 >> 20);
809
810
0
        d1 = (in4 << 17) ^ (in4 << 55);
811
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
812
0
        d3 = (in4 >> 45) ^ (in4 << 44);
813
0
        d4 = (in4 >> 20);
814
815
0
        out1 = a3 ^ b2 ^ c1;
816
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
817
0
        out3 = b4 ^ c3 ^ d2;
818
0
        out4 = c4 ^ d3;
819
0
        out5 = d4;
820
821
0
        next1 = next5 ^ out1;
822
0
        next2 = out2;
823
0
        next3 = out3;
824
0
        next4 = out4;
825
0
        next5 = out5;
826
827
0
        i += 32;
828
829
        /* 8-11 */
830
0
        in1 = input[i / sizeof(uint64_t)];
831
0
        in2 = input[i / sizeof(uint64_t) + 1];
832
#if BYTE_ORDER == BIG_ENDIAN
833
        in1 = ZSWAP64(in1);
834
        in2 = ZSWAP64(in2);
835
#endif
836
0
        in1 ^= next1 ^ chorba8 ^ chorba7 ^ chorba1;
837
0
        in2 ^= next2 ^ chorba8 ^ chorba2;
838
839
0
        a1 = (in1 << 17) ^ (in1 << 55);
840
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
841
0
        a3 = (in1 >> 45) ^ (in1 << 44);
842
0
        a4 = (in1 >> 20);
843
844
0
        b1 = (in2 << 17) ^ (in2 << 55);
845
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
846
0
        b3 = (in2 >> 45) ^ (in2 << 44);
847
0
        b4 = (in2 >> 20);
848
849
0
        in3 = input[i / sizeof(uint64_t) + 2];
850
0
        in4 = input[i / sizeof(uint64_t) + 3];
851
#if BYTE_ORDER == BIG_ENDIAN
852
        in3 = ZSWAP64(in3);
853
        in4 = ZSWAP64(in4);
854
#endif
855
0
        in3 ^= next3 ^ a1 ^ chorba3;
856
0
        in4 ^= next4 ^ a2 ^ b1 ^ chorba4;
857
858
0
        c1 = (in3 << 17) ^ (in3 << 55);
859
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
860
0
        c3 = (in3 >> 45) ^ (in3 << 44);
861
0
        c4 = (in3 >> 20);
862
863
0
        d1 = (in4 << 17) ^ (in4 << 55);
864
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
865
0
        d3 = (in4 >> 45) ^ (in4 << 44);
866
0
        d4 = (in4 >> 20);
867
868
0
        out1 = a3 ^ b2 ^ c1;
869
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
870
0
        out3 = b4 ^ c3 ^ d2;
871
0
        out4 = c4 ^ d3;
872
0
        out5 = d4;
873
874
0
        next1 = next5 ^ out1;
875
0
        next2 = out2;
876
0
        next3 = out3;
877
0
        next4 = out4;
878
0
        next5 = out5;
879
880
0
        i += 32;
881
882
        /* 12-15 */
883
0
        in1 = input[i / sizeof(uint64_t)];
884
0
        in2 = input[i / sizeof(uint64_t) + 1];
885
#if BYTE_ORDER == BIG_ENDIAN
886
        in1 = ZSWAP64(in1);
887
        in2 = ZSWAP64(in2);
888
#endif
889
0
        in1 ^= next1 ^ chorba5 ^ chorba1;
890
0
        in2 ^= next2 ^ chorba6 ^ chorba2 ^ chorba1;
891
892
0
        a1 = (in1 << 17) ^ (in1 << 55);
893
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
894
0
        a3 = (in1 >> 45) ^ (in1 << 44);
895
0
        a4 = (in1 >> 20);
896
897
0
        b1 = (in2 << 17) ^ (in2 << 55);
898
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
899
0
        b3 = (in2 >> 45) ^ (in2 << 44);
900
0
        b4 = (in2 >> 20);
901
902
0
        in3 = input[i / sizeof(uint64_t) + 2];
903
0
        in4 = input[i / sizeof(uint64_t) + 3];
904
#if BYTE_ORDER == BIG_ENDIAN
905
        in3 = ZSWAP64(in3);
906
        in4 = ZSWAP64(in4);
907
#endif
908
0
        in3 ^= next3 ^ a1 ^ chorba7 ^ chorba3 ^ chorba2 ^ chorba1;
909
0
        in4 ^= next4 ^ a2 ^ b1 ^ chorba8 ^ chorba4 ^ chorba3 ^ chorba2;
910
911
0
        c1 = (in3 << 17) ^ (in3 << 55);
912
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
913
0
        c3 = (in3 >> 45) ^ (in3 << 44);
914
0
        c4 = (in3 >> 20);
915
916
0
        d1 = (in4 << 17) ^ (in4 << 55);
917
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
918
0
        d3 = (in4 >> 45) ^ (in4 << 44);
919
0
        d4 = (in4 >> 20);
920
921
0
        out1 = a3 ^ b2 ^ c1;
922
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
923
0
        out3 = b4 ^ c3 ^ d2;
924
0
        out4 = c4 ^ d3;
925
0
        out5 = d4;
926
927
0
        next1 = next5 ^ out1;
928
0
        next2 = out2;
929
0
        next3 = out3;
930
0
        next4 = out4;
931
0
        next5 = out5;
932
933
0
        i += 32;
934
935
        /* 16-19 */
936
0
        in1 = input[i / sizeof(uint64_t)];
937
0
        in2 = input[i / sizeof(uint64_t) + 1];
938
#if BYTE_ORDER == BIG_ENDIAN
939
        in1 = ZSWAP64(in1);
940
        in2 = ZSWAP64(in2);
941
#endif
942
0
        in1 ^= next1 ^ chorba5 ^ chorba4 ^ chorba3 ^ chorba1;
943
0
        in2 ^= next2 ^ chorba6 ^ chorba5 ^ chorba4 ^ chorba1 ^ chorba2;
944
945
0
        a1 = (in1 << 17) ^ (in1 << 55);
946
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
947
0
        a3 = (in1 >> 45) ^ (in1 << 44);
948
0
        a4 = (in1 >> 20);
949
950
0
        b1 = (in2 << 17) ^ (in2 << 55);
951
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
952
0
        b3 = (in2 >> 45) ^ (in2 << 44);
953
0
        b4 = (in2 >> 20);
954
955
0
        in3 = input[i / sizeof(uint64_t) + 2];
956
0
        in4 = input[i / sizeof(uint64_t) + 3];
957
#if BYTE_ORDER == BIG_ENDIAN
958
        in3 = ZSWAP64(in3);
959
        in4 = ZSWAP64(in4);
960
#endif
961
0
        in3 ^= next3 ^ a1 ^ chorba7 ^ chorba6 ^ chorba5 ^ chorba2 ^ chorba3;
962
0
        in4 ^= next4 ^ a2 ^ b1 ^ chorba8 ^ chorba7 ^ chorba6 ^ chorba3 ^ chorba4 ^ chorba1;
963
964
0
        c1 = (in3 << 17) ^ (in3 << 55);
965
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
966
0
        c3 = (in3 >> 45) ^ (in3 << 44);
967
0
        c4 = (in3 >> 20);
968
969
0
        d1 = (in4 << 17) ^ (in4 << 55);
970
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
971
0
        d3 = (in4 >> 45) ^ (in4 << 44);
972
0
        d4 = (in4 >> 20);
973
974
0
        out1 = a3 ^ b2 ^ c1;
975
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
976
0
        out3 = b4 ^ c3 ^ d2;
977
0
        out4 = c4 ^ d3;
978
0
        out5 = d4;
979
980
0
        next1 = next5 ^ out1;
981
0
        next2 = out2;
982
0
        next3 = out3;
983
0
        next4 = out4;
984
0
        next5 = out5;
985
986
0
        i += 32;
987
988
        /* 20-23 */
989
0
        in1 = input[i / sizeof(uint64_t)];
990
0
        in2 = input[i / sizeof(uint64_t) + 1];
991
#if BYTE_ORDER == BIG_ENDIAN
992
        in1 = ZSWAP64(in1);
993
        in2 = ZSWAP64(in2);
994
#endif
995
0
        in1 ^= next1 ^ chorba8 ^ chorba7 ^ chorba4 ^ chorba5 ^ chorba2 ^ chorba1;
996
0
        in2 ^= next2 ^ chorba8 ^ chorba5 ^ chorba6 ^ chorba3 ^ chorba2;
997
998
0
        a1 = (in1 << 17) ^ (in1 << 55);
999
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
1000
0
        a3 = (in1 >> 45) ^ (in1 << 44);
1001
0
        a4 = (in1 >> 20);
1002
1003
0
        b1 = (in2 << 17) ^ (in2 << 55);
1004
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
1005
0
        b3 = (in2 >> 45) ^ (in2 << 44);
1006
0
        b4 = (in2 >> 20);
1007
1008
0
        in3 = input[i / sizeof(uint64_t) + 2];
1009
0
        in4 = input[i / sizeof(uint64_t) + 3];
1010
#if BYTE_ORDER == BIG_ENDIAN
1011
        in3 = ZSWAP64(in3);
1012
        in4 = ZSWAP64(in4);
1013
#endif
1014
0
        in3 ^= next3 ^ a1 ^ chorba7 ^ chorba6 ^ chorba4 ^ chorba3 ^ chorba1;
1015
0
        in4 ^= next4 ^ a2 ^ b1 ^ chorba8 ^ chorba7 ^ chorba5 ^ chorba4 ^ chorba2 ^ chorba1;
1016
1017
0
        c1 = (in3 << 17) ^ (in3 << 55);
1018
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
1019
0
        c3 = (in3 >> 45) ^ (in3 << 44);
1020
0
        c4 = (in3 >> 20);
1021
1022
0
        d1 = (in4 << 17) ^ (in4 << 55);
1023
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
1024
0
        d3 = (in4 >> 45) ^ (in4 << 44);
1025
0
        d4 = (in4 >> 20);
1026
1027
0
        out1 = a3 ^ b2 ^ c1;
1028
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
1029
0
        out3 = b4 ^ c3 ^ d2;
1030
0
        out4 = c4 ^ d3;
1031
0
        out5 = d4;
1032
1033
0
        next1 = next5 ^ out1;
1034
0
        next2 = out2;
1035
0
        next3 = out3;
1036
0
        next4 = out4;
1037
0
        next5 = out5;
1038
1039
0
        i += 32;
1040
1041
        /* 24-27 */
1042
0
        in1 = input[i / sizeof(uint64_t)];
1043
0
        in2 = input[i / sizeof(uint64_t) + 1];
1044
#if BYTE_ORDER == BIG_ENDIAN
1045
        in1 = ZSWAP64(in1);
1046
        in2 = ZSWAP64(in2);
1047
#endif
1048
0
        in1 ^= next1 ^ chorba8 ^ chorba6 ^ chorba5 ^ chorba3 ^ chorba2 ^ chorba1;
1049
0
        in2 ^= next2 ^ chorba7 ^ chorba6 ^ chorba4 ^ chorba3 ^ chorba2;
1050
1051
0
        a1 = (in1 << 17) ^ (in1 << 55);
1052
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
1053
0
        a3 = (in1 >> 45) ^ (in1 << 44);
1054
0
        a4 = (in1 >> 20);
1055
1056
0
        b1 = (in2 << 17) ^ (in2 << 55);
1057
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
1058
0
        b3 = (in2 >> 45) ^ (in2 << 44);
1059
0
        b4 = (in2 >> 20);
1060
1061
0
        in3 = input[i / sizeof(uint64_t) + 2];
1062
0
        in4 = input[i / sizeof(uint64_t) + 3];
1063
#if BYTE_ORDER == BIG_ENDIAN
1064
        in3 = ZSWAP64(in3);
1065
        in4 = ZSWAP64(in4);
1066
#endif
1067
0
        in3 ^= next3 ^ a1 ^ chorba8 ^ chorba7 ^ chorba5 ^ chorba4 ^ chorba3;
1068
0
        in4 ^= next4 ^ a2 ^ b1 ^ chorba8 ^ chorba6 ^ chorba5 ^ chorba4;
1069
1070
0
        c1 = (in3 << 17) ^ (in3 << 55);
1071
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
1072
0
        c3 = (in3 >> 45) ^ (in3 << 44);
1073
0
        c4 = (in3 >> 20);
1074
1075
0
        d1 = (in4 << 17) ^ (in4 << 55);
1076
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
1077
0
        d3 = (in4 >> 45) ^ (in4 << 44);
1078
0
        d4 = (in4 >> 20);
1079
1080
0
        out1 = a3 ^ b2 ^ c1;
1081
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
1082
0
        out3 = b4 ^ c3 ^ d2;
1083
0
        out4 = c4 ^ d3;
1084
0
        out5 = d4;
1085
1086
0
        next1 = next5 ^ out1;
1087
0
        next2 = out2;
1088
0
        next3 = out3;
1089
0
        next4 = out4;
1090
0
        next5 = out5;
1091
1092
0
        i += 32;
1093
1094
        /* 28-31 */
1095
0
        in1 = input[i / sizeof(uint64_t)];
1096
0
        in2 = input[i / sizeof(uint64_t) + 1];
1097
#if BYTE_ORDER == BIG_ENDIAN
1098
        in1 = ZSWAP64(in1);
1099
        in2 = ZSWAP64(in2);
1100
#endif
1101
0
        in1 ^= next1 ^ chorba7 ^ chorba6 ^ chorba5;
1102
0
        in2 ^= next2 ^ chorba8 ^ chorba7 ^ chorba6;
1103
1104
0
        a1 = (in1 << 17) ^ (in1 << 55);
1105
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
1106
0
        a3 = (in1 >> 45) ^ (in1 << 44);
1107
0
        a4 = (in1 >> 20);
1108
1109
0
        b1 = (in2 << 17) ^ (in2 << 55);
1110
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
1111
0
        b3 = (in2 >> 45) ^ (in2 << 44);
1112
0
        b4 = (in2 >> 20);
1113
1114
0
        in3 = input[i / sizeof(uint64_t) + 2];
1115
0
        in4 = input[i / sizeof(uint64_t) + 3];
1116
#if BYTE_ORDER == BIG_ENDIAN
1117
        in3 = ZSWAP64(in3);
1118
        in4 = ZSWAP64(in4);
1119
#endif
1120
0
        in3 ^= next3 ^ a1 ^ chorba8 ^ chorba7;
1121
0
        in4 ^= next4 ^ a2 ^ b1 ^ chorba8;
1122
1123
0
        c1 = (in3 << 17) ^ (in3 << 55);
1124
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
1125
0
        c3 = (in3 >> 45) ^ (in3 << 44);
1126
0
        c4 = (in3 >> 20);
1127
1128
0
        d1 = (in4 << 17) ^ (in4 << 55);
1129
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
1130
0
        d3 = (in4 >> 45) ^ (in4 << 44);
1131
0
        d4 = (in4 >> 20);
1132
1133
0
        out1 = a3 ^ b2 ^ c1;
1134
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
1135
0
        out3 = b4 ^ c3 ^ d2;
1136
0
        out4 = c4 ^ d3;
1137
0
        out5 = d4;
1138
1139
0
        next1 = next5 ^ out1;
1140
0
        next2 = out2;
1141
0
        next3 = out3;
1142
0
        next4 = out4;
1143
0
        next5 = out5;
1144
0
    }
1145
1146
0
    for(; (i + 40 + 32) < len; i += 32) {
1147
0
        uint64_t in1;
1148
0
        uint64_t in2;
1149
0
        uint64_t in3;
1150
0
        uint64_t in4;
1151
0
        uint64_t a1, a2, a3, a4;
1152
0
        uint64_t b1, b2, b3, b4;
1153
0
        uint64_t c1, c2, c3, c4;
1154
0
        uint64_t d1, d2, d3, d4;
1155
1156
0
        uint64_t out1;
1157
0
        uint64_t out2;
1158
0
        uint64_t out3;
1159
0
        uint64_t out4;
1160
0
        uint64_t out5;
1161
1162
0
        in1 = input[i / sizeof(uint64_t)];
1163
0
        in2 = input[i / sizeof(uint64_t) + 1];
1164
#if BYTE_ORDER == BIG_ENDIAN
1165
        in1 = ZSWAP64(in1);
1166
        in2 = ZSWAP64(in2);
1167
#endif
1168
0
        in1 ^=next1;
1169
0
        in2 ^=next2;
1170
1171
0
        a1 = (in1 << 17) ^ (in1 << 55);
1172
0
        a2 = (in1 >> 47) ^ (in1 >> 9) ^ (in1 << 19);
1173
0
        a3 = (in1 >> 45) ^ (in1 << 44);
1174
0
        a4 = (in1 >> 20);
1175
1176
0
        b1 = (in2 << 17) ^ (in2 << 55);
1177
0
        b2 = (in2 >> 47) ^ (in2 >> 9) ^ (in2 << 19);
1178
0
        b3 = (in2 >> 45) ^ (in2 << 44);
1179
0
        b4 = (in2 >> 20);
1180
1181
0
        in3 = input[i / sizeof(uint64_t) + 2];
1182
0
        in4 = input[i / sizeof(uint64_t) + 3];
1183
#if BYTE_ORDER == BIG_ENDIAN
1184
        in3 = ZSWAP64(in3);
1185
        in4 = ZSWAP64(in4);
1186
#endif
1187
0
        in3 ^= next3 ^ a1;
1188
0
        in4 ^= next4 ^ a2 ^ b1;
1189
1190
0
        c1 = (in3 << 17) ^ (in3 << 55);
1191
0
        c2 = (in3 >> 47) ^ (in3 >> 9) ^ (in3 << 19);
1192
0
        c3 = (in3 >> 45) ^ (in3 << 44);
1193
0
        c4 = (in3 >> 20);
1194
1195
0
        d1 = (in4 << 17) ^ (in4 << 55);
1196
0
        d2 = (in4 >> 47) ^ (in4 >> 9) ^ (in4 << 19);
1197
0
        d3 = (in4 >> 45) ^ (in4 << 44);
1198
0
        d4 = (in4 >> 20);
1199
1200
0
        out1 = a3 ^ b2 ^ c1;
1201
0
        out2 = a4 ^ b3 ^ c2 ^ d1;
1202
0
        out3 = b4 ^ c3 ^ d2;
1203
0
        out4 = c4 ^ d3;
1204
0
        out5 = d4;
1205
1206
0
        next1 = next5 ^ out1;
1207
0
        next2 = out2;
1208
0
        next3 = out3;
1209
0
        next4 = out4;
1210
0
        next5 = out5;
1211
0
    }
1212
1213
#if BYTE_ORDER == BIG_ENDIAN
1214
    next1 = ZSWAP64(next1);
1215
    next2 = ZSWAP64(next2);
1216
    next3 = ZSWAP64(next3);
1217
    next4 = ZSWAP64(next4);
1218
    next5 = ZSWAP64(next5);
1219
#endif
1220
1221
0
    memcpy(final, input+(i / sizeof(uint64_t)), len-i);
1222
0
    final[0] ^= next1;
1223
0
    final[1] ^= next2;
1224
0
    final[2] ^= next3;
1225
0
    final[3] ^= next4;
1226
0
    final[4] ^= next5;
1227
1228
0
    crc = crc32_braid_internal(crc, (uint8_t*) final, len-i);
1229
1230
0
    return crc;
1231
0
}
1232
1233
0
Z_INTERNAL uint32_t crc32_chorba_small_nondestructive_32bit (uint32_t crc, const uint32_t* buf, size_t len) {
1234
0
    const uint32_t* input = buf;
1235
0
    uint32_t final[20] = {0};
1236
1237
0
    uint32_t next1 = crc;
1238
0
    crc = 0;
1239
0
    uint32_t next2 = 0;
1240
0
    uint32_t next3 = 0;
1241
0
    uint32_t next4 = 0;
1242
0
    uint32_t next5 = 0;
1243
0
    uint32_t next6 = 0;
1244
0
    uint32_t next7 = 0;
1245
0
    uint32_t next8 = 0;
1246
0
    uint32_t next9 = 0;
1247
0
    uint32_t next10 = 0;
1248
1249
0
    size_t i = 0;
1250
0
    for(; i + 80 < len; i += 40) {
1251
0
        uint32_t in1;
1252
0
        uint32_t in2;
1253
0
        uint32_t in3;
1254
0
        uint32_t in4;
1255
0
        uint32_t in5;
1256
0
        uint32_t in6;
1257
0
        uint32_t in7;
1258
0
        uint32_t in8;
1259
0
        uint32_t in9;
1260
0
        uint32_t in10;
1261
1262
0
        uint32_t a1, a2, a3, a4, a6, a7;
1263
0
        uint32_t b1, b2, b3, b4, b6, b7;
1264
0
        uint32_t c1, c2, c3, c4, c6, c7;
1265
0
        uint32_t d1, d2, d3, d4, d6, d7;
1266
0
        uint32_t e1, e2, e3, e4, e6, e7;
1267
0
        uint32_t f1, f2, f3, f4, f6, f7;
1268
0
        uint32_t g1, g2, g3, g4, g6, g7;
1269
0
        uint32_t h1, h2, h3, h4, h6, h7;
1270
0
        uint32_t i1, i2, i3, i4, i6, i7;
1271
0
        uint32_t j1, j2, j3, j4, j6, j7;
1272
1273
0
        uint32_t out1;
1274
0
        uint32_t out2;
1275
0
        uint32_t out3;
1276
0
        uint32_t out4;
1277
0
        uint32_t out5;
1278
0
        uint32_t out6;
1279
0
        uint32_t out7;
1280
0
        uint32_t out8;
1281
0
        uint32_t out9;
1282
0
        uint32_t out10;
1283
1284
0
        in1 = input[i/sizeof(uint32_t) + 0];
1285
0
        in2 = input[i/sizeof(uint32_t) + 1];
1286
0
        in3 = input[i/sizeof(uint32_t) + 2];
1287
0
        in4 = input[i/sizeof(uint32_t) + 3];
1288
#if BYTE_ORDER == BIG_ENDIAN
1289
        in1 = ZSWAP32(in1);
1290
        in2 = ZSWAP32(in2);
1291
        in3 = ZSWAP32(in3);
1292
        in4 = ZSWAP32(in4);
1293
#endif
1294
0
        in1 ^= next1;
1295
0
        in2 ^= next2;
1296
0
        in3 ^= next3;
1297
0
        in4 ^= next4;
1298
1299
0
        a1 = (in1 << 17);
1300
0
        a2 = (in1 >> 15) ^ (in1 << 23);
1301
0
        a3 = (in1 >> 9) ^ (in1 << 19);
1302
0
        a4 = (in1 >> 13);
1303
0
        a6 = (in1 << 12);
1304
0
        a7 = (in1 >> 20);
1305
1306
0
        b1 = (in2 << 17);
1307
0
        b2 = (in2 >> 15) ^ (in2 << 23);
1308
0
        b3 = (in2 >> 9) ^ (in2 << 19);
1309
0
        b4 = (in2 >> 13);
1310
0
        b6 = (in2 << 12);
1311
0
        b7 = (in2 >> 20);
1312
1313
0
        c1 = (in3 << 17);
1314
0
        c2 = (in3 >> 15) ^ (in3 << 23);
1315
0
        c3 = (in3 >> 9) ^ (in3 << 19);
1316
0
        c4 = (in3 >> 13);
1317
0
        c6 = (in3 << 12);
1318
0
        c7 = (in3 >> 20);
1319
1320
0
        d1 = (in4 << 17);
1321
0
        d2 = (in4 >> 15) ^ (in4 << 23);
1322
0
        d3 = (in4 >> 9) ^ (in4 << 19);
1323
0
        d4 = (in4 >> 13);
1324
0
        d6 = (in4 << 12);
1325
0
        d7 = (in4 >> 20);
1326
1327
0
        in5 = input[i/sizeof(uint32_t) + 4];
1328
0
        in6 = input[i/sizeof(uint32_t) + 5];
1329
0
        in7 = input[i/sizeof(uint32_t) + 6];
1330
0
        in8 = input[i/sizeof(uint32_t) + 7];
1331
#if BYTE_ORDER == BIG_ENDIAN
1332
        in5 = ZSWAP32(in5);
1333
        in6 = ZSWAP32(in6);
1334
        in7 = ZSWAP32(in7);
1335
        in8 = ZSWAP32(in8);
1336
#endif
1337
0
        in5 ^= next5 ^ a1;
1338
0
        in6 ^= next6 ^ a2 ^ b1;
1339
0
        in7 ^= next7 ^ a3 ^ b2 ^ c1;
1340
0
        in8 ^= next8 ^ a4 ^ b3 ^ c2 ^ d1;
1341
1342
0
        e1 = (in5 << 17);
1343
0
        e2 = (in5 >> 15) ^ (in5 << 23);
1344
0
        e3 = (in5 >> 9) ^ (in5 << 19);
1345
0
        e4 = (in5 >> 13);
1346
0
        e6 = (in5 << 12);
1347
0
        e7 = (in5 >> 20);
1348
1349
0
        f1 = (in6 << 17);
1350
0
        f2 = (in6 >> 15) ^ (in6 << 23);
1351
0
        f3 = (in6 >> 9) ^ (in6 << 19);
1352
0
        f4 = (in6 >> 13);
1353
0
        f6 = (in6 << 12);
1354
0
        f7 = (in6 >> 20);
1355
1356
0
        g1 = (in7 << 17);
1357
0
        g2 = (in7 >> 15) ^ (in7 << 23);
1358
0
        g3 = (in7 >> 9) ^ (in7 << 19);
1359
0
        g4 = (in7 >> 13);
1360
0
        g6 = (in7 << 12);
1361
0
        g7 = (in7 >> 20);
1362
1363
0
        h1 = (in8 << 17);
1364
0
        h2 = (in8 >> 15) ^ (in8 << 23);
1365
0
        h3 = (in8 >> 9) ^ (in8 << 19);
1366
0
        h4 = (in8 >> 13);
1367
0
        h6 = (in8 << 12);
1368
0
        h7 = (in8 >> 20);
1369
1370
0
        in9 = input[i/sizeof(uint32_t) + 8];
1371
0
        in10 = input[i/sizeof(uint32_t) + 9];
1372
#if BYTE_ORDER == BIG_ENDIAN
1373
        in9 = ZSWAP32(in9);
1374
        in10 = ZSWAP32(in10);
1375
#endif
1376
0
        in9 ^= next9 ^ b4 ^ c3 ^ d2 ^ e1;
1377
0
        in10 ^= next10 ^ a6 ^ c4 ^ d3 ^ e2 ^ f1;
1378
1379
0
        i1 = (in9 << 17);
1380
0
        i2 = (in9 >> 15) ^ (in9 << 23);
1381
0
        i3 = (in9 >> 9) ^ (in9 << 19);
1382
0
        i4 = (in9 >> 13);
1383
0
        i6 = (in9 << 12);
1384
0
        i7 = (in9 >> 20);
1385
1386
0
        j1 = (in10 << 17);
1387
0
        j2 = (in10 >> 15) ^ (in10 << 23);
1388
0
        j3 = (in10 >> 9) ^ (in10 << 19);
1389
0
        j4 = (in10 >> 13);
1390
0
        j6 = (in10 << 12);
1391
0
        j7 = (in10 >> 20);
1392
1393
0
        out1 = a7 ^ b6 ^ d4 ^ e3 ^ f2 ^ g1;
1394
0
        out2 = b7 ^ c6 ^ e4 ^ f3 ^ g2 ^ h1;
1395
0
        out3 = c7 ^ d6 ^ f4 ^ g3 ^ h2 ^ i1;
1396
0
        out4 = d7 ^ e6 ^ g4 ^ h3 ^ i2 ^ j1;
1397
0
        out5 = e7 ^ f6 ^ h4 ^ i3 ^ j2;
1398
0
        out6 = f7 ^ g6 ^ i4 ^ j3;
1399
0
        out7 = g7 ^ h6 ^ j4;
1400
0
        out8 = h7 ^ i6;
1401
0
        out9 = i7 ^ j6;
1402
0
        out10 = j7;
1403
1404
0
        next1 = out1;
1405
0
        next2 = out2;
1406
0
        next3 = out3;
1407
0
        next4 = out4;
1408
0
        next5 = out5;
1409
0
        next6 = out6;
1410
0
        next7 = out7;
1411
0
        next8 = out8;
1412
0
        next9 = out9;
1413
0
        next10 = out10;
1414
1415
0
    }
1416
#if BYTE_ORDER == BIG_ENDIAN
1417
    next1 = ZSWAP32(next1);
1418
    next2 = ZSWAP32(next2);
1419
    next3 = ZSWAP32(next3);
1420
    next4 = ZSWAP32(next4);
1421
    next5 = ZSWAP32(next5);
1422
    next6 = ZSWAP32(next6);
1423
    next7 = ZSWAP32(next7);
1424
    next8 = ZSWAP32(next8);
1425
    next9 = ZSWAP32(next9);
1426
    next10 = ZSWAP32(next10);
1427
#endif
1428
1429
0
    memcpy(final, input+(i/sizeof(uint32_t)), len-i);
1430
0
    final[0] ^= next1;
1431
0
    final[1] ^= next2;
1432
0
    final[2] ^= next3;
1433
0
    final[3] ^= next4;
1434
0
    final[4] ^= next5;
1435
0
    final[5] ^= next6;
1436
0
    final[6] ^= next7;
1437
0
    final[7] ^= next8;
1438
0
    final[8] ^= next9;
1439
0
    final[9] ^= next10;
1440
1441
0
    crc = crc32_braid_internal(crc, (uint8_t*) final, len-i);
1442
1443
0
    return crc;
1444
0
}