1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements. See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership. The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License. You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied. See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18// This file was modified from its original version for inclusion in parquet-cpp.
19// Original source:
20// https://github.com/lemire/FrameOfReference/blob/6ccaf9e97160f9a3b299e23a8ef739e711ef0c71/src/bpacking.cpp
21// The original copyright notice follows.
22
23// This code is released under the
24// Apache License Version 2.0 http://www.apache.org/licenses/.
25// (c) Daniel Lemire 2013
26
27#ifndef ARROW_UTIL_BPACKING_H
28#define ARROW_UTIL_BPACKING_H
29
30#include "arrow/util/logging.h"
31
32namespace arrow {
33namespace internal {
34
35inline const uint32_t* unpack1_32(const uint32_t* in, uint32_t* out) {
36 *out = ((*in) >> 0) & 1;
37 out++;
38 *out = ((*in) >> 1) & 1;
39 out++;
40 *out = ((*in) >> 2) & 1;
41 out++;
42 *out = ((*in) >> 3) & 1;
43 out++;
44 *out = ((*in) >> 4) & 1;
45 out++;
46 *out = ((*in) >> 5) & 1;
47 out++;
48 *out = ((*in) >> 6) & 1;
49 out++;
50 *out = ((*in) >> 7) & 1;
51 out++;
52 *out = ((*in) >> 8) & 1;
53 out++;
54 *out = ((*in) >> 9) & 1;
55 out++;
56 *out = ((*in) >> 10) & 1;
57 out++;
58 *out = ((*in) >> 11) & 1;
59 out++;
60 *out = ((*in) >> 12) & 1;
61 out++;
62 *out = ((*in) >> 13) & 1;
63 out++;
64 *out = ((*in) >> 14) & 1;
65 out++;
66 *out = ((*in) >> 15) & 1;
67 out++;
68 *out = ((*in) >> 16) & 1;
69 out++;
70 *out = ((*in) >> 17) & 1;
71 out++;
72 *out = ((*in) >> 18) & 1;
73 out++;
74 *out = ((*in) >> 19) & 1;
75 out++;
76 *out = ((*in) >> 20) & 1;
77 out++;
78 *out = ((*in) >> 21) & 1;
79 out++;
80 *out = ((*in) >> 22) & 1;
81 out++;
82 *out = ((*in) >> 23) & 1;
83 out++;
84 *out = ((*in) >> 24) & 1;
85 out++;
86 *out = ((*in) >> 25) & 1;
87 out++;
88 *out = ((*in) >> 26) & 1;
89 out++;
90 *out = ((*in) >> 27) & 1;
91 out++;
92 *out = ((*in) >> 28) & 1;
93 out++;
94 *out = ((*in) >> 29) & 1;
95 out++;
96 *out = ((*in) >> 30) & 1;
97 out++;
98 *out = ((*in) >> 31);
99 ++in;
100 out++;
101
102 return in;
103}
104
105inline const uint32_t* unpack2_32(const uint32_t* in, uint32_t* out) {
106 *out = ((*in) >> 0) % (1U << 2);
107 out++;
108 *out = ((*in) >> 2) % (1U << 2);
109 out++;
110 *out = ((*in) >> 4) % (1U << 2);
111 out++;
112 *out = ((*in) >> 6) % (1U << 2);
113 out++;
114 *out = ((*in) >> 8) % (1U << 2);
115 out++;
116 *out = ((*in) >> 10) % (1U << 2);
117 out++;
118 *out = ((*in) >> 12) % (1U << 2);
119 out++;
120 *out = ((*in) >> 14) % (1U << 2);
121 out++;
122 *out = ((*in) >> 16) % (1U << 2);
123 out++;
124 *out = ((*in) >> 18) % (1U << 2);
125 out++;
126 *out = ((*in) >> 20) % (1U << 2);
127 out++;
128 *out = ((*in) >> 22) % (1U << 2);
129 out++;
130 *out = ((*in) >> 24) % (1U << 2);
131 out++;
132 *out = ((*in) >> 26) % (1U << 2);
133 out++;
134 *out = ((*in) >> 28) % (1U << 2);
135 out++;
136 *out = ((*in) >> 30);
137 ++in;
138 out++;
139 *out = ((*in) >> 0) % (1U << 2);
140 out++;
141 *out = ((*in) >> 2) % (1U << 2);
142 out++;
143 *out = ((*in) >> 4) % (1U << 2);
144 out++;
145 *out = ((*in) >> 6) % (1U << 2);
146 out++;
147 *out = ((*in) >> 8) % (1U << 2);
148 out++;
149 *out = ((*in) >> 10) % (1U << 2);
150 out++;
151 *out = ((*in) >> 12) % (1U << 2);
152 out++;
153 *out = ((*in) >> 14) % (1U << 2);
154 out++;
155 *out = ((*in) >> 16) % (1U << 2);
156 out++;
157 *out = ((*in) >> 18) % (1U << 2);
158 out++;
159 *out = ((*in) >> 20) % (1U << 2);
160 out++;
161 *out = ((*in) >> 22) % (1U << 2);
162 out++;
163 *out = ((*in) >> 24) % (1U << 2);
164 out++;
165 *out = ((*in) >> 26) % (1U << 2);
166 out++;
167 *out = ((*in) >> 28) % (1U << 2);
168 out++;
169 *out = ((*in) >> 30);
170 ++in;
171 out++;
172
173 return in;
174}
175
176inline const uint32_t* unpack3_32(const uint32_t* in, uint32_t* out) {
177 *out = ((*in) >> 0) % (1U << 3);
178 out++;
179 *out = ((*in) >> 3) % (1U << 3);
180 out++;
181 *out = ((*in) >> 6) % (1U << 3);
182 out++;
183 *out = ((*in) >> 9) % (1U << 3);
184 out++;
185 *out = ((*in) >> 12) % (1U << 3);
186 out++;
187 *out = ((*in) >> 15) % (1U << 3);
188 out++;
189 *out = ((*in) >> 18) % (1U << 3);
190 out++;
191 *out = ((*in) >> 21) % (1U << 3);
192 out++;
193 *out = ((*in) >> 24) % (1U << 3);
194 out++;
195 *out = ((*in) >> 27) % (1U << 3);
196 out++;
197 *out = ((*in) >> 30);
198 ++in;
199 *out |= ((*in) % (1U << 1)) << (3 - 1);
200 out++;
201 *out = ((*in) >> 1) % (1U << 3);
202 out++;
203 *out = ((*in) >> 4) % (1U << 3);
204 out++;
205 *out = ((*in) >> 7) % (1U << 3);
206 out++;
207 *out = ((*in) >> 10) % (1U << 3);
208 out++;
209 *out = ((*in) >> 13) % (1U << 3);
210 out++;
211 *out = ((*in) >> 16) % (1U << 3);
212 out++;
213 *out = ((*in) >> 19) % (1U << 3);
214 out++;
215 *out = ((*in) >> 22) % (1U << 3);
216 out++;
217 *out = ((*in) >> 25) % (1U << 3);
218 out++;
219 *out = ((*in) >> 28) % (1U << 3);
220 out++;
221 *out = ((*in) >> 31);
222 ++in;
223 *out |= ((*in) % (1U << 2)) << (3 - 2);
224 out++;
225 *out = ((*in) >> 2) % (1U << 3);
226 out++;
227 *out = ((*in) >> 5) % (1U << 3);
228 out++;
229 *out = ((*in) >> 8) % (1U << 3);
230 out++;
231 *out = ((*in) >> 11) % (1U << 3);
232 out++;
233 *out = ((*in) >> 14) % (1U << 3);
234 out++;
235 *out = ((*in) >> 17) % (1U << 3);
236 out++;
237 *out = ((*in) >> 20) % (1U << 3);
238 out++;
239 *out = ((*in) >> 23) % (1U << 3);
240 out++;
241 *out = ((*in) >> 26) % (1U << 3);
242 out++;
243 *out = ((*in) >> 29);
244 ++in;
245 out++;
246
247 return in;
248}
249
250inline const uint32_t* unpack4_32(const uint32_t* in, uint32_t* out) {
251 *out = ((*in) >> 0) % (1U << 4);
252 out++;
253 *out = ((*in) >> 4) % (1U << 4);
254 out++;
255 *out = ((*in) >> 8) % (1U << 4);
256 out++;
257 *out = ((*in) >> 12) % (1U << 4);
258 out++;
259 *out = ((*in) >> 16) % (1U << 4);
260 out++;
261 *out = ((*in) >> 20) % (1U << 4);
262 out++;
263 *out = ((*in) >> 24) % (1U << 4);
264 out++;
265 *out = ((*in) >> 28);
266 ++in;
267 out++;
268 *out = ((*in) >> 0) % (1U << 4);
269 out++;
270 *out = ((*in) >> 4) % (1U << 4);
271 out++;
272 *out = ((*in) >> 8) % (1U << 4);
273 out++;
274 *out = ((*in) >> 12) % (1U << 4);
275 out++;
276 *out = ((*in) >> 16) % (1U << 4);
277 out++;
278 *out = ((*in) >> 20) % (1U << 4);
279 out++;
280 *out = ((*in) >> 24) % (1U << 4);
281 out++;
282 *out = ((*in) >> 28);
283 ++in;
284 out++;
285 *out = ((*in) >> 0) % (1U << 4);
286 out++;
287 *out = ((*in) >> 4) % (1U << 4);
288 out++;
289 *out = ((*in) >> 8) % (1U << 4);
290 out++;
291 *out = ((*in) >> 12) % (1U << 4);
292 out++;
293 *out = ((*in) >> 16) % (1U << 4);
294 out++;
295 *out = ((*in) >> 20) % (1U << 4);
296 out++;
297 *out = ((*in) >> 24) % (1U << 4);
298 out++;
299 *out = ((*in) >> 28);
300 ++in;
301 out++;
302 *out = ((*in) >> 0) % (1U << 4);
303 out++;
304 *out = ((*in) >> 4) % (1U << 4);
305 out++;
306 *out = ((*in) >> 8) % (1U << 4);
307 out++;
308 *out = ((*in) >> 12) % (1U << 4);
309 out++;
310 *out = ((*in) >> 16) % (1U << 4);
311 out++;
312 *out = ((*in) >> 20) % (1U << 4);
313 out++;
314 *out = ((*in) >> 24) % (1U << 4);
315 out++;
316 *out = ((*in) >> 28);
317 ++in;
318 out++;
319
320 return in;
321}
322
323inline const uint32_t* unpack5_32(const uint32_t* in, uint32_t* out) {
324 *out = ((*in) >> 0) % (1U << 5);
325 out++;
326 *out = ((*in) >> 5) % (1U << 5);
327 out++;
328 *out = ((*in) >> 10) % (1U << 5);
329 out++;
330 *out = ((*in) >> 15) % (1U << 5);
331 out++;
332 *out = ((*in) >> 20) % (1U << 5);
333 out++;
334 *out = ((*in) >> 25) % (1U << 5);
335 out++;
336 *out = ((*in) >> 30);
337 ++in;
338 *out |= ((*in) % (1U << 3)) << (5 - 3);
339 out++;
340 *out = ((*in) >> 3) % (1U << 5);
341 out++;
342 *out = ((*in) >> 8) % (1U << 5);
343 out++;
344 *out = ((*in) >> 13) % (1U << 5);
345 out++;
346 *out = ((*in) >> 18) % (1U << 5);
347 out++;
348 *out = ((*in) >> 23) % (1U << 5);
349 out++;
350 *out = ((*in) >> 28);
351 ++in;
352 *out |= ((*in) % (1U << 1)) << (5 - 1);
353 out++;
354 *out = ((*in) >> 1) % (1U << 5);
355 out++;
356 *out = ((*in) >> 6) % (1U << 5);
357 out++;
358 *out = ((*in) >> 11) % (1U << 5);
359 out++;
360 *out = ((*in) >> 16) % (1U << 5);
361 out++;
362 *out = ((*in) >> 21) % (1U << 5);
363 out++;
364 *out = ((*in) >> 26) % (1U << 5);
365 out++;
366 *out = ((*in) >> 31);
367 ++in;
368 *out |= ((*in) % (1U << 4)) << (5 - 4);
369 out++;
370 *out = ((*in) >> 4) % (1U << 5);
371 out++;
372 *out = ((*in) >> 9) % (1U << 5);
373 out++;
374 *out = ((*in) >> 14) % (1U << 5);
375 out++;
376 *out = ((*in) >> 19) % (1U << 5);
377 out++;
378 *out = ((*in) >> 24) % (1U << 5);
379 out++;
380 *out = ((*in) >> 29);
381 ++in;
382 *out |= ((*in) % (1U << 2)) << (5 - 2);
383 out++;
384 *out = ((*in) >> 2) % (1U << 5);
385 out++;
386 *out = ((*in) >> 7) % (1U << 5);
387 out++;
388 *out = ((*in) >> 12) % (1U << 5);
389 out++;
390 *out = ((*in) >> 17) % (1U << 5);
391 out++;
392 *out = ((*in) >> 22) % (1U << 5);
393 out++;
394 *out = ((*in) >> 27);
395 ++in;
396 out++;
397
398 return in;
399}
400
401inline const uint32_t* unpack6_32(const uint32_t* in, uint32_t* out) {
402 *out = ((*in) >> 0) % (1U << 6);
403 out++;
404 *out = ((*in) >> 6) % (1U << 6);
405 out++;
406 *out = ((*in) >> 12) % (1U << 6);
407 out++;
408 *out = ((*in) >> 18) % (1U << 6);
409 out++;
410 *out = ((*in) >> 24) % (1U << 6);
411 out++;
412 *out = ((*in) >> 30);
413 ++in;
414 *out |= ((*in) % (1U << 4)) << (6 - 4);
415 out++;
416 *out = ((*in) >> 4) % (1U << 6);
417 out++;
418 *out = ((*in) >> 10) % (1U << 6);
419 out++;
420 *out = ((*in) >> 16) % (1U << 6);
421 out++;
422 *out = ((*in) >> 22) % (1U << 6);
423 out++;
424 *out = ((*in) >> 28);
425 ++in;
426 *out |= ((*in) % (1U << 2)) << (6 - 2);
427 out++;
428 *out = ((*in) >> 2) % (1U << 6);
429 out++;
430 *out = ((*in) >> 8) % (1U << 6);
431 out++;
432 *out = ((*in) >> 14) % (1U << 6);
433 out++;
434 *out = ((*in) >> 20) % (1U << 6);
435 out++;
436 *out = ((*in) >> 26);
437 ++in;
438 out++;
439 *out = ((*in) >> 0) % (1U << 6);
440 out++;
441 *out = ((*in) >> 6) % (1U << 6);
442 out++;
443 *out = ((*in) >> 12) % (1U << 6);
444 out++;
445 *out = ((*in) >> 18) % (1U << 6);
446 out++;
447 *out = ((*in) >> 24) % (1U << 6);
448 out++;
449 *out = ((*in) >> 30);
450 ++in;
451 *out |= ((*in) % (1U << 4)) << (6 - 4);
452 out++;
453 *out = ((*in) >> 4) % (1U << 6);
454 out++;
455 *out = ((*in) >> 10) % (1U << 6);
456 out++;
457 *out = ((*in) >> 16) % (1U << 6);
458 out++;
459 *out = ((*in) >> 22) % (1U << 6);
460 out++;
461 *out = ((*in) >> 28);
462 ++in;
463 *out |= ((*in) % (1U << 2)) << (6 - 2);
464 out++;
465 *out = ((*in) >> 2) % (1U << 6);
466 out++;
467 *out = ((*in) >> 8) % (1U << 6);
468 out++;
469 *out = ((*in) >> 14) % (1U << 6);
470 out++;
471 *out = ((*in) >> 20) % (1U << 6);
472 out++;
473 *out = ((*in) >> 26);
474 ++in;
475 out++;
476
477 return in;
478}
479
480inline const uint32_t* unpack7_32(const uint32_t* in, uint32_t* out) {
481 *out = ((*in) >> 0) % (1U << 7);
482 out++;
483 *out = ((*in) >> 7) % (1U << 7);
484 out++;
485 *out = ((*in) >> 14) % (1U << 7);
486 out++;
487 *out = ((*in) >> 21) % (1U << 7);
488 out++;
489 *out = ((*in) >> 28);
490 ++in;
491 *out |= ((*in) % (1U << 3)) << (7 - 3);
492 out++;
493 *out = ((*in) >> 3) % (1U << 7);
494 out++;
495 *out = ((*in) >> 10) % (1U << 7);
496 out++;
497 *out = ((*in) >> 17) % (1U << 7);
498 out++;
499 *out = ((*in) >> 24) % (1U << 7);
500 out++;
501 *out = ((*in) >> 31);
502 ++in;
503 *out |= ((*in) % (1U << 6)) << (7 - 6);
504 out++;
505 *out = ((*in) >> 6) % (1U << 7);
506 out++;
507 *out = ((*in) >> 13) % (1U << 7);
508 out++;
509 *out = ((*in) >> 20) % (1U << 7);
510 out++;
511 *out = ((*in) >> 27);
512 ++in;
513 *out |= ((*in) % (1U << 2)) << (7 - 2);
514 out++;
515 *out = ((*in) >> 2) % (1U << 7);
516 out++;
517 *out = ((*in) >> 9) % (1U << 7);
518 out++;
519 *out = ((*in) >> 16) % (1U << 7);
520 out++;
521 *out = ((*in) >> 23) % (1U << 7);
522 out++;
523 *out = ((*in) >> 30);
524 ++in;
525 *out |= ((*in) % (1U << 5)) << (7 - 5);
526 out++;
527 *out = ((*in) >> 5) % (1U << 7);
528 out++;
529 *out = ((*in) >> 12) % (1U << 7);
530 out++;
531 *out = ((*in) >> 19) % (1U << 7);
532 out++;
533 *out = ((*in) >> 26);
534 ++in;
535 *out |= ((*in) % (1U << 1)) << (7 - 1);
536 out++;
537 *out = ((*in) >> 1) % (1U << 7);
538 out++;
539 *out = ((*in) >> 8) % (1U << 7);
540 out++;
541 *out = ((*in) >> 15) % (1U << 7);
542 out++;
543 *out = ((*in) >> 22) % (1U << 7);
544 out++;
545 *out = ((*in) >> 29);
546 ++in;
547 *out |= ((*in) % (1U << 4)) << (7 - 4);
548 out++;
549 *out = ((*in) >> 4) % (1U << 7);
550 out++;
551 *out = ((*in) >> 11) % (1U << 7);
552 out++;
553 *out = ((*in) >> 18) % (1U << 7);
554 out++;
555 *out = ((*in) >> 25);
556 ++in;
557 out++;
558
559 return in;
560}
561
562inline const uint32_t* unpack8_32(const uint32_t* in, uint32_t* out) {
563 *out = ((*in) >> 0) % (1U << 8);
564 out++;
565 *out = ((*in) >> 8) % (1U << 8);
566 out++;
567 *out = ((*in) >> 16) % (1U << 8);
568 out++;
569 *out = ((*in) >> 24);
570 ++in;
571 out++;
572 *out = ((*in) >> 0) % (1U << 8);
573 out++;
574 *out = ((*in) >> 8) % (1U << 8);
575 out++;
576 *out = ((*in) >> 16) % (1U << 8);
577 out++;
578 *out = ((*in) >> 24);
579 ++in;
580 out++;
581 *out = ((*in) >> 0) % (1U << 8);
582 out++;
583 *out = ((*in) >> 8) % (1U << 8);
584 out++;
585 *out = ((*in) >> 16) % (1U << 8);
586 out++;
587 *out = ((*in) >> 24);
588 ++in;
589 out++;
590 *out = ((*in) >> 0) % (1U << 8);
591 out++;
592 *out = ((*in) >> 8) % (1U << 8);
593 out++;
594 *out = ((*in) >> 16) % (1U << 8);
595 out++;
596 *out = ((*in) >> 24);
597 ++in;
598 out++;
599 *out = ((*in) >> 0) % (1U << 8);
600 out++;
601 *out = ((*in) >> 8) % (1U << 8);
602 out++;
603 *out = ((*in) >> 16) % (1U << 8);
604 out++;
605 *out = ((*in) >> 24);
606 ++in;
607 out++;
608 *out = ((*in) >> 0) % (1U << 8);
609 out++;
610 *out = ((*in) >> 8) % (1U << 8);
611 out++;
612 *out = ((*in) >> 16) % (1U << 8);
613 out++;
614 *out = ((*in) >> 24);
615 ++in;
616 out++;
617 *out = ((*in) >> 0) % (1U << 8);
618 out++;
619 *out = ((*in) >> 8) % (1U << 8);
620 out++;
621 *out = ((*in) >> 16) % (1U << 8);
622 out++;
623 *out = ((*in) >> 24);
624 ++in;
625 out++;
626 *out = ((*in) >> 0) % (1U << 8);
627 out++;
628 *out = ((*in) >> 8) % (1U << 8);
629 out++;
630 *out = ((*in) >> 16) % (1U << 8);
631 out++;
632 *out = ((*in) >> 24);
633 ++in;
634 out++;
635
636 return in;
637}
638
639inline const uint32_t* unpack9_32(const uint32_t* in, uint32_t* out) {
640 *out = ((*in) >> 0) % (1U << 9);
641 out++;
642 *out = ((*in) >> 9) % (1U << 9);
643 out++;
644 *out = ((*in) >> 18) % (1U << 9);
645 out++;
646 *out = ((*in) >> 27);
647 ++in;
648 *out |= ((*in) % (1U << 4)) << (9 - 4);
649 out++;
650 *out = ((*in) >> 4) % (1U << 9);
651 out++;
652 *out = ((*in) >> 13) % (1U << 9);
653 out++;
654 *out = ((*in) >> 22) % (1U << 9);
655 out++;
656 *out = ((*in) >> 31);
657 ++in;
658 *out |= ((*in) % (1U << 8)) << (9 - 8);
659 out++;
660 *out = ((*in) >> 8) % (1U << 9);
661 out++;
662 *out = ((*in) >> 17) % (1U << 9);
663 out++;
664 *out = ((*in) >> 26);
665 ++in;
666 *out |= ((*in) % (1U << 3)) << (9 - 3);
667 out++;
668 *out = ((*in) >> 3) % (1U << 9);
669 out++;
670 *out = ((*in) >> 12) % (1U << 9);
671 out++;
672 *out = ((*in) >> 21) % (1U << 9);
673 out++;
674 *out = ((*in) >> 30);
675 ++in;
676 *out |= ((*in) % (1U << 7)) << (9 - 7);
677 out++;
678 *out = ((*in) >> 7) % (1U << 9);
679 out++;
680 *out = ((*in) >> 16) % (1U << 9);
681 out++;
682 *out = ((*in) >> 25);
683 ++in;
684 *out |= ((*in) % (1U << 2)) << (9 - 2);
685 out++;
686 *out = ((*in) >> 2) % (1U << 9);
687 out++;
688 *out = ((*in) >> 11) % (1U << 9);
689 out++;
690 *out = ((*in) >> 20) % (1U << 9);
691 out++;
692 *out = ((*in) >> 29);
693 ++in;
694 *out |= ((*in) % (1U << 6)) << (9 - 6);
695 out++;
696 *out = ((*in) >> 6) % (1U << 9);
697 out++;
698 *out = ((*in) >> 15) % (1U << 9);
699 out++;
700 *out = ((*in) >> 24);
701 ++in;
702 *out |= ((*in) % (1U << 1)) << (9 - 1);
703 out++;
704 *out = ((*in) >> 1) % (1U << 9);
705 out++;
706 *out = ((*in) >> 10) % (1U << 9);
707 out++;
708 *out = ((*in) >> 19) % (1U << 9);
709 out++;
710 *out = ((*in) >> 28);
711 ++in;
712 *out |= ((*in) % (1U << 5)) << (9 - 5);
713 out++;
714 *out = ((*in) >> 5) % (1U << 9);
715 out++;
716 *out = ((*in) >> 14) % (1U << 9);
717 out++;
718 *out = ((*in) >> 23);
719 ++in;
720 out++;
721
722 return in;
723}
724
725inline const uint32_t* unpack10_32(const uint32_t* in, uint32_t* out) {
726 *out = ((*in) >> 0) % (1U << 10);
727 out++;
728 *out = ((*in) >> 10) % (1U << 10);
729 out++;
730 *out = ((*in) >> 20) % (1U << 10);
731 out++;
732 *out = ((*in) >> 30);
733 ++in;
734 *out |= ((*in) % (1U << 8)) << (10 - 8);
735 out++;
736 *out = ((*in) >> 8) % (1U << 10);
737 out++;
738 *out = ((*in) >> 18) % (1U << 10);
739 out++;
740 *out = ((*in) >> 28);
741 ++in;
742 *out |= ((*in) % (1U << 6)) << (10 - 6);
743 out++;
744 *out = ((*in) >> 6) % (1U << 10);
745 out++;
746 *out = ((*in) >> 16) % (1U << 10);
747 out++;
748 *out = ((*in) >> 26);
749 ++in;
750 *out |= ((*in) % (1U << 4)) << (10 - 4);
751 out++;
752 *out = ((*in) >> 4) % (1U << 10);
753 out++;
754 *out = ((*in) >> 14) % (1U << 10);
755 out++;
756 *out = ((*in) >> 24);
757 ++in;
758 *out |= ((*in) % (1U << 2)) << (10 - 2);
759 out++;
760 *out = ((*in) >> 2) % (1U << 10);
761 out++;
762 *out = ((*in) >> 12) % (1U << 10);
763 out++;
764 *out = ((*in) >> 22);
765 ++in;
766 out++;
767 *out = ((*in) >> 0) % (1U << 10);
768 out++;
769 *out = ((*in) >> 10) % (1U << 10);
770 out++;
771 *out = ((*in) >> 20) % (1U << 10);
772 out++;
773 *out = ((*in) >> 30);
774 ++in;
775 *out |= ((*in) % (1U << 8)) << (10 - 8);
776 out++;
777 *out = ((*in) >> 8) % (1U << 10);
778 out++;
779 *out = ((*in) >> 18) % (1U << 10);
780 out++;
781 *out = ((*in) >> 28);
782 ++in;
783 *out |= ((*in) % (1U << 6)) << (10 - 6);
784 out++;
785 *out = ((*in) >> 6) % (1U << 10);
786 out++;
787 *out = ((*in) >> 16) % (1U << 10);
788 out++;
789 *out = ((*in) >> 26);
790 ++in;
791 *out |= ((*in) % (1U << 4)) << (10 - 4);
792 out++;
793 *out = ((*in) >> 4) % (1U << 10);
794 out++;
795 *out = ((*in) >> 14) % (1U << 10);
796 out++;
797 *out = ((*in) >> 24);
798 ++in;
799 *out |= ((*in) % (1U << 2)) << (10 - 2);
800 out++;
801 *out = ((*in) >> 2) % (1U << 10);
802 out++;
803 *out = ((*in) >> 12) % (1U << 10);
804 out++;
805 *out = ((*in) >> 22);
806 ++in;
807 out++;
808
809 return in;
810}
811
812inline const uint32_t* unpack11_32(const uint32_t* in, uint32_t* out) {
813 *out = ((*in) >> 0) % (1U << 11);
814 out++;
815 *out = ((*in) >> 11) % (1U << 11);
816 out++;
817 *out = ((*in) >> 22);
818 ++in;
819 *out |= ((*in) % (1U << 1)) << (11 - 1);
820 out++;
821 *out = ((*in) >> 1) % (1U << 11);
822 out++;
823 *out = ((*in) >> 12) % (1U << 11);
824 out++;
825 *out = ((*in) >> 23);
826 ++in;
827 *out |= ((*in) % (1U << 2)) << (11 - 2);
828 out++;
829 *out = ((*in) >> 2) % (1U << 11);
830 out++;
831 *out = ((*in) >> 13) % (1U << 11);
832 out++;
833 *out = ((*in) >> 24);
834 ++in;
835 *out |= ((*in) % (1U << 3)) << (11 - 3);
836 out++;
837 *out = ((*in) >> 3) % (1U << 11);
838 out++;
839 *out = ((*in) >> 14) % (1U << 11);
840 out++;
841 *out = ((*in) >> 25);
842 ++in;
843 *out |= ((*in) % (1U << 4)) << (11 - 4);
844 out++;
845 *out = ((*in) >> 4) % (1U << 11);
846 out++;
847 *out = ((*in) >> 15) % (1U << 11);
848 out++;
849 *out = ((*in) >> 26);
850 ++in;
851 *out |= ((*in) % (1U << 5)) << (11 - 5);
852 out++;
853 *out = ((*in) >> 5) % (1U << 11);
854 out++;
855 *out = ((*in) >> 16) % (1U << 11);
856 out++;
857 *out = ((*in) >> 27);
858 ++in;
859 *out |= ((*in) % (1U << 6)) << (11 - 6);
860 out++;
861 *out = ((*in) >> 6) % (1U << 11);
862 out++;
863 *out = ((*in) >> 17) % (1U << 11);
864 out++;
865 *out = ((*in) >> 28);
866 ++in;
867 *out |= ((*in) % (1U << 7)) << (11 - 7);
868 out++;
869 *out = ((*in) >> 7) % (1U << 11);
870 out++;
871 *out = ((*in) >> 18) % (1U << 11);
872 out++;
873 *out = ((*in) >> 29);
874 ++in;
875 *out |= ((*in) % (1U << 8)) << (11 - 8);
876 out++;
877 *out = ((*in) >> 8) % (1U << 11);
878 out++;
879 *out = ((*in) >> 19) % (1U << 11);
880 out++;
881 *out = ((*in) >> 30);
882 ++in;
883 *out |= ((*in) % (1U << 9)) << (11 - 9);
884 out++;
885 *out = ((*in) >> 9) % (1U << 11);
886 out++;
887 *out = ((*in) >> 20) % (1U << 11);
888 out++;
889 *out = ((*in) >> 31);
890 ++in;
891 *out |= ((*in) % (1U << 10)) << (11 - 10);
892 out++;
893 *out = ((*in) >> 10) % (1U << 11);
894 out++;
895 *out = ((*in) >> 21);
896 ++in;
897 out++;
898
899 return in;
900}
901
902inline const uint32_t* unpack12_32(const uint32_t* in, uint32_t* out) {
903 *out = ((*in) >> 0) % (1U << 12);
904 out++;
905 *out = ((*in) >> 12) % (1U << 12);
906 out++;
907 *out = ((*in) >> 24);
908 ++in;
909 *out |= ((*in) % (1U << 4)) << (12 - 4);
910 out++;
911 *out = ((*in) >> 4) % (1U << 12);
912 out++;
913 *out = ((*in) >> 16) % (1U << 12);
914 out++;
915 *out = ((*in) >> 28);
916 ++in;
917 *out |= ((*in) % (1U << 8)) << (12 - 8);
918 out++;
919 *out = ((*in) >> 8) % (1U << 12);
920 out++;
921 *out = ((*in) >> 20);
922 ++in;
923 out++;
924 *out = ((*in) >> 0) % (1U << 12);
925 out++;
926 *out = ((*in) >> 12) % (1U << 12);
927 out++;
928 *out = ((*in) >> 24);
929 ++in;
930 *out |= ((*in) % (1U << 4)) << (12 - 4);
931 out++;
932 *out = ((*in) >> 4) % (1U << 12);
933 out++;
934 *out = ((*in) >> 16) % (1U << 12);
935 out++;
936 *out = ((*in) >> 28);
937 ++in;
938 *out |= ((*in) % (1U << 8)) << (12 - 8);
939 out++;
940 *out = ((*in) >> 8) % (1U << 12);
941 out++;
942 *out = ((*in) >> 20);
943 ++in;
944 out++;
945 *out = ((*in) >> 0) % (1U << 12);
946 out++;
947 *out = ((*in) >> 12) % (1U << 12);
948 out++;
949 *out = ((*in) >> 24);
950 ++in;
951 *out |= ((*in) % (1U << 4)) << (12 - 4);
952 out++;
953 *out = ((*in) >> 4) % (1U << 12);
954 out++;
955 *out = ((*in) >> 16) % (1U << 12);
956 out++;
957 *out = ((*in) >> 28);
958 ++in;
959 *out |= ((*in) % (1U << 8)) << (12 - 8);
960 out++;
961 *out = ((*in) >> 8) % (1U << 12);
962 out++;
963 *out = ((*in) >> 20);
964 ++in;
965 out++;
966 *out = ((*in) >> 0) % (1U << 12);
967 out++;
968 *out = ((*in) >> 12) % (1U << 12);
969 out++;
970 *out = ((*in) >> 24);
971 ++in;
972 *out |= ((*in) % (1U << 4)) << (12 - 4);
973 out++;
974 *out = ((*in) >> 4) % (1U << 12);
975 out++;
976 *out = ((*in) >> 16) % (1U << 12);
977 out++;
978 *out = ((*in) >> 28);
979 ++in;
980 *out |= ((*in) % (1U << 8)) << (12 - 8);
981 out++;
982 *out = ((*in) >> 8) % (1U << 12);
983 out++;
984 *out = ((*in) >> 20);
985 ++in;
986 out++;
987
988 return in;
989}
990
991inline const uint32_t* unpack13_32(const uint32_t* in, uint32_t* out) {
992 *out = ((*in) >> 0) % (1U << 13);
993 out++;
994 *out = ((*in) >> 13) % (1U << 13);
995 out++;
996 *out = ((*in) >> 26);
997 ++in;
998 *out |= ((*in) % (1U << 7)) << (13 - 7);
999 out++;
1000 *out = ((*in) >> 7) % (1U << 13);
1001 out++;
1002 *out = ((*in) >> 20);
1003 ++in;
1004 *out |= ((*in) % (1U << 1)) << (13 - 1);
1005 out++;
1006 *out = ((*in) >> 1) % (1U << 13);
1007 out++;
1008 *out = ((*in) >> 14) % (1U << 13);
1009 out++;
1010 *out = ((*in) >> 27);
1011 ++in;
1012 *out |= ((*in) % (1U << 8)) << (13 - 8);
1013 out++;
1014 *out = ((*in) >> 8) % (1U << 13);
1015 out++;
1016 *out = ((*in) >> 21);
1017 ++in;
1018 *out |= ((*in) % (1U << 2)) << (13 - 2);
1019 out++;
1020 *out = ((*in) >> 2) % (1U << 13);
1021 out++;
1022 *out = ((*in) >> 15) % (1U << 13);
1023 out++;
1024 *out = ((*in) >> 28);
1025 ++in;
1026 *out |= ((*in) % (1U << 9)) << (13 - 9);
1027 out++;
1028 *out = ((*in) >> 9) % (1U << 13);
1029 out++;
1030 *out = ((*in) >> 22);
1031 ++in;
1032 *out |= ((*in) % (1U << 3)) << (13 - 3);
1033 out++;
1034 *out = ((*in) >> 3) % (1U << 13);
1035 out++;
1036 *out = ((*in) >> 16) % (1U << 13);
1037 out++;
1038 *out = ((*in) >> 29);
1039 ++in;
1040 *out |= ((*in) % (1U << 10)) << (13 - 10);
1041 out++;
1042 *out = ((*in) >> 10) % (1U << 13);
1043 out++;
1044 *out = ((*in) >> 23);
1045 ++in;
1046 *out |= ((*in) % (1U << 4)) << (13 - 4);
1047 out++;
1048 *out = ((*in) >> 4) % (1U << 13);
1049 out++;
1050 *out = ((*in) >> 17) % (1U << 13);
1051 out++;
1052 *out = ((*in) >> 30);
1053 ++in;
1054 *out |= ((*in) % (1U << 11)) << (13 - 11);
1055 out++;
1056 *out = ((*in) >> 11) % (1U << 13);
1057 out++;
1058 *out = ((*in) >> 24);
1059 ++in;
1060 *out |= ((*in) % (1U << 5)) << (13 - 5);
1061 out++;
1062 *out = ((*in) >> 5) % (1U << 13);
1063 out++;
1064 *out = ((*in) >> 18) % (1U << 13);
1065 out++;
1066 *out = ((*in) >> 31);
1067 ++in;
1068 *out |= ((*in) % (1U << 12)) << (13 - 12);
1069 out++;
1070 *out = ((*in) >> 12) % (1U << 13);
1071 out++;
1072 *out = ((*in) >> 25);
1073 ++in;
1074 *out |= ((*in) % (1U << 6)) << (13 - 6);
1075 out++;
1076 *out = ((*in) >> 6) % (1U << 13);
1077 out++;
1078 *out = ((*in) >> 19);
1079 ++in;
1080 out++;
1081
1082 return in;
1083}
1084
1085inline const uint32_t* unpack14_32(const uint32_t* in, uint32_t* out) {
1086 *out = ((*in) >> 0) % (1U << 14);
1087 out++;
1088 *out = ((*in) >> 14) % (1U << 14);
1089 out++;
1090 *out = ((*in) >> 28);
1091 ++in;
1092 *out |= ((*in) % (1U << 10)) << (14 - 10);
1093 out++;
1094 *out = ((*in) >> 10) % (1U << 14);
1095 out++;
1096 *out = ((*in) >> 24);
1097 ++in;
1098 *out |= ((*in) % (1U << 6)) << (14 - 6);
1099 out++;
1100 *out = ((*in) >> 6) % (1U << 14);
1101 out++;
1102 *out = ((*in) >> 20);
1103 ++in;
1104 *out |= ((*in) % (1U << 2)) << (14 - 2);
1105 out++;
1106 *out = ((*in) >> 2) % (1U << 14);
1107 out++;
1108 *out = ((*in) >> 16) % (1U << 14);
1109 out++;
1110 *out = ((*in) >> 30);
1111 ++in;
1112 *out |= ((*in) % (1U << 12)) << (14 - 12);
1113 out++;
1114 *out = ((*in) >> 12) % (1U << 14);
1115 out++;
1116 *out = ((*in) >> 26);
1117 ++in;
1118 *out |= ((*in) % (1U << 8)) << (14 - 8);
1119 out++;
1120 *out = ((*in) >> 8) % (1U << 14);
1121 out++;
1122 *out = ((*in) >> 22);
1123 ++in;
1124 *out |= ((*in) % (1U << 4)) << (14 - 4);
1125 out++;
1126 *out = ((*in) >> 4) % (1U << 14);
1127 out++;
1128 *out = ((*in) >> 18);
1129 ++in;
1130 out++;
1131 *out = ((*in) >> 0) % (1U << 14);
1132 out++;
1133 *out = ((*in) >> 14) % (1U << 14);
1134 out++;
1135 *out = ((*in) >> 28);
1136 ++in;
1137 *out |= ((*in) % (1U << 10)) << (14 - 10);
1138 out++;
1139 *out = ((*in) >> 10) % (1U << 14);
1140 out++;
1141 *out = ((*in) >> 24);
1142 ++in;
1143 *out |= ((*in) % (1U << 6)) << (14 - 6);
1144 out++;
1145 *out = ((*in) >> 6) % (1U << 14);
1146 out++;
1147 *out = ((*in) >> 20);
1148 ++in;
1149 *out |= ((*in) % (1U << 2)) << (14 - 2);
1150 out++;
1151 *out = ((*in) >> 2) % (1U << 14);
1152 out++;
1153 *out = ((*in) >> 16) % (1U << 14);
1154 out++;
1155 *out = ((*in) >> 30);
1156 ++in;
1157 *out |= ((*in) % (1U << 12)) << (14 - 12);
1158 out++;
1159 *out = ((*in) >> 12) % (1U << 14);
1160 out++;
1161 *out = ((*in) >> 26);
1162 ++in;
1163 *out |= ((*in) % (1U << 8)) << (14 - 8);
1164 out++;
1165 *out = ((*in) >> 8) % (1U << 14);
1166 out++;
1167 *out = ((*in) >> 22);
1168 ++in;
1169 *out |= ((*in) % (1U << 4)) << (14 - 4);
1170 out++;
1171 *out = ((*in) >> 4) % (1U << 14);
1172 out++;
1173 *out = ((*in) >> 18);
1174 ++in;
1175 out++;
1176
1177 return in;
1178}
1179
1180inline const uint32_t* unpack15_32(const uint32_t* in, uint32_t* out) {
1181 *out = ((*in) >> 0) % (1U << 15);
1182 out++;
1183 *out = ((*in) >> 15) % (1U << 15);
1184 out++;
1185 *out = ((*in) >> 30);
1186 ++in;
1187 *out |= ((*in) % (1U << 13)) << (15 - 13);
1188 out++;
1189 *out = ((*in) >> 13) % (1U << 15);
1190 out++;
1191 *out = ((*in) >> 28);
1192 ++in;
1193 *out |= ((*in) % (1U << 11)) << (15 - 11);
1194 out++;
1195 *out = ((*in) >> 11) % (1U << 15);
1196 out++;
1197 *out = ((*in) >> 26);
1198 ++in;
1199 *out |= ((*in) % (1U << 9)) << (15 - 9);
1200 out++;
1201 *out = ((*in) >> 9) % (1U << 15);
1202 out++;
1203 *out = ((*in) >> 24);
1204 ++in;
1205 *out |= ((*in) % (1U << 7)) << (15 - 7);
1206 out++;
1207 *out = ((*in) >> 7) % (1U << 15);
1208 out++;
1209 *out = ((*in) >> 22);
1210 ++in;
1211 *out |= ((*in) % (1U << 5)) << (15 - 5);
1212 out++;
1213 *out = ((*in) >> 5) % (1U << 15);
1214 out++;
1215 *out = ((*in) >> 20);
1216 ++in;
1217 *out |= ((*in) % (1U << 3)) << (15 - 3);
1218 out++;
1219 *out = ((*in) >> 3) % (1U << 15);
1220 out++;
1221 *out = ((*in) >> 18);
1222 ++in;
1223 *out |= ((*in) % (1U << 1)) << (15 - 1);
1224 out++;
1225 *out = ((*in) >> 1) % (1U << 15);
1226 out++;
1227 *out = ((*in) >> 16) % (1U << 15);
1228 out++;
1229 *out = ((*in) >> 31);
1230 ++in;
1231 *out |= ((*in) % (1U << 14)) << (15 - 14);
1232 out++;
1233 *out = ((*in) >> 14) % (1U << 15);
1234 out++;
1235 *out = ((*in) >> 29);
1236 ++in;
1237 *out |= ((*in) % (1U << 12)) << (15 - 12);
1238 out++;
1239 *out = ((*in) >> 12) % (1U << 15);
1240 out++;
1241 *out = ((*in) >> 27);
1242 ++in;
1243 *out |= ((*in) % (1U << 10)) << (15 - 10);
1244 out++;
1245 *out = ((*in) >> 10) % (1U << 15);
1246 out++;
1247 *out = ((*in) >> 25);
1248 ++in;
1249 *out |= ((*in) % (1U << 8)) << (15 - 8);
1250 out++;
1251 *out = ((*in) >> 8) % (1U << 15);
1252 out++;
1253 *out = ((*in) >> 23);
1254 ++in;
1255 *out |= ((*in) % (1U << 6)) << (15 - 6);
1256 out++;
1257 *out = ((*in) >> 6) % (1U << 15);
1258 out++;
1259 *out = ((*in) >> 21);
1260 ++in;
1261 *out |= ((*in) % (1U << 4)) << (15 - 4);
1262 out++;
1263 *out = ((*in) >> 4) % (1U << 15);
1264 out++;
1265 *out = ((*in) >> 19);
1266 ++in;
1267 *out |= ((*in) % (1U << 2)) << (15 - 2);
1268 out++;
1269 *out = ((*in) >> 2) % (1U << 15);
1270 out++;
1271 *out = ((*in) >> 17);
1272 ++in;
1273 out++;
1274
1275 return in;
1276}
1277
1278inline const uint32_t* unpack16_32(const uint32_t* in, uint32_t* out) {
1279 *out = ((*in) >> 0) % (1U << 16);
1280 out++;
1281 *out = ((*in) >> 16);
1282 ++in;
1283 out++;
1284 *out = ((*in) >> 0) % (1U << 16);
1285 out++;
1286 *out = ((*in) >> 16);
1287 ++in;
1288 out++;
1289 *out = ((*in) >> 0) % (1U << 16);
1290 out++;
1291 *out = ((*in) >> 16);
1292 ++in;
1293 out++;
1294 *out = ((*in) >> 0) % (1U << 16);
1295 out++;
1296 *out = ((*in) >> 16);
1297 ++in;
1298 out++;
1299 *out = ((*in) >> 0) % (1U << 16);
1300 out++;
1301 *out = ((*in) >> 16);
1302 ++in;
1303 out++;
1304 *out = ((*in) >> 0) % (1U << 16);
1305 out++;
1306 *out = ((*in) >> 16);
1307 ++in;
1308 out++;
1309 *out = ((*in) >> 0) % (1U << 16);
1310 out++;
1311 *out = ((*in) >> 16);
1312 ++in;
1313 out++;
1314 *out = ((*in) >> 0) % (1U << 16);
1315 out++;
1316 *out = ((*in) >> 16);
1317 ++in;
1318 out++;
1319 *out = ((*in) >> 0) % (1U << 16);
1320 out++;
1321 *out = ((*in) >> 16);
1322 ++in;
1323 out++;
1324 *out = ((*in) >> 0) % (1U << 16);
1325 out++;
1326 *out = ((*in) >> 16);
1327 ++in;
1328 out++;
1329 *out = ((*in) >> 0) % (1U << 16);
1330 out++;
1331 *out = ((*in) >> 16);
1332 ++in;
1333 out++;
1334 *out = ((*in) >> 0) % (1U << 16);
1335 out++;
1336 *out = ((*in) >> 16);
1337 ++in;
1338 out++;
1339 *out = ((*in) >> 0) % (1U << 16);
1340 out++;
1341 *out = ((*in) >> 16);
1342 ++in;
1343 out++;
1344 *out = ((*in) >> 0) % (1U << 16);
1345 out++;
1346 *out = ((*in) >> 16);
1347 ++in;
1348 out++;
1349 *out = ((*in) >> 0) % (1U << 16);
1350 out++;
1351 *out = ((*in) >> 16);
1352 ++in;
1353 out++;
1354 *out = ((*in) >> 0) % (1U << 16);
1355 out++;
1356 *out = ((*in) >> 16);
1357 ++in;
1358 out++;
1359
1360 return in;
1361}
1362
1363inline const uint32_t* unpack17_32(const uint32_t* in, uint32_t* out) {
1364 *out = ((*in) >> 0) % (1U << 17);
1365 out++;
1366 *out = ((*in) >> 17);
1367 ++in;
1368 *out |= ((*in) % (1U << 2)) << (17 - 2);
1369 out++;
1370 *out = ((*in) >> 2) % (1U << 17);
1371 out++;
1372 *out = ((*in) >> 19);
1373 ++in;
1374 *out |= ((*in) % (1U << 4)) << (17 - 4);
1375 out++;
1376 *out = ((*in) >> 4) % (1U << 17);
1377 out++;
1378 *out = ((*in) >> 21);
1379 ++in;
1380 *out |= ((*in) % (1U << 6)) << (17 - 6);
1381 out++;
1382 *out = ((*in) >> 6) % (1U << 17);
1383 out++;
1384 *out = ((*in) >> 23);
1385 ++in;
1386 *out |= ((*in) % (1U << 8)) << (17 - 8);
1387 out++;
1388 *out = ((*in) >> 8) % (1U << 17);
1389 out++;
1390 *out = ((*in) >> 25);
1391 ++in;
1392 *out |= ((*in) % (1U << 10)) << (17 - 10);
1393 out++;
1394 *out = ((*in) >> 10) % (1U << 17);
1395 out++;
1396 *out = ((*in) >> 27);
1397 ++in;
1398 *out |= ((*in) % (1U << 12)) << (17 - 12);
1399 out++;
1400 *out = ((*in) >> 12) % (1U << 17);
1401 out++;
1402 *out = ((*in) >> 29);
1403 ++in;
1404 *out |= ((*in) % (1U << 14)) << (17 - 14);
1405 out++;
1406 *out = ((*in) >> 14) % (1U << 17);
1407 out++;
1408 *out = ((*in) >> 31);
1409 ++in;
1410 *out |= ((*in) % (1U << 16)) << (17 - 16);
1411 out++;
1412 *out = ((*in) >> 16);
1413 ++in;
1414 *out |= ((*in) % (1U << 1)) << (17 - 1);
1415 out++;
1416 *out = ((*in) >> 1) % (1U << 17);
1417 out++;
1418 *out = ((*in) >> 18);
1419 ++in;
1420 *out |= ((*in) % (1U << 3)) << (17 - 3);
1421 out++;
1422 *out = ((*in) >> 3) % (1U << 17);
1423 out++;
1424 *out = ((*in) >> 20);
1425 ++in;
1426 *out |= ((*in) % (1U << 5)) << (17 - 5);
1427 out++;
1428 *out = ((*in) >> 5) % (1U << 17);
1429 out++;
1430 *out = ((*in) >> 22);
1431 ++in;
1432 *out |= ((*in) % (1U << 7)) << (17 - 7);
1433 out++;
1434 *out = ((*in) >> 7) % (1U << 17);
1435 out++;
1436 *out = ((*in) >> 24);
1437 ++in;
1438 *out |= ((*in) % (1U << 9)) << (17 - 9);
1439 out++;
1440 *out = ((*in) >> 9) % (1U << 17);
1441 out++;
1442 *out = ((*in) >> 26);
1443 ++in;
1444 *out |= ((*in) % (1U << 11)) << (17 - 11);
1445 out++;
1446 *out = ((*in) >> 11) % (1U << 17);
1447 out++;
1448 *out = ((*in) >> 28);
1449 ++in;
1450 *out |= ((*in) % (1U << 13)) << (17 - 13);
1451 out++;
1452 *out = ((*in) >> 13) % (1U << 17);
1453 out++;
1454 *out = ((*in) >> 30);
1455 ++in;
1456 *out |= ((*in) % (1U << 15)) << (17 - 15);
1457 out++;
1458 *out = ((*in) >> 15);
1459 ++in;
1460 out++;
1461
1462 return in;
1463}
1464
1465inline const uint32_t* unpack18_32(const uint32_t* in, uint32_t* out) {
1466 *out = ((*in) >> 0) % (1U << 18);
1467 out++;
1468 *out = ((*in) >> 18);
1469 ++in;
1470 *out |= ((*in) % (1U << 4)) << (18 - 4);
1471 out++;
1472 *out = ((*in) >> 4) % (1U << 18);
1473 out++;
1474 *out = ((*in) >> 22);
1475 ++in;
1476 *out |= ((*in) % (1U << 8)) << (18 - 8);
1477 out++;
1478 *out = ((*in) >> 8) % (1U << 18);
1479 out++;
1480 *out = ((*in) >> 26);
1481 ++in;
1482 *out |= ((*in) % (1U << 12)) << (18 - 12);
1483 out++;
1484 *out = ((*in) >> 12) % (1U << 18);
1485 out++;
1486 *out = ((*in) >> 30);
1487 ++in;
1488 *out |= ((*in) % (1U << 16)) << (18 - 16);
1489 out++;
1490 *out = ((*in) >> 16);
1491 ++in;
1492 *out |= ((*in) % (1U << 2)) << (18 - 2);
1493 out++;
1494 *out = ((*in) >> 2) % (1U << 18);
1495 out++;
1496 *out = ((*in) >> 20);
1497 ++in;
1498 *out |= ((*in) % (1U << 6)) << (18 - 6);
1499 out++;
1500 *out = ((*in) >> 6) % (1U << 18);
1501 out++;
1502 *out = ((*in) >> 24);
1503 ++in;
1504 *out |= ((*in) % (1U << 10)) << (18 - 10);
1505 out++;
1506 *out = ((*in) >> 10) % (1U << 18);
1507 out++;
1508 *out = ((*in) >> 28);
1509 ++in;
1510 *out |= ((*in) % (1U << 14)) << (18 - 14);
1511 out++;
1512 *out = ((*in) >> 14);
1513 ++in;
1514 out++;
1515 *out = ((*in) >> 0) % (1U << 18);
1516 out++;
1517 *out = ((*in) >> 18);
1518 ++in;
1519 *out |= ((*in) % (1U << 4)) << (18 - 4);
1520 out++;
1521 *out = ((*in) >> 4) % (1U << 18);
1522 out++;
1523 *out = ((*in) >> 22);
1524 ++in;
1525 *out |= ((*in) % (1U << 8)) << (18 - 8);
1526 out++;
1527 *out = ((*in) >> 8) % (1U << 18);
1528 out++;
1529 *out = ((*in) >> 26);
1530 ++in;
1531 *out |= ((*in) % (1U << 12)) << (18 - 12);
1532 out++;
1533 *out = ((*in) >> 12) % (1U << 18);
1534 out++;
1535 *out = ((*in) >> 30);
1536 ++in;
1537 *out |= ((*in) % (1U << 16)) << (18 - 16);
1538 out++;
1539 *out = ((*in) >> 16);
1540 ++in;
1541 *out |= ((*in) % (1U << 2)) << (18 - 2);
1542 out++;
1543 *out = ((*in) >> 2) % (1U << 18);
1544 out++;
1545 *out = ((*in) >> 20);
1546 ++in;
1547 *out |= ((*in) % (1U << 6)) << (18 - 6);
1548 out++;
1549 *out = ((*in) >> 6) % (1U << 18);
1550 out++;
1551 *out = ((*in) >> 24);
1552 ++in;
1553 *out |= ((*in) % (1U << 10)) << (18 - 10);
1554 out++;
1555 *out = ((*in) >> 10) % (1U << 18);
1556 out++;
1557 *out = ((*in) >> 28);
1558 ++in;
1559 *out |= ((*in) % (1U << 14)) << (18 - 14);
1560 out++;
1561 *out = ((*in) >> 14);
1562 ++in;
1563 out++;
1564
1565 return in;
1566}
1567
1568inline const uint32_t* unpack19_32(const uint32_t* in, uint32_t* out) {
1569 *out = ((*in) >> 0) % (1U << 19);
1570 out++;
1571 *out = ((*in) >> 19);
1572 ++in;
1573 *out |= ((*in) % (1U << 6)) << (19 - 6);
1574 out++;
1575 *out = ((*in) >> 6) % (1U << 19);
1576 out++;
1577 *out = ((*in) >> 25);
1578 ++in;
1579 *out |= ((*in) % (1U << 12)) << (19 - 12);
1580 out++;
1581 *out = ((*in) >> 12) % (1U << 19);
1582 out++;
1583 *out = ((*in) >> 31);
1584 ++in;
1585 *out |= ((*in) % (1U << 18)) << (19 - 18);
1586 out++;
1587 *out = ((*in) >> 18);
1588 ++in;
1589 *out |= ((*in) % (1U << 5)) << (19 - 5);
1590 out++;
1591 *out = ((*in) >> 5) % (1U << 19);
1592 out++;
1593 *out = ((*in) >> 24);
1594 ++in;
1595 *out |= ((*in) % (1U << 11)) << (19 - 11);
1596 out++;
1597 *out = ((*in) >> 11) % (1U << 19);
1598 out++;
1599 *out = ((*in) >> 30);
1600 ++in;
1601 *out |= ((*in) % (1U << 17)) << (19 - 17);
1602 out++;
1603 *out = ((*in) >> 17);
1604 ++in;
1605 *out |= ((*in) % (1U << 4)) << (19 - 4);
1606 out++;
1607 *out = ((*in) >> 4) % (1U << 19);
1608 out++;
1609 *out = ((*in) >> 23);
1610 ++in;
1611 *out |= ((*in) % (1U << 10)) << (19 - 10);
1612 out++;
1613 *out = ((*in) >> 10) % (1U << 19);
1614 out++;
1615 *out = ((*in) >> 29);
1616 ++in;
1617 *out |= ((*in) % (1U << 16)) << (19 - 16);
1618 out++;
1619 *out = ((*in) >> 16);
1620 ++in;
1621 *out |= ((*in) % (1U << 3)) << (19 - 3);
1622 out++;
1623 *out = ((*in) >> 3) % (1U << 19);
1624 out++;
1625 *out = ((*in) >> 22);
1626 ++in;
1627 *out |= ((*in) % (1U << 9)) << (19 - 9);
1628 out++;
1629 *out = ((*in) >> 9) % (1U << 19);
1630 out++;
1631 *out = ((*in) >> 28);
1632 ++in;
1633 *out |= ((*in) % (1U << 15)) << (19 - 15);
1634 out++;
1635 *out = ((*in) >> 15);
1636 ++in;
1637 *out |= ((*in) % (1U << 2)) << (19 - 2);
1638 out++;
1639 *out = ((*in) >> 2) % (1U << 19);
1640 out++;
1641 *out = ((*in) >> 21);
1642 ++in;
1643 *out |= ((*in) % (1U << 8)) << (19 - 8);
1644 out++;
1645 *out = ((*in) >> 8) % (1U << 19);
1646 out++;
1647 *out = ((*in) >> 27);
1648 ++in;
1649 *out |= ((*in) % (1U << 14)) << (19 - 14);
1650 out++;
1651 *out = ((*in) >> 14);
1652 ++in;
1653 *out |= ((*in) % (1U << 1)) << (19 - 1);
1654 out++;
1655 *out = ((*in) >> 1) % (1U << 19);
1656 out++;
1657 *out = ((*in) >> 20);
1658 ++in;
1659 *out |= ((*in) % (1U << 7)) << (19 - 7);
1660 out++;
1661 *out = ((*in) >> 7) % (1U << 19);
1662 out++;
1663 *out = ((*in) >> 26);
1664 ++in;
1665 *out |= ((*in) % (1U << 13)) << (19 - 13);
1666 out++;
1667 *out = ((*in) >> 13);
1668 ++in;
1669 out++;
1670
1671 return in;
1672}
1673
1674inline const uint32_t* unpack20_32(const uint32_t* in, uint32_t* out) {
1675 *out = ((*in) >> 0) % (1U << 20);
1676 out++;
1677 *out = ((*in) >> 20);
1678 ++in;
1679 *out |= ((*in) % (1U << 8)) << (20 - 8);
1680 out++;
1681 *out = ((*in) >> 8) % (1U << 20);
1682 out++;
1683 *out = ((*in) >> 28);
1684 ++in;
1685 *out |= ((*in) % (1U << 16)) << (20 - 16);
1686 out++;
1687 *out = ((*in) >> 16);
1688 ++in;
1689 *out |= ((*in) % (1U << 4)) << (20 - 4);
1690 out++;
1691 *out = ((*in) >> 4) % (1U << 20);
1692 out++;
1693 *out = ((*in) >> 24);
1694 ++in;
1695 *out |= ((*in) % (1U << 12)) << (20 - 12);
1696 out++;
1697 *out = ((*in) >> 12);
1698 ++in;
1699 out++;
1700 *out = ((*in) >> 0) % (1U << 20);
1701 out++;
1702 *out = ((*in) >> 20);
1703 ++in;
1704 *out |= ((*in) % (1U << 8)) << (20 - 8);
1705 out++;
1706 *out = ((*in) >> 8) % (1U << 20);
1707 out++;
1708 *out = ((*in) >> 28);
1709 ++in;
1710 *out |= ((*in) % (1U << 16)) << (20 - 16);
1711 out++;
1712 *out = ((*in) >> 16);
1713 ++in;
1714 *out |= ((*in) % (1U << 4)) << (20 - 4);
1715 out++;
1716 *out = ((*in) >> 4) % (1U << 20);
1717 out++;
1718 *out = ((*in) >> 24);
1719 ++in;
1720 *out |= ((*in) % (1U << 12)) << (20 - 12);
1721 out++;
1722 *out = ((*in) >> 12);
1723 ++in;
1724 out++;
1725 *out = ((*in) >> 0) % (1U << 20);
1726 out++;
1727 *out = ((*in) >> 20);
1728 ++in;
1729 *out |= ((*in) % (1U << 8)) << (20 - 8);
1730 out++;
1731 *out = ((*in) >> 8) % (1U << 20);
1732 out++;
1733 *out = ((*in) >> 28);
1734 ++in;
1735 *out |= ((*in) % (1U << 16)) << (20 - 16);
1736 out++;
1737 *out = ((*in) >> 16);
1738 ++in;
1739 *out |= ((*in) % (1U << 4)) << (20 - 4);
1740 out++;
1741 *out = ((*in) >> 4) % (1U << 20);
1742 out++;
1743 *out = ((*in) >> 24);
1744 ++in;
1745 *out |= ((*in) % (1U << 12)) << (20 - 12);
1746 out++;
1747 *out = ((*in) >> 12);
1748 ++in;
1749 out++;
1750 *out = ((*in) >> 0) % (1U << 20);
1751 out++;
1752 *out = ((*in) >> 20);
1753 ++in;
1754 *out |= ((*in) % (1U << 8)) << (20 - 8);
1755 out++;
1756 *out = ((*in) >> 8) % (1U << 20);
1757 out++;
1758 *out = ((*in) >> 28);
1759 ++in;
1760 *out |= ((*in) % (1U << 16)) << (20 - 16);
1761 out++;
1762 *out = ((*in) >> 16);
1763 ++in;
1764 *out |= ((*in) % (1U << 4)) << (20 - 4);
1765 out++;
1766 *out = ((*in) >> 4) % (1U << 20);
1767 out++;
1768 *out = ((*in) >> 24);
1769 ++in;
1770 *out |= ((*in) % (1U << 12)) << (20 - 12);
1771 out++;
1772 *out = ((*in) >> 12);
1773 ++in;
1774 out++;
1775
1776 return in;
1777}
1778
1779inline const uint32_t* unpack21_32(const uint32_t* in, uint32_t* out) {
1780 *out = ((*in) >> 0) % (1U << 21);
1781 out++;
1782 *out = ((*in) >> 21);
1783 ++in;
1784 *out |= ((*in) % (1U << 10)) << (21 - 10);
1785 out++;
1786 *out = ((*in) >> 10) % (1U << 21);
1787 out++;
1788 *out = ((*in) >> 31);
1789 ++in;
1790 *out |= ((*in) % (1U << 20)) << (21 - 20);
1791 out++;
1792 *out = ((*in) >> 20);
1793 ++in;
1794 *out |= ((*in) % (1U << 9)) << (21 - 9);
1795 out++;
1796 *out = ((*in) >> 9) % (1U << 21);
1797 out++;
1798 *out = ((*in) >> 30);
1799 ++in;
1800 *out |= ((*in) % (1U << 19)) << (21 - 19);
1801 out++;
1802 *out = ((*in) >> 19);
1803 ++in;
1804 *out |= ((*in) % (1U << 8)) << (21 - 8);
1805 out++;
1806 *out = ((*in) >> 8) % (1U << 21);
1807 out++;
1808 *out = ((*in) >> 29);
1809 ++in;
1810 *out |= ((*in) % (1U << 18)) << (21 - 18);
1811 out++;
1812 *out = ((*in) >> 18);
1813 ++in;
1814 *out |= ((*in) % (1U << 7)) << (21 - 7);
1815 out++;
1816 *out = ((*in) >> 7) % (1U << 21);
1817 out++;
1818 *out = ((*in) >> 28);
1819 ++in;
1820 *out |= ((*in) % (1U << 17)) << (21 - 17);
1821 out++;
1822 *out = ((*in) >> 17);
1823 ++in;
1824 *out |= ((*in) % (1U << 6)) << (21 - 6);
1825 out++;
1826 *out = ((*in) >> 6) % (1U << 21);
1827 out++;
1828 *out = ((*in) >> 27);
1829 ++in;
1830 *out |= ((*in) % (1U << 16)) << (21 - 16);
1831 out++;
1832 *out = ((*in) >> 16);
1833 ++in;
1834 *out |= ((*in) % (1U << 5)) << (21 - 5);
1835 out++;
1836 *out = ((*in) >> 5) % (1U << 21);
1837 out++;
1838 *out = ((*in) >> 26);
1839 ++in;
1840 *out |= ((*in) % (1U << 15)) << (21 - 15);
1841 out++;
1842 *out = ((*in) >> 15);
1843 ++in;
1844 *out |= ((*in) % (1U << 4)) << (21 - 4);
1845 out++;
1846 *out = ((*in) >> 4) % (1U << 21);
1847 out++;
1848 *out = ((*in) >> 25);
1849 ++in;
1850 *out |= ((*in) % (1U << 14)) << (21 - 14);
1851 out++;
1852 *out = ((*in) >> 14);
1853 ++in;
1854 *out |= ((*in) % (1U << 3)) << (21 - 3);
1855 out++;
1856 *out = ((*in) >> 3) % (1U << 21);
1857 out++;
1858 *out = ((*in) >> 24);
1859 ++in;
1860 *out |= ((*in) % (1U << 13)) << (21 - 13);
1861 out++;
1862 *out = ((*in) >> 13);
1863 ++in;
1864 *out |= ((*in) % (1U << 2)) << (21 - 2);
1865 out++;
1866 *out = ((*in) >> 2) % (1U << 21);
1867 out++;
1868 *out = ((*in) >> 23);
1869 ++in;
1870 *out |= ((*in) % (1U << 12)) << (21 - 12);
1871 out++;
1872 *out = ((*in) >> 12);
1873 ++in;
1874 *out |= ((*in) % (1U << 1)) << (21 - 1);
1875 out++;
1876 *out = ((*in) >> 1) % (1U << 21);
1877 out++;
1878 *out = ((*in) >> 22);
1879 ++in;
1880 *out |= ((*in) % (1U << 11)) << (21 - 11);
1881 out++;
1882 *out = ((*in) >> 11);
1883 ++in;
1884 out++;
1885
1886 return in;
1887}
1888
1889inline const uint32_t* unpack22_32(const uint32_t* in, uint32_t* out) {
1890 *out = ((*in) >> 0) % (1U << 22);
1891 out++;
1892 *out = ((*in) >> 22);
1893 ++in;
1894 *out |= ((*in) % (1U << 12)) << (22 - 12);
1895 out++;
1896 *out = ((*in) >> 12);
1897 ++in;
1898 *out |= ((*in) % (1U << 2)) << (22 - 2);
1899 out++;
1900 *out = ((*in) >> 2) % (1U << 22);
1901 out++;
1902 *out = ((*in) >> 24);
1903 ++in;
1904 *out |= ((*in) % (1U << 14)) << (22 - 14);
1905 out++;
1906 *out = ((*in) >> 14);
1907 ++in;
1908 *out |= ((*in) % (1U << 4)) << (22 - 4);
1909 out++;
1910 *out = ((*in) >> 4) % (1U << 22);
1911 out++;
1912 *out = ((*in) >> 26);
1913 ++in;
1914 *out |= ((*in) % (1U << 16)) << (22 - 16);
1915 out++;
1916 *out = ((*in) >> 16);
1917 ++in;
1918 *out |= ((*in) % (1U << 6)) << (22 - 6);
1919 out++;
1920 *out = ((*in) >> 6) % (1U << 22);
1921 out++;
1922 *out = ((*in) >> 28);
1923 ++in;
1924 *out |= ((*in) % (1U << 18)) << (22 - 18);
1925 out++;
1926 *out = ((*in) >> 18);
1927 ++in;
1928 *out |= ((*in) % (1U << 8)) << (22 - 8);
1929 out++;
1930 *out = ((*in) >> 8) % (1U << 22);
1931 out++;
1932 *out = ((*in) >> 30);
1933 ++in;
1934 *out |= ((*in) % (1U << 20)) << (22 - 20);
1935 out++;
1936 *out = ((*in) >> 20);
1937 ++in;
1938 *out |= ((*in) % (1U << 10)) << (22 - 10);
1939 out++;
1940 *out = ((*in) >> 10);
1941 ++in;
1942 out++;
1943 *out = ((*in) >> 0) % (1U << 22);
1944 out++;
1945 *out = ((*in) >> 22);
1946 ++in;
1947 *out |= ((*in) % (1U << 12)) << (22 - 12);
1948 out++;
1949 *out = ((*in) >> 12);
1950 ++in;
1951 *out |= ((*in) % (1U << 2)) << (22 - 2);
1952 out++;
1953 *out = ((*in) >> 2) % (1U << 22);
1954 out++;
1955 *out = ((*in) >> 24);
1956 ++in;
1957 *out |= ((*in) % (1U << 14)) << (22 - 14);
1958 out++;
1959 *out = ((*in) >> 14);
1960 ++in;
1961 *out |= ((*in) % (1U << 4)) << (22 - 4);
1962 out++;
1963 *out = ((*in) >> 4) % (1U << 22);
1964 out++;
1965 *out = ((*in) >> 26);
1966 ++in;
1967 *out |= ((*in) % (1U << 16)) << (22 - 16);
1968 out++;
1969 *out = ((*in) >> 16);
1970 ++in;
1971 *out |= ((*in) % (1U << 6)) << (22 - 6);
1972 out++;
1973 *out = ((*in) >> 6) % (1U << 22);
1974 out++;
1975 *out = ((*in) >> 28);
1976 ++in;
1977 *out |= ((*in) % (1U << 18)) << (22 - 18);
1978 out++;
1979 *out = ((*in) >> 18);
1980 ++in;
1981 *out |= ((*in) % (1U << 8)) << (22 - 8);
1982 out++;
1983 *out = ((*in) >> 8) % (1U << 22);
1984 out++;
1985 *out = ((*in) >> 30);
1986 ++in;
1987 *out |= ((*in) % (1U << 20)) << (22 - 20);
1988 out++;
1989 *out = ((*in) >> 20);
1990 ++in;
1991 *out |= ((*in) % (1U << 10)) << (22 - 10);
1992 out++;
1993 *out = ((*in) >> 10);
1994 ++in;
1995 out++;
1996
1997 return in;
1998}
1999
2000inline const uint32_t* unpack23_32(const uint32_t* in, uint32_t* out) {
2001 *out = ((*in) >> 0) % (1U << 23);
2002 out++;
2003 *out = ((*in) >> 23);
2004 ++in;
2005 *out |= ((*in) % (1U << 14)) << (23 - 14);
2006 out++;
2007 *out = ((*in) >> 14);
2008 ++in;
2009 *out |= ((*in) % (1U << 5)) << (23 - 5);
2010 out++;
2011 *out = ((*in) >> 5) % (1U << 23);
2012 out++;
2013 *out = ((*in) >> 28);
2014 ++in;
2015 *out |= ((*in) % (1U << 19)) << (23 - 19);
2016 out++;
2017 *out = ((*in) >> 19);
2018 ++in;
2019 *out |= ((*in) % (1U << 10)) << (23 - 10);
2020 out++;
2021 *out = ((*in) >> 10);
2022 ++in;
2023 *out |= ((*in) % (1U << 1)) << (23 - 1);
2024 out++;
2025 *out = ((*in) >> 1) % (1U << 23);
2026 out++;
2027 *out = ((*in) >> 24);
2028 ++in;
2029 *out |= ((*in) % (1U << 15)) << (23 - 15);
2030 out++;
2031 *out = ((*in) >> 15);
2032 ++in;
2033 *out |= ((*in) % (1U << 6)) << (23 - 6);
2034 out++;
2035 *out = ((*in) >> 6) % (1U << 23);
2036 out++;
2037 *out = ((*in) >> 29);
2038 ++in;
2039 *out |= ((*in) % (1U << 20)) << (23 - 20);
2040 out++;
2041 *out = ((*in) >> 20);
2042 ++in;
2043 *out |= ((*in) % (1U << 11)) << (23 - 11);
2044 out++;
2045 *out = ((*in) >> 11);
2046 ++in;
2047 *out |= ((*in) % (1U << 2)) << (23 - 2);
2048 out++;
2049 *out = ((*in) >> 2) % (1U << 23);
2050 out++;
2051 *out = ((*in) >> 25);
2052 ++in;
2053 *out |= ((*in) % (1U << 16)) << (23 - 16);
2054 out++;
2055 *out = ((*in) >> 16);
2056 ++in;
2057 *out |= ((*in) % (1U << 7)) << (23 - 7);
2058 out++;
2059 *out = ((*in) >> 7) % (1U << 23);
2060 out++;
2061 *out = ((*in) >> 30);
2062 ++in;
2063 *out |= ((*in) % (1U << 21)) << (23 - 21);
2064 out++;
2065 *out = ((*in) >> 21);
2066 ++in;
2067 *out |= ((*in) % (1U << 12)) << (23 - 12);
2068 out++;
2069 *out = ((*in) >> 12);
2070 ++in;
2071 *out |= ((*in) % (1U << 3)) << (23 - 3);
2072 out++;
2073 *out = ((*in) >> 3) % (1U << 23);
2074 out++;
2075 *out = ((*in) >> 26);
2076 ++in;
2077 *out |= ((*in) % (1U << 17)) << (23 - 17);
2078 out++;
2079 *out = ((*in) >> 17);
2080 ++in;
2081 *out |= ((*in) % (1U << 8)) << (23 - 8);
2082 out++;
2083 *out = ((*in) >> 8) % (1U << 23);
2084 out++;
2085 *out = ((*in) >> 31);
2086 ++in;
2087 *out |= ((*in) % (1U << 22)) << (23 - 22);
2088 out++;
2089 *out = ((*in) >> 22);
2090 ++in;
2091 *out |= ((*in) % (1U << 13)) << (23 - 13);
2092 out++;
2093 *out = ((*in) >> 13);
2094 ++in;
2095 *out |= ((*in) % (1U << 4)) << (23 - 4);
2096 out++;
2097 *out = ((*in) >> 4) % (1U << 23);
2098 out++;
2099 *out = ((*in) >> 27);
2100 ++in;
2101 *out |= ((*in) % (1U << 18)) << (23 - 18);
2102 out++;
2103 *out = ((*in) >> 18);
2104 ++in;
2105 *out |= ((*in) % (1U << 9)) << (23 - 9);
2106 out++;
2107 *out = ((*in) >> 9);
2108 ++in;
2109 out++;
2110
2111 return in;
2112}
2113
2114inline const uint32_t* unpack24_32(const uint32_t* in, uint32_t* out) {
2115 *out = ((*in) >> 0) % (1U << 24);
2116 out++;
2117 *out = ((*in) >> 24);
2118 ++in;
2119 *out |= ((*in) % (1U << 16)) << (24 - 16);
2120 out++;
2121 *out = ((*in) >> 16);
2122 ++in;
2123 *out |= ((*in) % (1U << 8)) << (24 - 8);
2124 out++;
2125 *out = ((*in) >> 8);
2126 ++in;
2127 out++;
2128 *out = ((*in) >> 0) % (1U << 24);
2129 out++;
2130 *out = ((*in) >> 24);
2131 ++in;
2132 *out |= ((*in) % (1U << 16)) << (24 - 16);
2133 out++;
2134 *out = ((*in) >> 16);
2135 ++in;
2136 *out |= ((*in) % (1U << 8)) << (24 - 8);
2137 out++;
2138 *out = ((*in) >> 8);
2139 ++in;
2140 out++;
2141 *out = ((*in) >> 0) % (1U << 24);
2142 out++;
2143 *out = ((*in) >> 24);
2144 ++in;
2145 *out |= ((*in) % (1U << 16)) << (24 - 16);
2146 out++;
2147 *out = ((*in) >> 16);
2148 ++in;
2149 *out |= ((*in) % (1U << 8)) << (24 - 8);
2150 out++;
2151 *out = ((*in) >> 8);
2152 ++in;
2153 out++;
2154 *out = ((*in) >> 0) % (1U << 24);
2155 out++;
2156 *out = ((*in) >> 24);
2157 ++in;
2158 *out |= ((*in) % (1U << 16)) << (24 - 16);
2159 out++;
2160 *out = ((*in) >> 16);
2161 ++in;
2162 *out |= ((*in) % (1U << 8)) << (24 - 8);
2163 out++;
2164 *out = ((*in) >> 8);
2165 ++in;
2166 out++;
2167 *out = ((*in) >> 0) % (1U << 24);
2168 out++;
2169 *out = ((*in) >> 24);
2170 ++in;
2171 *out |= ((*in) % (1U << 16)) << (24 - 16);
2172 out++;
2173 *out = ((*in) >> 16);
2174 ++in;
2175 *out |= ((*in) % (1U << 8)) << (24 - 8);
2176 out++;
2177 *out = ((*in) >> 8);
2178 ++in;
2179 out++;
2180 *out = ((*in) >> 0) % (1U << 24);
2181 out++;
2182 *out = ((*in) >> 24);
2183 ++in;
2184 *out |= ((*in) % (1U << 16)) << (24 - 16);
2185 out++;
2186 *out = ((*in) >> 16);
2187 ++in;
2188 *out |= ((*in) % (1U << 8)) << (24 - 8);
2189 out++;
2190 *out = ((*in) >> 8);
2191 ++in;
2192 out++;
2193 *out = ((*in) >> 0) % (1U << 24);
2194 out++;
2195 *out = ((*in) >> 24);
2196 ++in;
2197 *out |= ((*in) % (1U << 16)) << (24 - 16);
2198 out++;
2199 *out = ((*in) >> 16);
2200 ++in;
2201 *out |= ((*in) % (1U << 8)) << (24 - 8);
2202 out++;
2203 *out = ((*in) >> 8);
2204 ++in;
2205 out++;
2206 *out = ((*in) >> 0) % (1U << 24);
2207 out++;
2208 *out = ((*in) >> 24);
2209 ++in;
2210 *out |= ((*in) % (1U << 16)) << (24 - 16);
2211 out++;
2212 *out = ((*in) >> 16);
2213 ++in;
2214 *out |= ((*in) % (1U << 8)) << (24 - 8);
2215 out++;
2216 *out = ((*in) >> 8);
2217 ++in;
2218 out++;
2219
2220 return in;
2221}
2222
2223inline const uint32_t* unpack25_32(const uint32_t* in, uint32_t* out) {
2224 *out = ((*in) >> 0) % (1U << 25);
2225 out++;
2226 *out = ((*in) >> 25);
2227 ++in;
2228 *out |= ((*in) % (1U << 18)) << (25 - 18);
2229 out++;
2230 *out = ((*in) >> 18);
2231 ++in;
2232 *out |= ((*in) % (1U << 11)) << (25 - 11);
2233 out++;
2234 *out = ((*in) >> 11);
2235 ++in;
2236 *out |= ((*in) % (1U << 4)) << (25 - 4);
2237 out++;
2238 *out = ((*in) >> 4) % (1U << 25);
2239 out++;
2240 *out = ((*in) >> 29);
2241 ++in;
2242 *out |= ((*in) % (1U << 22)) << (25 - 22);
2243 out++;
2244 *out = ((*in) >> 22);
2245 ++in;
2246 *out |= ((*in) % (1U << 15)) << (25 - 15);
2247 out++;
2248 *out = ((*in) >> 15);
2249 ++in;
2250 *out |= ((*in) % (1U << 8)) << (25 - 8);
2251 out++;
2252 *out = ((*in) >> 8);
2253 ++in;
2254 *out |= ((*in) % (1U << 1)) << (25 - 1);
2255 out++;
2256 *out = ((*in) >> 1) % (1U << 25);
2257 out++;
2258 *out = ((*in) >> 26);
2259 ++in;
2260 *out |= ((*in) % (1U << 19)) << (25 - 19);
2261 out++;
2262 *out = ((*in) >> 19);
2263 ++in;
2264 *out |= ((*in) % (1U << 12)) << (25 - 12);
2265 out++;
2266 *out = ((*in) >> 12);
2267 ++in;
2268 *out |= ((*in) % (1U << 5)) << (25 - 5);
2269 out++;
2270 *out = ((*in) >> 5) % (1U << 25);
2271 out++;
2272 *out = ((*in) >> 30);
2273 ++in;
2274 *out |= ((*in) % (1U << 23)) << (25 - 23);
2275 out++;
2276 *out = ((*in) >> 23);
2277 ++in;
2278 *out |= ((*in) % (1U << 16)) << (25 - 16);
2279 out++;
2280 *out = ((*in) >> 16);
2281 ++in;
2282 *out |= ((*in) % (1U << 9)) << (25 - 9);
2283 out++;
2284 *out = ((*in) >> 9);
2285 ++in;
2286 *out |= ((*in) % (1U << 2)) << (25 - 2);
2287 out++;
2288 *out = ((*in) >> 2) % (1U << 25);
2289 out++;
2290 *out = ((*in) >> 27);
2291 ++in;
2292 *out |= ((*in) % (1U << 20)) << (25 - 20);
2293 out++;
2294 *out = ((*in) >> 20);
2295 ++in;
2296 *out |= ((*in) % (1U << 13)) << (25 - 13);
2297 out++;
2298 *out = ((*in) >> 13);
2299 ++in;
2300 *out |= ((*in) % (1U << 6)) << (25 - 6);
2301 out++;
2302 *out = ((*in) >> 6) % (1U << 25);
2303 out++;
2304 *out = ((*in) >> 31);
2305 ++in;
2306 *out |= ((*in) % (1U << 24)) << (25 - 24);
2307 out++;
2308 *out = ((*in) >> 24);
2309 ++in;
2310 *out |= ((*in) % (1U << 17)) << (25 - 17);
2311 out++;
2312 *out = ((*in) >> 17);
2313 ++in;
2314 *out |= ((*in) % (1U << 10)) << (25 - 10);
2315 out++;
2316 *out = ((*in) >> 10);
2317 ++in;
2318 *out |= ((*in) % (1U << 3)) << (25 - 3);
2319 out++;
2320 *out = ((*in) >> 3) % (1U << 25);
2321 out++;
2322 *out = ((*in) >> 28);
2323 ++in;
2324 *out |= ((*in) % (1U << 21)) << (25 - 21);
2325 out++;
2326 *out = ((*in) >> 21);
2327 ++in;
2328 *out |= ((*in) % (1U << 14)) << (25 - 14);
2329 out++;
2330 *out = ((*in) >> 14);
2331 ++in;
2332 *out |= ((*in) % (1U << 7)) << (25 - 7);
2333 out++;
2334 *out = ((*in) >> 7);
2335 ++in;
2336 out++;
2337
2338 return in;
2339}
2340
2341inline const uint32_t* unpack26_32(const uint32_t* in, uint32_t* out) {
2342 *out = ((*in) >> 0) % (1U << 26);
2343 out++;
2344 *out = ((*in) >> 26);
2345 ++in;
2346 *out |= ((*in) % (1U << 20)) << (26 - 20);
2347 out++;
2348 *out = ((*in) >> 20);
2349 ++in;
2350 *out |= ((*in) % (1U << 14)) << (26 - 14);
2351 out++;
2352 *out = ((*in) >> 14);
2353 ++in;
2354 *out |= ((*in) % (1U << 8)) << (26 - 8);
2355 out++;
2356 *out = ((*in) >> 8);
2357 ++in;
2358 *out |= ((*in) % (1U << 2)) << (26 - 2);
2359 out++;
2360 *out = ((*in) >> 2) % (1U << 26);
2361 out++;
2362 *out = ((*in) >> 28);
2363 ++in;
2364 *out |= ((*in) % (1U << 22)) << (26 - 22);
2365 out++;
2366 *out = ((*in) >> 22);
2367 ++in;
2368 *out |= ((*in) % (1U << 16)) << (26 - 16);
2369 out++;
2370 *out = ((*in) >> 16);
2371 ++in;
2372 *out |= ((*in) % (1U << 10)) << (26 - 10);
2373 out++;
2374 *out = ((*in) >> 10);
2375 ++in;
2376 *out |= ((*in) % (1U << 4)) << (26 - 4);
2377 out++;
2378 *out = ((*in) >> 4) % (1U << 26);
2379 out++;
2380 *out = ((*in) >> 30);
2381 ++in;
2382 *out |= ((*in) % (1U << 24)) << (26 - 24);
2383 out++;
2384 *out = ((*in) >> 24);
2385 ++in;
2386 *out |= ((*in) % (1U << 18)) << (26 - 18);
2387 out++;
2388 *out = ((*in) >> 18);
2389 ++in;
2390 *out |= ((*in) % (1U << 12)) << (26 - 12);
2391 out++;
2392 *out = ((*in) >> 12);
2393 ++in;
2394 *out |= ((*in) % (1U << 6)) << (26 - 6);
2395 out++;
2396 *out = ((*in) >> 6);
2397 ++in;
2398 out++;
2399 *out = ((*in) >> 0) % (1U << 26);
2400 out++;
2401 *out = ((*in) >> 26);
2402 ++in;
2403 *out |= ((*in) % (1U << 20)) << (26 - 20);
2404 out++;
2405 *out = ((*in) >> 20);
2406 ++in;
2407 *out |= ((*in) % (1U << 14)) << (26 - 14);
2408 out++;
2409 *out = ((*in) >> 14);
2410 ++in;
2411 *out |= ((*in) % (1U << 8)) << (26 - 8);
2412 out++;
2413 *out = ((*in) >> 8);
2414 ++in;
2415 *out |= ((*in) % (1U << 2)) << (26 - 2);
2416 out++;
2417 *out = ((*in) >> 2) % (1U << 26);
2418 out++;
2419 *out = ((*in) >> 28);
2420 ++in;
2421 *out |= ((*in) % (1U << 22)) << (26 - 22);
2422 out++;
2423 *out = ((*in) >> 22);
2424 ++in;
2425 *out |= ((*in) % (1U << 16)) << (26 - 16);
2426 out++;
2427 *out = ((*in) >> 16);
2428 ++in;
2429 *out |= ((*in) % (1U << 10)) << (26 - 10);
2430 out++;
2431 *out = ((*in) >> 10);
2432 ++in;
2433 *out |= ((*in) % (1U << 4)) << (26 - 4);
2434 out++;
2435 *out = ((*in) >> 4) % (1U << 26);
2436 out++;
2437 *out = ((*in) >> 30);
2438 ++in;
2439 *out |= ((*in) % (1U << 24)) << (26 - 24);
2440 out++;
2441 *out = ((*in) >> 24);
2442 ++in;
2443 *out |= ((*in) % (1U << 18)) << (26 - 18);
2444 out++;
2445 *out = ((*in) >> 18);
2446 ++in;
2447 *out |= ((*in) % (1U << 12)) << (26 - 12);
2448 out++;
2449 *out = ((*in) >> 12);
2450 ++in;
2451 *out |= ((*in) % (1U << 6)) << (26 - 6);
2452 out++;
2453 *out = ((*in) >> 6);
2454 ++in;
2455 out++;
2456
2457 return in;
2458}
2459
2460inline const uint32_t* unpack27_32(const uint32_t* in, uint32_t* out) {
2461 *out = ((*in) >> 0) % (1U << 27);
2462 out++;
2463 *out = ((*in) >> 27);
2464 ++in;
2465 *out |= ((*in) % (1U << 22)) << (27 - 22);
2466 out++;
2467 *out = ((*in) >> 22);
2468 ++in;
2469 *out |= ((*in) % (1U << 17)) << (27 - 17);
2470 out++;
2471 *out = ((*in) >> 17);
2472 ++in;
2473 *out |= ((*in) % (1U << 12)) << (27 - 12);
2474 out++;
2475 *out = ((*in) >> 12);
2476 ++in;
2477 *out |= ((*in) % (1U << 7)) << (27 - 7);
2478 out++;
2479 *out = ((*in) >> 7);
2480 ++in;
2481 *out |= ((*in) % (1U << 2)) << (27 - 2);
2482 out++;
2483 *out = ((*in) >> 2) % (1U << 27);
2484 out++;
2485 *out = ((*in) >> 29);
2486 ++in;
2487 *out |= ((*in) % (1U << 24)) << (27 - 24);
2488 out++;
2489 *out = ((*in) >> 24);
2490 ++in;
2491 *out |= ((*in) % (1U << 19)) << (27 - 19);
2492 out++;
2493 *out = ((*in) >> 19);
2494 ++in;
2495 *out |= ((*in) % (1U << 14)) << (27 - 14);
2496 out++;
2497 *out = ((*in) >> 14);
2498 ++in;
2499 *out |= ((*in) % (1U << 9)) << (27 - 9);
2500 out++;
2501 *out = ((*in) >> 9);
2502 ++in;
2503 *out |= ((*in) % (1U << 4)) << (27 - 4);
2504 out++;
2505 *out = ((*in) >> 4) % (1U << 27);
2506 out++;
2507 *out = ((*in) >> 31);
2508 ++in;
2509 *out |= ((*in) % (1U << 26)) << (27 - 26);
2510 out++;
2511 *out = ((*in) >> 26);
2512 ++in;
2513 *out |= ((*in) % (1U << 21)) << (27 - 21);
2514 out++;
2515 *out = ((*in) >> 21);
2516 ++in;
2517 *out |= ((*in) % (1U << 16)) << (27 - 16);
2518 out++;
2519 *out = ((*in) >> 16);
2520 ++in;
2521 *out |= ((*in) % (1U << 11)) << (27 - 11);
2522 out++;
2523 *out = ((*in) >> 11);
2524 ++in;
2525 *out |= ((*in) % (1U << 6)) << (27 - 6);
2526 out++;
2527 *out = ((*in) >> 6);
2528 ++in;
2529 *out |= ((*in) % (1U << 1)) << (27 - 1);
2530 out++;
2531 *out = ((*in) >> 1) % (1U << 27);
2532 out++;
2533 *out = ((*in) >> 28);
2534 ++in;
2535 *out |= ((*in) % (1U << 23)) << (27 - 23);
2536 out++;
2537 *out = ((*in) >> 23);
2538 ++in;
2539 *out |= ((*in) % (1U << 18)) << (27 - 18);
2540 out++;
2541 *out = ((*in) >> 18);
2542 ++in;
2543 *out |= ((*in) % (1U << 13)) << (27 - 13);
2544 out++;
2545 *out = ((*in) >> 13);
2546 ++in;
2547 *out |= ((*in) % (1U << 8)) << (27 - 8);
2548 out++;
2549 *out = ((*in) >> 8);
2550 ++in;
2551 *out |= ((*in) % (1U << 3)) << (27 - 3);
2552 out++;
2553 *out = ((*in) >> 3) % (1U << 27);
2554 out++;
2555 *out = ((*in) >> 30);
2556 ++in;
2557 *out |= ((*in) % (1U << 25)) << (27 - 25);
2558 out++;
2559 *out = ((*in) >> 25);
2560 ++in;
2561 *out |= ((*in) % (1U << 20)) << (27 - 20);
2562 out++;
2563 *out = ((*in) >> 20);
2564 ++in;
2565 *out |= ((*in) % (1U << 15)) << (27 - 15);
2566 out++;
2567 *out = ((*in) >> 15);
2568 ++in;
2569 *out |= ((*in) % (1U << 10)) << (27 - 10);
2570 out++;
2571 *out = ((*in) >> 10);
2572 ++in;
2573 *out |= ((*in) % (1U << 5)) << (27 - 5);
2574 out++;
2575 *out = ((*in) >> 5);
2576 ++in;
2577 out++;
2578
2579 return in;
2580}
2581
2582inline const uint32_t* unpack28_32(const uint32_t* in, uint32_t* out) {
2583 *out = ((*in) >> 0) % (1U << 28);
2584 out++;
2585 *out = ((*in) >> 28);
2586 ++in;
2587 *out |= ((*in) % (1U << 24)) << (28 - 24);
2588 out++;
2589 *out = ((*in) >> 24);
2590 ++in;
2591 *out |= ((*in) % (1U << 20)) << (28 - 20);
2592 out++;
2593 *out = ((*in) >> 20);
2594 ++in;
2595 *out |= ((*in) % (1U << 16)) << (28 - 16);
2596 out++;
2597 *out = ((*in) >> 16);
2598 ++in;
2599 *out |= ((*in) % (1U << 12)) << (28 - 12);
2600 out++;
2601 *out = ((*in) >> 12);
2602 ++in;
2603 *out |= ((*in) % (1U << 8)) << (28 - 8);
2604 out++;
2605 *out = ((*in) >> 8);
2606 ++in;
2607 *out |= ((*in) % (1U << 4)) << (28 - 4);
2608 out++;
2609 *out = ((*in) >> 4);
2610 ++in;
2611 out++;
2612 *out = ((*in) >> 0) % (1U << 28);
2613 out++;
2614 *out = ((*in) >> 28);
2615 ++in;
2616 *out |= ((*in) % (1U << 24)) << (28 - 24);
2617 out++;
2618 *out = ((*in) >> 24);
2619 ++in;
2620 *out |= ((*in) % (1U << 20)) << (28 - 20);
2621 out++;
2622 *out = ((*in) >> 20);
2623 ++in;
2624 *out |= ((*in) % (1U << 16)) << (28 - 16);
2625 out++;
2626 *out = ((*in) >> 16);
2627 ++in;
2628 *out |= ((*in) % (1U << 12)) << (28 - 12);
2629 out++;
2630 *out = ((*in) >> 12);
2631 ++in;
2632 *out |= ((*in) % (1U << 8)) << (28 - 8);
2633 out++;
2634 *out = ((*in) >> 8);
2635 ++in;
2636 *out |= ((*in) % (1U << 4)) << (28 - 4);
2637 out++;
2638 *out = ((*in) >> 4);
2639 ++in;
2640 out++;
2641 *out = ((*in) >> 0) % (1U << 28);
2642 out++;
2643 *out = ((*in) >> 28);
2644 ++in;
2645 *out |= ((*in) % (1U << 24)) << (28 - 24);
2646 out++;
2647 *out = ((*in) >> 24);
2648 ++in;
2649 *out |= ((*in) % (1U << 20)) << (28 - 20);
2650 out++;
2651 *out = ((*in) >> 20);
2652 ++in;
2653 *out |= ((*in) % (1U << 16)) << (28 - 16);
2654 out++;
2655 *out = ((*in) >> 16);
2656 ++in;
2657 *out |= ((*in) % (1U << 12)) << (28 - 12);
2658 out++;
2659 *out = ((*in) >> 12);
2660 ++in;
2661 *out |= ((*in) % (1U << 8)) << (28 - 8);
2662 out++;
2663 *out = ((*in) >> 8);
2664 ++in;
2665 *out |= ((*in) % (1U << 4)) << (28 - 4);
2666 out++;
2667 *out = ((*in) >> 4);
2668 ++in;
2669 out++;
2670 *out = ((*in) >> 0) % (1U << 28);
2671 out++;
2672 *out = ((*in) >> 28);
2673 ++in;
2674 *out |= ((*in) % (1U << 24)) << (28 - 24);
2675 out++;
2676 *out = ((*in) >> 24);
2677 ++in;
2678 *out |= ((*in) % (1U << 20)) << (28 - 20);
2679 out++;
2680 *out = ((*in) >> 20);
2681 ++in;
2682 *out |= ((*in) % (1U << 16)) << (28 - 16);
2683 out++;
2684 *out = ((*in) >> 16);
2685 ++in;
2686 *out |= ((*in) % (1U << 12)) << (28 - 12);
2687 out++;
2688 *out = ((*in) >> 12);
2689 ++in;
2690 *out |= ((*in) % (1U << 8)) << (28 - 8);
2691 out++;
2692 *out = ((*in) >> 8);
2693 ++in;
2694 *out |= ((*in) % (1U << 4)) << (28 - 4);
2695 out++;
2696 *out = ((*in) >> 4);
2697 ++in;
2698 out++;
2699
2700 return in;
2701}
2702
2703inline const uint32_t* unpack29_32(const uint32_t* in, uint32_t* out) {
2704 *out = ((*in) >> 0) % (1U << 29);
2705 out++;
2706 *out = ((*in) >> 29);
2707 ++in;
2708 *out |= ((*in) % (1U << 26)) << (29 - 26);
2709 out++;
2710 *out = ((*in) >> 26);
2711 ++in;
2712 *out |= ((*in) % (1U << 23)) << (29 - 23);
2713 out++;
2714 *out = ((*in) >> 23);
2715 ++in;
2716 *out |= ((*in) % (1U << 20)) << (29 - 20);
2717 out++;
2718 *out = ((*in) >> 20);
2719 ++in;
2720 *out |= ((*in) % (1U << 17)) << (29 - 17);
2721 out++;
2722 *out = ((*in) >> 17);
2723 ++in;
2724 *out |= ((*in) % (1U << 14)) << (29 - 14);
2725 out++;
2726 *out = ((*in) >> 14);
2727 ++in;
2728 *out |= ((*in) % (1U << 11)) << (29 - 11);
2729 out++;
2730 *out = ((*in) >> 11);
2731 ++in;
2732 *out |= ((*in) % (1U << 8)) << (29 - 8);
2733 out++;
2734 *out = ((*in) >> 8);
2735 ++in;
2736 *out |= ((*in) % (1U << 5)) << (29 - 5);
2737 out++;
2738 *out = ((*in) >> 5);
2739 ++in;
2740 *out |= ((*in) % (1U << 2)) << (29 - 2);
2741 out++;
2742 *out = ((*in) >> 2) % (1U << 29);
2743 out++;
2744 *out = ((*in) >> 31);
2745 ++in;
2746 *out |= ((*in) % (1U << 28)) << (29 - 28);
2747 out++;
2748 *out = ((*in) >> 28);
2749 ++in;
2750 *out |= ((*in) % (1U << 25)) << (29 - 25);
2751 out++;
2752 *out = ((*in) >> 25);
2753 ++in;
2754 *out |= ((*in) % (1U << 22)) << (29 - 22);
2755 out++;
2756 *out = ((*in) >> 22);
2757 ++in;
2758 *out |= ((*in) % (1U << 19)) << (29 - 19);
2759 out++;
2760 *out = ((*in) >> 19);
2761 ++in;
2762 *out |= ((*in) % (1U << 16)) << (29 - 16);
2763 out++;
2764 *out = ((*in) >> 16);
2765 ++in;
2766 *out |= ((*in) % (1U << 13)) << (29 - 13);
2767 out++;
2768 *out = ((*in) >> 13);
2769 ++in;
2770 *out |= ((*in) % (1U << 10)) << (29 - 10);
2771 out++;
2772 *out = ((*in) >> 10);
2773 ++in;
2774 *out |= ((*in) % (1U << 7)) << (29 - 7);
2775 out++;
2776 *out = ((*in) >> 7);
2777 ++in;
2778 *out |= ((*in) % (1U << 4)) << (29 - 4);
2779 out++;
2780 *out = ((*in) >> 4);
2781 ++in;
2782 *out |= ((*in) % (1U << 1)) << (29 - 1);
2783 out++;
2784 *out = ((*in) >> 1) % (1U << 29);
2785 out++;
2786 *out = ((*in) >> 30);
2787 ++in;
2788 *out |= ((*in) % (1U << 27)) << (29 - 27);
2789 out++;
2790 *out = ((*in) >> 27);
2791 ++in;
2792 *out |= ((*in) % (1U << 24)) << (29 - 24);
2793 out++;
2794 *out = ((*in) >> 24);
2795 ++in;
2796 *out |= ((*in) % (1U << 21)) << (29 - 21);
2797 out++;
2798 *out = ((*in) >> 21);
2799 ++in;
2800 *out |= ((*in) % (1U << 18)) << (29 - 18);
2801 out++;
2802 *out = ((*in) >> 18);
2803 ++in;
2804 *out |= ((*in) % (1U << 15)) << (29 - 15);
2805 out++;
2806 *out = ((*in) >> 15);
2807 ++in;
2808 *out |= ((*in) % (1U << 12)) << (29 - 12);
2809 out++;
2810 *out = ((*in) >> 12);
2811 ++in;
2812 *out |= ((*in) % (1U << 9)) << (29 - 9);
2813 out++;
2814 *out = ((*in) >> 9);
2815 ++in;
2816 *out |= ((*in) % (1U << 6)) << (29 - 6);
2817 out++;
2818 *out = ((*in) >> 6);
2819 ++in;
2820 *out |= ((*in) % (1U << 3)) << (29 - 3);
2821 out++;
2822 *out = ((*in) >> 3);
2823 ++in;
2824 out++;
2825
2826 return in;
2827}
2828
2829inline const uint32_t* unpack30_32(const uint32_t* in, uint32_t* out) {
2830 *out = ((*in) >> 0) % (1U << 30);
2831 out++;
2832 *out = ((*in) >> 30);
2833 ++in;
2834 *out |= ((*in) % (1U << 28)) << (30 - 28);
2835 out++;
2836 *out = ((*in) >> 28);
2837 ++in;
2838 *out |= ((*in) % (1U << 26)) << (30 - 26);
2839 out++;
2840 *out = ((*in) >> 26);
2841 ++in;
2842 *out |= ((*in) % (1U << 24)) << (30 - 24);
2843 out++;
2844 *out = ((*in) >> 24);
2845 ++in;
2846 *out |= ((*in) % (1U << 22)) << (30 - 22);
2847 out++;
2848 *out = ((*in) >> 22);
2849 ++in;
2850 *out |= ((*in) % (1U << 20)) << (30 - 20);
2851 out++;
2852 *out = ((*in) >> 20);
2853 ++in;
2854 *out |= ((*in) % (1U << 18)) << (30 - 18);
2855 out++;
2856 *out = ((*in) >> 18);
2857 ++in;
2858 *out |= ((*in) % (1U << 16)) << (30 - 16);
2859 out++;
2860 *out = ((*in) >> 16);
2861 ++in;
2862 *out |= ((*in) % (1U << 14)) << (30 - 14);
2863 out++;
2864 *out = ((*in) >> 14);
2865 ++in;
2866 *out |= ((*in) % (1U << 12)) << (30 - 12);
2867 out++;
2868 *out = ((*in) >> 12);
2869 ++in;
2870 *out |= ((*in) % (1U << 10)) << (30 - 10);
2871 out++;
2872 *out = ((*in) >> 10);
2873 ++in;
2874 *out |= ((*in) % (1U << 8)) << (30 - 8);
2875 out++;
2876 *out = ((*in) >> 8);
2877 ++in;
2878 *out |= ((*in) % (1U << 6)) << (30 - 6);
2879 out++;
2880 *out = ((*in) >> 6);
2881 ++in;
2882 *out |= ((*in) % (1U << 4)) << (30 - 4);
2883 out++;
2884 *out = ((*in) >> 4);
2885 ++in;
2886 *out |= ((*in) % (1U << 2)) << (30 - 2);
2887 out++;
2888 *out = ((*in) >> 2);
2889 ++in;
2890 out++;
2891 *out = ((*in) >> 0) % (1U << 30);
2892 out++;
2893 *out = ((*in) >> 30);
2894 ++in;
2895 *out |= ((*in) % (1U << 28)) << (30 - 28);
2896 out++;
2897 *out = ((*in) >> 28);
2898 ++in;
2899 *out |= ((*in) % (1U << 26)) << (30 - 26);
2900 out++;
2901 *out = ((*in) >> 26);
2902 ++in;
2903 *out |= ((*in) % (1U << 24)) << (30 - 24);
2904 out++;
2905 *out = ((*in) >> 24);
2906 ++in;
2907 *out |= ((*in) % (1U << 22)) << (30 - 22);
2908 out++;
2909 *out = ((*in) >> 22);
2910 ++in;
2911 *out |= ((*in) % (1U << 20)) << (30 - 20);
2912 out++;
2913 *out = ((*in) >> 20);
2914 ++in;
2915 *out |= ((*in) % (1U << 18)) << (30 - 18);
2916 out++;
2917 *out = ((*in) >> 18);
2918 ++in;
2919 *out |= ((*in) % (1U << 16)) << (30 - 16);
2920 out++;
2921 *out = ((*in) >> 16);
2922 ++in;
2923 *out |= ((*in) % (1U << 14)) << (30 - 14);
2924 out++;
2925 *out = ((*in) >> 14);
2926 ++in;
2927 *out |= ((*in) % (1U << 12)) << (30 - 12);
2928 out++;
2929 *out = ((*in) >> 12);
2930 ++in;
2931 *out |= ((*in) % (1U << 10)) << (30 - 10);
2932 out++;
2933 *out = ((*in) >> 10);
2934 ++in;
2935 *out |= ((*in) % (1U << 8)) << (30 - 8);
2936 out++;
2937 *out = ((*in) >> 8);
2938 ++in;
2939 *out |= ((*in) % (1U << 6)) << (30 - 6);
2940 out++;
2941 *out = ((*in) >> 6);
2942 ++in;
2943 *out |= ((*in) % (1U << 4)) << (30 - 4);
2944 out++;
2945 *out = ((*in) >> 4);
2946 ++in;
2947 *out |= ((*in) % (1U << 2)) << (30 - 2);
2948 out++;
2949 *out = ((*in) >> 2);
2950 ++in;
2951 out++;
2952
2953 return in;
2954}
2955
2956inline const uint32_t* unpack31_32(const uint32_t* in, uint32_t* out) {
2957 *out = ((*in) >> 0) % (1U << 31);
2958 out++;
2959 *out = ((*in) >> 31);
2960 ++in;
2961 *out |= ((*in) % (1U << 30)) << (31 - 30);
2962 out++;
2963 *out = ((*in) >> 30);
2964 ++in;
2965 *out |= ((*in) % (1U << 29)) << (31 - 29);
2966 out++;
2967 *out = ((*in) >> 29);
2968 ++in;
2969 *out |= ((*in) % (1U << 28)) << (31 - 28);
2970 out++;
2971 *out = ((*in) >> 28);
2972 ++in;
2973 *out |= ((*in) % (1U << 27)) << (31 - 27);
2974 out++;
2975 *out = ((*in) >> 27);
2976 ++in;
2977 *out |= ((*in) % (1U << 26)) << (31 - 26);
2978 out++;
2979 *out = ((*in) >> 26);
2980 ++in;
2981 *out |= ((*in) % (1U << 25)) << (31 - 25);
2982 out++;
2983 *out = ((*in) >> 25);
2984 ++in;
2985 *out |= ((*in) % (1U << 24)) << (31 - 24);
2986 out++;
2987 *out = ((*in) >> 24);
2988 ++in;
2989 *out |= ((*in) % (1U << 23)) << (31 - 23);
2990 out++;
2991 *out = ((*in) >> 23);
2992 ++in;
2993 *out |= ((*in) % (1U << 22)) << (31 - 22);
2994 out++;
2995 *out = ((*in) >> 22);
2996 ++in;
2997 *out |= ((*in) % (1U << 21)) << (31 - 21);
2998 out++;
2999 *out = ((*in) >> 21);
3000 ++in;
3001 *out |= ((*in) % (1U << 20)) << (31 - 20);
3002 out++;
3003 *out = ((*in) >> 20);
3004 ++in;
3005 *out |= ((*in) % (1U << 19)) << (31 - 19);
3006 out++;
3007 *out = ((*in) >> 19);
3008 ++in;
3009 *out |= ((*in) % (1U << 18)) << (31 - 18);
3010 out++;
3011 *out = ((*in) >> 18);
3012 ++in;
3013 *out |= ((*in) % (1U << 17)) << (31 - 17);
3014 out++;
3015 *out = ((*in) >> 17);
3016 ++in;
3017 *out |= ((*in) % (1U << 16)) << (31 - 16);
3018 out++;
3019 *out = ((*in) >> 16);
3020 ++in;
3021 *out |= ((*in) % (1U << 15)) << (31 - 15);
3022 out++;
3023 *out = ((*in) >> 15);
3024 ++in;
3025 *out |= ((*in) % (1U << 14)) << (31 - 14);
3026 out++;
3027 *out = ((*in) >> 14);
3028 ++in;
3029 *out |= ((*in) % (1U << 13)) << (31 - 13);
3030 out++;
3031 *out = ((*in) >> 13);
3032 ++in;
3033 *out |= ((*in) % (1U << 12)) << (31 - 12);
3034 out++;
3035 *out = ((*in) >> 12);
3036 ++in;
3037 *out |= ((*in) % (1U << 11)) << (31 - 11);
3038 out++;
3039 *out = ((*in) >> 11);
3040 ++in;
3041 *out |= ((*in) % (1U << 10)) << (31 - 10);
3042 out++;
3043 *out = ((*in) >> 10);
3044 ++in;
3045 *out |= ((*in) % (1U << 9)) << (31 - 9);
3046 out++;
3047 *out = ((*in) >> 9);
3048 ++in;
3049 *out |= ((*in) % (1U << 8)) << (31 - 8);
3050 out++;
3051 *out = ((*in) >> 8);
3052 ++in;
3053 *out |= ((*in) % (1U << 7)) << (31 - 7);
3054 out++;
3055 *out = ((*in) >> 7);
3056 ++in;
3057 *out |= ((*in) % (1U << 6)) << (31 - 6);
3058 out++;
3059 *out = ((*in) >> 6);
3060 ++in;
3061 *out |= ((*in) % (1U << 5)) << (31 - 5);
3062 out++;
3063 *out = ((*in) >> 5);
3064 ++in;
3065 *out |= ((*in) % (1U << 4)) << (31 - 4);
3066 out++;
3067 *out = ((*in) >> 4);
3068 ++in;
3069 *out |= ((*in) % (1U << 3)) << (31 - 3);
3070 out++;
3071 *out = ((*in) >> 3);
3072 ++in;
3073 *out |= ((*in) % (1U << 2)) << (31 - 2);
3074 out++;
3075 *out = ((*in) >> 2);
3076 ++in;
3077 *out |= ((*in) % (1U << 1)) << (31 - 1);
3078 out++;
3079 *out = ((*in) >> 1);
3080 ++in;
3081 out++;
3082
3083 return in;
3084}
3085
3086inline const uint32_t* unpack32_32(const uint32_t* in, uint32_t* out) {
3087 *out = ((*in) >> 0);
3088 ++in;
3089 out++;
3090 *out = ((*in) >> 0);
3091 ++in;
3092 out++;
3093 *out = ((*in) >> 0);
3094 ++in;
3095 out++;
3096 *out = ((*in) >> 0);
3097 ++in;
3098 out++;
3099 *out = ((*in) >> 0);
3100 ++in;
3101 out++;
3102 *out = ((*in) >> 0);
3103 ++in;
3104 out++;
3105 *out = ((*in) >> 0);
3106 ++in;
3107 out++;
3108 *out = ((*in) >> 0);
3109 ++in;
3110 out++;
3111 *out = ((*in) >> 0);
3112 ++in;
3113 out++;
3114 *out = ((*in) >> 0);
3115 ++in;
3116 out++;
3117 *out = ((*in) >> 0);
3118 ++in;
3119 out++;
3120 *out = ((*in) >> 0);
3121 ++in;
3122 out++;
3123 *out = ((*in) >> 0);
3124 ++in;
3125 out++;
3126 *out = ((*in) >> 0);
3127 ++in;
3128 out++;
3129 *out = ((*in) >> 0);
3130 ++in;
3131 out++;
3132 *out = ((*in) >> 0);
3133 ++in;
3134 out++;
3135 *out = ((*in) >> 0);
3136 ++in;
3137 out++;
3138 *out = ((*in) >> 0);
3139 ++in;
3140 out++;
3141 *out = ((*in) >> 0);
3142 ++in;
3143 out++;
3144 *out = ((*in) >> 0);
3145 ++in;
3146 out++;
3147 *out = ((*in) >> 0);
3148 ++in;
3149 out++;
3150 *out = ((*in) >> 0);
3151 ++in;
3152 out++;
3153 *out = ((*in) >> 0);
3154 ++in;
3155 out++;
3156 *out = ((*in) >> 0);
3157 ++in;
3158 out++;
3159 *out = ((*in) >> 0);
3160 ++in;
3161 out++;
3162 *out = ((*in) >> 0);
3163 ++in;
3164 out++;
3165 *out = ((*in) >> 0);
3166 ++in;
3167 out++;
3168 *out = ((*in) >> 0);
3169 ++in;
3170 out++;
3171 *out = ((*in) >> 0);
3172 ++in;
3173 out++;
3174 *out = ((*in) >> 0);
3175 ++in;
3176 out++;
3177 *out = ((*in) >> 0);
3178 ++in;
3179 out++;
3180 *out = ((*in) >> 0);
3181 ++in;
3182 out++;
3183
3184 return in;
3185}
3186
3187inline const uint32_t* nullunpacker32(const uint32_t* in, uint32_t* out) {
3188 for (int k = 0; k < 32; ++k) {
3189 out[k] = 0;
3190 }
3191 return in;
3192}
3193
3194inline int unpack32(const uint32_t* in, uint32_t* out, int batch_size, int num_bits) {
3195 batch_size = batch_size / 32 * 32;
3196 int num_loops = batch_size / 32;
3197
3198 switch (num_bits) {
3199 case 0:
3200 for (int i = 0; i < num_loops; ++i) in = nullunpacker32(in, out + i * 32);
3201 break;
3202 case 1:
3203 for (int i = 0; i < num_loops; ++i) in = unpack1_32(in, out + i * 32);
3204 break;
3205 case 2:
3206 for (int i = 0; i < num_loops; ++i) in = unpack2_32(in, out + i * 32);
3207 break;
3208 case 3:
3209 for (int i = 0; i < num_loops; ++i) in = unpack3_32(in, out + i * 32);
3210 break;
3211 case 4:
3212 for (int i = 0; i < num_loops; ++i) in = unpack4_32(in, out + i * 32);
3213 break;
3214 case 5:
3215 for (int i = 0; i < num_loops; ++i) in = unpack5_32(in, out + i * 32);
3216 break;
3217 case 6:
3218 for (int i = 0; i < num_loops; ++i) in = unpack6_32(in, out + i * 32);
3219 break;
3220 case 7:
3221 for (int i = 0; i < num_loops; ++i) in = unpack7_32(in, out + i * 32);
3222 break;
3223 case 8:
3224 for (int i = 0; i < num_loops; ++i) in = unpack8_32(in, out + i * 32);
3225 break;
3226 case 9:
3227 for (int i = 0; i < num_loops; ++i) in = unpack9_32(in, out + i * 32);
3228 break;
3229 case 10:
3230 for (int i = 0; i < num_loops; ++i) in = unpack10_32(in, out + i * 32);
3231 break;
3232 case 11:
3233 for (int i = 0; i < num_loops; ++i) in = unpack11_32(in, out + i * 32);
3234 break;
3235 case 12:
3236 for (int i = 0; i < num_loops; ++i) in = unpack12_32(in, out + i * 32);
3237 break;
3238 case 13:
3239 for (int i = 0; i < num_loops; ++i) in = unpack13_32(in, out + i * 32);
3240 break;
3241 case 14:
3242 for (int i = 0; i < num_loops; ++i) in = unpack14_32(in, out + i * 32);
3243 break;
3244 case 15:
3245 for (int i = 0; i < num_loops; ++i) in = unpack15_32(in, out + i * 32);
3246 break;
3247 case 16:
3248 for (int i = 0; i < num_loops; ++i) in = unpack16_32(in, out + i * 32);
3249 break;
3250 case 17:
3251 for (int i = 0; i < num_loops; ++i) in = unpack17_32(in, out + i * 32);
3252 break;
3253 case 18:
3254 for (int i = 0; i < num_loops; ++i) in = unpack18_32(in, out + i * 32);
3255 break;
3256 case 19:
3257 for (int i = 0; i < num_loops; ++i) in = unpack19_32(in, out + i * 32);
3258 break;
3259 case 20:
3260 for (int i = 0; i < num_loops; ++i) in = unpack20_32(in, out + i * 32);
3261 break;
3262 case 21:
3263 for (int i = 0; i < num_loops; ++i) in = unpack21_32(in, out + i * 32);
3264 break;
3265 case 22:
3266 for (int i = 0; i < num_loops; ++i) in = unpack22_32(in, out + i * 32);
3267 break;
3268 case 23:
3269 for (int i = 0; i < num_loops; ++i) in = unpack23_32(in, out + i * 32);
3270 break;
3271 case 24:
3272 for (int i = 0; i < num_loops; ++i) in = unpack24_32(in, out + i * 32);
3273 break;
3274 case 25:
3275 for (int i = 0; i < num_loops; ++i) in = unpack25_32(in, out + i * 32);
3276 break;
3277 case 26:
3278 for (int i = 0; i < num_loops; ++i) in = unpack26_32(in, out + i * 32);
3279 break;
3280 case 27:
3281 for (int i = 0; i < num_loops; ++i) in = unpack27_32(in, out + i * 32);
3282 break;
3283 case 28:
3284 for (int i = 0; i < num_loops; ++i) in = unpack28_32(in, out + i * 32);
3285 break;
3286 case 29:
3287 for (int i = 0; i < num_loops; ++i) in = unpack29_32(in, out + i * 32);
3288 break;
3289 case 30:
3290 for (int i = 0; i < num_loops; ++i) in = unpack30_32(in, out + i * 32);
3291 break;
3292 case 31:
3293 for (int i = 0; i < num_loops; ++i) in = unpack31_32(in, out + i * 32);
3294 break;
3295 case 32:
3296 for (int i = 0; i < num_loops; ++i) in = unpack32_32(in, out + i * 32);
3297 break;
3298 default:
3299 DCHECK(false) << "Unsupported num_bits";
3300 }
3301
3302 return batch_size;
3303}
3304
3305} // namespace internal
3306} // namespace arrow
3307
3308#endif // ARROW_UTIL_BPACKING_H
3309